diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index 3b0ff4ee..532597dc 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -10,7 +10,7 @@ body: required: true - label: I have searched in the issue tracker for similar bug reports, including closed ones required: true - - label: I ran `pip3 install -U https://github.com/pyrogram/pyrogram/archive/master.zip` and reproduced the issue using the latest development version + - label: I ran `pip3 install -U https://github.com/pyrogrammod/pyrogrammod/archive/master.zip` and reproduced the issue using the latest development version required: true - type: textarea diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml deleted file mode 100644 index 453151d8..00000000 --- a/.github/ISSUE_TEMPLATE/config.yml +++ /dev/null @@ -1,8 +0,0 @@ -blank_issues_enabled: false -contact_links: - - name: Ask Pyrogram related questions - url: https://stackoverflow.com/questions/tagged/pyrogram - about: This place is only for reporting issues about Pyrogram. You can ask questions at StackOverflow. - - name: Join the Telegram channel - url: https://t.me/pyrogram - about: Join the official channel and stay tuned for news, updates and announcements. \ No newline at end of file diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 041dfd86..dc42e432 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -1,71 +1,52 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. -# -# ******** NOTE ******** -# We have attempted to detect the languages in your repository. Please check -# the `language` matrix defined below to confirm you have the correct set of -# supported CodeQL languages. -# name: "CodeQL" on: push: - branches: [ main ] + branches: [ "main" ] pull_request: - # The branches below must be a subset of the branches above - branches: [ main ] + branches: [ "main" ] schedule: - - cron: '38 8 * * 5' + - cron: '26 2 * * 6' jobs: analyze: - name: Analyze - runs-on: ubuntu-latest + name: Analyze (${{ matrix.language }}) + runs-on: ${{ (matrix.language == 'swift' && 'macos-latest') || 'ubuntu-latest' }} permissions: + security-events: write + packages: read actions: read contents: read - security-events: write strategy: fail-fast: false matrix: - language: ['python' ] - # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] - # Learn more: - # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed + include: + - language: actions + build-mode: none + - language: python + build-mode: none steps: - name: Checkout repository - uses: actions/checkout@v2 + uses: actions/checkout@v4 - # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL - uses: github/codeql-action/init@v2 + uses: github/codeql-action/init@v3 with: languages: ${{ matrix.language }} - # If you wish to specify custom queries, you can do so here or in a config file. - # By default, queries listed here will override any specified in a config file. - # Prefix the list here with "+" to use these queries and those in the config file. - # queries: ./path/to/local/query, your-org/your-repo/queries@main - - # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). - # If this step fails, then you should remove it and run the build manually (see below) - - name: Autobuild - uses: github/codeql-action/autobuild@v2 - - # Command-line programs to run using the OS shell. - # https://git.io/JvXDl - - # If the Autobuild fails above, remove it and uncomment the following three lines - # and modify them (or add more) to build your code if your project - # uses a compiled language - - #- run: | - # make bootstrap - # make release + build-mode: ${{ matrix.build-mode }} + - if: matrix.build-mode == 'manual' + shell: bash + run: | + echo 'If you are using a "manual" build mode for one or more of the' \ + 'languages you are analyzing, replace this with the commands to build' \ + 'your code, for example:' + echo ' make bootstrap' + echo ' make release' + exit 1 - name: Perform CodeQL Analysis - uses: github/codeql-action/analyze@v2 + uses: github/codeql-action/analyze@v3 + with: + category: "/language:${{matrix.language}}" diff --git a/.github/workflows/publish.yaml b/.github/workflows/publish.yaml new file mode 100644 index 00000000..fa44420e --- /dev/null +++ b/.github/workflows/publish.yaml @@ -0,0 +1,51 @@ +# This is the workflow to make and push wheels to PyPi + +name: Build Wheels +on: + workflow_dispatch: + inputs: + publish: + description: 'Publish to PyPi' + required: false + default: false + type: boolean + +jobs: + build: + runs-on: ubuntu-latest + permissions: + id-token: write + + steps: + - name: Check out the repo + uses: actions/checkout@v4 + + - name: Set up Python 3.12 + uses: actions/setup-python@v5 + with: + python-version: 3.12 + + - name: Install dependencies + run: python3.12 -m pip install --upgrade pip setuptools wheel + + - name: Create wheels directory + run: mkdir -p wheels + + - name: Build wheel + run: python3.12 -m pip wheel . --no-deps --wheel-dir wheels + + - name: List wheel contents + run: ls -l wheels + + - uses: actions/upload-artifact@v4 + with: + name: program-mod-wheel + path: ./wheels/pyrogrammod*.whl + if-no-files-found: error + + - name: Publish a Python distribution to PyPI + if: github.event.inputs.publish == 'true' + uses: pypa/gh-action-pypi-publish@release/v1 + with: + skip-existing: true + packages-dir: wheels/ diff --git a/.github/workflows/python.yml b/.github/workflows/python.yml index b2af74df..135a7584 100644 --- a/.github/workflows/python.yml +++ b/.github/workflows/python.yml @@ -1,34 +1,41 @@ name: Pyrogram - Mod -on: [push, pull_request] +permissions: + contents: read + +on: + push: + pull_request: jobs: build: - runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest, macos-latest] - python-version: ["3.8", "3.9", "3.10", "3.11", "3.12"] + python-version: ["3.9", "3.10", "3.11", "3.12", "3.13"] steps: - - uses: actions/checkout@v3 + - name: Checkout repository + uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} - uses: actions/setup-python@v2 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} + cache: "pip" - - name: Install dependencies + - name: Upgrade pip and install dependencies run: | python -m pip install --upgrade pip - pip install tox + pip install --upgrade tox wheel setuptools - name: Generate API run: | make venv make api - - name: Run tests - run: | - tox + - name: Run tests with tox + env: + PYTHONWARNINGS: "ignore" + run: tox diff --git a/.github/workflows/scrape-errors.yml b/.github/workflows/scrape-errors.yml new file mode 100644 index 00000000..200a7c51 --- /dev/null +++ b/.github/workflows/scrape-errors.yml @@ -0,0 +1,53 @@ +name: Scrape Errors + +on: + workflow_dispatch: + schedule: + - cron: '0 0 * * *' # Run daily at midnight UTC + +jobs: + scrape_and_commit: + name: Scrape and Update Error Lists + runs-on: ubuntu-latest + permissions: + contents: write + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + with: + fetch-depth: 1 + + - name: Set up Python 3.9 + uses: actions/setup-python@v3 + with: + python-version: '3.9' + + - name: Install Python dependencies and run scripts + run: | + set -e # Exit immediately if a command exits with a non-zero status + echo "-------------------- Installing dependencies --------------------" + cd compiler/errors/ + python -m pip install --upgrade pip setuptools wheel + python -m pip install requests==2.28.1 + echo "-------------------- Running scrape script --------------------" + python sort.py scrape + echo "-------------------- Running sort script --------------------" + python sort.py sort + + - name: Check for changes and commit + run: | + git config --local user.email "github-actions[bot]@users.noreply.github.com" + git config --local user.name "GitHub Actions Bot" + + if ! git diff --quiet; then # Check if there are any changes + echo "Changes detected in error files." + git add . + git commit -m "Automated update of unknown_errors" + echo "Committing and pushing changes..." + git push origin main + else + echo "No changes detected in error files. Skipping commit and push." + fi + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.gitignore b/.gitignore index 95f6e7f8..82adb3ee 100644 --- a/.gitignore +++ b/.gitignore @@ -129,3 +129,4 @@ venv.bak/ .mypy_cache/ docs_build.sh .buildinfo +json_docs.py diff --git a/.readthedocs.yaml b/.readthedocs.yaml index 28ca4521..020a9be6 100644 --- a/.readthedocs.yaml +++ b/.readthedocs.yaml @@ -3,7 +3,7 @@ version: 2 build: os: ubuntu-22.04 tools: - python: "3.11" + python: "3.13" jobs: post_install: - pip install .[docs] diff --git a/Makefile b/Makefile index 336b4af2..3e6debe6 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,17 @@ VENV := venv PYTHON := $(VENV)/bin/python -HOST = $(shell ifconfig | grep "inet " | tail -1 | cut -d\ -f2) -TAG = v$(shell grep -E '__version__ = ".*"' pyrogram/__init__.py | cut -d\" -f2) +ifeq ($(OS),Windows_NT) + PYTHON := $(VENV)/Scripts/python.exe +endif + +HOST := $(shell ifconfig | grep "inet " | tail -1 | cut -d\ -f2 2>/dev/null || echo "127.0.0.1") +TAG := v$(shell grep -E '__version__ = ".*"' pyrogram/__init__.py | cut -d\" -f2) RM := rm -rf -.PHONY: venv clean-build clean-api clean api build docs clean-docs +NUM_CORES := $(shell $(PYTHON) -c "import os; print(os.cpu_count())") + +.PHONY: venv clean-build clean-api clean api build docs clean-docs tag dtag venv: $(RM) $(VENV) @@ -20,9 +26,14 @@ clean-build: clean-api: $(RM) pyrogram/errors/exceptions pyrogram/raw/all.py pyrogram/raw/base pyrogram/raw/functions pyrogram/raw/types -clean: - make clean-build - make clean-api +clean-pyc: + find . -name "*.pyc" -exec $(RM) {} + || true + find . -name "__pycache__" -exec $(RM) {} + || true + +clean-ds_store: + find . -name ".DS_Store" -exec $(RM) {} \; + +clean: clean-build clean-api clean-pyc clean-ds_store clean-docs clean-docs: $(RM) docs/build @@ -35,8 +46,7 @@ api: docs: make clean-docs cd compiler/docs && ../../$(PYTHON) compiler.py - $(VENV)/bin/sphinx-build \ - -b html "docs/source" "docs/build/html" -j6 + $(PYTHON) -m sphinx -b html "docs/source" "docs/build/html" -j$(NUM_CORES) build: make clean @@ -49,4 +59,4 @@ tag: dtag: git tag -d $(TAG) - git push origin -d $(TAG) \ No newline at end of file + git push origin -d $(TAG) diff --git a/README.md b/README.md index fa55ffb3..e584e121 100644 --- a/README.md +++ b/README.md @@ -3,13 +3,13 @@ Pyrogram
- Telegram MTProto API Framework for Python (Fork of Pyrogram) + Telegram MTProto API Framework for Python (Fork of Pyrogram)
- + Homepage • - + Documentation • @@ -18,7 +18,7 @@

-## Pyrogram +# PyrogramMod
[![PyPI](https://img.shields.io/pypi/v/pyrogrammod.svg?logo=python&logoColor=%23959DA5&label=pypi&labelColor=%23282f37)](https://pypi.org/project/pyrogrammod/) [![Downloads](https://pepy.tech/badge/pyrogrammod)](https://pepy.tech/project/pyrogrammod) > Elegant, modern and asynchronous Telegram MTProto API framework in Python for users and bots @@ -67,7 +67,7 @@ pip3 install https://github.com/PyrogramMod/PyrogramMod/archive/refs/heads/main. ### Resources - The docs contain lots of resources to help you get started with Pyrogram: https://docs.pyrogram.org. -- Seeking extra help? Come join and ask our community: https://t.me/pyrogram. +- Seeking extra help? Come join and ask our community: https://t.me/pyrogrammodchat. - For other kind of inquiries, you can send a [message](https://t.me/haskell) or an [e-mail](mailto:dan@pyrogram.org). ### Copyright & License @@ -83,11 +83,11 @@ pip3 install https://github.com/PyrogramMod/PyrogramMod/archive/refs/heads/main. - 📚 Docs: https://docs.pyrogram.org ------------------------------------------------------------ - 📕 Un-Official Repo: https://github.com/PyrogramMod/PyrogramMod/ -- 🗞 News: https://t.me/PyroGramMod +- 🗞 News: https://t.me/PyroGramModNews - 💭 Support Group: https://t.me/pyrogramodchat -- 📚 Docs: https://pyrogrammod.readthedocs.io/ +- 📚 Docs: https://pyrogrammod.readthedocs.io/en/latest/ ------------------------------------------------------------ - Check out the docs at https://docs.pyrogram.org to learn more about Pyrogram, get started right away and discover more in-depth material for building your client applications. -- Join the official channel at https://t.me/pyrogram and stay tuned for news, updates and announcements. +- Join the official channel at https://t.me/PyroGramModNews and stay tuned for news, updates and announcements. diff --git a/compiler/api/compiler.py b/compiler/api/compiler.py index c151476c..75378ad7 100644 --- a/compiler/api/compiler.py +++ b/compiler/api/compiler.py @@ -20,6 +20,8 @@ import os import re import shutil +import urllib.request +import urllib.error from functools import partial from pathlib import Path from typing import NamedTuple, List, Tuple @@ -64,11 +66,15 @@ with open("docs.json") as f: docs = json.load(f) except FileNotFoundError: - docs = { - "type": {}, - "constructor": {}, - "method": {} - } + try: + with urllib.request.urlopen("https://github.com/PyrogramMod/PyrogramMod/raw/refs/heads/main/compiler/api/docs.json") as r: + docs = json.load(r) + except (urllib.error.URLError, json.JSONDecodeError): + docs = { + "type": {}, + "constructor": {}, + "method": {} + } class Combinator(NamedTuple): diff --git a/compiler/api/docs.json b/compiler/api/docs.json new file mode 100644 index 00000000..a8a76c54 --- /dev/null +++ b/compiler/api/docs.json @@ -0,0 +1,19457 @@ +{ + "constructor": { + "AccountDaysTTL": { + "desc": "Time to live in days of the current account", + "params": { + "days": "This account will self-destruct in the specified number of days" + } + }, + "AttachMenuBot": { + "desc": "Represents a bot mini app that can be launched from the attachment/side menu \u00bb", + "params": { + "bot_id": "Bot ID", + "flags": "Flags, see TL conditional fields", + "has_settings": "Deprecated flag, can be ignored.", + "icons": "List of platform-specific static icons and animations to use for the attachment menu button", + "inactive": "If set, before launching the mini app the client should ask the user to add the mini app to the attachment/side menu, and only if the user accepts, after invoking messages.toggleBotInAttachMenu the app should be opened.", + "peer_types": "List of dialog types where this attachment menu entry should be shown", + "request_write_access": "Whether the bot would like to send messages to the user.", + "short_name": "Attachment menu item name", + "show_in_attach_menu": "Whether, when installed, an attachment menu entry should be shown for the Mini App.", + "show_in_side_menu": "Whether, when installed, an entry in the main view side menu should be shown for the Mini App.", + "side_menu_disclaimer_needed": "If inactive if set and the user hasn't previously accepted the third-party mini apps Terms of Service for this bot, when showing the mini app installation prompt, an additional mandatory checkbox to accept the mini apps TOS and a disclaimer indicating that this Mini App is not affiliated to Telegram should be shown." + } + }, + "AttachMenuBotIcon": { + "desc": "Represents an attachment menu icon for bot mini apps \u00bb", + "params": { + "colors": "Attachment menu icon colors.", + "flags": "Flags, see TL conditional fields", + "icon": "The actual icon file.", + "name": "One of the following values: note that animated icons must be played when the user clicks on the button, activating the bot mini app. default_static - Default attachment menu icon in SVG format placeholder_static - Default placeholder for opened Web Apps in SVG format ios_static - Attachment menu icon in SVG format for the official iOS app ios_animated - Animated attachment menu icon in TGS format for the official iOS app android_animated - Animated attachment menu icon in TGS format for the official Android app macos_animated - Animated attachment menu icon in TGS format for the official native Mac OS app ios_side_menu_static - Side menu icon in PNG format for the official iOS app android_side_menu_static - Side menu icon in SVG format for the official android app macos_side_menu_static - Side menu icon in PNG format for the official native Mac OS app" + } + }, + "AttachMenuBotIconColor": { + "desc": "Represents an attachment menu icon color for bot mini apps \u00bb", + "params": { + "color": "Color in RGB24 format", + "name": "One of the following values: light_icon - Color of the attachment menu icon (light mode) light_text - Color of the attachment menu label, once selected (light mode) dark_icon - Color of the attachment menu icon (dark mode) dark_text - Color of the attachment menu label, once selected (dark mode)" + } + }, + "AttachMenuBots": { + "desc": "Represents a list of bot mini apps that can be launched from the attachment menu \u00bb", + "params": { + "bots": "List of bot mini apps that can be launched from the attachment menu \u00bb", + "hash": "Hash used for caching, for more info click here", + "users": "Info about related users/bots" + } + }, + "AttachMenuBotsBot": { + "desc": "Represents a bot mini app that can be launched from the attachment menu \u00bb", + "params": { + "bot": "Represents a bot mini app that can be launched from the attachment menu \u00bb", + "users": "Info about related users and bots" + } + }, + "AttachMenuBotsNotModified": { + "desc": "The list of bot mini apps hasn't changed", + "params": {} + }, + "AttachMenuPeerTypeBotPM": { + "desc": "The bot attachment menu entry is available in private chats with other bots (excluding the bot that offers the current attachment menu)", + "params": {} + }, + "AttachMenuPeerTypeBroadcast": { + "desc": "The bot attachment menu entry is available in channels", + "params": {} + }, + "AttachMenuPeerTypeChat": { + "desc": "The bot attachment menu entry is available in groups and supergroups", + "params": {} + }, + "AttachMenuPeerTypePM": { + "desc": "The bot attachment menu entry is available in private chats with other users (not bots)", + "params": {} + }, + "AttachMenuPeerTypeSameBotPM": { + "desc": "The bot attachment menu entry is available in the chat with the bot that offers it", + "params": {} + }, + "Authorization": { + "desc": "Logged-in session", + "params": { + "api_id": "API ID", + "app_name": "App name", + "app_version": "App version", + "call_requests_disabled": "Whether this session will accept phone calls", + "country": "Country determined from IP", + "current": "Whether this is the current session", + "date_active": "When was the session last active", + "date_created": "When was the session created", + "device_model": "Device model", + "encrypted_requests_disabled": "Whether this session will accept encrypted chats", + "flags": "Flags, see TL conditional fields", + "hash": "Identifier", + "ip": "Last known IP", + "official_app": "Whether the session is from an official app", + "password_pending": "Whether the session is still waiting for a 2FA password", + "platform": "Platform", + "region": "Region determined from IP", + "system_version": "System version", + "unconfirmed": "Whether the session is unconfirmed, see here \u00bb for more info." + } + }, + "AutoDownloadSettings": { + "desc": "Autodownload settings", + "params": { + "audio_preload_next": "Whether to preload the next audio track when you're listening to music", + "disabled": "Disable automatic media downloads?", + "file_size_max": "Maximum size of other files to preload", + "flags": "Flags, see TL conditional fields", + "large_queue_active_operations_max": "A limit, specifying the maximum number of files that should be downloaded in parallel from the same DC, for files bigger than 20MB.", + "phonecalls_less_data": "Whether to enable data saving mode in phone calls", + "photo_size_max": "Maximum size of photos to preload", + "small_queue_active_operations_max": "A limit, specifying the maximum number of files that should be downloaded in parallel from the same DC, for files smaller than 20MB.", + "stories_preload": "Whether to preload stories; in particular, the first documentAttributeVideo.preload_prefix_size bytes of story videos should be preloaded.", + "video_preload_large": "Whether to preload the first seconds of videos larger than the specified limit", + "video_size_max": "Maximum size of videos to preload", + "video_upload_maxbitrate": "Maximum suggested bitrate for uploading videos" + } + }, + "AutoSaveException": { + "desc": "Peer-specific media autosave settings", + "params": { + "peer": "The peer", + "settings": "Media autosave settings" + } + }, + "AutoSaveSettings": { + "desc": "Media autosave settings", + "params": { + "flags": "Flags, see TL conditional fields", + "photos": "Whether photos should be autosaved to the gallery.", + "video_max_size": "If set, specifies a size limit for autosavable videos", + "videos": "Whether videos should be autosaved to the gallery." + } + }, + "AvailableEffect": { + "desc": "Represents a message effect \u00bb.", + "params": { + "effect_animation_id": "If set, contains the actual animated effect (TGS format \u00bb). If not set, the animated effect must be set equal to the premium animated sticker effect associated to the animated sticker specified in effect_sticker_id (always different from the preview animation, fetched thanks to the videoSize of type f as specified here \u00bb).", + "effect_sticker_id": "Contains the preview animation (TGS format \u00bb), used for the effect selection menu.", + "emoticon": "Emoji corresponding to the effect, to be used as icon for the effect if static_icon_id is not set.", + "flags": "Flags, see TL conditional fields", + "id": "Unique effect ID.", + "premium_required": "Whether a Premium subscription is required to use this effect.", + "static_icon_id": "ID of the document containing the static icon (WEBP) of the effect." + } + }, + "AvailableReaction": { + "desc": "Animations associated with a message reaction", + "params": { + "activate_animation": "The animated sticker to show when the reaction is chosen and activated", + "appear_animation": "The animated sticker to show when the user opens the reaction dropdown", + "around_animation": "The animation that plays around the button when you press an existing reaction (played together with center_icon).", + "center_icon": "The animation of the emoji inside the button when you press an existing reaction (played together with around_animation).", + "effect_animation": "The background effect (still an animated sticker) to play under the activate_animation, when the reaction is chosen and activated", + "flags": "Flags, see TL conditional fields", + "inactive": "If not set, the reaction can be added to new messages and enabled in chats.", + "premium": "Whether this reaction can only be used by Telegram Premium users", + "reaction": "Reaction emoji", + "select_animation": "The animated sticker to show when the user hovers over the reaction", + "static_icon": "Static icon for the reaction", + "title": "Reaction description" + } + }, + "BankCardOpenUrl": { + "desc": "Credit card info URL provided by the bank", + "params": { + "name": "Bank name", + "url": "Info URL" + } + }, + "BaseThemeArctic": { + "desc": "Arctic theme", + "params": {} + }, + "BaseThemeClassic": { + "desc": "Classic theme", + "params": {} + }, + "BaseThemeDay": { + "desc": "Day theme", + "params": {} + }, + "BaseThemeNight": { + "desc": "Night theme", + "params": {} + }, + "BaseThemeTinted": { + "desc": "Tinted theme", + "params": {} + }, + "Birthday": { + "desc": "Birthday information for a user.", + "params": { + "day": "Birth day", + "flags": "Flags, see TL conditional fields", + "month": "Birth month", + "year": "(Optional) birth year." + } + }, + "Boost": { + "desc": "Info about one or more boosts applied by a specific user.", + "params": { + "date": "When was the boost applied", + "expires": "When does the boost expire", + "flags": "Flags, see TL conditional fields", + "gift": "Whether this boost was applied because the channel/supergroup directly gifted a subscription to the user.", + "giveaway": "Whether this boost was applied because the user was chosen in a giveaway started by the channel/supergroup.", + "giveaway_msg_id": "The message ID of the giveaway", + "id": "Unique ID for this set of boosts.", + "multiplier": "If set, this boost counts as multiplier boosts, otherwise it counts as a single boost.", + "stars": "Number of Telegram Stars distributed among the winners of the giveaway.", + "unclaimed": "If set, the user hasn't yet invoked payments.applyGiftCode to claim a subscription gifted directly or in a giveaway by the channel.", + "used_gift_slug": "The created Telegram Premium gift code, only set if either gift or giveaway are set AND it is either a gift code for the currently logged in user or if it was already claimed.", + "user_id": "ID of the user that applied the boost." + } + }, + "BotApp": { + "desc": "Contains information about a direct link Mini App.", + "params": { + "access_hash": "bot mini app access hash", + "description": "bot mini app description.", + "document": "bot mini app animation.", + "flags": "Flags, see TL conditional fields", + "hash": "Hash to pass to messages.getBotApp, to avoid refetching bot app info if it hasn't changed.", + "id": "bot mini app ID", + "photo": "bot mini app photo.", + "short_name": "bot mini app short name, used to generate Direct Mini App deep links.", + "title": "bot mini app title." + } + }, + "BotAppNotModified": { + "desc": "Bot app info hasn't changed.", + "params": {} + }, + "BotAppSettings": { + "desc": "Mini app \u00bb settings", + "params": { + "background_color": "Default light mode background color", + "background_dark_color": "Default dark mode background color", + "flags": "Flags, see TL conditional fields", + "header_color": "Default light mode header color", + "header_dark_color": "Default dark mode header color", + "placeholder_path": "SVG placeholder logo, compressed using the same format used for vector thumbnails \u00bb." + } + }, + "BotBusinessConnection": { + "desc": "Contains info about a bot business connection.", + "params": { + "connection_id": "Business connection ID, used to identify messages coming from the connection and to reply to them as specified here \u00bb.", + "date": "When was the connection created.", + "dc_id": "ID of the datacenter where to send queries wrapped in a invokeWithBusinessConnection as specified here \u00bb.", + "disabled": "Whether this business connection is currently disabled", + "flags": "Flags, see TL conditional fields", + "rights": "Business bot rights.", + "user_id": "ID of the user that the bot is connected to via this connection." + } + }, + "BotCommand": { + "desc": "Describes a bot command that can be used in a chat", + "params": { + "command": "/command name", + "description": "Description of the command" + } + }, + "BotCommandScopeChatAdmins": { + "desc": "The specified bot commands will be valid only for chat administrators, in all groups and supergroups.", + "params": {} + }, + "BotCommandScopeChats": { + "desc": "The specified bot commands will be valid in all groups and supergroups.", + "params": {} + }, + "BotCommandScopeDefault": { + "desc": "The commands will be valid in all dialogs", + "params": {} + }, + "BotCommandScopePeer": { + "desc": "The specified bot commands will be valid only in a specific dialog.", + "params": { + "peer": "The dialog" + } + }, + "BotCommandScopePeerAdmins": { + "desc": "The specified bot commands will be valid for all admins of the specified group or supergroup.", + "params": { + "peer": "The chat" + } + }, + "BotCommandScopePeerUser": { + "desc": "The specified bot commands will be valid only for a specific user in the specified group or supergroup.", + "params": { + "peer": "The chat", + "user_id": "The user" + } + }, + "BotCommandScopeUsers": { + "desc": "The specified bot commands will only be valid in all private chats with users.", + "params": {} + }, + "BotInfo": { + "desc": "Info about bots (available bot commands, etc)", + "params": { + "app_settings": "Mini app \u00bb settings", + "commands": "Bot commands that can be used in the chat", + "description": "Description of the bot", + "description_document": "Description animation in MPEG4 format", + "description_photo": "Description photo", + "flags": "Flags, see TL conditional fields", + "has_preview_medias": "If set, the bot has some preview medias for the configured Main Mini App, see here \u00bb for more info on Main Mini App preview medias.", + "menu_button": "Indicates the action to execute when pressing the in-UI menu button for bots", + "privacy_policy_url": "The HTTP link to the privacy policy of the bot. If not set, then the /privacy command must be used, if supported by the bot (i.e. if it's present in the commands vector). If it isn't supported, then https://telegram.org/privacy-tpa must be opened, instead.", + "user_id": "ID of the bot", + "verifier_settings": "This bot can verify peers: this field contains more info about the verification the bot can assign to peers." + } + }, + "BotInlineMediaResult": { + "desc": "Media result", + "params": { + "description": "Description", + "document": "If type is document, the document to send", + "flags": "Flags, see TL conditional fields", + "id": "Result ID", + "photo": "If type is photo, the photo to send", + "send_message": "Depending on the type and on the constructor, contains the caption of the media or the content of the message to be sent instead of the media", + "title": "Result title", + "type": "Result type (see bot API docs)" + } + }, + "BotInlineMessageMediaAuto": { + "desc": "Send whatever media is attached to the botInlineMediaResult", + "params": { + "entities": "Message entities for styled text", + "flags": "Flags, see TL conditional fields", + "invert_media": "If set, any eventual webpage preview will be shown on top of the message instead of at the bottom.", + "message": "Caption", + "reply_markup": "Inline keyboard" + } + }, + "BotInlineMessageMediaContact": { + "desc": "Send a contact", + "params": { + "first_name": "First name", + "flags": "Flags, see TL conditional fields", + "last_name": "Last name", + "phone_number": "Phone number", + "reply_markup": "Inline keyboard", + "vcard": "VCard info" + } + }, + "BotInlineMessageMediaGeo": { + "desc": "Send a geolocation", + "params": { + "flags": "Flags, see TL conditional fields", + "geo": "Geolocation", + "heading": "For live locations, a direction in which the location moves, in degrees; 1-360.", + "period": "Validity period", + "proximity_notification_radius": "For live locations, a maximum distance to another chat member for proximity alerts, in meters (0-100000).", + "reply_markup": "Inline keyboard" + } + }, + "BotInlineMessageMediaInvoice": { + "desc": "Send an invoice", + "params": { + "currency": "Three-letter ISO 4217 currency code, or XTR for Telegram Stars.", + "description": "Product description, 1-255 characters", + "flags": "Flags, see TL conditional fields", + "photo": "Product photo", + "reply_markup": "Inline keyboard", + "shipping_address_requested": "Set this flag if you require the user's shipping address to complete the order", + "test": "Test invoice", + "title": "Product name, 1-32 characters", + "total_amount": "Total price in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies)." + } + }, + "BotInlineMessageMediaVenue": { + "desc": "Send a venue", + "params": { + "address": "Address", + "flags": "Flags, see TL conditional fields", + "geo": "Geolocation of venue", + "provider": "Venue provider: currently only \"foursquare\" and \"gplaces\" (Google Places) need to be supported", + "reply_markup": "Inline keyboard", + "title": "Venue name", + "venue_id": "Venue ID in the provider's database", + "venue_type": "Venue type in the provider's database" + } + }, + "BotInlineMessageMediaWebPage": { + "desc": "Specifies options that must be used to generate the link preview for the message, or even a standalone link preview without an attached message.", + "params": { + "entities": "Message entities for styled text", + "flags": "Flags, see TL conditional fields", + "force_large_media": "If set, specifies that a large media preview should be used.", + "force_small_media": "If set, specifies that a small media preview should be used.", + "invert_media": "If set, any eventual webpage preview will be shown on top of the message instead of at the bottom.", + "manual": "If set, indicates that the URL used for the webpage preview was specified manually using inputMediaWebPage, and may not be related to any of the URLs specified in the message.", + "message": "The message, can be empty.", + "reply_markup": "Reply markup for sending bot buttons", + "safe": "If set, the link can be opened directly without user confirmation.", + "url": "The URL to use for the link preview." + } + }, + "BotInlineMessageText": { + "desc": "Send a simple text message", + "params": { + "entities": "Message entities for styled text", + "flags": "Flags, see TL conditional fields", + "invert_media": "If set, any eventual webpage preview will be shown on top of the message instead of at the bottom.", + "message": "The message", + "no_webpage": "Disable webpage preview", + "reply_markup": "Inline keyboard" + } + }, + "BotInlineResult": { + "desc": "Generic result", + "params": { + "content": "Content of the result", + "description": "Result description", + "flags": "Flags, see TL conditional fields", + "id": "Result ID", + "send_message": "Message to send", + "thumb": "Thumbnail for the result", + "title": "Result title", + "type": "Result type (see bot API docs)", + "url": "URL of article or webpage" + } + }, + "BotMenuButton": { + "desc": "Bot menu button that opens a web app when clicked.", + "params": { + "text": "Title to be displayed on the menu button instead of 'Menu'", + "url": "URL of a web app to open when the user clicks on the button" + } + }, + "BotMenuButtonCommands": { + "desc": "Bot menu button that opens the bot command list when clicked.", + "params": {} + }, + "BotMenuButtonDefault": { + "desc": "Placeholder bot menu button never returned to users: see the docs for more info.", + "params": {} + }, + "BotPreviewMedia": { + "desc": "Represents a Main Mini App preview media, see here \u00bb for more info.", + "params": { + "date": "When was this media last updated.", + "media": "The actual photo/video." + } + }, + "BotVerification": { + "desc": "Describes a bot verification icon \u00bb.", + "params": { + "bot_id": "ID of the bot that verified this peer", + "description": "Verification description", + "icon": "Verification icon" + } + }, + "BotVerifierSettings": { + "desc": "Info about the current verifier bot \u00bb.", + "params": { + "can_modify_custom_description": "Indicates whether the bot is allowed to set a custom description field for individual verified peers, different from the custom_description provided here.", + "company": "The name of the organization that provides the verification", + "custom_description": "An optional default description for the verification", + "flags": "Flags, see TL conditional fields", + "icon": "Verification icon" + } + }, + "BusinessAwayMessage": { + "desc": "Describes a Telegram Business away message, automatically sent to users writing to us when we're offline, during closing hours, while we're on vacation, or in some other custom time period when we cannot immediately answer to the user.", + "params": { + "flags": "Flags, see TL conditional fields", + "offline_only": "If set, the messages will not be sent if the account was online in the last 10 minutes.", + "recipients": "Allowed recipients for the away messages.", + "schedule": "Specifies when should the away messages be sent.", + "shortcut_id": "ID of a quick reply shorcut, containing the away messages to send, see here \u00bb for more info." + } + }, + "BusinessAwayMessageScheduleAlways": { + "desc": "Always send Telegram Business away messages to users writing to us in private.", + "params": {} + }, + "BusinessAwayMessageScheduleCustom": { + "desc": "Send Telegram Business away messages to users writing to us in private in the specified time span.", + "params": { + "end_date": "End date (UNIX timestamp).", + "start_date": "Start date (UNIX timestamp)." + } + }, + "BusinessAwayMessageScheduleOutsideWorkHours": { + "desc": "Send Telegram Business away messages to users writing to us in private outside of the configured Telegram Business working hours.", + "params": {} + }, + "BusinessBotRecipients": { + "desc": "Specifies the private chats that a connected business bot \u00bb may receive messages and interact with.", + "params": { + "contacts": "Selects all private chats with contacts.", + "exclude_selected": "If set, then all private chats except the ones selected by existing_chats, new_chats, contacts, non_contacts and users are chosen. Note that if this flag is set, any values passed in exclude_users will be merged and moved into users by the server, thus exclude_users will always be empty.", + "exclude_users": "Identifiers of private chats that are always excluded.", + "existing_chats": "Selects all existing private chats.", + "flags": "Flags, see TL conditional fields", + "new_chats": "Selects all new private chats.", + "non_contacts": "Selects all private chats with non-contacts.", + "users": "Explicitly selected private chats." + } + }, + "BusinessBotRights": { + "desc": "Business bot rights.", + "params": { + "change_gift_settings": "Whether the bot can change the privacy settings pertaining to gifts for the business account.", + "delete_received_messages": "Whether the bot can delete received private messages in managed chats.", + "delete_sent_messages": "Whether the bot can delete messages sent by the bot.", + "edit_bio": "Whether the bot can edit the bio of the business account.", + "edit_name": "Whether the bot can edit the first and last name of the business account.", + "edit_profile_photo": "Whether the bot can edit the profile photo of the business account.", + "edit_username": "Whether the bot can edit the username of the business account.", + "flags": "Flags, see TL conditional fields", + "manage_stories": "Whether the bot can post, edit and delete stories on behalf of the business account.", + "read_messages": "Whether the bot can mark incoming private messages as read.", + "reply": "Whether the bot can send and edit messages in private chats that had incoming messages in the last 24 hours.", + "sell_gifts": "Whether the bot can convert regular gifts owned by the business account to Telegram Stars.", + "transfer_and_upgrade_gifts": "Whether the bot can transfer and upgrade gifts owned by the business account.", + "transfer_stars": "Whether the bot can transfer Telegram Stars received by the business account to its own account, or use them to upgrade and transfer gifts.", + "view_gifts": "Whether the bot can view gifts and the amount of Telegram Stars owned by the business account." + } + }, + "BusinessChatLink": { + "desc": "Contains info about a business chat deep link \u00bb created by the current account.", + "params": { + "entities": "Message entities for styled text", + "flags": "Flags, see TL conditional fields", + "link": "Business chat deep link.", + "message": "Message to pre-fill in the message input field.", + "title": "Human-readable name of the link, to simplify management in the UI (only visible to the creator of the link).", + "views": "Number of times the link was resolved (clicked/scanned/etc...)." + } + }, + "BusinessGreetingMessage": { + "desc": "Describes a Telegram Business greeting, automatically sent to new users writing to us in private for the first time, or after a certain inactivity period.", + "params": { + "no_activity_days": "The number of days after which a private chat will be considered as inactive; currently, must be one of 7, 14, 21, or 28.", + "recipients": "Allowed recipients for the greeting messages.", + "shortcut_id": "ID of a quick reply shorcut, containing the greeting messages to send, see here \u00bb for more info." + } + }, + "BusinessIntro": { + "desc": "Telegram Business introduction \u00bb.", + "params": { + "description": "Profile introduction (max intro_description_length_limit \u00bb UTF-8 characters).", + "flags": "Flags, see TL conditional fields", + "sticker": "Optional introduction sticker.", + "title": "Title of the introduction message (max intro_title_length_limit \u00bb UTF-8 characters)." + } + }, + "BusinessLocation": { + "desc": "Represents the location of a Telegram Business \u00bb.", + "params": { + "address": "Textual description of the address (mandatory).", + "flags": "Flags, see TL conditional fields", + "geo_point": "Geographical coordinates (optional)." + } + }, + "BusinessRecipients": { + "desc": "Specifies the chats that can receive Telegram Business away \u00bb and greeting \u00bb messages.", + "params": { + "contacts": "All private chats with contacts.", + "exclude_selected": "If set, inverts the selection.", + "existing_chats": "All existing private chats.", + "flags": "Flags, see TL conditional fields", + "new_chats": "All new private chats.", + "non_contacts": "All private chats with non-contacts.", + "users": "Only private chats with the specified users." + } + }, + "BusinessWeeklyOpen": { + "desc": "A time interval, indicating the opening hours of a business.", + "params": { + "end_minute": "End minute in minutes of the week, 1 to 8*24*60 inclusively (8 and not 7 because this allows to specify intervals that, for example, start on Sunday 21:00 and end on Monday 04:00 (6*24*60+21*60 to 7*24*60+4*60) without passing an invalid end_minute < start_minute). See here \u00bb for more info.", + "start_minute": "Start minute in minutes of the week, 0 to 7*24*60 inclusively." + } + }, + "BusinessWorkHours": { + "desc": "Specifies a set of Telegram Business opening hours.", + "params": { + "flags": "Flags, see TL conditional fields", + "open_now": "Ignored if set while invoking account.updateBusinessWorkHours, only returned by the server in userFull.business_work_hours, indicating whether the business is currently open according to the current time and the values in weekly_open and timezone.", + "timezone_id": "An ID of one of the timezones returned by help.getTimezonesList. The timezone ID is contained timezone.id, a human-readable, localized name of the timezone is available in timezone.name and the timezone.utc_offset field contains the UTC offset in seconds, which may be displayed in hh:mm format by the client together with the human-readable name (i.e. $name UTC -01:00).", + "weekly_open": "A list of time intervals (max 28) represented by businessWeeklyOpen \u00bb, indicating the opening hours of their business." + } + }, + "CdnConfig": { + "desc": "Configuration for CDN file downloads.", + "params": { + "public_keys": "Vector of public keys to use only during handshakes to CDN DCs." + } + }, + "CdnPublicKey": { + "desc": "Public key to use only during handshakes to CDN DCs.", + "params": { + "dc_id": "CDN DC ID", + "public_key": "RSA public key" + } + }, + "Channel": { + "desc": "Channel/supergroup info", + "params": { + "access_hash": "Access hash, see here \u00bb for more info", + "admin_rights": "Admin rights of the user in this channel (see rights)", + "autotranslation": "If set, autotranslation was enabled for all users by the admin of the channel, as specified here \u00bb.", + "banned_rights": "Banned rights of the user in this channel (see rights)", + "bot_verification_icon": "Describes a bot verification icon \u00bb.", + "broadcast": "Is this a channel?", + "broadcast_messages_allowed": "If set, this channel has an associated monoforum \u00bb, and its ID is specified in the linked_monoforum_id flag.", + "call_active": "Whether a group call or livestream is currently active", + "call_not_empty": "Whether there's anyone in the group call or livestream", + "color": "The channel's accent color.", + "creator": "Whether the current user is the creator of this channel", + "date": "Date when the user joined the supergroup/channel, or if the user isn't a member, its creation date", + "default_banned_rights": "Default chat rights (see rights)", + "emoji_status": "Emoji status", + "fake": "If set, this supergroup/channel was reported by many users as a fake or scam: be careful when interacting with it. Changes to this flag should invalidate the local channelFull cache for this channel/supergroup ID, see here \u00bb for more info.", + "flags": "Flags, see TL conditional fields", + "flags2": "Flags, see TL conditional fields", + "forum": "Whether this supergroup is a forum. Changes to this flag should invalidate the local channelFull cache for this channel/supergroup ID, see here \u00bb for more info.", + "forum_tabs": "If set, enables the tabbed forum UI \u00bb.", + "gigagroup": "Whether this supergroup is a gigagroupChanges to this flag should invalidate the local channelFull cache for this channel/supergroup ID, see here \u00bb for more info.", + "has_geo": "Whether this chanel has a geoposition", + "has_link": "Whether this channel has a linked discussion group \u00bb (or this supergroup is a channel's discussion group). The actual ID of the linked channel/supergroup is contained in channelFull.linked_chat_id. Changes to this flag should invalidate the local channelFull cache for this channel/supergroup ID, see here \u00bb for more info.", + "id": "ID of the channel, see here \u00bb for more info and the available ID range.", + "join_request": "Whether a user's join request will have to be approved by administrators, toggle using channels.toggleJoinToSendChanges to this flag should invalidate the local channelFull cache for this channel/supergroup ID, see here \u00bb for more info.", + "join_to_send": "Whether a user needs to join the supergroup before they can send messages: can be false only for discussion groups \u00bb, toggle using channels.toggleJoinToSendChanges to this flag should invalidate the local channelFull cache for this channel/supergroup ID, see here \u00bb for more info.", + "left": "Whether the current user has left or is not a member of this channel", + "level": "Boost level. Changes to this flag should invalidate the local channelFull cache for this channel/supergroup ID, see here \u00bb for more info.", + "linked_monoforum_id": "For channels with associated monoforums, the monoforum ID. For Monoforums, the ID of the associated channel.", + "megagroup": "Is this a supergroup? Changes to this flag should invalidate the local channelFull cache for this channel/supergroup ID, see here \u00bb for more info.", + "min": "See min", + "monoforum": "If set, this is a monoforum \u00bb, and the ID of the associated channel is specified in the linked_monoforum_id.", + "noforwards": "Whether this channel or group is protected, thus does not allow forwarding messages from it", + "participants_count": "Participant count", + "photo": "Profile photo", + "profile_color": "The channel's profile color.", + "restricted": "Whether viewing/writing in this channel for a reason (see restriction_reason)", + "restriction_reason": "Contains the reason why access to this channel must be restricted. Changes to this flag should invalidate the local channelFull cache for this channel/supergroup ID, see here \u00bb for more info.", + "scam": "This channel/supergroup is probably a scam Changes to this flag should invalidate the local channelFull cache for this channel/supergroup ID, see here \u00bb for more info.", + "send_paid_messages_stars": "If set, this supergroup or monoforum has enabled paid messages \u00bb, we might need to pay the specified amount of Stars to send messages to it, depending on the configured exceptions: check channelFull.send_paid_messages_stars to see if the currently logged in user actually has to pay or not, see here \u00bb for the full flow (only set for the monoforum, not the associated channel).", + "signature_profiles": "If set, messages sent by admins to this channel will link to the admin's profile (just like with groups).", + "signatures": "Whether signatures are enabled (channels)", + "slowmode_enabled": "Whether slow mode is enabled for groups to prevent flood in chat. Changes to this flag should invalidate the local channelFull cache for this channel/supergroup ID, see here \u00bb for more info.", + "stories_hidden": "Whether we have hidden all stories posted by this channel \u00bb.", + "stories_hidden_min": "If set, indicates that the stories_hidden flag was not populated, and its value must cannot be relied on; use the previously cached value, or re-fetch the constructor using channels.getChannels to obtain the latest value of the stories_hidden flag.", + "stories_max_id": "ID of the maximum read story.", + "stories_unavailable": "No stories from the channel are visible.", + "subscription_until_date": "Expiration date of the Telegram Star subscription \u00bb the current user has bought to gain access to this channel.", + "title": "Title", + "username": "Main active username.", + "usernames": "Additional usernames", + "verified": "Is this channel verified by telegram?" + } + }, + "ChannelAdminLogEvent": { + "desc": "Admin log event", + "params": { + "action": "Action", + "date": "Date", + "id": "Event ID", + "user_id": "User ID" + } + }, + "ChannelAdminLogEventActionChangeAbout": { + "desc": "The description was changed", + "params": { + "new_value": "New description", + "prev_value": "Previous description" + } + }, + "ChannelAdminLogEventActionChangeAvailableReactions": { + "desc": "The set of allowed message reactions \u00bb for this channel has changed", + "params": { + "new_value": "New allowed reaction emojis", + "prev_value": "Previously allowed reaction emojis" + } + }, + "ChannelAdminLogEventActionChangeEmojiStatus": { + "desc": "The emoji status was changed", + "params": { + "new_value": "New emoji status", + "prev_value": "Previous emoji status" + } + }, + "ChannelAdminLogEventActionChangeEmojiStickerSet": { + "desc": "The supergroup's custom emoji stickerset was changed.", + "params": { + "new_stickerset": "New value", + "prev_stickerset": "Old value" + } + }, + "ChannelAdminLogEventActionChangeHistoryTTL": { + "desc": "The Time-To-Live of messages in this chat was changed", + "params": { + "new_value": "New value", + "prev_value": "Previous value" + } + }, + "ChannelAdminLogEventActionChangeLinkedChat": { + "desc": "The linked chat was changed", + "params": { + "new_value": "New linked chat", + "prev_value": "Previous linked chat" + } + }, + "ChannelAdminLogEventActionChangeLocation": { + "desc": "The geogroup location was changed", + "params": { + "new_value": "New location", + "prev_value": "Previous location" + } + }, + "ChannelAdminLogEventActionChangePeerColor": { + "desc": "The message accent color was changed", + "params": { + "new_value": "New accent palette", + "prev_value": "Previous accent palette" + } + }, + "ChannelAdminLogEventActionChangePhoto": { + "desc": "The channel/supergroup's picture was changed", + "params": { + "new_photo": "New picture", + "prev_photo": "Previous picture" + } + }, + "ChannelAdminLogEventActionChangeProfilePeerColor": { + "desc": "The profile accent color was changed", + "params": { + "new_value": "New accent palette", + "prev_value": "Previous accent palette" + } + }, + "ChannelAdminLogEventActionChangeStickerSet": { + "desc": "The supergroup's stickerset was changed", + "params": { + "new_stickerset": "New stickerset", + "prev_stickerset": "Previous stickerset" + } + }, + "ChannelAdminLogEventActionChangeTheme": { + "desc": "The chat theme was changed", + "params": { + "new_value": "New theme emoji", + "prev_value": "Previous theme emoji" + } + }, + "ChannelAdminLogEventActionChangeTitle": { + "desc": "Channel/supergroup title was changed", + "params": { + "new_value": "New title", + "prev_value": "Previous title" + } + }, + "ChannelAdminLogEventActionChangeUsername": { + "desc": "Channel/supergroup username was changed", + "params": { + "new_value": "New username", + "prev_value": "Old username" + } + }, + "ChannelAdminLogEventActionChangeUsernames": { + "desc": "The list of usernames associated with the channel was changed", + "params": { + "new_value": "New set of usernames", + "prev_value": "Previous set of usernames" + } + }, + "ChannelAdminLogEventActionChangeWallpaper": { + "desc": "The wallpaper was changed", + "params": { + "new_value": "New wallpaper", + "prev_value": "Previous wallpaper" + } + }, + "ChannelAdminLogEventActionCreateTopic": { + "desc": "A forum topic was created", + "params": { + "topic": "The forum topic that was created" + } + }, + "ChannelAdminLogEventActionDefaultBannedRights": { + "desc": "The default banned rights were modified", + "params": { + "new_banned_rights": "New global banned rights.", + "prev_banned_rights": "Previous global banned rights" + } + }, + "ChannelAdminLogEventActionDeleteMessage": { + "desc": "A message was deleted", + "params": { + "message": "The message that was deleted" + } + }, + "ChannelAdminLogEventActionDeleteTopic": { + "desc": "A forum topic was deleted", + "params": { + "topic": "The forum topic that was deleted" + } + }, + "ChannelAdminLogEventActionDiscardGroupCall": { + "desc": "A group call was terminated", + "params": { + "call": "The group call that was terminated" + } + }, + "ChannelAdminLogEventActionEditMessage": { + "desc": "A message was edited", + "params": { + "new_message": "New message", + "prev_message": "Old message" + } + }, + "ChannelAdminLogEventActionEditTopic": { + "desc": "A forum topic was edited", + "params": { + "new_topic": "New topic information", + "prev_topic": "Previous topic information" + } + }, + "ChannelAdminLogEventActionExportedInviteDelete": { + "desc": "A chat invite was deleted", + "params": { + "invite": "The deleted chat invite" + } + }, + "ChannelAdminLogEventActionExportedInviteEdit": { + "desc": "A chat invite was edited", + "params": { + "new_invite": "New chat invite information", + "prev_invite": "Previous chat invite information" + } + }, + "ChannelAdminLogEventActionExportedInviteRevoke": { + "desc": "A specific invite link was revoked", + "params": { + "invite": "The invite link that was revoked" + } + }, + "ChannelAdminLogEventActionParticipantInvite": { + "desc": "A user was invited to the group", + "params": { + "participant": "The user that was invited" + } + }, + "ChannelAdminLogEventActionParticipantJoin": { + "desc": "A user has joined the group (in the case of big groups, info of the user that has joined isn't shown)", + "params": {} + }, + "ChannelAdminLogEventActionParticipantJoinByInvite": { + "desc": "A user joined the supergroup/channel using a specific invite link", + "params": { + "flags": "Flags, see TL conditional fields", + "invite": "The invite link used to join the supergroup/channel", + "via_chatlist": "The participant joined by importing a chat folder deep link \u00bb." + } + }, + "ChannelAdminLogEventActionParticipantJoinByRequest": { + "desc": "A new member was accepted to the chat by an admin", + "params": { + "approved_by": "ID of the admin that approved the invite", + "invite": "The invite link that was used to join the chat" + } + }, + "ChannelAdminLogEventActionParticipantLeave": { + "desc": "A user left the channel/supergroup (in the case of big groups, info of the user that has joined isn't shown)", + "params": {} + }, + "ChannelAdminLogEventActionParticipantMute": { + "desc": "A group call participant was muted", + "params": { + "participant": "The participant that was muted" + } + }, + "ChannelAdminLogEventActionParticipantSubExtend": { + "desc": "A paid subscriber has extended their Telegram Star subscription \u00bb.", + "params": { + "new_participant": "The subscriber that extended the subscription.", + "prev_participant": "Same as new_participant." + } + }, + "ChannelAdminLogEventActionParticipantToggleAdmin": { + "desc": "The admin rights of a user were changed", + "params": { + "new_participant": "New admin rights", + "prev_participant": "Previous admin rights" + } + }, + "ChannelAdminLogEventActionParticipantToggleBan": { + "desc": "The banned rights of a user were changed", + "params": { + "new_participant": "New banned rights of user", + "prev_participant": "Old banned rights of user" + } + }, + "ChannelAdminLogEventActionParticipantUnmute": { + "desc": "A group call participant was unmuted", + "params": { + "participant": "The participant that was unmuted" + } + }, + "ChannelAdminLogEventActionParticipantVolume": { + "desc": "channelAdminLogEvent.user_id has set the volume of participant.peer to participant.volume", + "params": { + "participant": "The participant whose volume was changed" + } + }, + "ChannelAdminLogEventActionPinTopic": { + "desc": "A forum topic was pinned or unpinned", + "params": { + "flags": "Flags, see TL conditional fields", + "new_topic": "New topic information", + "prev_topic": "Previous topic information" + } + }, + "ChannelAdminLogEventActionSendMessage": { + "desc": "A message was posted in a channel", + "params": { + "message": "The message that was sent" + } + }, + "ChannelAdminLogEventActionStartGroupCall": { + "desc": "A group call was started", + "params": { + "call": "Group call" + } + }, + "ChannelAdminLogEventActionStopPoll": { + "desc": "A poll was stopped", + "params": { + "message": "The poll that was stopped" + } + }, + "ChannelAdminLogEventActionToggleAntiSpam": { + "desc": "Native antispam functionality was enabled or disabled.", + "params": { + "new_value": "Whether antispam functionality was enabled or disabled." + } + }, + "ChannelAdminLogEventActionToggleAutotranslation": { + "desc": "Channel autotranslation was toggled \u00bb.", + "params": { + "new_value": "New value of the toggle" + } + }, + "ChannelAdminLogEventActionToggleForum": { + "desc": "Forum functionality was enabled or disabled.", + "params": { + "new_value": "Whether forum functionality was enabled or disabled." + } + }, + "ChannelAdminLogEventActionToggleGroupCallSetting": { + "desc": "Group call settings were changed", + "params": { + "join_muted": "Whether all users are muted by default upon joining" + } + }, + "ChannelAdminLogEventActionToggleInvites": { + "desc": "Invites were enabled/disabled", + "params": { + "new_value": "New value" + } + }, + "ChannelAdminLogEventActionToggleNoForwards": { + "desc": "Forwards were enabled or disabled", + "params": { + "new_value": "Old value" + } + }, + "ChannelAdminLogEventActionTogglePreHistoryHidden": { + "desc": "The hidden prehistory setting was changed", + "params": { + "new_value": "New value" + } + }, + "ChannelAdminLogEventActionToggleSignatureProfiles": { + "desc": "Channel signature profiles were enabled/disabled.", + "params": { + "new_value": "New value" + } + }, + "ChannelAdminLogEventActionToggleSignatures": { + "desc": "Channel signatures were enabled/disabled", + "params": { + "new_value": "New value" + } + }, + "ChannelAdminLogEventActionToggleSlowMode": { + "desc": "Slow mode setting for supergroups was changed", + "params": { + "new_value": "New slow mode value", + "prev_value": "Previous slow mode value" + } + }, + "ChannelAdminLogEventActionUpdatePinned": { + "desc": "A message was pinned", + "params": { + "message": "The message that was pinned" + } + }, + "ChannelAdminLogEventsFilter": { + "desc": "Filter only certain admin log events", + "params": { + "ban": "Ban events", + "delete": "Message deletion events", + "demote": "Admin demotion events", + "edit": "Message edit events", + "flags": "Flags, see TL conditional fields", + "forums": "Forum-related events", + "group_call": "Group call events", + "info": "Info change events (when about, linked chat, location, photo, stickerset, title or username, slowmode, history TTL settings of a channel gets modified)", + "invite": "Invite events", + "invites": "Invite events", + "join": "Join events, including joins using invite links and join requests.", + "kick": "Kick events", + "leave": "Leave events", + "pinned": "Message pin events", + "promote": "Admin promotion events", + "send": "A message was posted in a channel", + "settings": "Settings change events (invites, hidden prehistory, signatures, default banned rights, forum toggle events)", + "sub_extend": "Telegram Star subscription extension events \u00bb", + "unban": "Unban events", + "unkick": "Unkick events" + } + }, + "ChannelForbidden": { + "desc": "Indicates a channel/supergroup we can't access because we were banned, or for some other reason.", + "params": { + "access_hash": "Access hash", + "broadcast": "Is this a channel", + "flags": "Flags, see TL conditional fields", + "id": "Channel ID", + "megagroup": "Is this a supergroup", + "title": "Title", + "until_date": "The ban is valid until the specified date" + } + }, + "ChannelFull": { + "desc": "Full info about a channel, supergroup or gigagroup.", + "params": { + "about": "Info about the channel", + "admins_count": "Number of channel admins", + "antispam": "Whether native antispam functionality is enabled in this supergroup.", + "available_min_id": "Identifier of a maximum unavailable message in a channel due to hidden history.", + "available_reactions": "Allowed message reactions \u00bb", + "banned_count": "Number of users banned from the channel", + "blocked": "Whether any anonymous admin of this supergroup was blocked: if set, you won't receive messages from anonymous group admins in discussion replies via @replies", + "boosts_applied": "The number of boosts the current user has applied to the current supergroup.", + "boosts_unrestrict": "The number of boosts this supergroup requires to bypass slowmode and other restrictions, see here \u00bb for more info.", + "bot_info": "Info about bots in the channel/supergroup", + "bot_verification": "Bot verification icon", + "call": "Livestream or group call information", + "can_delete_channel": "Can we delete this channel?", + "can_set_location": "Can we set the geolocation of this group (for geogroups)", + "can_set_stickers": "Can we associate a stickerpack to the supergroup?", + "can_set_username": "Can we set the channel's username?", + "can_view_participants": "Can we view the participant list?", + "can_view_revenue": "If set, this user can view ad revenue statistics \u00bb for this channel.", + "can_view_stars_revenue": "If set, this user can view Telegram Star revenue statistics \u00bb for this channel.", + "can_view_stats": "Can the user view channel/supergroup statistics", + "chat_photo": "Channel picture", + "default_send_as": "Default peer used for sending messages to this channel", + "emojiset": "Custom emoji stickerset associated to the current supergroup, set using channels.setEmojiStickers after reaching the appropriate boost level, see here \u00bb for more info.", + "exported_invite": "Invite link", + "flags": "Flags, see TL conditional fields", + "flags2": "Flags, see TL conditional fields", + "folder_id": "Peer folder ID, for more info click here", + "groupcall_default_join_as": "When using phone.getGroupCallJoinAs to get a list of peers that can be used to join a group call, this field indicates the peer that should be selected by default.", + "has_scheduled": "Whether scheduled messages are available", + "hidden_prehistory": "Is the history before we joined hidden to us?", + "id": "ID of the channel", + "kicked_count": "Number of users kicked from the channel", + "linked_chat_id": "ID of the linked discussion chat for channels (and vice versa, the ID of the linked channel for discussion chats).", + "location": "Location of the geogroup", + "main_tab": "The main tab for the channel's profile, see here \u00bb for more info.", + "migrated_from_chat_id": "The chat ID from which this group was migrated", + "migrated_from_max_id": "The message ID in the original chat at which this group was migrated", + "notify_settings": "Notification settings", + "online_count": "Number of users currently online", + "paid_media_allowed": "Whether the current user can send or forward paid media \u00bb to this channel.", + "paid_messages_available": "If set, admins may enable enable paid messages \u00bb in this supergroup.", + "paid_reactions_available": "If set, users may send paid Telegram Star reactions \u00bb to messages of this channel.", + "participants_count": "Number of participants of the channel", + "participants_hidden": "Whether the participant list is hidden.", + "pending_suggestions": "A list of suggested actions for the supergroup admin, see here for more info \u00bb.", + "pinned_msg_id": "Message ID of the last pinned message", + "pts": "Latest PTS for this channel", + "reactions_limit": "This flag may be used to impose a custom limit of unique reactions (i.e. a customizable version of appConfig.reactions_uniq_max).", + "read_inbox_max_id": "Position up to which all incoming messages are read.", + "read_outbox_max_id": "Position up to which all outgoing messages are read.", + "recent_requesters": "IDs of users who requested to join recently", + "requests_pending": "Pending join requests \u00bb", + "restricted_sponsored": "Whether ads on this channel were disabled as specified here \u00bb (this flag is only visible to the owner of the channel).", + "send_paid_messages_stars": "If set and bigger than 0, this supergroup, monoforum or the monoforum associated to this channel has enabled paid messages \u00bb and we must pay the specified amount of Stars to send messages to it, see here \u00bb for the full flow. This flag will be set both for the monoforum and for channelFull of the associated channel). If set and equal to 0, the monoforum requires payment in general but we were exempted from paying.", + "slowmode_next_send_date": "Indicates when the user will be allowed to send another message in the supergroup (unixtime)", + "slowmode_seconds": "If specified, users in supergroups will only be able to send one message every slowmode_seconds seconds", + "stargifts_available": "If set, users may send Gifts \u00bb to this channel.", + "stargifts_count": "Admins with chatAdminRights.post_messages rights will see the total number of received gifts, everyone else will see the number of gifts added to the channel's profile.", + "stats_dc": "If set, specifies the DC to use for fetching channel statistics", + "stickerset": "Associated stickerset", + "stories": "Channel stories", + "stories_pinned_available": "Whether this user has some pinned stories.", + "theme_emoticon": "Emoji representing a specific chat theme", + "translations_disabled": "Whether the real-time chat translation popup should be hidden.", + "ttl_period": "Time-To-Live of messages in this channel or supergroup", + "unread_count": "Count of unread messages", + "view_forum_as_messages": "Users may also choose to display messages from all topics of a forum as if they were sent to a normal group, using a \"View as messages\" setting in the local client. This setting only affects the current account, and is synced to other logged in sessions using the channels.toggleViewForumAsMessages method; invoking this method will update the value of this flag.", + "wallpaper": "Wallpaper" + } + }, + "ChannelLocation": { + "desc": "Geographical location of supergroup (geogroups)", + "params": { + "address": "Textual description of the address", + "geo_point": "Geographical location of supergroup" + } + }, + "ChannelLocationEmpty": { + "desc": "No location (normal supergroup)", + "params": {} + }, + "ChannelMessagesFilter": { + "desc": "Filter for getting only certain types of channel messages", + "params": { + "exclude_new_messages": "Whether to exclude new messages from the search", + "flags": "Flags, see TL conditional fields", + "ranges": "A range of messages to fetch" + } + }, + "ChannelMessagesFilterEmpty": { + "desc": "No filter", + "params": {} + }, + "ChannelParticipant": { + "desc": "Channel/supergroup participant", + "params": { + "date": "Date joined", + "flags": "Flags, see TL conditional fields", + "subscription_until_date": "If set, contains the expiration date of the current Telegram Star subscription period \u00bb for the specified participant.", + "user_id": "Participant user ID" + } + }, + "ChannelParticipantAdmin": { + "desc": "Admin", + "params": { + "admin_rights": "Admin rights", + "can_edit": "Can this admin promote other admins with the same permissions?", + "date": "When did the user join", + "flags": "Flags, see TL conditional fields", + "inviter_id": "User that invited the admin to the channel/group", + "promoted_by": "User that promoted the user to admin", + "rank": "The role (rank) of the admin in the group: just an arbitrary string, admin by default", + "self": "Is this the current user", + "user_id": "Admin user ID" + } + }, + "ChannelParticipantBanned": { + "desc": "Banned/kicked user", + "params": { + "banned_rights": "Banned rights", + "date": "When did the user join the group", + "flags": "Flags, see TL conditional fields", + "kicked_by": "User was kicked by the specified admin", + "left": "Whether the user has left the group", + "peer": "The banned peer" + } + }, + "ChannelParticipantCreator": { + "desc": "Channel/supergroup creator", + "params": { + "admin_rights": "Creator admin rights", + "flags": "Flags, see TL conditional fields", + "rank": "The role (rank) of the group creator in the group: just an arbitrary string, admin by default", + "user_id": "User ID" + } + }, + "ChannelParticipantLeft": { + "desc": "A participant that left the channel/supergroup", + "params": { + "peer": "The peer that left" + } + }, + "ChannelParticipantSelf": { + "desc": "Myself", + "params": { + "date": "When did I join the channel/supergroup", + "flags": "Flags, see TL conditional fields", + "inviter_id": "User that invited me to the channel/supergroup", + "subscription_until_date": "If set, contains the expiration date of the current Telegram Star subscription period \u00bb for the specified participant.", + "user_id": "User ID", + "via_request": "Whether I joined upon specific approval of an admin" + } + }, + "ChannelParticipantsAdmins": { + "desc": "Fetch only admin participants", + "params": {} + }, + "ChannelParticipantsBanned": { + "desc": "Fetch only banned participants", + "params": { + "q": "Optional filter for searching banned participants by name (otherwise empty)" + } + }, + "ChannelParticipantsBots": { + "desc": "Fetch only bot participants", + "params": {} + }, + "ChannelParticipantsContacts": { + "desc": "Fetch only participants that are also contacts", + "params": { + "q": "Optional search query for searching contact participants by name" + } + }, + "ChannelParticipantsKicked": { + "desc": "Fetch only kicked participants", + "params": { + "q": "Optional filter for searching kicked participants by name (otherwise empty)" + } + }, + "ChannelParticipantsMentions": { + "desc": "This filter is used when looking for supergroup members to mention.\nThis filter will automatically remove anonymous admins, and return even non-participant users that replied to a specific thread through the comment section of a channel.", + "params": { + "flags": "Flags, see TL conditional fields", + "q": "Filter by user name or username", + "top_msg_id": "Look only for users that posted in this thread" + } + }, + "ChannelParticipantsRecent": { + "desc": "Fetch only recent participants", + "params": {} + }, + "ChannelParticipantsSearch": { + "desc": "Query participants by name", + "params": { + "q": "Search query" + } + }, + "Chat": { + "desc": "Info about a group.", + "params": { + "admin_rights": "Admin rights of the user in the group", + "call_active": "Whether a group call is currently active", + "call_not_empty": "Whether there's anyone in the group call", + "creator": "Whether the current user is the creator of the group", + "date": "Date of creation of the group", + "deactivated": "Whether the group was migrated", + "default_banned_rights": "Default banned rights of all users in the group", + "flags": "Flags, see TL conditional fields", + "id": "ID of the group, see here \u00bb for more info and the available ID range.", + "left": "Whether the current user has left the group", + "migrated_to": "Means this chat was upgraded to a supergroup", + "noforwards": "Whether this group is protected, thus does not allow forwarding messages from it", + "participants_count": "Participant count", + "photo": "Chat photo", + "title": "Title", + "version": "Used in basic groups to reorder updates and make sure that all of them were received." + } + }, + "ChatAdminRights": { + "desc": "Represents the rights of an admin in a channel/supergroup.", + "params": { + "add_admins": "If set, allows the admin to add other admins with the same (or more limited) permissions in the channel/supergroup", + "anonymous": "Whether this admin is anonymous", + "ban_users": "If set, allows the admin to ban users from the channel/supergroup", + "change_info": "If set, allows the admin to modify the description of the channel/supergroup", + "delete_messages": "If set, allows the admin to also delete messages from other admins in the channel", + "delete_stories": "If set, allows the admin to delete stories posted by the other admins of the channel.", + "edit_messages": "If set, allows the admin to also edit messages from other admins in the channel", + "edit_stories": "If set, allows the admin to edit stories posted by the other admins of the channel.", + "flags": "Flags, see TL conditional fields", + "invite_users": "If set, allows the admin to invite users in the channel/supergroup", + "manage_call": "If set, allows the admin to change group call/livestream settings", + "manage_direct_messages": "If set, allows the admin to manage the direct messages monoforum \u00bb and decline suggested posts \u00bb.", + "manage_topics": "If set, allows the admin to create, delete or modify forum topics \u00bb.", + "other": "Set this flag if none of the other flags are set, but you still want the user to be an admin: if this or any of the other flags are set, the admin can get the chat admin log, get chat statistics, get message statistics in channels, get channel members, see anonymous administrators in supergroups and ignore slow mode.", + "pin_messages": "If set, allows the admin to pin messages in the channel/supergroup", + "post_messages": "If set, allows the admin to post messages in the channel", + "post_stories": "If set, allows the admin to post stories as the channel." + } + }, + "ChatAdminWithInvites": { + "desc": "Info about chat invites generated by admins.", + "params": { + "admin_id": "The admin", + "invites_count": "Number of invites generated by the admin", + "revoked_invites_count": "Number of revoked invites" + } + }, + "ChatBannedRights": { + "desc": "Represents the rights of a normal user in a supergroup/channel/chat. In this case, the flags are inverted: if set, a flag does not allow a user to do X.", + "params": { + "change_info": "If set, does not allow any user to change the description of a supergroup/chat", + "embed_links": "If set, does not allow a user to embed links in the messages of a supergroup/chat", + "flags": "Flags, see TL conditional fields", + "invite_users": "If set, does not allow any user to invite users in a supergroup/chat", + "manage_topics": "If set, does not allow any user to create, delete or modify forum topics \u00bb.", + "pin_messages": "If set, does not allow any user to pin messages in a supergroup/chat", + "send_audios": "If set, does not allow a user to send audio files in a supergroup/chat.", + "send_docs": "If set, does not allow a user to send documents in a supergroup/chat.", + "send_games": "If set, does not allow a user to send games in a supergroup/chat", + "send_gifs": "If set, does not allow a user to send gifs in a supergroup/chat", + "send_inline": "If set, does not allow a user to use inline bots in a supergroup/chat.", + "send_media": "If set, does not allow a user to send any media in a supergroup/chat", + "send_messages": "If set, does not allow a user to send messages in a supergroup/chat", + "send_photos": "If set, does not allow a user to send photos in a supergroup/chat.", + "send_plain": "If set, does not allow a user to send text messages in a supergroup/chat.", + "send_polls": "If set, does not allow a user to send polls in a supergroup/chat", + "send_roundvideos": "If set, does not allow a user to send round videos in a supergroup/chat.", + "send_stickers": "If set, does not allow a user to send stickers in a supergroup/chat", + "send_videos": "If set, does not allow a user to send videos in a supergroup/chat.", + "send_voices": "If set, does not allow a user to send voice messages in a supergroup/chat.", + "until_date": "Validity of said permissions (it is considered forever any value less then 30 seconds or more then 366 days).", + "view_messages": "If set, does not allow a user to view messages in a supergroup/channel/chat" + } + }, + "ChatEmpty": { + "desc": "Empty constructor, group doesn't exist", + "params": { + "id": "Group identifier" + } + }, + "ChatForbidden": { + "desc": "A group to which the user has no access. E.g., because the user was kicked from the group.", + "params": { + "id": "User identifier", + "title": "Group name" + } + }, + "ChatFull": { + "desc": "Full info about a basic group.", + "params": { + "about": "About string for this chat", + "available_reactions": "Allowed message reactions \u00bb", + "bot_info": "Info about bots that are in this chat", + "call": "Group call information", + "can_set_username": "Can we change the username of this chat", + "chat_photo": "Chat photo", + "exported_invite": "Chat invite", + "flags": "Flags, see TL conditional fields", + "folder_id": "Peer folder ID, for more info click here", + "groupcall_default_join_as": "When using phone.getGroupCallJoinAs to get a list of peers that can be used to join a group call, this field indicates the peer that should be selected by default.", + "has_scheduled": "Whether scheduled messages are available", + "id": "ID of the chat", + "notify_settings": "Notification settings", + "participants": "Participant list", + "pinned_msg_id": "Message ID of the last pinned message", + "reactions_limit": "This flag may be used to impose a custom limit of unique reactions (i.e. a customizable version of appConfig.reactions_uniq_max).", + "recent_requesters": "IDs of users who requested to join recently", + "requests_pending": "Pending join requests \u00bb", + "theme_emoticon": "Emoji representing a specific chat theme", + "translations_disabled": "Whether the real-time chat translation popup should be hidden.", + "ttl_period": "Time-To-Live of messages sent by the current user to this chat" + } + }, + "ChatInvite": { + "desc": "Chat invite info", + "params": { + "about": "Description of the group of channel", + "bot_verification": "Describes a bot verification icon \u00bb.", + "broadcast": "Whether this is a channel", + "can_refulfill_subscription": "If set, indicates that the user has already paid for the associated Telegram Star subscriptions \u00bb and it hasn't expired yet, so they may re-join the channel using messages.importChatInvite without repeating the payment.", + "channel": "Whether this is a channel/supergroup or a normal group", + "color": "Profile color palette ID", + "fake": "If set, this chat was reported by many users as a fake or scam: be careful when interacting with it.", + "flags": "Flags, see TL conditional fields", + "megagroup": "Whether this is a supergroup", + "participants": "A few of the participants that are in the group", + "participants_count": "Participant count", + "photo": "Chat/supergroup/channel photo", + "public": "Whether this is a public channel/supergroup", + "request_needed": "Whether the join request \u00bb must be first approved by an administrator", + "scam": "This chat is probably a scam", + "subscription_form_id": "For Telegram Star subscriptions \u00bb, the ID of the payment form for the subscription.", + "subscription_pricing": "For Telegram Star subscriptions \u00bb, contains the pricing of the subscription the user must activate to join the private channel.", + "title": "Chat/supergroup/channel title", + "verified": "Is this chat or channel verified by Telegram?" + } + }, + "ChatInviteAlready": { + "desc": "The user has already joined this chat", + "params": { + "chat": "The chat connected to the invite" + } + }, + "ChatInviteExported": { + "desc": "Exported chat invite", + "params": { + "admin_id": "ID of the admin that created this chat invite", + "date": "When was this chat invite created", + "expire_date": "When does this chat invite expire", + "flags": "Flags, see TL conditional fields", + "link": "Chat invitation link", + "permanent": "Whether this chat invite has no expiration", + "request_needed": "Whether users importing this invite link will have to be approved to join the channel or group", + "requested": "Number of users that have already used this link to join", + "revoked": "Whether this chat invite was revoked", + "start_date": "When was this chat invite last modified", + "subscription_expired": "For Telegram Star subscriptions \u00bb, contains the number of chat members which have already joined the chat using the link, but have already left due to expiration of their subscription.", + "subscription_pricing": "For Telegram Star subscriptions \u00bb, contains the pricing of the subscription the user must activate to join the private channel.", + "title": "Custom description for the invite link, visible only to admins", + "usage": "How many users joined using this link", + "usage_limit": "Maximum number of users that can join using this link" + } + }, + "ChatInviteImporter": { + "desc": "When and which user joined the chat using a chat invite", + "params": { + "about": "For users with pending requests, contains bio of the user that requested to join", + "approved_by": "The administrator that approved the join request \u00bb of the user", + "date": "When did the user join", + "flags": "Flags, see TL conditional fields", + "requested": "Whether this user currently has a pending join request \u00bb", + "user_id": "The user", + "via_chatlist": "The participant joined by importing a chat folder deep link \u00bb." + } + }, + "ChatInvitePeek": { + "desc": "A chat invitation that also allows peeking into the group to read messages without joining it.", + "params": { + "chat": "Chat information", + "expires": "Read-only anonymous access to this group will be revoked at this date" + } + }, + "ChatInvitePublicJoinRequests": { + "desc": "Used in updates and in the channel log to indicate when a user is requesting to join or has joined a discussion group", + "params": {} + }, + "ChatOnlines": { + "desc": "Number of online users in a chat", + "params": { + "onlines": "Number of online users" + } + }, + "ChatParticipant": { + "desc": "Group member.", + "params": { + "date": "Date added to the group", + "inviter_id": "ID of the user that added the member to the group", + "user_id": "Member user ID" + } + }, + "ChatParticipantAdmin": { + "desc": "Chat admin", + "params": { + "date": "Date when the user was added", + "inviter_id": "ID of the user that added the member to the group", + "user_id": "ID of a group member that is admin" + } + }, + "ChatParticipantCreator": { + "desc": "Represents the creator of the group", + "params": { + "user_id": "ID of the user that created the group" + } + }, + "ChatParticipants": { + "desc": "Group members.", + "params": { + "chat_id": "Group identifier", + "participants": "List of group members", + "version": "Group version number" + } + }, + "ChatParticipantsForbidden": { + "desc": "Info on members is unavailable", + "params": { + "chat_id": "Group ID", + "flags": "Flags, see TL conditional fields", + "self_participant": "Info about the group membership of the current user" + } + }, + "ChatPhoto": { + "desc": "Group profile photo.", + "params": { + "dc_id": "DC where this photo is stored", + "flags": "Flags, see TL conditional fields", + "has_video": "Whether the user has an animated profile picture", + "photo_id": "Photo ID", + "stripped_thumb": "Stripped thumbnail" + } + }, + "ChatPhotoEmpty": { + "desc": "Group photo is not set.", + "params": {} + }, + "ChatReactionsAll": { + "desc": "All reactions or all non-custom reactions are allowed", + "params": { + "allow_custom": "Whether to allow custom reactions", + "flags": "Flags, see TL conditional fields" + } + }, + "ChatReactionsNone": { + "desc": "No reactions are allowed", + "params": {} + }, + "ChatReactionsSome": { + "desc": "Some reactions are allowed", + "params": { + "reactions": "Allowed set of reactions: the reactions_in_chat_max configuration field indicates the maximum number of reactions that can be specified in this field." + } + }, + "ChatTheme": { + "desc": "A chat theme", + "params": { + "emoticon": "The emoji identifying the chat theme." + } + }, + "ChatThemeUniqueGift": { + "desc": "A chat theme based on a collectible gift \u00bb.", + "params": { + "gift": "The owned collectible gift on which this theme is based, as a starGiftUnique constructor.", + "theme_settings": "Theme settings." + } + }, + "ChatThemes": { + "desc": "", + "params": {} + }, + "CodeSettings": { + "desc": "Settings used by telegram servers for sending the confirm code.", + "params": { + "allow_app_hash": "If a token that will be included in eventually sent SMSs is required: required in newer versions of android, to use the android SMS receiver APIs", + "allow_firebase": "Whether Firebase auth is supported", + "allow_flashcall": "Whether to allow phone verification via phone calls.", + "allow_missed_call": "Whether this device supports receiving the code using the auth.codeTypeMissedCall method", + "app_sandbox": "Used only by official iOS apps for firebase auth: whether a sandbox-certificate will be used during transmission of the push notification.", + "current_number": "Pass true if the phone number is used on the current device. Ignored if allow_flashcall is not set.", + "flags": "Flags, see TL conditional fields", + "logout_tokens": "Previously stored future auth tokens, see the documentation for more info \u00bb", + "token": "Used only by official iOS apps for Firebase auth: device token for apple push.", + "unknown_number": "Set this flag if there is a SIM card in the current device, but it is not possible to check whether the specified phone number matches the SIM's phone number." + } + }, + "Config": { + "desc": "Current configuration", + "params": { + "autologin_token": "Autologin token, click here for more info on URL authorization \u00bb.", + "autoupdate_url_prefix": "URL to use to auto-update the current app", + "base_lang_pack_version": "Basic language pack version", + "blocked_mode": "Indicates that telegram is probably censored by governments/ISPs in the current region", + "call_connect_timeout_ms": "VoIP connection timeout: if the instance of libtgvoip on the other side of the call doesn't connect to our instance of libtgvoip within the specified time (in milliseconds), the call must be aborted", + "call_packet_timeout_ms": "If during a VoIP call a packet isn't received for the specified period of time, the call must be aborted", + "call_receive_timeout_ms": "Maximum allowed outgoing ring time in VoIP calls: if the user we're calling doesn't reply within the specified time (in milliseconds), we should hang up the call", + "call_ring_timeout_ms": "Maximum allowed incoming ring time in VoIP calls: if the current user doesn't reply within the specified time (in milliseconds), the call will be automatically refused", + "caption_length_max": "Maximum length of caption (length in utf8 codepoints)", + "channels_read_media_period": "Indicates that round videos (video notes) and voice messages sent in channels and older than the specified period must be marked as read", + "chat_size_max": "Maximum member count for normal groups", + "date": "Current date at the server", + "dc_options": "DC IP list", + "dc_txt_domain_name": "Domain name for fetching encrypted DC list from DNS TXT record", + "default_p2p_contacts": "Whether the client should use P2P by default for phone calls with contacts", + "edit_time_limit": "Only messages with age smaller than the one specified can be edited", + "expires": "Expiration date of this config: when it expires it'll have to be refetched using help.getConfig", + "flags": "Flags, see TL conditional fields", + "force_try_ipv6": "Whether to forcefully connect using IPv6 dcOptions, even if the client knows that IPv4 is available.", + "forwarded_count_max": "Maximum number of messages that can be forwarded at once using messages.forwardMessages.", + "gif_search_username": "Username of the bot to use to search for GIFs", + "img_search_username": "Username of the bot to use for image search", + "lang_pack_version": "Language pack version", + "me_url_prefix": "The domain to use to parse deep links \u00bb.", + "megagroup_size_max": "Maximum member count for supergroups", + "message_length_max": "Maximum length of messages (length in utf8 codepoints)", + "notify_cloud_delay_ms": "If we are offline, but online from some other client then delay sending the offline notification for notify_cloud_delay_ms milliseconds.", + "notify_default_delay_ms": "If some other client is online, then delay notification for notification_default_delay_ms milliseconds", + "offline_blur_timeout_ms": "Delay before offline status needs to be sent to the server", + "offline_idle_timeout_ms": "Time without any user activity after which it should be treated offline", + "online_cloud_timeout_ms": "If we are offline, but were online from some other client in last online_cloud_timeout_ms milliseconds after we had gone offline, then delay offline notification for notify_cloud_delay_ms milliseconds.", + "online_update_period_ms": "The client should update its online status every N milliseconds", + "preload_featured_stickers": "Whether the client should preload featured stickers", + "push_chat_limit": "Not for client use", + "push_chat_period_ms": "Not for client use", + "rating_e_decay": "Exponential decay rate for computing top peer rating", + "reactions_default": "Default message reaction", + "revoke_pm_inbox": "Whether incoming private messages can be deleted for both participants", + "revoke_pm_time_limit": "Only private messages with age smaller than the specified can be deleted", + "revoke_time_limit": "Only channel/supergroup messages with age smaller than the specified can be deleted", + "static_maps_provider": "ID of the map provider to use for venues", + "stickers_recent_limit": "Maximum number of recent stickers", + "suggested_lang_code": "Suggested language code", + "test_mode": "Whether we're connected to the test DCs", + "this_dc": "ID of the DC that returned the reply", + "tmp_sessions": "Temporary passport sessions", + "venue_search_username": "Username of the bot to use to search for venues", + "webfile_dc_id": "DC ID to use to download webfiles" + } + }, + "ConnectedBot": { + "desc": "Contains info about a connected business bot \u00bb.", + "params": { + "bot_id": "ID of the connected bot", + "flags": "Flags, see TL conditional fields", + "recipients": "Specifies the private chats that a connected business bot \u00bb may receive messages and interact with.", + "rights": "Business bot rights." + } + }, + "ConnectedBotStarRef": { + "desc": "Info about an active affiliate program we have with a Mini App", + "params": { + "bot_id": "ID of the mini app that created the affiliate program", + "commission_permille": "The number of Telegram Stars received by the affiliate for each 1000 Telegram Stars received by bot_id", + "date": "When did we affiliate with bot_id", + "duration_months": "Number of months the program will be active; if not set, there is no expiration date.", + "flags": "Flags, see TL conditional fields", + "participants": "The number of users that used the affiliate program", + "revenue": "The number of Telegram Stars that were earned by the affiliate program", + "revoked": "If set, this affiliation was revoked by the affiliate using payments.editConnectedStarRefBot, or by the affiliation program owner using bots.updateStarRefProgram", + "url": "Referral link to be shared" + } + }, + "Contact": { + "desc": "A contact of the current user that is registered in the system.", + "params": { + "mutual": "Current user is in the user's contact list", + "user_id": "User identifier" + } + }, + "ContactBirthday": { + "desc": "Birthday information of a contact.", + "params": { + "birthday": "Birthday information.", + "contact_id": "User ID." + } + }, + "ContactStatus": { + "desc": "Contact status: online / offline.", + "params": { + "status": "Online status", + "user_id": "User identifier" + } + }, + "DataJSON": { + "desc": "Represents a json-encoded object", + "params": { + "data": "JSON-encoded object" + } + }, + "DcOption": { + "desc": "Data center", + "params": { + "cdn": "Whether this is a CDN DC.", + "flags": "Flags, see TL conditional fields", + "id": "DC ID", + "ip_address": "IP address of DC", + "ipv6": "Whether the specified IP is an IPv6 address", + "media_only": "Whether this DC should only be used to download or upload files", + "port": "Port", + "secret": "If the tcpo_only flag is set, specifies the secret to use when connecting using transport obfuscation", + "static": "If set, this IP should be used when connecting through a proxy", + "tcpo_only": "Whether this DC only supports connection with transport obfuscation", + "this_port_only": "If set, clients must connect using only the specified port, without trying any other port." + } + }, + "DefaultHistoryTTL": { + "desc": "Contains info about the default value of the Time-To-Live setting, applied to all new chats.", + "params": { + "period": "Time-To-Live setting applied to all new chats." + } + }, + "Dialog": { + "desc": "Chat", + "params": { + "draft": "Message draft", + "flags": "Flags, see TL conditional fields", + "folder_id": "Peer folder ID, for more info click here", + "notify_settings": "Notification settings", + "peer": "The chat", + "pinned": "Is the dialog pinned", + "pts": "PTS", + "read_inbox_max_id": "Position up to which all incoming messages are read.", + "read_outbox_max_id": "Position up to which all outgoing messages are read.", + "top_message": "The latest message ID", + "ttl_period": "Time-to-live of all messages sent in this dialog", + "unread_count": "Number of unread messages", + "unread_mark": "Whether the chat was manually marked as unread", + "unread_mentions_count": "Number of unread mentions", + "unread_reactions_count": "Number of unread reactions to messages you sent", + "view_forum_as_messages": "Users may also choose to display messages from all topics of a forum as if they were sent to a normal group, using a \"View as messages\" setting in the local client. This setting only affects the current account, and is synced to other logged in sessions using the channels.toggleViewForumAsMessages method; invoking this method will update the value of this flag." + } + }, + "DialogFilter": { + "desc": "Dialog filter AKA folder", + "params": { + "bots": "Whether to include all bots in this folder", + "broadcasts": "Whether to include all channels in this folder", + "color": "A color ID for the folder tag associated to this folder, see here \u00bb for more info.", + "contacts": "Whether to include all contacts in this folder", + "emoticon": "Emoji to use as icon for the folder.", + "exclude_archived": "Whether to exclude archived chats from this folder", + "exclude_muted": "Whether to exclude muted chats from this folder", + "exclude_peers": "Exclude the following chats from this folder", + "exclude_read": "Whether to exclude read chats from this folder", + "flags": "Flags, see TL conditional fields", + "groups": "Whether to include all groups in this folder", + "id": "Folder ID", + "include_peers": "Include the following chats in this folder", + "non_contacts": "Whether to include all non-contacts in this folder", + "pinned_peers": "Pinned chats, folders can have unlimited pinned chats", + "title": "Folder name (max 12 UTF-8 chars)", + "title_noanimate": "If set, any animated emojis present in title should not be animated and should be instead frozen on the first frame." + } + }, + "DialogFilterChatlist": { + "desc": "A folder imported using a chat folder deep link \u00bb.", + "params": { + "color": "A color ID for the folder tag associated to this folder, see here \u00bb for more info.", + "emoticon": "Emoji to use as icon for the folder.", + "flags": "Flags, see TL conditional fields", + "has_my_invites": "Whether the current user has created some chat folder deep links \u00bb to share the folder as well.", + "id": "ID of the folder", + "include_peers": "Chats to include in the folder", + "pinned_peers": "Pinned chats, folders can have unlimited pinned chats", + "title": "Name of the folder (max 12 UTF-8 chars)", + "title_noanimate": "If set, any animated emojis present in title should not be animated and should be instead frozen on the first frame." + } + }, + "DialogFilterDefault": { + "desc": "Used only when reordering folders to indicate the default (all chats) folder.", + "params": {} + }, + "DialogFilterSuggested": { + "desc": "Suggested folders", + "params": { + "description": "Folder description", + "filter": "Folder info" + } + }, + "DialogFolder": { + "desc": "Dialog in folder", + "params": { + "flags": "Flags, see TL conditional fields", + "folder": "The folder", + "peer": "Peer in folder", + "pinned": "Is this folder pinned", + "top_message": "Latest message ID of dialog", + "unread_muted_messages_count": "Number of unread messages from muted peers in folder", + "unread_muted_peers_count": "Number of unread muted peers in folder", + "unread_unmuted_messages_count": "Number of unread messages from unmuted peers in folder", + "unread_unmuted_peers_count": "Number of unread unmuted peers in folder" + } + }, + "DialogPeer": { + "desc": "Peer", + "params": { + "peer": "Peer" + } + }, + "DialogPeerFolder": { + "desc": "Peer folder", + "params": { + "folder_id": "Peer folder ID, for more info click here" + } + }, + "DisallowedGiftsSettings": { + "desc": "Disallow the reception of specific gift types.", + "params": { + "disallow_limited_stargifts": "Disallow the reception of limited-supply gifts (those with the starGift.limited flag set).", + "disallow_premium_gifts": "Disallow the reception of gifted Telegram Premium subscriptions \u00bb.", + "disallow_unique_stargifts": "Disallow the reception of collectible gifts \u00bb.", + "disallow_unlimited_stargifts": "Disallow the reception of gifts with an unlimited supply (those with the starGift.limited flag not set).", + "flags": "Flags, see TL conditional fields" + } + }, + "Document": { + "desc": "Document", + "params": { + "access_hash": "Check sum, dependent on document ID", + "attributes": "Attributes", + "date": "Creation date", + "dc_id": "DC ID", + "file_reference": "File reference", + "flags": "Flags, see TL conditional fields", + "id": "Document ID", + "mime_type": "MIME type", + "size": "Size", + "thumbs": "Thumbnails", + "video_thumbs": "Video thumbnails" + } + }, + "DocumentAttributeAnimated": { + "desc": "Defines an animated GIF", + "params": {} + }, + "DocumentAttributeAudio": { + "desc": "Represents an audio file", + "params": { + "duration": "Duration in seconds", + "flags": "Flags, see TL conditional fields", + "performer": "Performer", + "title": "Name of song", + "voice": "Whether this is a voice message", + "waveform": "Waveform: consists in a series of bitpacked 5-bit values. Example implementation: android." + } + }, + "DocumentAttributeCustomEmoji": { + "desc": "Info about a custom emoji", + "params": { + "alt": "The actual emoji", + "flags": "Flags, see TL conditional fields", + "free": "Whether this custom emoji can be sent by non-Premium users", + "stickerset": "The emoji stickerset to which this emoji belongs.", + "text_color": "Whether the color of this TGS custom emoji should be changed to the text color when used in messages, the accent color if used as emoji status, white on chat photos, or another appropriate color based on context." + } + }, + "DocumentAttributeFilename": { + "desc": "A simple document with a file name", + "params": { + "file_name": "The file name" + } + }, + "DocumentAttributeHasStickers": { + "desc": "Whether the current document has stickers attached", + "params": {} + }, + "DocumentAttributeImageSize": { + "desc": "Defines the width and height of an image uploaded as document", + "params": { + "h": "Height of image", + "w": "Width of image" + } + }, + "DocumentAttributeSticker": { + "desc": "Defines a sticker", + "params": { + "alt": "Alternative emoji representation of sticker", + "flags": "Flags, see TL conditional fields", + "mask": "Whether this is a mask sticker", + "mask_coords": "Mask coordinates (if this is a mask sticker, attached to a photo)", + "stickerset": "Associated stickerset" + } + }, + "DocumentAttributeVideo": { + "desc": "Defines a video", + "params": { + "duration": "Duration in seconds", + "flags": "Flags, see TL conditional fields", + "h": "Video height", + "nosound": "Whether the specified document is a video file with no audio tracks", + "preload_prefix_size": "Number of bytes to preload when preloading videos (particularly video stories).", + "round_message": "Whether this is a round video", + "supports_streaming": "Whether the video supports streaming", + "video_codec": "Codec used for the video, i.e. \"h264\", \"h265\", or \"av1\"", + "video_start_ts": "Floating point UNIX timestamp in seconds, indicating the frame of the video that should be used as static preview and thumbnail.", + "w": "Video width" + } + }, + "DocumentEmpty": { + "desc": "Empty constructor, document doesn't exist.", + "params": { + "id": "Document ID or 0" + } + }, + "DraftMessage": { + "desc": "Represents a message draft.", + "params": { + "date": "Date of last update of the draft.", + "effect": "A message effect that should be played as specified here \u00bb.", + "entities": "Message entities for styled text.", + "flags": "Flags, see TL conditional fields", + "invert_media": "If set, any eventual webpage preview will be shown on top of the message instead of at the bottom.", + "media": "Media.", + "message": "The draft", + "no_webpage": "Whether no webpage preview will be generated", + "reply_to": "If set, indicates that the message should be sent in reply to the specified message or story.", + "suggested_post": "Used to suggest a post to a channel, see here \u00bb for more info on the full flow." + } + }, + "DraftMessageEmpty": { + "desc": "Empty draft", + "params": { + "date": "When was the draft last updated", + "flags": "Flags, see TL conditional fields" + } + }, + "EmailVerificationApple": { + "desc": "Apple ID email verification token", + "params": { + "token": "Token" + } + }, + "EmailVerificationCode": { + "desc": "Email verification code", + "params": { + "code": "Received verification code" + } + }, + "EmailVerificationGoogle": { + "desc": "Google ID email verification token", + "params": { + "token": "Token" + } + }, + "EmailVerifyPurposeLoginChange": { + "desc": "Email verification purpose: change login email", + "params": {} + }, + "EmailVerifyPurposeLoginSetup": { + "desc": "Email verification purpose: setup login email", + "params": { + "phone_code_hash": "Phone code hash as specified by the documentation", + "phone_number": "Phone number" + } + }, + "EmailVerifyPurposePassport": { + "desc": "Verify an email for use in telegram passport", + "params": {} + }, + "EmojiGroup": { + "desc": "Represents an emoji category.", + "params": { + "emoticons": "A list of UTF-8 emojis, matching the category.", + "icon_emoji_id": "A single custom emoji used as preview for the category.", + "title": "Category name, i.e. \"Animals\", \"Flags\", \"Faces\" and so on..." + } + }, + "EmojiGroupGreeting": { + "desc": "Represents an emoji category, that should be moved to the top of the list when choosing a sticker for a business introduction", + "params": { + "emoticons": "A list of UTF-8 emojis, matching the category.", + "icon_emoji_id": "A single custom emoji used as preview for the category.", + "title": "Category name, i.e. \"Animals\", \"Flags\", \"Faces\" and so on..." + } + }, + "EmojiGroupPremium": { + "desc": "An emoji category, used to select all Premium-only stickers (i.e. those with a Premium effect \u00bb)/Premium-only custom emojis (i.e. those where the documentAttributeCustomEmoji.free flag is not set)", + "params": { + "icon_emoji_id": "A single custom emoji used as preview for the category.", + "title": "Category name, i.e. \"Animals\", \"Flags\", \"Faces\" and so on..." + } + }, + "EmojiKeyword": { + "desc": "Emoji keyword", + "params": { + "emoticons": "Emojis associated to keyword", + "keyword": "Keyword" + } + }, + "EmojiKeywordDeleted": { + "desc": "Deleted emoji keyword", + "params": { + "emoticons": "Emojis that were associated to keyword", + "keyword": "Keyword" + } + }, + "EmojiKeywordsDifference": { + "desc": "Changes to emoji keywords", + "params": { + "from_version": "Previous emoji keyword list version", + "keywords": "Emojis associated to keywords", + "lang_code": "Language code for keywords", + "version": "Current version of emoji keyword list" + } + }, + "EmojiLanguage": { + "desc": "Emoji language", + "params": { + "lang_code": "Language code" + } + }, + "EmojiList": { + "desc": "Represents a list of custom emojis.", + "params": { + "document_id": "Custom emoji IDs", + "hash": "Hash used for caching, for more info click here" + } + }, + "EmojiListNotModified": { + "desc": "The list of custom emojis hasn't changed.", + "params": {} + }, + "EmojiStatus": { + "desc": "An emoji status", + "params": { + "document_id": "Custom emoji document ID", + "flags": "Flags, see TL conditional fields", + "until": "If set, the emoji status will be active until the specified unixtime." + } + }, + "EmojiStatusCollectible": { + "desc": "An owned collectible gift \u00bb as emoji status.", + "params": { + "center_color": "Color of the center of the profile backdrop in RGB24 format, from the gift's starGiftAttributeBackdrop.", + "collectible_id": "ID of the collectible (from starGiftUnique.id).", + "document_id": "ID of the custom emoji representing the status.", + "edge_color": "Color of the edges of the profile backdrop in RGB24 format, from the gift's starGiftAttributeBackdrop.", + "flags": "Flags, see TL conditional fields", + "pattern_color": "Color of the pattern_document_id applied on the profile backdrop in RGB24 format, from the gift's starGiftAttributeBackdrop.", + "pattern_document_id": "The ID of a pattern to apply on the profile's backdrop, correlated to the starGiftAttributePattern from the gift in slug.", + "slug": "Unique identifier of the collectible that may be used to create a collectible gift link \u00bb for the current collectible, or to fetch further info about the collectible using payments.getUniqueStarGift.", + "text_color": "Color of text on the profile backdrop in RGB24 format, from the gift's starGiftAttributeBackdrop.", + "title": "Name of the collectible.", + "until": "If set, the emoji status will be active until the specified unixtime." + } + }, + "EmojiStatusEmpty": { + "desc": "No emoji status is set", + "params": {} + }, + "EmojiURL": { + "desc": "An HTTP URL which can be used to automatically log in into translation platform and suggest new emoji replacements. The URL will be valid for 30 seconds after generation", + "params": { + "url": "An HTTP URL which can be used to automatically log in into translation platform and suggest new emoji replacements. The URL will be valid for 30 seconds after generation" + } + }, + "EncryptedChat": { + "desc": "Encrypted chat", + "params": { + "access_hash": "Check sum dependent on the user ID", + "admin_id": "Chat creator ID", + "date": "Date chat was created", + "g_a_or_b": "B = g ^ b mod p, if the currently authorized user is the chat's creator,or A = g ^ a mod p otherwiseSee Wikipedia for more info", + "id": "Chat ID", + "key_fingerprint": "64-bit fingerprint of received key", + "participant_id": "ID of the second chat participant" + } + }, + "EncryptedChatDiscarded": { + "desc": "Discarded or deleted chat.", + "params": { + "flags": "Flags, see TL conditional fields", + "history_deleted": "Whether both users of this secret chat should also remove all of its messages", + "id": "Chat ID" + } + }, + "EncryptedChatEmpty": { + "desc": "Empty constructor.", + "params": { + "id": "Chat ID" + } + }, + "EncryptedChatRequested": { + "desc": "Request to create an encrypted chat.", + "params": { + "access_hash": "Check sum depending on user ID", + "admin_id": "Chat creator ID", + "date": "Chat creation date", + "flags": "Flags, see TL conditional fields", + "folder_id": "Peer folder ID, for more info click here", + "g_a": "A = g ^ a mod p, see Wikipedia", + "id": "Chat ID", + "participant_id": "ID of second chat participant" + } + }, + "EncryptedChatWaiting": { + "desc": "Chat waiting for approval of second participant.", + "params": { + "access_hash": "Checking sum depending on user ID", + "admin_id": "Chat creator ID", + "date": "Date of chat creation", + "id": "Chat ID", + "participant_id": "ID of second chat participant" + } + }, + "EncryptedFile": { + "desc": "Encrypted file.", + "params": { + "access_hash": "Checking sum depending on user ID", + "dc_id": "Number of data center", + "id": "File ID", + "key_fingerprint": "32-bit fingerprint of key used for file encryption", + "size": "File size in bytes" + } + }, + "EncryptedFileEmpty": { + "desc": "Empty constructor, non-existing file.", + "params": {} + }, + "EncryptedMessage": { + "desc": "Encrypted message.", + "params": { + "bytes": "TL-serialization of DecryptedMessage type, encrypted with the key created at chat initialization", + "chat_id": "ID of encrypted chat", + "date": "Date of sending", + "file": "Attached encrypted file", + "random_id": "Random message ID, assigned by the author of message" + } + }, + "EncryptedMessageService": { + "desc": "Encrypted service message", + "params": { + "bytes": "TL-serialization of the DecryptedMessage type, encrypted with the key created at chat initialization", + "chat_id": "ID of encrypted chat", + "date": "Date of sending", + "random_id": "Random message ID, assigned by the author of message" + } + }, + "ExportedChatlistInvite": { + "desc": "Exported chat folder deep link \u00bb.", + "params": { + "flags": "Flags, see TL conditional fields", + "peers": "Peers to import", + "title": "Name of the link", + "url": "The chat folder deep link \u00bb." + } + }, + "ExportedContactToken": { + "desc": "Describes a temporary profile link.", + "params": { + "expires": "Its expiration date", + "url": "The temporary profile link." + } + }, + "ExportedMessageLink": { + "desc": "Link to a message in a supergroup/channel", + "params": { + "html": "Embed code", + "link": "URL" + } + }, + "ExportedStoryLink": { + "desc": "Represents a story deep link.", + "params": { + "link": "The story deep link." + } + }, + "FactCheck": { + "desc": "Represents a fact-check \u00bb created by an independent fact-checker.", + "params": { + "country": "A two-letter ISO 3166-1 alpha-2 country code of the country for which the fact-check should be shown.", + "flags": "Flags, see TL conditional fields", + "hash": "Hash used for caching, for more info click here", + "need_check": "If set, the country/text fields will not be set, and the fact check must be fetched manually by the client (if it isn't already cached with the key specified in hash) using bundled messages.getFactCheck requests, when the message with the factcheck scrolls into view.", + "text": "The fact-check." + } + }, + "FileHash": { + "desc": "SHA256 Hash of an uploaded file, to be checked for validity after download", + "params": { + "hash": "SHA-256 Hash of file chunk, to be checked for validity after download", + "limit": "Length", + "offset": "Offset from where to start computing SHA-256 hash" + } + }, + "Folder": { + "desc": "Folder", + "params": { + "autofill_new_broadcasts": "Automatically add new channels to this folder", + "autofill_new_correspondents": "Automatically add new private chats to this folder", + "autofill_public_groups": "Automatically add joined new public supergroups to this folder", + "flags": "Flags, see TL conditional fields", + "id": "Folder ID", + "photo": "Folder picture", + "title": "Folder title" + } + }, + "FolderPeer": { + "desc": "Peer in a folder", + "params": { + "folder_id": "Peer folder ID, for more info click here", + "peer": "Folder peer info" + } + }, + "ForumTopic": { + "desc": "Represents a forum topic.", + "params": { + "closed": "Whether the topic is closed (no messages can be sent to it)", + "date": "Topic creation date", + "draft": "Message draft", + "flags": "Flags, see TL conditional fields", + "from_id": "ID of the peer that created the topic", + "hidden": "Whether the topic is hidden (only valid for the \"General\" topic, id=1)", + "icon_color": "If no custom emoji icon is specified, specifies the color of the fallback topic icon (RGB), one of 0x6FB9F0, 0xFFD67E, 0xCB86DB, 0x8EEE98, 0xFF93B2, or 0xFB6F5F.", + "icon_emoji_id": "ID of the custom emoji used as topic icon.", + "id": "Topic ID", + "my": "Whether the topic was created by the current user", + "notify_settings": "Notification settings", + "pinned": "Whether the topic is pinned", + "read_inbox_max_id": "Position up to which all incoming messages are read.", + "read_outbox_max_id": "Position up to which all outgoing messages are read.", + "short": "Whether this constructor is a reduced version of the full topic information. If set, only the my, closed, id, date, title, icon_color, icon_emoji_id and from_id parameters will contain valid information. Reduced info is usually only returned in topic-related admin log events \u00bb and in the messages.channelMessages constructor: if needed, full information can be fetched using channels.getForumTopicsByID.", + "title": "Topic title", + "top_message": "ID of the last message that was sent to this topic", + "unread_count": "Number of unread messages", + "unread_mentions_count": "Number of unread mentions", + "unread_reactions_count": "Number of unread reactions to messages you sent" + } + }, + "ForumTopicDeleted": { + "desc": "Represents a deleted forum topic.", + "params": { + "id": "The ID of the deleted forum topic." + } + }, + "FoundStory": { + "desc": "A story found using global story search \u00bb.", + "params": { + "peer": "The peer that posted the story.", + "story": "The story." + } + }, + "Game": { + "desc": "Indicates an already sent game", + "params": { + "access_hash": "Access hash of the game", + "description": "Game description", + "document": "Optional attached document", + "flags": "Flags, see TL conditional fields", + "id": "ID of the game", + "photo": "Game preview", + "short_name": "Short name for the game", + "title": "Title of the game" + } + }, + "GeoPoint": { + "desc": "GeoPoint.", + "params": { + "access_hash": "Access hash", + "accuracy_radius": "The estimated horizontal accuracy of the location, in meters; as defined by the sender.", + "flags": "Flags, see TL conditional fields", + "lat": "Latitude", + "long": "Longitude" + } + }, + "GeoPointAddress": { + "desc": "Address optionally associated to a geoPoint.", + "params": { + "city": "City", + "country_iso2": "Two-letter ISO 3166-1 alpha-2 country code", + "flags": "Flags, see TL conditional fields", + "state": "State", + "street": "Street" + } + }, + "GeoPointEmpty": { + "desc": "Empty constructor.", + "params": {} + }, + "GlobalPrivacySettings": { + "desc": "Global privacy settings", + "params": { + "archive_and_mute_new_noncontact_peers": "Whether to archive and mute new chats from non-contacts", + "disallowed_gifts": "Disallows the reception of specific gift types.", + "display_gifts_button": "Enables or disables our userFull.display_gifts_button flag: if the userFull.display_gifts_button flag of both us and another user is set, a gift button should always be displayed in the text field in private chats with the other user: once clicked, the gift UI should be displayed, offering the user options to gift Telegram Premium \u00bb subscriptions or Telegram Gifts \u00bb.", + "flags": "Flags, see TL conditional fields", + "hide_read_marks": "If this flag is set, the inputPrivacyKeyStatusTimestamp key will also apply to the ability to use messages.getOutboxReadDate on messages sent to us. Meaning, users that cannot see our exact last online date due to the current value of the inputPrivacyKeyStatusTimestamp key will receive a 403 USER_PRIVACY_RESTRICTED error when invoking messages.getOutboxReadDate to fetch the exact read date of a message they sent to us. The userFull.read_dates_private flag will be set for users that have this flag enabled.", + "keep_archived_folders": "Whether unmuted chats that are always included or pinned in a folder, will be kept in the Archive chat list when they get a new message. Ignored if keep_archived_unmuted is set.", + "keep_archived_unmuted": "Whether unmuted chats will be kept in the Archive chat list when they get a new message.", + "new_noncontact_peers_require_premium": "See here for more info on this flag \u00bb.", + "noncontact_peers_paid_stars": "If configured, specifies the number of stars users must pay us to send us a message, see here \u00bb for more info on paid messages." + } + }, + "GroupCall": { + "desc": "Info about a group call or livestream", + "params": { + "access_hash": "Group call access hash", + "can_change_join_muted": "Whether the current user can change the value of the join_muted flag using phone.toggleGroupCallSettings", + "can_start_video": "Whether you can start streaming video into the call", + "conference": "Whether this is an E2E conference call.", + "creator": "Whether we're created this group call.", + "flags": "Flags, see TL conditional fields", + "id": "Group call ID", + "invite_link": "Invitation link for the conference.", + "join_date_asc": "Specifies the ordering to use when locally sorting by date and displaying in the UI group call participants.", + "join_muted": "Whether the user should be muted upon joining the call", + "listeners_hidden": "Whether the listeners list is hidden and cannot be fetched using phone.getGroupParticipants. The phone.groupParticipants.count and groupCall.participants_count counters will still include listeners.", + "participants_count": "Participant count", + "record_start_date": "When was the recording started", + "record_video_active": "Whether the group call is currently being recorded", + "rtmp_stream": "Whether RTMP streams are allowed", + "schedule_date": "When is the call scheduled to start", + "schedule_start_subscribed": "Whether we subscribed to the scheduled call", + "stream_dc_id": "DC ID to be used for livestream chunks", + "title": "Group call title", + "unmuted_video_count": "Number of people currently streaming video into the call", + "unmuted_video_limit": "Maximum number of people allowed to stream video into the call", + "version": "Version" + } + }, + "GroupCallDiscarded": { + "desc": "An ended group call", + "params": { + "access_hash": "Group call access hash", + "duration": "Group call duration", + "id": "Group call ID" + } + }, + "GroupCallParticipant": { + "desc": "Info about a group call participant", + "params": { + "about": "Info about this participant", + "active_date": "When was this participant last active in the group call", + "can_self_unmute": "Whether the participant can unmute themselves", + "date": "When did this participant join the group call", + "flags": "Flags, see TL conditional fields", + "just_joined": "Whether the participant has just joined", + "left": "Whether the participant has left", + "min": "If not set, the volume and muted_by_you fields can be safely used to overwrite locally cached information; otherwise, volume will contain valid information only if volume_by_admin is set both in the cache and in the received constructor.", + "muted": "Whether the participant is muted", + "muted_by_you": "Whether this participant was muted by the current user", + "peer": "Peer information", + "presentation": "Info about the screen sharing stream the participant is currently broadcasting", + "raise_hand_rating": "Specifies the UI visualization order of peers with raised hands: peers with a higher rating should be showed first in the list.", + "self": "Whether this participant is the current user", + "source": "Source ID", + "versioned": "If set, and updateGroupCallParticipants.version < locally stored call.version, info about this participant should be ignored. If (...), and updateGroupCallParticipants.version > call.version+1, the participant list should be refetched using phone.getGroupParticipants.", + "video": "Info about the video stream the participant is currently broadcasting", + "video_joined": "Whether this participant is currently broadcasting video", + "volume": "Volume, if not set the volume is set to 100%.", + "volume_by_admin": "Whether our volume can only changed by an admin" + } + }, + "GroupCallParticipantVideo": { + "desc": "Info about a video stream", + "params": { + "audio_source": "Audio source ID", + "endpoint": "Endpoint", + "flags": "Flags, see TL conditional fields", + "paused": "Whether the stream is currently paused", + "source_groups": "Source groups" + } + }, + "GroupCallParticipantVideoSourceGroup": { + "desc": "Describes a group of video synchronization source identifiers", + "params": { + "semantics": "SDP semantics", + "sources": "Source IDs" + } + }, + "GroupCallStreamChannel": { + "desc": "Info about an RTMP stream in a group call or livestream", + "params": { + "channel": "Channel ID", + "last_timestamp_ms": "Last seen timestamp to easily start fetching livestream chunks using inputGroupCallStream", + "scale": "Specifies the duration of the video segment to fetch in milliseconds, by bitshifting 1000 to the right scale times: duration_ms := 1000 >> scale." + } + }, + "HighScore": { + "desc": "Game highscore", + "params": { + "pos": "Position in highscore list", + "score": "Score", + "user_id": "User ID" + } + }, + "ImportedContact": { + "desc": "Successfully imported contact.", + "params": { + "client_id": "The contact's client identifier (passed to one of the InputContact constructors)", + "user_id": "User identifier" + } + }, + "InlineBotSwitchPM": { + "desc": "The bot requested the user to message them in private", + "params": { + "start_param": "The parameter for the /start parameter", + "text": "Text for the button that switches the user to a private chat with the bot and sends the bot a start message with the parameter start_parameter (can be empty)" + } + }, + "InlineBotWebView": { + "desc": "Specifies an inline mode mini app button, shown on top of the inline query results list.", + "params": { + "text": "Text of the button", + "url": "Webapp URL" + } + }, + "InlineQueryPeerTypeBotPM": { + "desc": "Peer type: private chat with a bot.", + "params": {} + }, + "InlineQueryPeerTypeBroadcast": { + "desc": "Peer type: channel", + "params": {} + }, + "InlineQueryPeerTypeChat": { + "desc": "Peer type: chat", + "params": {} + }, + "InlineQueryPeerTypeMegagroup": { + "desc": "Peer type: supergroup", + "params": {} + }, + "InlineQueryPeerTypePM": { + "desc": "Peer type: private chat", + "params": {} + }, + "InlineQueryPeerTypeSameBotPM": { + "desc": "Peer type: private chat with the bot itself", + "params": {} + }, + "InputAppEvent": { + "desc": "Event that occurred in the application.", + "params": { + "data": "Details of the event", + "peer": "Arbitrary numeric value for more convenient selection of certain event types, or events referring to a certain object", + "time": "Client's exact timestamp for the event", + "type": "Type of event" + } + }, + "InputBotAppID": { + "desc": "Used to fetch information about a direct link Mini App by its ID", + "params": { + "access_hash": "Access hash, obtained from the botApp constructor.", + "id": "direct link Mini App ID." + } + }, + "InputBotAppShortName": { + "desc": "Used to fetch information about a direct link Mini App by its short name", + "params": { + "bot_id": "ID of the bot that owns the bot mini app", + "short_name": "Short name, obtained from a Direct Mini App deep link" + } + }, + "InputBotInlineMessageGame": { + "desc": "A game", + "params": { + "flags": "Flags, see TL conditional fields", + "reply_markup": "Inline keyboard" + } + }, + "InputBotInlineMessageID": { + "desc": "Represents a sent inline message from the perspective of a bot (legacy constructor)", + "params": { + "access_hash": "Access hash of message", + "dc_id": "DC ID to use when working with this inline message", + "id": "ID of message, contains both the (32-bit, legacy) owner ID and the message ID, used only for Bot API backwards compatibility with 32-bit user ID." + } + }, + "InputBotInlineMessageID64": { + "desc": "Represents a sent inline message from the perspective of a bot", + "params": { + "access_hash": "Access hash of message", + "dc_id": "DC ID to use when working with this inline message", + "id": "ID of message", + "owner_id": "ID of the owner of this message" + } + }, + "InputBotInlineMessageMediaAuto": { + "desc": "A media", + "params": { + "entities": "Message entities for styled text", + "flags": "Flags, see TL conditional fields", + "invert_media": "If set, any eventual webpage preview will be shown on top of the message instead of at the bottom.", + "message": "Caption", + "reply_markup": "Inline keyboard" + } + }, + "InputBotInlineMessageMediaContact": { + "desc": "A contact", + "params": { + "first_name": "First name", + "flags": "Flags, see TL conditional fields", + "last_name": "Last name", + "phone_number": "Phone number", + "reply_markup": "Inline keyboard", + "vcard": "VCard info" + } + }, + "InputBotInlineMessageMediaGeo": { + "desc": "Geolocation", + "params": { + "flags": "Flags, see TL conditional fields", + "geo_point": "Geolocation", + "heading": "For live locations, a direction in which the location moves, in degrees; 1-360", + "period": "Validity period", + "proximity_notification_radius": "For live locations, a maximum distance to another chat member for proximity alerts, in meters (0-100000)", + "reply_markup": "Reply markup for bot/inline keyboards" + } + }, + "InputBotInlineMessageMediaInvoice": { + "desc": "An invoice", + "params": { + "description": "Product description, 1-255 characters", + "flags": "Flags, see TL conditional fields", + "invoice": "The invoice", + "payload": "Bot-defined invoice payload, 1-128 bytes. This will not be displayed to the user, use for your internal processes.", + "photo": "Invoice photo", + "provider": "Payments provider token, obtained via Botfather", + "provider_data": "A JSON-serialized object for data about the invoice, which will be shared with the payment provider. A detailed description of the required fields should be provided by the payment provider.", + "reply_markup": "Inline keyboard", + "title": "Product name, 1-32 characters" + } + }, + "InputBotInlineMessageMediaVenue": { + "desc": "Venue", + "params": { + "address": "Address", + "flags": "Flags, see TL conditional fields", + "geo_point": "Geolocation", + "provider": "Venue provider: currently only \"foursquare\" and \"gplaces\" (Google Places) need to be supported", + "reply_markup": "Inline keyboard", + "title": "Venue name", + "venue_id": "Venue ID in the provider's database", + "venue_type": "Venue type in the provider's database" + } + }, + "InputBotInlineMessageMediaWebPage": { + "desc": "Specifies options that will be used to generate the link preview for the message, or even a standalone link preview without an attached message.", + "params": { + "entities": "Message entities for styled text", + "flags": "Flags, see TL conditional fields", + "force_large_media": "If set, specifies that a large media preview should be used.", + "force_small_media": "If set, specifies that a small media preview should be used.", + "invert_media": "If set, any eventual webpage preview will be shown on top of the message instead of at the bottom.", + "message": "The message, can be empty.", + "optional": "If not set, a WEBPAGE_NOT_FOUND RPC error will be emitted if a webpage preview cannot be generated for the specified url; otherwise, no error will be emitted (unless the provided message is also empty, in which case a MESSAGE_EMPTY will be emitted, instead).", + "reply_markup": "Inline keyboard", + "url": "The URL to use for the link preview." + } + }, + "InputBotInlineMessageText": { + "desc": "Simple text message", + "params": { + "entities": "Message entities for styled text", + "flags": "Flags, see TL conditional fields", + "invert_media": "If set, any eventual webpage preview will be shown on top of the message instead of at the bottom.", + "message": "Message", + "no_webpage": "Disable webpage preview", + "reply_markup": "Inline keyboard" + } + }, + "InputBotInlineResult": { + "desc": "An inline bot result", + "params": { + "content": "Result contents", + "description": "Result description", + "flags": "Flags, see TL conditional fields", + "id": "ID of result", + "send_message": "Message to send when the result is selected", + "thumb": "Thumbnail for result", + "title": "Result title", + "type": "Result type (see bot API docs)", + "url": "URL of result" + } + }, + "InputBotInlineResultDocument": { + "desc": "Document (media of any type except for photos)", + "params": { + "description": "Result description", + "document": "Document to send", + "flags": "Flags, see TL conditional fields", + "id": "Result ID", + "send_message": "Message to send when the result is selected", + "title": "Result title", + "type": "Result type (see bot API docs)" + } + }, + "InputBotInlineResultGame": { + "desc": "Game", + "params": { + "id": "Result ID", + "send_message": "Message to send when the result is selected", + "short_name": "Game short name" + } + }, + "InputBotInlineResultPhoto": { + "desc": "Photo", + "params": { + "id": "Result ID", + "photo": "Photo to send", + "send_message": "Message to send when the result is selected", + "type": "Result type (see bot API docs)" + } + }, + "InputBusinessAwayMessage": { + "desc": "Describes a Telegram Business away message, automatically sent to users writing to us when we're offline, during closing hours, while we're on vacation, or in some other custom time period when we cannot immediately answer to the user.", + "params": { + "flags": "Flags, see TL conditional fields", + "offline_only": "If set, the messages will not be sent if the account was online in the last 10 minutes.", + "recipients": "Allowed recipients for the away messages.", + "schedule": "Specifies when should the away messages be sent.", + "shortcut_id": "ID of a quick reply shorcut, containing the away messages to send, see here \u00bb for more info." + } + }, + "InputBusinessBotRecipients": { + "desc": "Specifies the private chats that a connected business bot \u00bb may interact with.", + "params": { + "contacts": "Selects all private chats with contacts.", + "exclude_selected": "If set, then all private chats except the ones selected by existing_chats, new_chats, contacts, non_contacts and users are chosen. Note that if this flag is set, any values passed in exclude_users will be merged and moved into users by the server.", + "exclude_users": "Identifiers of private chats that are always excluded.", + "existing_chats": "Selects all existing private chats.", + "flags": "Flags, see TL conditional fields", + "new_chats": "Selects all new private chats.", + "non_contacts": "Selects all private chats with non-contacts.", + "users": "Explicitly selected private chats." + } + }, + "InputBusinessChatLink": { + "desc": "Contains info about a business chat deep link \u00bb to be created by the current account.", + "params": { + "entities": "Message entities for styled text", + "flags": "Flags, see TL conditional fields", + "message": "Message to pre-fill in the message input field.", + "title": "Human-readable name of the link, to simplify management in the UI (only visible to the creator of the link)." + } + }, + "InputBusinessGreetingMessage": { + "desc": "Describes a Telegram Business greeting, automatically sent to new users writing to us in private for the first time, or after a certain inactivity period.", + "params": { + "no_activity_days": "The number of days after which a private chat will be considered as inactive; currently, must be one of 7, 14, 21, or 28.", + "recipients": "Allowed recipients for the greeting messages.", + "shortcut_id": "ID of a quick reply shorcut, containing the greeting messages to send, see here \u00bb for more info." + } + }, + "InputBusinessIntro": { + "desc": "Telegram Business introduction \u00bb.", + "params": { + "description": "Profile introduction", + "flags": "Flags, see TL conditional fields", + "sticker": "Optional introduction sticker.", + "title": "Title of the introduction message" + } + }, + "InputBusinessRecipients": { + "desc": "Specifies the chats that can receive Telegram Business away \u00bb and greeting \u00bb messages.", + "params": { + "contacts": "All private chats with contacts.", + "exclude_selected": "If set, inverts the selection.", + "existing_chats": "All existing private chats.", + "flags": "Flags, see TL conditional fields", + "new_chats": "All new private chats.", + "non_contacts": "All private chats with non-contacts.", + "users": "Only private chats with the specified users." + } + }, + "InputChannel": { + "desc": "Represents a channel", + "params": { + "access_hash": "Access hash taken from the channel constructor", + "channel_id": "Channel ID" + } + }, + "InputChannelEmpty": { + "desc": "Represents the absence of a channel", + "params": {} + }, + "InputChannelFromMessage": { + "desc": "Defines a min channel that was seen in a certain message of a certain chat.", + "params": { + "channel_id": "The channel ID", + "msg_id": "The message ID in the chat where the channel was seen", + "peer": "The chat where the channel was seen" + } + }, + "InputChatPhoto": { + "desc": "Existing photo to be set as a chat profile photo.", + "params": { + "id": "Existing photo" + } + }, + "InputChatPhotoEmpty": { + "desc": "Empty constructor, remove group photo.", + "params": {} + }, + "InputChatTheme": { + "desc": "Set an emoji-based chat theme, returned by account.getChatThemes.", + "params": { + "emoticon": "The emoji." + } + }, + "InputChatThemeEmpty": { + "desc": "Remove any currently configured theme.", + "params": {} + }, + "InputChatThemeUniqueGift": { + "desc": "Set a theme based on an owned collectible gift \u00bb, returned by account.getUniqueGiftChatThemes.", + "params": { + "slug": "The slug from starGiftUnique.slug." + } + }, + "InputChatUploadedPhoto": { + "desc": "New photo to be set as group profile photo.", + "params": { + "file": "File saved in parts using the method upload.saveFilePart", + "flags": "Flags, see TL conditional fields", + "video": "Square video for animated profile picture", + "video_emoji_markup": "Animated sticker profile picture, must contain either a videoSizeEmojiMarkup or a videoSizeStickerMarkup constructor.", + "video_start_ts": "Floating point UNIX timestamp in seconds, indicating the frame of the video/sticker that should be used as static preview; can only be used if video or video_emoji_markup is set." + } + }, + "InputChatlistDialogFilter": { + "desc": "Folder ID", + "params": { + "filter_id": "Folder ID" + } + }, + "InputCheckPasswordEmpty": { + "desc": "There is no password", + "params": {} + }, + "InputCheckPasswordSRP": { + "desc": "Constructor for checking the validity of a 2FA SRP password (see SRP)", + "params": { + "A": "A parameter (see SRP)", + "M1": "M1 parameter (see SRP)", + "srp_id": "SRP ID" + } + }, + "InputClientProxy": { + "desc": "Info about an MTProxy used to connect.", + "params": { + "address": "Proxy address", + "port": "Proxy port" + } + }, + "InputCollectiblePhone": { + "desc": "Represents a phone number fragment collectible", + "params": { + "phone": "Phone number" + } + }, + "InputCollectibleUsername": { + "desc": "Represents a username fragment collectible", + "params": { + "username": "Username" + } + }, + "InputDialogPeer": { + "desc": "A peer", + "params": { + "peer": "Peer" + } + }, + "InputDialogPeerFolder": { + "desc": "All peers in a peer folder", + "params": { + "folder_id": "Peer folder ID, for more info click here" + } + }, + "InputDocument": { + "desc": "Defines a document for subsequent interaction.", + "params": { + "access_hash": "access_hash parameter from the document constructor", + "file_reference": "File reference", + "id": "Document ID" + } + }, + "InputDocumentEmpty": { + "desc": "Empty constructor.", + "params": {} + }, + "InputDocumentFileLocation": { + "desc": "Document location (video, voice, audio, basically every type except photo)", + "params": { + "access_hash": "access_hash parameter from the document constructor", + "file_reference": "File reference", + "id": "Document ID", + "thumb_size": "Thumbnail size to download the thumbnail" + } + }, + "InputEmojiStatusCollectible": { + "desc": "An owned collectible gift \u00bb as emoji status: can only be used in account.updateEmojiStatus, is never returned by the API.", + "params": { + "collectible_id": "ID of the collectible (from starGiftUnique.id).", + "flags": "Flags, see TL conditional fields", + "until": "If set, the emoji status will be active until the specified unixtime." + } + }, + "InputEncryptedChat": { + "desc": "Creates an encrypted chat.", + "params": { + "access_hash": "Checking sum from constructor encryptedChat, encryptedChatWaiting or encryptedChatRequested", + "chat_id": "Chat ID" + } + }, + "InputEncryptedFile": { + "desc": "Sets forwarded encrypted file for attachment.", + "params": { + "access_hash": "Checking sum, value of access_hash parameter from encryptedFile", + "id": "File ID, value of id parameter from encryptedFile" + } + }, + "InputEncryptedFileBigUploaded": { + "desc": "Assigns a new big encrypted file (over 10 MB in size), saved in parts using the method upload.saveBigFilePart.", + "params": { + "id": "Random file id, created by the client", + "key_fingerprint": "32-bit imprint of the key used to encrypt the file", + "parts": "Number of saved parts" + } + }, + "InputEncryptedFileEmpty": { + "desc": "Empty constructor.", + "params": {} + }, + "InputEncryptedFileLocation": { + "desc": "Location of encrypted secret chat file.", + "params": { + "access_hash": "Checksum, access_hash parameter value from encryptedFile", + "id": "File ID, id parameter value from encryptedFile" + } + }, + "InputEncryptedFileUploaded": { + "desc": "Sets new encrypted file saved by parts using upload.saveFilePart method.", + "params": { + "id": "Random file ID created by client", + "key_fingerprint": "32-bit fingerprint of the key used to encrypt a file", + "md5_checksum": "In case md5-HASH of the (already encrypted) file was transmitted, file content will be checked prior to use", + "parts": "Number of saved parts" + } + }, + "InputFile": { + "desc": "Defines a file saved in parts using the method upload.saveFilePart.", + "params": { + "id": "Random file identifier created by the client", + "md5_checksum": "In case the file's md5-hash was passed, contents of the file will be checked prior to use", + "name": "Full name of the file", + "parts": "Number of parts saved" + } + }, + "InputFileBig": { + "desc": "Assigns a big file (over 10 MB in size), saved in part using the method upload.saveBigFilePart.", + "params": { + "id": "Random file id, created by the client", + "name": "Full file name", + "parts": "Number of parts saved" + } + }, + "InputFileLocation": { + "desc": "DEPRECATED location of a photo", + "params": { + "file_reference": "File reference", + "local_id": "File identifier", + "secret": "Check sum to access the file", + "volume_id": "Server volume" + } + }, + "InputFileStoryDocument": { + "desc": "Used to edit the thumbnail/static preview of a story, see here \u00bb for more info on the full flow.", + "params": { + "id": "The old story video." + } + }, + "InputFolderPeer": { + "desc": "Peer in a folder", + "params": { + "folder_id": "Peer folder ID, for more info click here", + "peer": "Peer" + } + }, + "InputGameID": { + "desc": "Indicates an already sent game", + "params": { + "access_hash": "access hash from Game constructor", + "id": "game ID from Game constructor" + } + }, + "InputGameShortName": { + "desc": "Game by short name", + "params": { + "bot_id": "The bot that provides the game", + "short_name": "The game's short name, usually obtained from a game link \u00bb" + } + }, + "InputGeoPoint": { + "desc": "Defines a GeoPoint by its coordinates.", + "params": { + "accuracy_radius": "The estimated horizontal accuracy of the location, in meters; as defined by the sender.", + "flags": "Flags, see TL conditional fields", + "lat": "Latitude", + "long": "Longitude" + } + }, + "InputGeoPointEmpty": { + "desc": "Empty GeoPoint constructor.", + "params": {} + }, + "InputGroupCall": { + "desc": "Points to a specific group call", + "params": { + "access_hash": "Group call access hash", + "id": "Group call ID" + } + }, + "InputGroupCallInviteMessage": { + "desc": "Join a group call through a messageActionConferenceCall invitation message.", + "params": { + "msg_id": "ID of the messageActionConferenceCall." + } + }, + "InputGroupCallSlug": { + "desc": "Join a conference call through an invitation link \u00bb.", + "params": { + "slug": "Slug from the conference link \u00bb." + } + }, + "InputGroupCallStream": { + "desc": "Chunk of a livestream", + "params": { + "call": "Livestream info", + "flags": "Flags, see TL conditional fields", + "scale": "Specifies the duration of the video segment to fetch in milliseconds, by bitshifting 1000 to the right scale times: duration_ms := 1000 >> scale", + "time_ms": "Timestamp in milliseconds", + "video_channel": "Selected video channel", + "video_quality": "Selected video quality (0 = lowest, 1 = medium, 2 = best)" + } + }, + "InputInvoiceBusinessBotTransferStars": { + "desc": "Transfer stars from the balance of a user account connected to a business bot, to the balance of the business bot, see here \u00bb for more info on the full flow.", + "params": { + "bot": "Always inputUserSelf.", + "stars": "The number of stars to transfer." + } + }, + "InputInvoiceChatInviteSubscription": { + "desc": "Used to pay for a Telegram Star subscription \u00bb.", + "params": { + "hash": "The invitation link of the Telegram Star subscription \u00bb" + } + }, + "InputInvoiceMessage": { + "desc": "An invoice contained in a messageMediaInvoice message or paid media \u00bb.", + "params": { + "msg_id": "Message ID", + "peer": "Chat where the invoice/paid media was sent" + } + }, + "InputInvoicePremiumAuthCode": { + "desc": "", + "params": {} + }, + "InputInvoicePremiumGiftCode": { + "desc": "Used if the user wishes to start a channel/supergroup giveaway or send some giftcodes to members of a channel/supergroup, in exchange for boosts.", + "params": { + "option": "Should be populated with one of the giveaway options returned by payments.getPremiumGiftCodeOptions, see the giveaways \u00bb documentation for more info.", + "purpose": "Should be populated with inputStorePaymentPremiumGiveaway for giveaways and inputStorePaymentPremiumGiftCode for gifts." + } + }, + "InputInvoicePremiumGiftStars": { + "desc": "Used to gift a Telegram Premium subscription to another user, paying with Telegram Stars.", + "params": { + "flags": "Flags, see TL conditional fields", + "message": "Message attached with the gift.", + "months": "Duration of the subscription in months, must be one of the options with currency == \"XTR\" returned by payments.getPremiumGiftCodeOptions.", + "user_id": "Who will receive the gifted subscription." + } + }, + "InputInvoiceSlug": { + "desc": "An invoice slug taken from an invoice deep link or from the premium_invoice_slug app config parameter \u00bb", + "params": { + "slug": "The invoice slug" + } + }, + "InputInvoiceStarGift": { + "desc": "Used to buy a Telegram Star Gift, see here \u00bb for more info.", + "params": { + "flags": "Flags, see TL conditional fields", + "gift_id": "Identifier of the gift, from starGift.id", + "hide_name": "If set, your name will be hidden if the destination user decides to display the gift on their profile (they will still see that you sent the gift)", + "include_upgrade": "Also pay for an eventual upgrade of the gift to a collectible gift \u00bb.", + "message": "Optional message, attached with the gift. The maximum length for this field is specified in the stargifts_message_length_max client configuration value \u00bb.", + "peer": "Receiver of the gift." + } + }, + "InputInvoiceStarGiftDropOriginalDetails": { + "desc": "", + "params": {} + }, + "InputInvoiceStarGiftPrepaidUpgrade": { + "desc": "Separately prepay for the upgrade of a gift \u00bb.", + "params": { + "hash": "The upgrade hash from messageActionStarGift.prepaid_upgrade_hash or savedStarGift.prepaid_upgrade_hash.", + "peer": "The peer that owns the gift." + } + }, + "InputInvoiceStarGiftResale": { + "desc": "Used to buy a collectible gift currently up on resale, see here for more info on the full flow.", + "params": { + "flags": "Flags, see TL conditional fields", + "slug": "Slug of the gift to buy.", + "to_id": "The receiver of the gift.", + "ton": "Buy the gift using TON." + } + }, + "InputInvoiceStarGiftTransfer": { + "desc": "Used to pay to transfer a collectible gift to another peer, see the gifts \u00bb documentation for more info.", + "params": { + "stargift": "The identifier of the received gift", + "to_id": "The destination peer" + } + }, + "InputInvoiceStarGiftUpgrade": { + "desc": "Used to pay to upgrade a Gift to a collectible gift, see the collectible gifts \u00bb documentation for more info on the full flow.", + "params": { + "flags": "Flags, see TL conditional fields", + "keep_original_details": "Set this flag to keep the original gift text, sender and receiver in the upgraded gift as a starGiftAttributeOriginalDetails attribute.", + "stargift": "The identifier of the received gift to upgrade." + } + }, + "InputInvoiceStars": { + "desc": "Used to top up the Telegram Stars balance of the current account or someone else's account, or to start a Telegram Star giveaway \u00bb.", + "params": { + "purpose": "An inputStorePaymentStarsGiveaway, inputStorePaymentStarsTopup or inputStorePaymentStarsGift." + } + }, + "InputKeyboardButtonRequestPeer": { + "desc": "Prompts the user to select and share one or more peers with the bot using messages.sendBotRequestedPeer.", + "params": { + "button_id": "Button ID, to be passed to messages.sendBotRequestedPeer.", + "flags": "Flags, see TL conditional fields", + "max_quantity": "Maximum number of peers that can be chosen.", + "name_requested": "Set this flag to request the peer's name.", + "peer_type": "Filtering criteria to use for the peer selection list shown to the user. The list should display all existing peers of the specified type, and should also offer an option for the user to create and immediately use one or more (up to max_quantity) peers of the specified type, if needed.", + "photo_requested": "Set this flag to request the peer's photo (if any).", + "text": "Button text", + "username_requested": "Set this flag to request the peer's @username (if any)." + } + }, + "InputKeyboardButtonUrlAuth": { + "desc": "Button to request a user to authorize via URL using Seamless Telegram Login.", + "params": { + "bot": "Username of a bot, which will be used for user authorization. See Setting up a bot for more details. If not specified, the current bot's username will be assumed. The url's domain must be the same as the domain linked with the bot. See Linking your domain to the bot for more details.", + "flags": "Flags, see TL conditional fields", + "fwd_text": "New text of the button in forwarded messages.", + "request_write_access": "Set this flag to request the permission for your bot to send messages to the user.", + "text": "Button text", + "url": "An HTTP URL to be opened with user authorization data added to the query string when the button is pressed. If the user refuses to provide authorization data, the original URL without information about the user will be opened. The data added is the same as described in Receiving authorization data.NOTE: You must always check the hash of the received data to verify the authentication and the integrity of the data as described in Checking authorization." + } + }, + "InputKeyboardButtonUserProfile": { + "desc": "Button that links directly to a user profile", + "params": { + "text": "Button text", + "user_id": "User ID" + } + }, + "InputMediaAreaChannelPost": { + "desc": "Represents a channel post", + "params": { + "channel": "The channel that posted the message", + "coordinates": "The size and location of the media area corresponding to the location sticker on top of the story media.", + "msg_id": "ID of the channel message" + } + }, + "InputMediaAreaVenue": { + "desc": "Represents a location tag attached to a story, with additional venue information.", + "params": { + "coordinates": "The size and location of the media area corresponding to the location sticker on top of the story media.", + "query_id": "The query_id from messages.botResults, see here \u00bb for more info.", + "result_id": "The id of the chosen result, see here \u00bb for more info." + } + }, + "InputMediaContact": { + "desc": "Phone book contact", + "params": { + "first_name": "Contact's first name", + "last_name": "Contact's last name", + "phone_number": "Phone number", + "vcard": "Contact vcard" + } + }, + "InputMediaDice": { + "desc": "Send a dice-based animated sticker", + "params": { + "emoticon": "The emoji, for now , and are supported" + } + }, + "InputMediaDocument": { + "desc": "Forwarded document", + "params": { + "flags": "Flags, see TL conditional fields", + "id": "The document to be forwarded.", + "query": "Text query or emoji that was used by the user to find this sticker or GIF: used to improve search result relevance.", + "spoiler": "Whether this media should be hidden behind a spoiler warning", + "ttl_seconds": "Time to live of self-destructing document", + "video_cover": "Custom video cover.", + "video_timestamp": "Start playing the video at the specified timestamp (seconds)." + } + }, + "InputMediaDocumentExternal": { + "desc": "Document that will be downloaded by the telegram servers", + "params": { + "flags": "Flags, see TL conditional fields", + "spoiler": "Whether this media should be hidden behind a spoiler warning", + "ttl_seconds": "Self-destruct time to live of document", + "url": "URL of the document", + "video_cover": "Custom video cover.", + "video_timestamp": "Start playing the video at the specified timestamp (seconds)." + } + }, + "InputMediaEmpty": { + "desc": "Empty media content of a message.", + "params": {} + }, + "InputMediaGame": { + "desc": "A game", + "params": { + "id": "The game to forward" + } + }, + "InputMediaGeoLive": { + "desc": "Live geolocation", + "params": { + "flags": "Flags, see TL conditional fields", + "geo_point": "Current geolocation", + "heading": "For live locations, a direction in which the location moves, in degrees; 1-360.", + "period": "Validity period of the current location", + "proximity_notification_radius": "For live locations, a maximum distance to another chat member for proximity alerts, in meters (0-100000)", + "stopped": "Whether sending of the geolocation was stopped" + } + }, + "InputMediaGeoPoint": { + "desc": "Map.", + "params": { + "geo_point": "GeoPoint" + } + }, + "InputMediaInvoice": { + "desc": "Generated invoice of a bot payment", + "params": { + "description": "Product description, 1-255 characters", + "extended_media": "Deprecated", + "flags": "Flags, see TL conditional fields", + "invoice": "The actual invoice", + "payload": "Bot-defined invoice payload, 1-128 bytes. This will not be displayed to the user, use for your internal processes.", + "photo": "URL of the product photo for the invoice. Can be a photo of the goods or a marketing image for a service. People like it better when they see what they are paying for.", + "provider": "Payments provider token, obtained via Botfather", + "provider_data": "JSON-encoded data about the invoice, which will be shared with the payment provider. A detailed description of required fields should be provided by the payment provider.", + "start_param": "Unique bot deep links start parameter. If present, forwarded copies of the sent message will have a URL button with a deep link to the bot (instead of a Pay button), with the value used as the start parameter. If absent, forwarded copies of the sent message will have a Pay button, allowing multiple users to pay directly from the forwarded message, using the same invoice.", + "title": "Product name, 1-32 characters" + } + }, + "InputMediaPaidMedia": { + "desc": "Paid media, see here \u00bb for more info.", + "params": { + "extended_media": "Photos or videos.", + "flags": "Flags, see TL conditional fields", + "payload": "Bots only, specifies a custom payload that will then be passed in updateBotPurchasedPaidMedia when a payment is made (this field will not be visible to the user)", + "stars_amount": "The price of the media in Telegram Stars." + } + }, + "InputMediaPhoto": { + "desc": "Forwarded photo", + "params": { + "flags": "Flags, see TL conditional fields", + "id": "Photo to be forwarded", + "spoiler": "Whether this media should be hidden behind a spoiler warning", + "ttl_seconds": "Time to live in seconds of self-destructing photo" + } + }, + "InputMediaPhotoExternal": { + "desc": "New photo that will be uploaded by the server using the specified URL", + "params": { + "flags": "Flags, see TL conditional fields", + "spoiler": "Whether this media should be hidden behind a spoiler warning", + "ttl_seconds": "Self-destruct time to live of photo", + "url": "URL of the photo" + } + }, + "InputMediaPoll": { + "desc": "A poll", + "params": { + "correct_answers": "Correct answer IDs (for quiz polls)", + "flags": "Flags, see TL conditional fields", + "poll": "The poll to send", + "solution": "Explanation of quiz solution", + "solution_entities": "Message entities for styled text" + } + }, + "InputMediaStory": { + "desc": "Forwarded story", + "params": { + "id": "Story ID", + "peer": "Peer where the story was posted" + } + }, + "InputMediaTodo": { + "desc": "Creates a todo list \u00bb.", + "params": { + "todo": "The todo list." + } + }, + "InputMediaUploadedDocument": { + "desc": "New document", + "params": { + "attributes": "Attributes that specify the type of the document (video, audio, voice, sticker, etc.)", + "file": "The uploaded file", + "flags": "Flags, see TL conditional fields", + "force_file": "Force the media file to be uploaded as document", + "mime_type": "MIME type of document", + "nosound_video": "Whether to send the file as a video even if it doesn't have an audio track (i.e. if set, the documentAttributeAnimated attribute will not be set even for videos without audio)", + "spoiler": "Whether this media should be hidden behind a spoiler warning", + "stickers": "Attached stickers", + "thumb": "Thumbnail of the document, uploaded as for the file", + "ttl_seconds": "Time to live in seconds of self-destructing document", + "video_cover": "Start playing the video at the specified timestamp (seconds).", + "video_timestamp": "Start playing the video at the specified timestamp (seconds)." + } + }, + "InputMediaUploadedPhoto": { + "desc": "Photo", + "params": { + "file": "The uploaded file", + "flags": "Flags, see TL conditional fields", + "spoiler": "Whether this media should be hidden behind a spoiler warning", + "stickers": "Attached mask stickers", + "ttl_seconds": "Time to live in seconds of self-destructing photo" + } + }, + "InputMediaVenue": { + "desc": "Can be used to send a venue geolocation.", + "params": { + "address": "Physical address of the venue", + "geo_point": "Geolocation", + "provider": "Venue provider: currently only \"foursquare\" and \"gplaces\" (Google Places) need to be supported", + "title": "Venue name", + "venue_id": "Venue ID in the provider's database", + "venue_type": "Venue type in the provider's database" + } + }, + "InputMediaWebPage": { + "desc": "Specifies options that will be used to generate the link preview for the caption, or even a standalone link preview without an attached message.", + "params": { + "flags": "Flags, see TL conditional fields", + "force_large_media": "If set, specifies that a large media preview should be used.", + "force_small_media": "If set, specifies that a small media preview should be used.", + "optional": "If not set, a WEBPAGE_NOT_FOUND RPC error will be emitted if a webpage preview cannot be generated for the specified url; otherwise, no error will be emitted (unless the provided message is also empty, in which case a MESSAGE_EMPTY will be emitted, instead).", + "url": "The URL to use for the link preview." + } + }, + "InputMessageCallbackQuery": { + "desc": "Used by bots for fetching information about the message that originated a callback query", + "params": { + "id": "Message ID", + "query_id": "Callback query ID" + } + }, + "InputMessageEntityMentionName": { + "desc": "Message entity that can be used to create a user user mention: received mentions use the messageEntityMentionName constructor, instead.", + "params": { + "length": "Length of message entity within message (in UTF-16 code units)", + "offset": "Offset of message entity within message (in UTF-16 code units)", + "user_id": "Identifier of the user that was mentioned" + } + }, + "InputMessageID": { + "desc": "Message by ID", + "params": { + "id": "Message ID" + } + }, + "InputMessagePinned": { + "desc": "Pinned message", + "params": {} + }, + "InputMessageReplyTo": { + "desc": "Message to which the specified message replies to", + "params": { + "id": "ID of the message that replies to the message we need" + } + }, + "InputMessagesFilterChatPhotos": { + "desc": "Return only chat photo changes", + "params": {} + }, + "InputMessagesFilterContacts": { + "desc": "Return only messages containing contacts", + "params": {} + }, + "InputMessagesFilterDocument": { + "desc": "Filter for messages containing documents.", + "params": {} + }, + "InputMessagesFilterEmpty": { + "desc": "Filter is absent.", + "params": {} + }, + "InputMessagesFilterGeo": { + "desc": "Return only messages containing geolocations", + "params": {} + }, + "InputMessagesFilterGif": { + "desc": "Return only messages containing gifs", + "params": {} + }, + "InputMessagesFilterMusic": { + "desc": "Return only messages containing audio files", + "params": {} + }, + "InputMessagesFilterMyMentions": { + "desc": "Return only messages where the current user was mentioned.", + "params": {} + }, + "InputMessagesFilterPhoneCalls": { + "desc": "Return only phone calls", + "params": { + "flags": "Flags, see TL conditional fields", + "missed": "Return only missed phone calls" + } + }, + "InputMessagesFilterPhotoVideo": { + "desc": "Filter for messages containing photos or videos.", + "params": {} + }, + "InputMessagesFilterPhotoVideoDocuments": { + "desc": "", + "params": {} + }, + "InputMessagesFilterPhotos": { + "desc": "Filter for messages containing photos.", + "params": {} + }, + "InputMessagesFilterPinned": { + "desc": "Fetch only pinned messages", + "params": {} + }, + "InputMessagesFilterRoundVideo": { + "desc": "Return only round videos", + "params": {} + }, + "InputMessagesFilterRoundVoice": { + "desc": "Return only round videos and voice notes", + "params": {} + }, + "InputMessagesFilterUrl": { + "desc": "Return only messages containing URLs", + "params": {} + }, + "InputMessagesFilterVideo": { + "desc": "Filter for messages containing videos.", + "params": {} + }, + "InputMessagesFilterVoice": { + "desc": "Return only messages containing voice notes", + "params": {} + }, + "InputNotifyBroadcasts": { + "desc": "All channels", + "params": {} + }, + "InputNotifyChats": { + "desc": "Notifications generated by all groups.", + "params": {} + }, + "InputNotifyForumTopic": { + "desc": "Notifications generated by a topic in a forum.", + "params": { + "peer": "Forum ID", + "top_msg_id": "Topic ID" + } + }, + "InputNotifyPeer": { + "desc": "Notifications generated by a certain user or group.", + "params": { + "peer": "User or group" + } + }, + "InputNotifyUsers": { + "desc": "Notifications generated by all users.", + "params": {} + }, + "InputPaymentCredentials": { + "desc": "Payment credentials", + "params": { + "data": "Payment credentials", + "flags": "Flags, see TL conditional fields", + "save": "Save payment credential for future use" + } + }, + "InputPaymentCredentialsApplePay": { + "desc": "Apple pay payment credentials", + "params": { + "payment_data": "Payment data" + } + }, + "InputPaymentCredentialsGooglePay": { + "desc": "Google Pay payment credentials", + "params": { + "payment_token": "Payment token" + } + }, + "InputPaymentCredentialsSaved": { + "desc": "Saved payment credentials", + "params": { + "id": "Credential ID", + "tmp_password": "Temporary password" + } + }, + "InputPeerChannel": { + "desc": "Defines a channel for further interaction.", + "params": { + "access_hash": "access_hash value from the channel constructor", + "channel_id": "Channel identifier" + } + }, + "InputPeerChannelFromMessage": { + "desc": "Defines a min channel that was seen in a certain message of a certain chat.", + "params": { + "channel_id": "The identifier of the channel that was seen", + "msg_id": "The message ID", + "peer": "The chat where the channel's message was seen" + } + }, + "InputPeerChat": { + "desc": "Defines a chat for further interaction.", + "params": { + "chat_id": "Chat identifier" + } + }, + "InputPeerColorCollectible": { + "desc": "", + "params": {} + }, + "InputPeerEmpty": { + "desc": "An empty constructor, no user or chat is defined.", + "params": {} + }, + "InputPeerNotifySettings": { + "desc": "Notification settings.", + "params": { + "flags": "Flags, see TL conditional fields", + "mute_until": "Date until which all notifications shall be switched off", + "show_previews": "If the text of the message shall be displayed in notification", + "silent": "Peer was muted?", + "sound": "Identifier of an audio file to play for notifications.", + "stories_hide_sender": "Whether the sender name should be displayed in story notifications.", + "stories_muted": "Whether story notifications should be disabled.", + "stories_sound": "Identifier of an audio file to play for story notifications." + } + }, + "InputPeerPhotoFileLocation": { + "desc": "Location of profile photo of channel/group/supergroup/user", + "params": { + "big": "Whether to download the high-quality version of the picture", + "flags": "Flags, see TL conditional fields", + "peer": "The peer whose profile picture should be downloaded", + "photo_id": "Photo ID" + } + }, + "InputPeerSelf": { + "desc": "Defines the current user.", + "params": {} + }, + "InputPeerUser": { + "desc": "Defines a user for further interaction.", + "params": { + "access_hash": "access_hash value from the user constructor", + "user_id": "User identifier" + } + }, + "InputPeerUserFromMessage": { + "desc": "Defines a min user that was seen in a certain message of a certain chat.", + "params": { + "msg_id": "The message ID", + "peer": "The chat where the user was seen", + "user_id": "The identifier of the user that was seen" + } + }, + "InputPhoneCall": { + "desc": "Phone call", + "params": { + "access_hash": "Access hash", + "id": "Call ID" + } + }, + "InputPhoneContact": { + "desc": "Phone contact.", + "params": { + "client_id": "An arbitrary 64-bit integer: it should be set, for example, to an incremental number when using contacts.importContacts, in order to retry importing only the contacts that weren't imported successfully, according to the client_ids returned in contacts.importedContacts.retry_contacts.", + "first_name": "Contact's first name", + "last_name": "Contact's last name", + "phone": "Phone number" + } + }, + "InputPhoto": { + "desc": "Defines a photo for further interaction.", + "params": { + "access_hash": "access_hash value from the photo constructor", + "file_reference": "File reference", + "id": "Photo identifier" + } + }, + "InputPhotoEmpty": { + "desc": "Empty constructor.", + "params": {} + }, + "InputPhotoFileLocation": { + "desc": "Use this object to download a photo with upload.getFile method", + "params": { + "access_hash": "Photo's access hash, obtained from the photo object", + "file_reference": "File reference", + "id": "Photo ID, obtained from the photo object", + "thumb_size": "The PhotoSize to download: must be set to the type field of the desired PhotoSize object of the photo" + } + }, + "InputPhotoLegacyFileLocation": { + "desc": "DEPRECATED legacy photo file location", + "params": { + "access_hash": "Access hash", + "file_reference": "File reference", + "id": "Photo ID", + "local_id": "Local ID", + "secret": "Secret", + "volume_id": "Volume ID" + } + }, + "InputPrivacyKeyAbout": { + "desc": "Whether people can see your bio", + "params": {} + }, + "InputPrivacyKeyAddedByPhone": { + "desc": "Whether people can add you to their contact list by your phone number", + "params": {} + }, + "InputPrivacyKeyBirthday": { + "desc": "Whether the user can see our birthday.", + "params": {} + }, + "InputPrivacyKeyChatInvite": { + "desc": "Whether people will be able to invite you to chats", + "params": {} + }, + "InputPrivacyKeyForwards": { + "desc": "Whether messages forwarded from you will be anonymous", + "params": {} + }, + "InputPrivacyKeyNoPaidMessages": { + "desc": "Who can send you messages without paying, if paid messages \u00bb are enabled.", + "params": {} + }, + "InputPrivacyKeyPhoneCall": { + "desc": "Whether you will accept phone calls", + "params": {} + }, + "InputPrivacyKeyPhoneNumber": { + "desc": "Whether people will be able to see your phone number", + "params": {} + }, + "InputPrivacyKeyPhoneP2P": { + "desc": "Whether to allow P2P communication during VoIP calls", + "params": {} + }, + "InputPrivacyKeyProfilePhoto": { + "desc": "Whether people will be able to see your profile picture", + "params": {} + }, + "InputPrivacyKeyStarGiftsAutoSave": { + "desc": "Whether received gifts will be automatically displayed on our profile", + "params": {} + }, + "InputPrivacyKeyStatusTimestamp": { + "desc": "Whether people will be able to see our exact last online timestamp.", + "params": {} + }, + "InputPrivacyKeyVoiceMessages": { + "desc": "Whether people can send you voice messages or round videos (Premium users only).", + "params": {} + }, + "InputPrivacyValueAllowAll": { + "desc": "Allow all users", + "params": {} + }, + "InputPrivacyValueAllowBots": { + "desc": "Allow bots and mini apps", + "params": {} + }, + "InputPrivacyValueAllowChatParticipants": { + "desc": "Allow only participants of certain chats", + "params": { + "chats": "Allowed chat IDs (either a chat or a supergroup ID, verbatim the way it is received in the constructor (i.e. unlike with bot API IDs, here group and supergroup IDs should be treated in the same way))." + } + }, + "InputPrivacyValueAllowCloseFriends": { + "desc": "Allow only close friends \u00bb", + "params": {} + }, + "InputPrivacyValueAllowContacts": { + "desc": "Allow only contacts", + "params": {} + }, + "InputPrivacyValueAllowPremium": { + "desc": "Allow only users with a Premium subscription \u00bb, currently only usable for inputPrivacyKeyChatInvite.", + "params": {} + }, + "InputPrivacyValueAllowUsers": { + "desc": "Allow only certain users", + "params": { + "users": "Allowed users" + } + }, + "InputPrivacyValueDisallowAll": { + "desc": "Disallow all", + "params": {} + }, + "InputPrivacyValueDisallowBots": { + "desc": "Disallow bots and mini apps", + "params": {} + }, + "InputPrivacyValueDisallowChatParticipants": { + "desc": "Disallow only participants of certain chats", + "params": { + "chats": "Disallowed chat IDs (either a chat or a supergroup ID, verbatim the way it is received in the constructor (i.e. unlike with bot API IDs, here group and supergroup IDs should be treated in the same way))." + } + }, + "InputPrivacyValueDisallowContacts": { + "desc": "Disallow only contacts", + "params": {} + }, + "InputPrivacyValueDisallowUsers": { + "desc": "Disallow only certain users", + "params": { + "users": "Users to disallow" + } + }, + "InputQuickReplyShortcut": { + "desc": "Selects a quick reply shortcut by name.", + "params": { + "shortcut": "Shortcut name." + } + }, + "InputQuickReplyShortcutId": { + "desc": "Selects a quick reply shortcut by its numeric ID.", + "params": { + "shortcut_id": "Shortcut ID." + } + }, + "InputReplyToMessage": { + "desc": "Reply to a message.", + "params": { + "flags": "Flags, see TL conditional fields", + "monoforum_peer_id": "Must be set to the ID of the topic when replying to a message within a monoforum topic.", + "quote_entities": "Message entities for styled text from the quote_text field.", + "quote_offset": "Offset of the message quote_text within the original message (in UTF-16 code units).", + "quote_text": "Used to quote-reply to only a certain section (specified here) of the original message. The maximum UTF-8 length for quotes is specified in the quote_length_max config key.", + "reply_to_msg_id": "The message ID to reply to.", + "reply_to_peer_id": "Used to reply to messages sent to another chat (specified here), can only be used for non-protected chats and messages.", + "todo_item_id": "Can be set to reply to the specified item of a todo list \u00bb.", + "top_msg_id": "This field must contain the topic ID only when replying to messages in forum topics different from the \"General\" topic (i.e. reply_to_msg_id is set and reply_to_msg_id != topicID and topicID != 1). If the replied-to message is deleted before the method finishes execution, the value in this field will be used to send the message to the correct topic, instead of the \"General\" topic." + } + }, + "InputReplyToMonoForum": { + "desc": "Used to send messages to a monoforum topic.", + "params": { + "monoforum_peer_id": "The topic ID." + } + }, + "InputReplyToStory": { + "desc": "Reply to a story.", + "params": { + "peer": "Sender of the story", + "story_id": "ID of the story to reply to." + } + }, + "InputReportReasonChildAbuse": { + "desc": "Report for child abuse", + "params": {} + }, + "InputReportReasonCopyright": { + "desc": "Report for copyrighted content", + "params": {} + }, + "InputReportReasonFake": { + "desc": "Report for impersonation", + "params": {} + }, + "InputReportReasonGeoIrrelevant": { + "desc": "Report an irrelevant geogroup", + "params": {} + }, + "InputReportReasonIllegalDrugs": { + "desc": "Report for illegal drugs", + "params": {} + }, + "InputReportReasonOther": { + "desc": "Other", + "params": {} + }, + "InputReportReasonPersonalDetails": { + "desc": "Report for divulgation of personal details", + "params": {} + }, + "InputReportReasonPornography": { + "desc": "Report for pornography", + "params": {} + }, + "InputReportReasonSpam": { + "desc": "Report for spam", + "params": {} + }, + "InputReportReasonViolence": { + "desc": "Report for violence", + "params": {} + }, + "InputSavedStarGiftChat": { + "desc": "A gift received by a channel we own.", + "params": { + "peer": "The channel.", + "saved_id": "ID of the gift, must be the saved_id of a messageActionStarGift/messageActionStarGiftUnique constructor." + } + }, + "InputSavedStarGiftSlug": { + "desc": "Points to a collectible gift obtained from a collectible gift link \u00bb.", + "params": { + "slug": "Slug from the link." + } + }, + "InputSavedStarGiftUser": { + "desc": "A gift received in a private chat with another user.", + "params": { + "msg_id": "ID of the messageService with the messageActionStarGift with the gift." + } + }, + "InputSecureFile": { + "desc": "Pre-uploaded passport file, for more info see the passport docs \u00bb", + "params": { + "access_hash": "Secure file access hash", + "id": "Secure file ID" + } + }, + "InputSecureFileLocation": { + "desc": "Location of encrypted telegram passport file.", + "params": { + "access_hash": "Checksum, access_hash parameter value from secureFile", + "id": "File ID, id parameter value from secureFile" + } + }, + "InputSecureFileUploaded": { + "desc": "Uploaded secure file, for more info see the passport docs \u00bb", + "params": { + "file_hash": "File hash", + "id": "Secure file ID", + "md5_checksum": "MD5 hash of encrypted uploaded file, to be checked server-side", + "parts": "Secure file part count", + "secret": "Secret" + } + }, + "InputSecureValue": { + "desc": "Secure value, for more info see the passport docs \u00bb", + "params": { + "data": "Encrypted Telegram Passport element data", + "files": "Array of encrypted passport files with photos the of the documents", + "flags": "Flags, see TL conditional fields", + "front_side": "Encrypted passport file with the front side of the document", + "plain_data": "Plaintext verified passport data", + "reverse_side": "Encrypted passport file with the reverse side of the document", + "selfie": "Encrypted passport file with a selfie of the user holding the document", + "translation": "Array of encrypted passport files with translated versions of the provided documents", + "type": "Secure passport value type" + } + }, + "InputSingleMedia": { + "desc": "A single media in an album or grouped media sent with messages.sendMultiMedia.", + "params": { + "entities": "Message entities for styled text", + "flags": "Flags, see TL conditional fields", + "media": "The media", + "message": "A caption for the media", + "random_id": "Unique client media ID required to prevent message resending" + } + }, + "InputStarsTransaction": { + "desc": "Used to fetch info about a Telegram Star transaction \u00bb.", + "params": { + "flags": "Flags, see TL conditional fields", + "id": "Transaction ID.", + "refund": "If set, fetches info about the refund transaction for this transaction." + } + }, + "InputStickerSetAnimatedEmoji": { + "desc": "Animated emojis stickerset", + "params": {} + }, + "InputStickerSetAnimatedEmojiAnimations": { + "desc": "Animated emoji reaction stickerset (contains animations to play when a user clicks on a given animated emoji)", + "params": {} + }, + "InputStickerSetDice": { + "desc": "Used for fetching animated dice stickers", + "params": { + "emoticon": "The emoji, for now , and are supported" + } + }, + "InputStickerSetEmojiChannelDefaultStatuses": { + "desc": "Default custom emoji status stickerset for channel statuses", + "params": {} + }, + "InputStickerSetEmojiDefaultStatuses": { + "desc": "Default custom emoji status stickerset", + "params": {} + }, + "InputStickerSetEmojiDefaultTopicIcons": { + "desc": "Default custom emoji stickerset for forum topic icons", + "params": {} + }, + "InputStickerSetEmojiGenericAnimations": { + "desc": "Generic animation stickerset containing animations to play when reacting to messages using a normal emoji without a custom animation", + "params": {} + }, + "InputStickerSetEmpty": { + "desc": "Empty constructor", + "params": {} + }, + "InputStickerSetID": { + "desc": "Stickerset by ID", + "params": { + "access_hash": "Access hash", + "id": "ID" + } + }, + "InputStickerSetItem": { + "desc": "Sticker in a stickerset", + "params": { + "document": "The sticker", + "emoji": "Associated emoji", + "flags": "Flags, see TL conditional fields", + "keywords": "Set of keywords, separated by commas (can't be provided for mask stickers)", + "mask_coords": "Coordinates for mask sticker" + } + }, + "InputStickerSetPremiumGifts": { + "desc": "Stickers to show when receiving a gifted Telegram Premium subscription", + "params": {} + }, + "InputStickerSetShortName": { + "desc": "Stickerset by short name, from a stickerset deep link \u00bb", + "params": { + "short_name": "Short name from a stickerset deep link \u00bb" + } + }, + "InputStickerSetThumb": { + "desc": "Location of stickerset thumbnail (see files)", + "params": { + "stickerset": "Sticker set", + "thumb_version": "Thumbnail version" + } + }, + "InputStickerSetTonGifts": { + "desc": "TON gifts stickerset.", + "params": {} + }, + "InputStickeredMediaDocument": { + "desc": "A document with stickers attached", + "params": { + "id": "The document" + } + }, + "InputStickeredMediaPhoto": { + "desc": "A photo with stickers attached", + "params": { + "id": "The photo" + } + }, + "InputStorePaymentAuthCode": { + "desc": "Indicates payment for a login code.", + "params": { + "amount": "Price of the product in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).", + "currency": "Three-letter ISO 4217 currency code", + "flags": "Flags, see TL conditional fields", + "phone_code_hash": "phone_code_hash returned by auth.sendCode.", + "phone_number": "Phone number.", + "restore": "Set this flag to restore a previously made purchase." + } + }, + "InputStorePaymentGiftPremium": { + "desc": "Info about a gifted Telegram Premium purchase", + "params": { + "amount": "Price of the product in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).", + "currency": "Three-letter ISO 4217 currency code", + "user_id": "The user to which the Telegram Premium subscription was gifted" + } + }, + "InputStorePaymentPremiumGiftCode": { + "desc": "Used to gift Telegram Premium subscriptions only to some specific subscribers of a channel/supergroup or to some of our contacts, see here \u00bb for more info on giveaways and gifts.", + "params": { + "amount": "Total price in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).", + "boost_peer": "If set, the gifts will be sent on behalf of a channel/supergroup we are an admin of, which will also assign some boosts to it. Otherwise, the gift will be sent directly from the currently logged in user, and we will gain some extra boost slots. See here \u00bb for more info on giveaways and gifts.", + "currency": "Three-letter ISO 4217 currency code", + "flags": "Flags, see TL conditional fields", + "message": "Message attached with the gift", + "users": "The users that will receive the Telegram Premium subscriptions." + } + }, + "InputStorePaymentPremiumGiveaway": { + "desc": "Used to pay for a giveaway, see here \u00bb for more info.", + "params": { + "additional_peers": "Additional channels that the user must join to participate to the giveaway can be specified here.", + "amount": "Total price in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).", + "boost_peer": "The channel/supergroup starting the giveaway, that the user must join to participate, that will receive the giveaway boosts; see here \u00bb for more info on giveaways.", + "countries_iso2": "The set of users that can participate to the giveaway can be restricted by passing here an explicit whitelist of up to giveaway_countries_max countries, specified as two-letter ISO 3166-1 alpha-2 country codes.", + "currency": "Three-letter ISO 4217 currency code", + "flags": "Flags, see TL conditional fields", + "only_new_subscribers": "If set, only new subscribers starting from the giveaway creation date will be able to participate to the giveaway.", + "prize_description": "Can contain a textual description of additional giveaway prizes.", + "random_id": "Random ID to avoid resending the giveaway", + "until_date": "The end date of the giveaway, must be at most giveaway_period_max seconds in the future; see here \u00bb for more info on giveaways.", + "winners_are_visible": "If set, giveaway winners are public and will be listed in a messageMediaGiveawayResults message that will be automatically sent to the channel once the giveaway ends." + } + }, + "InputStorePaymentPremiumSubscription": { + "desc": "Info about a Telegram Premium purchase", + "params": { + "flags": "Flags, see TL conditional fields", + "restore": "Pass true if this is a restore of a Telegram Premium purchase; only for the App Store", + "upgrade": "Pass true if this is an upgrade from a monthly subscription to a yearly subscription; only for App Store" + } + }, + "InputStorePaymentStarsGift": { + "desc": "Used to gift Telegram Stars to a friend.", + "params": { + "amount": "Total price in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).", + "currency": "Three-letter ISO 4217 currency code", + "stars": "Amount of stars to gift", + "user_id": "The user to which the stars should be gifted." + } + }, + "InputStorePaymentStarsGiveaway": { + "desc": "Used to pay for a star giveaway, see here \u00bb for more info.", + "params": { + "additional_peers": "Additional channels that the user must join to participate to the giveaway can be specified here.", + "amount": "Total price in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).", + "boost_peer": "The channel/supergroup starting the giveaway, that the user must join to participate, that will receive the giveaway boosts; see here \u00bb for more info on giveaways.", + "countries_iso2": "The set of users that can participate to the giveaway can be restricted by passing here an explicit whitelist of up to giveaway_countries_max countries, specified as two-letter ISO 3166-1 alpha-2 country codes.", + "currency": "Three-letter ISO 4217 currency code", + "flags": "Flags, see TL conditional fields", + "only_new_subscribers": "If set, only new subscribers starting from the giveaway creation date will be able to participate to the giveaway.", + "prize_description": "Can contain a textual description of additional giveaway prizes.", + "random_id": "Random ID to avoid resending the giveaway", + "stars": "Total number of Telegram Stars being given away (each user will receive stars/users stars).", + "until_date": "The end date of the giveaway, must be at most giveaway_period_max seconds in the future; see here \u00bb for more info on giveaways.", + "users": "Number of winners.", + "winners_are_visible": "If set, giveaway winners are public and will be listed in a messageMediaGiveawayResults message that will be automatically sent to the channel once the giveaway ends." + } + }, + "InputStorePaymentStarsTopup": { + "desc": "Used to top up the Telegram Stars balance of the current account.", + "params": { + "amount": "Total price in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).", + "currency": "Three-letter ISO 4217 currency code", + "flags": "Flags, see TL conditional fields", + "spend_purpose_peer": "Should be populated with the peer where the topup process was initiated due to low funds (i.e. a bot for bot payments, a channel for paid media/reactions, etc); leave this flag unpopulated if the topup flow was not initated when attempting to spend more Stars than currently available on the account's balance.", + "stars": "Amount of stars to topup" + } + }, + "InputTakeoutFileLocation": { + "desc": "Used to download a JSON file that will contain all personal data related to features that do not have a specialized takeout method yet, see here \u00bb for more info on the takeout API.", + "params": {} + }, + "InputTheme": { + "desc": "Theme", + "params": { + "access_hash": "Access hash", + "id": "ID" + } + }, + "InputThemeSettings": { + "desc": "Theme settings", + "params": { + "accent_color": "Accent color, ARGB format", + "base_theme": "Default theme on which this theme is based", + "flags": "Flags, see TL conditional fields", + "message_colors": "The fill to be used as a background for outgoing messages, in RGB24 format. If just one or two equal colors are provided, describes a solid fill of a background. If two different colors are provided, describes the top and bottom colors of a 0-degree gradient.If three or four colors are provided, describes a freeform gradient fill of a background.", + "message_colors_animated": "If set, the freeform gradient fill needs to be animated on every sent message", + "outbox_accent_color": "Accent color of outgoing messages in ARGB format", + "wallpaper": "inputWallPaper or inputWallPaperSlug when passing wallpaper files for image or pattern wallpapers, inputWallPaperNoFile with id=0 otherwise.", + "wallpaper_settings": "Wallpaper settings." + } + }, + "InputThemeSlug": { + "desc": "Theme by theme ID", + "params": { + "slug": "Unique theme ID obtained from a theme deep link \u00bb" + } + }, + "InputUser": { + "desc": "Defines a user for further interaction.", + "params": { + "access_hash": "access_hash value from the user constructor", + "user_id": "User identifier" + } + }, + "InputUserEmpty": { + "desc": "Empty constructor, does not define a user.", + "params": {} + }, + "InputUserFromMessage": { + "desc": "Defines a min user that was seen in a certain message of a certain chat.", + "params": { + "msg_id": "The message ID", + "peer": "The chat where the user was seen", + "user_id": "The identifier of the user that was seen" + } + }, + "InputUserSelf": { + "desc": "Defines the current user.", + "params": {} + }, + "InputWallPaper": { + "desc": "Wallpaper", + "params": { + "access_hash": "Access hash", + "id": "Wallpaper ID" + } + }, + "InputWallPaperNoFile": { + "desc": "Wallpaper with no file access hash, used for example when deleting (unsave=true) wallpapers using account.saveWallPaper, specifying just the wallpaper ID.", + "params": { + "id": "Wallpaper ID" + } + }, + "InputWallPaperSlug": { + "desc": "Wallpaper by slug (a unique ID, obtained from a wallpaper link \u00bb)", + "params": { + "slug": "Unique wallpaper ID" + } + }, + "InputWebDocument": { + "desc": "The document", + "params": { + "attributes": "Attributes for media types", + "mime_type": "Mime type", + "size": "Remote file size", + "url": "Remote document URL to be downloaded using the appropriate method" + } + }, + "InputWebFileAudioAlbumThumbLocation": { + "desc": "Used to download an album cover for any music file using upload.getWebFile, see the webfile docs for more info \u00bb.", + "params": { + "document": "The audio file in question: must NOT be provided in secret chats, provide the title and performer fields instead.", + "flags": "Flags, see TL conditional fields", + "performer": "Song performer: should only be used in secret chats, in normal chats provide document instead, as it has more lax rate limits.", + "small": "Used to return a thumbnail with 100x100 resolution (instead of the default 600x600)", + "title": "Song title: should only be used in secret chats, in normal chats provide document instead, as it has more lax rate limits." + } + }, + "InputWebFileGeoPointLocation": { + "desc": "Used to download a server-generated image with the map preview from a geoPoint, see the webfile docs for more info \u00bb.", + "params": { + "access_hash": "Access hash of the geoPoint", + "geo_point": "Generated from the lat, long and accuracy_radius parameters of the geoPoint", + "h": "Map height in pixels before applying scale; 16-1024", + "scale": "Map scale; 1-3", + "w": "Map width in pixels before applying scale; 16-1024", + "zoom": "Map zoom level; 13-20" + } + }, + "InputWebFileLocation": { + "desc": "Location of a remote HTTP(s) file", + "params": { + "access_hash": "Access hash", + "url": "HTTP URL of file" + } + }, + "Invoice": { + "desc": "Invoice", + "params": { + "currency": "Three-letter ISO 4217 currency code, or XTR for Telegram Stars.", + "email_requested": "Set this flag if you require the user's email address to complete the order", + "email_to_provider": "Set this flag if user's email address should be sent to provider", + "flags": "Flags, see TL conditional fields", + "flexible": "Set this flag if the final price depends on the shipping method", + "max_tip_amount": "The maximum accepted amount for tips in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).", + "name_requested": "Set this flag if you require the user's full name to complete the order", + "phone_requested": "Set this flag if you require the user's phone number to complete the order", + "phone_to_provider": "Set this flag if user's phone number should be sent to provider", + "prices": "Price breakdown, a list of components (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, etc.)", + "recurring": "Whether this is a recurring payment", + "shipping_address_requested": "Set this flag if you require the user's shipping address to complete the order", + "subscription_period": "The number of seconds between consecutive Telegram Star debiting for bot subscription invoices", + "suggested_tip_amounts": "A vector of suggested amounts of tips in the smallest units of the currency (integer, not float/double). At most 4 suggested tip amounts can be specified. The suggested tip amounts must be positive, passed in a strictly increased order and must not exceed max_tip_amount.", + "terms_url": "Terms of service URL", + "test": "Test invoice" + } + }, + "JsonArray": { + "desc": "JSON array", + "params": { + "value": "JSON values" + } + }, + "JsonBool": { + "desc": "JSON boolean value", + "params": { + "value": "Value" + } + }, + "JsonNull": { + "desc": "null JSON value", + "params": {} + }, + "JsonNumber": { + "desc": "JSON numeric value", + "params": { + "value": "Value" + } + }, + "JsonObject": { + "desc": "JSON object value", + "params": { + "value": "Values" + } + }, + "JsonObjectValue": { + "desc": "JSON key: value pair", + "params": { + "key": "Key", + "value": "Value" + } + }, + "JsonString": { + "desc": "JSON string", + "params": { + "value": "Value" + } + }, + "KeyboardButton": { + "desc": "Bot keyboard button", + "params": { + "text": "Button text" + } + }, + "KeyboardButtonBuy": { + "desc": "Button to buy a product", + "params": { + "text": "Button text" + } + }, + "KeyboardButtonCallback": { + "desc": "Callback button", + "params": { + "data": "Callback data", + "flags": "Flags, see TL conditional fields", + "requires_password": "Whether the user should verify his identity by entering his 2FA SRP parameters to the messages.getBotCallbackAnswer method. NOTE: telegram and the bot WILL NOT have access to the plaintext password, thanks to SRP. This button is mainly used by the official @botfather bot, for verifying the user's identity before transferring ownership of a bot to another user.", + "text": "Button text" + } + }, + "KeyboardButtonCopy": { + "desc": "Clipboard button: when clicked, the attached text must be copied to the clipboard.", + "params": { + "copy_text": "The text that will be copied to the clipboard", + "text": "Title of the button" + } + }, + "KeyboardButtonGame": { + "desc": "Button to start a game", + "params": { + "text": "Button text" + } + }, + "KeyboardButtonRequestGeoLocation": { + "desc": "Button to request a user's geolocation", + "params": { + "text": "Button text" + } + }, + "KeyboardButtonRequestPeer": { + "desc": "Prompts the user to select and share one or more peers with the bot using messages.sendBotRequestedPeer", + "params": { + "button_id": "Button ID, to be passed to messages.sendBotRequestedPeer.", + "max_quantity": "Maximum number of peers that can be chosen.", + "peer_type": "Filtering criteria to use for the peer selection list shown to the user. The list should display all existing peers of the specified type, and should also offer an option for the user to create and immediately use one or more (up to max_quantity) peers of the specified type, if needed.", + "text": "Button text" + } + }, + "KeyboardButtonRequestPhone": { + "desc": "Button to request a user's phone number", + "params": { + "text": "Button text" + } + }, + "KeyboardButtonRequestPoll": { + "desc": "A button that allows the user to create and send a poll when pressed; available only in private", + "params": { + "flags": "Flags, see TL conditional fields", + "quiz": "If set, only quiz polls can be sent", + "text": "Button text" + } + }, + "KeyboardButtonRow": { + "desc": "Inline keyboard row", + "params": { + "buttons": "Bot or inline keyboard buttons" + } + }, + "KeyboardButtonSimpleWebView": { + "desc": "Button to open a bot mini app using messages.requestSimpleWebView, without sending user information to the web app.", + "params": { + "text": "Button text", + "url": "Web app URL" + } + }, + "KeyboardButtonSwitchInline": { + "desc": "Button to force a user to switch to inline mode: pressing the button will prompt the user to select one of their chats, open that chat and insert the bot's username and the specified inline query in the input field.", + "params": { + "flags": "Flags, see TL conditional fields", + "peer_types": "Filter to use when selecting chats.", + "query": "The inline query to use", + "same_peer": "If set, pressing the button will insert the bot's username and the specified inline query in the current chat's input field.", + "text": "Button label" + } + }, + "KeyboardButtonUrl": { + "desc": "URL button", + "params": { + "text": "Button label", + "url": "URL" + } + }, + "KeyboardButtonUrlAuth": { + "desc": "Button to request a user to authorize via URL using Seamless Telegram Login. When the user clicks on such a button, messages.requestUrlAuth should be called, providing the button_id and the ID of the container message. The returned urlAuthResultRequest object will contain more details about the authorization request (request_write_access if the bot would like to send messages to the user along with the username of the bot which will be used for user authorization). Finally, the user can choose to call messages.acceptUrlAuth to get a urlAuthResultAccepted with the URL to open instead of the url of this constructor, or a urlAuthResultDefault, in which case the url of this constructor must be opened, instead. If the user refuses the authorization request but still wants to open the link, the url of this constructor must be used.", + "params": { + "button_id": "ID of the button to pass to messages.requestUrlAuth", + "flags": "Flags, see TL conditional fields", + "fwd_text": "New text of the button in forwarded messages.", + "text": "Button label", + "url": "An HTTP URL to be opened with user authorization data added to the query string when the button is pressed. If the user refuses to provide authorization data, the original URL without information about the user will be opened. The data added is the same as described in Receiving authorization data.NOTE: Services must always check the hash of the received data to verify the authentication and the integrity of the data as described in Checking authorization." + } + }, + "KeyboardButtonUserProfile": { + "desc": "Button that links directly to a user profile", + "params": { + "text": "Button text", + "user_id": "User ID" + } + }, + "KeyboardButtonWebView": { + "desc": "Button to open a bot mini app using messages.requestWebView, sending over user information after user confirmation.", + "params": { + "text": "Button text", + "url": "Web app url" + } + }, + "LabeledPrice": { + "desc": "This object represents a portion of the price for goods or services.", + "params": { + "amount": "Price of the product in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).", + "label": "Portion label" + } + }, + "LangPackDifference": { + "desc": "Changes to the app's localization pack", + "params": { + "from_version": "Previous version number", + "lang_code": "Language code", + "strings": "Localized strings", + "version": "New version number" + } + }, + "LangPackLanguage": { + "desc": "Identifies a localization pack", + "params": { + "base_lang_code": "Identifier of a base language pack; may be empty. If a string is missed in the language pack, then it should be fetched from base language pack. Unsupported in custom language packs", + "beta": "Is this a beta localization pack?", + "flags": "Flags, see TL conditional fields", + "lang_code": "Language code (pack identifier)", + "name": "Language name", + "native_name": "Language name in the language itself", + "official": "Whether the language pack is official", + "plural_code": "A language code to be used to apply plural forms. See https://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html for more info", + "rtl": "Is this a localization pack for an RTL language", + "strings_count": "Total number of non-deleted strings from the language pack", + "translated_count": "Total number of translated strings from the language pack", + "translations_url": "Link to language translation interface; empty for custom local language packs" + } + }, + "LangPackString": { + "desc": "Translated localization string", + "params": { + "key": "Language key", + "value": "Value" + } + }, + "LangPackStringDeleted": { + "desc": "Deleted localization string", + "params": { + "key": "Localization key" + } + }, + "LangPackStringPluralized": { + "desc": "A language pack string which has different forms based on the number of some object it mentions. See https://www.unicode.org/cldr/charts/latest/supplemental/language_plural_rules.html for more info", + "params": { + "few_value": "Value for a few objects", + "flags": "Flags, see TL conditional fields", + "key": "Localization key", + "many_value": "Value for many objects", + "one_value": "Value for one object", + "other_value": "Default value", + "two_value": "Value for two objects", + "zero_value": "Value for zero objects" + } + }, + "MaskCoords": { + "desc": "Position on a photo where a mask should be placed when attaching stickers to media \u00bb", + "params": { + "n": "Part of the face, relative to which the mask should be placed", + "x": "Shift by X-axis measured in widths of the mask scaled to the face size, from left to right. (For example, -1.0 will place the mask just to the left of the default mask position)", + "y": "Shift by Y-axis measured in widths of the mask scaled to the face size, from left to right. (For example, -1.0 will place the mask just below the default mask position)", + "zoom": "Mask scaling coefficient. (For example, 2.0 means a doubled size)" + } + }, + "MediaAreaChannelPost": { + "desc": "Represents a channel post.", + "params": { + "channel_id": "The channel that posted the message", + "coordinates": "The size and location of the media area corresponding to the location sticker on top of the story media.", + "msg_id": "ID of the channel message" + } + }, + "MediaAreaCoordinates": { + "desc": "Coordinates and size of a clickable rectangular area on top of a story.", + "params": { + "flags": "Flags, see TL conditional fields", + "h": "The height of the rectangle, as a percentage of the media height (0-100).", + "radius": "The radius of the rectangle corner rounding, as a percentage of the media width.", + "rotation": "Clockwise rotation angle of the rectangle, in degrees (0-360).", + "w": "The width of the rectangle, as a percentage of the media width (0-100).", + "x": "The abscissa of the rectangle's center, as a percentage of the media width (0-100).", + "y": "The ordinate of the rectangle's center, as a percentage of the media height (0-100)." + } + }, + "MediaAreaGeoPoint": { + "desc": "Represents a geolocation tag attached to a story.", + "params": { + "address": "Optional textual representation of the address.", + "coordinates": "The size and position of the media area corresponding to the location sticker on top of the story media.", + "flags": "Flags, see TL conditional fields", + "geo": "Coordinates of the geolocation tag." + } + }, + "MediaAreaStarGift": { + "desc": "Represents a collectible gift \u00bb.", + "params": { + "coordinates": "Coordinates of the media area.", + "slug": "slug from starGiftUnique.slug, that can be resolved as specified here \u00bb." + } + }, + "MediaAreaSuggestedReaction": { + "desc": "Represents a reaction bubble.", + "params": { + "coordinates": "The coordinates of the media area corresponding to the reaction button.", + "dark": "Whether the reaction bubble has a dark background.", + "flags": "Flags, see TL conditional fields", + "flipped": "Whether the reaction bubble is mirrored (see here \u00bb for more info).", + "reaction": "The reaction that should be sent when this area is clicked." + } + }, + "MediaAreaUrl": { + "desc": "Represents a URL media area.", + "params": { + "coordinates": "The size and location of the media area corresponding to the URL button on top of the story media.", + "url": "URL to open when clicked." + } + }, + "MediaAreaVenue": { + "desc": "Represents a location tag attached to a story, with additional venue information.", + "params": { + "address": "Address", + "coordinates": "The size and location of the media area corresponding to the location sticker on top of the story media.", + "geo": "Coordinates of the venue", + "provider": "Venue provider: currently only \"foursquare\" needs to be supported.", + "title": "Venue name", + "venue_id": "Venue ID in the provider's database", + "venue_type": "Venue type in the provider's database" + } + }, + "MediaAreaWeather": { + "desc": "Represents a weather widget \u00bb.", + "params": { + "color": "ARGB background color.", + "coordinates": "The size and location of the media area corresponding to the widget on top of the story media.", + "emoji": "Weather emoji, should be rendered as an animated emoji.", + "temperature_c": "Temperature in degrees Celsius." + } + }, + "Message": { + "desc": "A message", + "params": { + "date": "Date of the message", + "edit_date": "Last edit date of this message", + "edit_hide": "Whether the message should be shown as not modified to the user, even if an edit date is present", + "effect": "A message effect that should be played as specified here \u00bb.", + "entities": "Message entities for styled text", + "factcheck": "Represents a fact-check \u00bb.", + "flags": "Flags, see TL conditional fields", + "flags2": "Flags, see TL conditional fields", + "forwards": "Forward counter", + "from_boosts_applied": "Supergroups only, contains the number of boosts this user has given the current supergroup, and should be shown in the UI in the header of the message. Only present for incoming messages from non-anonymous supergroup members that have boosted the supergroup. Note that this counter should be locally overridden for non-anonymous outgoing messages, according to the current value of channelFull.boosts_applied, to ensure the value is correct even for messages sent by the current user before a supergroup was boosted (or after a boost has expired or the number of boosts has changed); do not update this value for incoming messages from other users, even if their boosts have changed.", + "from_id": "ID of the sender of the message", + "from_scheduled": "Whether this is a scheduled message", + "fwd_from": "Info about forwarded messages", + "grouped_id": "Multiple media messages sent using messages.sendMultiMedia with the same grouped ID indicate an album or media group", + "id": "ID of the message", + "invert_media": "If set, any eventual webpage preview will be shown on top of the message instead of at the bottom.", + "legacy": "This is a legacy message: it has to be refetched with the new layer", + "media": "Media attachment", + "media_unread": "Whether there are unread media attachments in this message", + "mentioned": "Whether we were mentioned in this message", + "message": "The message", + "noforwards": "Whether this message is protected and thus cannot be forwarded; clients should also prevent users from saving attached media (i.e. videos should only be streamed, photos should be kept in RAM, et cetera).", + "offline": "If set, the message was sent because of a scheduled action by the message sender, for example, as away, or a greeting service message.", + "out": "Is this an outgoing message", + "paid_message_stars": "The amount of stars the sender has paid to send the message, see here \u00bb for more info.", + "paid_suggested_post_stars": "Set if this is a suggested channel post \u00bb that was paid using Telegram Stars.", + "paid_suggested_post_ton": "Set if this is a suggested channel post \u00bb that was paid using Toncoins.", + "peer_id": "Peer ID, the chat where this message was sent", + "pinned": "Whether this message is pinned", + "post": "Whether this is a channel post", + "post_author": "Name of the author of this message for channel posts (with signatures enabled)", + "quick_reply_shortcut_id": "If set, this message is a quick reply shortcut message \u00bb (note that quick reply shortcut messages sent to a private chat will not have this field set).", + "reactions": "Reactions to this message", + "replies": "Info about post comments (for channels) or message replies (for groups)", + "reply_markup": "Reply markup (bot/inline keyboards)", + "reply_to": "Reply information", + "report_delivery_until_date": "Used for Telegram Gateway verification messages: if set and the current unixtime is bigger than the specified unixtime, invoke messages.reportMessagesDelivery passing the ID and the peer of this message as soon as it is received by the client (optionally batching requests for the same peer).", + "restriction_reason": "Contains the reason why access to this message must be restricted.", + "saved_peer_id": "Messages from a saved messages dialog \u00bb will have peer=inputPeerSelf and the saved_peer_id flag set to the ID of the saved dialog.Messages from a monoforum \u00bb will have peer=ID of the monoforum and the saved_peer_id flag set to the ID of a topic.", + "silent": "Whether this is a silent message (no notification triggered)", + "suggested_post": "Used to suggest a post to a channel, see here \u00bb for more info on the full flow.", + "ttl_period": "Time To Live of the message, once message.date+message.ttl_period === time(), the message will be deleted on the server, and must be deleted locally as well.", + "via_bot_id": "ID of the inline bot that generated the message", + "via_business_bot_id": "Whether the message was sent by the business bot specified in via_bot_id on behalf of the user.", + "video_processing_pending": "The video contained in the message is currently being processed by the server (i.e. to generate alternative qualities, that will be contained in the final messageMediaDocument.alt_document), and will be sent once the video is processed, which will happen approximately at the specified date (i.e. messages with this flag set should be treated similarly to scheduled messages, but instead of the scheduled date, date contains the estimated conversion date). See here \u00bb for more info.", + "views": "View count for channel posts" + } + }, + "MessageActionBoostApply": { + "desc": "Some boosts \u00bb were applied to the channel or supergroup.", + "params": { + "boosts": "Number of applied boosts." + } + }, + "MessageActionBotAllowed": { + "desc": "We have given the bot permission to send us direct messages.", + "params": { + "app": "We have authorized the bot to send us messages by opening the specified bot mini app.", + "attach_menu": "We have authorized the bot to send us messages by installing the bot's attachment menu.", + "domain": "We have authorized the bot to send us messages by logging into a website via Telegram Login \u00bb; this field contains the domain name of the website on which the user has logged in.", + "flags": "Flags, see TL conditional fields", + "from_request": "We have allowed the bot to send us messages using bots.allowSendMessage \u00bb." + } + }, + "MessageActionChannelCreate": { + "desc": "The channel was created", + "params": { + "title": "Original channel/supergroup title" + } + }, + "MessageActionChannelMigrateFrom": { + "desc": "Indicates the channel was migrated from the specified chat", + "params": { + "chat_id": "The old chat ID", + "title": "The old chat title" + } + }, + "MessageActionChatAddUser": { + "desc": "New member in the group", + "params": { + "users": "Users that were invited to the chat" + } + }, + "MessageActionChatCreate": { + "desc": "Group created", + "params": { + "title": "Group name", + "users": "List of group members" + } + }, + "MessageActionChatDeletePhoto": { + "desc": "Group profile photo removed.", + "params": {} + }, + "MessageActionChatDeleteUser": { + "desc": "User left the group.", + "params": { + "user_id": "Leaving user ID" + } + }, + "MessageActionChatEditPhoto": { + "desc": "Group profile changed", + "params": { + "photo": "New group profile photo" + } + }, + "MessageActionChatEditTitle": { + "desc": "Group name changed.", + "params": { + "title": "New group name" + } + }, + "MessageActionChatJoinedByLink": { + "desc": "A user joined the chat via an invite link", + "params": { + "inviter_id": "ID of the user that created the invite link" + } + }, + "MessageActionChatJoinedByRequest": { + "desc": "A user was accepted into the group by an admin", + "params": {} + }, + "MessageActionChatMigrateTo": { + "desc": "Indicates the chat was migrated to the specified supergroup", + "params": { + "channel_id": "The supergroup it was migrated to" + } + }, + "MessageActionConferenceCall": { + "desc": "Represents a conference call (or an invitation to a conference call, if neither the missed nor active flags are set).", + "params": { + "active": "Whether the user is currently in the conference call.", + "call_id": "Call ID.", + "duration": "Call duration, for left calls only.", + "flags": "Flags, see TL conditional fields", + "missed": "Whether the conference call has ended and the user hasn't joined.", + "other_participants": "Identifiers of some other call participants.", + "video": "Whether this is a video conference call." + } + }, + "MessageActionContactSignUp": { + "desc": "A contact just signed up to telegram", + "params": {} + }, + "MessageActionCreatedBroadcastList": { + "desc": "", + "params": {} + }, + "MessageActionCustomAction": { + "desc": "Custom action (most likely not supported by the current layer, an upgrade might be needed)", + "params": { + "message": "Action message" + } + }, + "MessageActionEmpty": { + "desc": "Empty constructor.", + "params": {} + }, + "MessageActionGameScore": { + "desc": "Someone scored in a game", + "params": { + "game_id": "Game ID", + "score": "Score" + } + }, + "MessageActionGeoProximityReached": { + "desc": "A user of the chat is now in proximity of another user", + "params": { + "distance": "Distance, in meters (0-100000)", + "from_id": "The user or chat that is now in proximity of to_id", + "to_id": "The user or chat that subscribed to live geolocation proximity alerts" + } + }, + "MessageActionGiftCode": { + "desc": "Contains a Telegram Premium giftcode link.", + "params": { + "amount": "Total price in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).", + "boost_peer": "Identifier of the channel/supergroup that created the gift code either directly or through a giveaway: if we import this giftcode link, we will also automatically boost this channel/supergroup.", + "crypto_amount": "If crypto_currency is set, contains the paid amount, in the smallest units of the cryptocurrency.", + "crypto_currency": "If set, the gift was made using the specified cryptocurrency.", + "currency": "Three-letter ISO 4217 currency code", + "flags": "Flags, see TL conditional fields", + "message": "Message attached with the gift", + "months": "Duration in months of the gifted Telegram Premium subscription.", + "slug": "Slug of the Telegram Premium giftcode link", + "unclaimed": "If set, the link was not redeemed yet.", + "via_giveaway": "If set, this gift code was received from a giveaway \u00bb started by a channel/supergroup we're subscribed to." + } + }, + "MessageActionGiftPremium": { + "desc": "Info about a gifted Telegram Premium subscription", + "params": { + "amount": "Price of the gift in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).", + "crypto_amount": "If the gift was bought using a cryptocurrency, price of the gift in the smallest units of a cryptocurrency.", + "crypto_currency": "If the gift was bought using a cryptocurrency, the cryptocurrency name.", + "currency": "Three-letter ISO 4217 currency code", + "flags": "Flags, see TL conditional fields", + "message": "Message attached with the gift", + "months": "Duration of the gifted Telegram Premium subscription." + } + }, + "MessageActionGiftStars": { + "desc": "You gifted or were gifted some Telegram Stars.", + "params": { + "amount": "Price of the gift in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).", + "crypto_amount": "If the gift was bought using a cryptocurrency, price of the gift in the smallest units of a cryptocurrency.", + "crypto_currency": "If the gift was bought using a cryptocurrency, the cryptocurrency name.", + "currency": "Three-letter ISO 4217 currency code", + "flags": "Flags, see TL conditional fields", + "stars": "Amount of gifted stars", + "transaction_id": "Identifier of the transaction, only visible to the receiver of the gift." + } + }, + "MessageActionGiftTon": { + "desc": "You were gifted some toncoins.", + "params": { + "amount": "FIAT currency equivalent (in the currency specified in currency) of the amount specified in crypto_amount.", + "crypto_amount": "Amount in the smallest unit of the cryptocurrency (for TONs, one billionth of a ton, AKA a nanoton).", + "crypto_currency": "Name of the cryptocurrency.", + "currency": "Name of a localized FIAT currency.", + "flags": "Flags, see TL conditional fields", + "transaction_id": "Transaction ID." + } + }, + "MessageActionGiveawayLaunch": { + "desc": "A giveaway was started.", + "params": { + "flags": "Flags, see TL conditional fields", + "stars": "For Telegram Star giveaways, the total number of Telegram Stars being given away." + } + }, + "MessageActionGiveawayResults": { + "desc": "A giveaway has ended.", + "params": { + "flags": "Flags, see TL conditional fields", + "stars": "If set, this is a Telegram Star giveaway", + "unclaimed_count": "Number of undistributed prizes", + "winners_count": "Number of winners in the giveaway" + } + }, + "MessageActionGroupCall": { + "desc": "The group call has ended", + "params": { + "call": "Group call", + "duration": "Group call duration", + "flags": "Flags, see TL conditional fields" + } + }, + "MessageActionGroupCallScheduled": { + "desc": "A group call was scheduled", + "params": { + "call": "The group call", + "schedule_date": "When is this group call scheduled to start" + } + }, + "MessageActionHistoryClear": { + "desc": "Chat history was cleared", + "params": {} + }, + "MessageActionInviteToGroupCall": { + "desc": "A set of users was invited to the group call", + "params": { + "call": "The group call", + "users": "The invited users" + } + }, + "MessageActionLoginUnknownLocation": { + "desc": "", + "params": {} + }, + "MessageActionPaidMessagesPrice": { + "desc": "The price of paid messages \u00bb in this chat was changed.", + "params": { + "broadcast_messages_allowed": "Can only be set for channels, if set indicates that direct messages were enabled \u00bb, otherwise indicates that direct messages were disabled; the price of paid messages is related to the price of direct messages (aka those sent to the associated monoforum).", + "flags": "Flags, see TL conditional fields", + "stars": "The new price in Telegram Stars, can be 0 if messages are now free." + } + }, + "MessageActionPaidMessagesRefunded": { + "desc": "Sent from peer A to B, indicates that A refunded all stars B previously paid to send messages to A, see here \u00bb for more info on paid messages.", + "params": { + "count": "Number of paid messages affected by the refund.", + "stars": "Number of refunded stars." + } + }, + "MessageActionPaymentRefunded": { + "desc": "Describes a payment refund (service message received by both users and bots).", + "params": { + "charge": "Provider payment identifier", + "currency": "Currency, XTR for Telegram Stars.", + "flags": "Flags, see TL conditional fields", + "payload": "Bot specified invoice payload (only received by bots).", + "peer": "Identifier of the peer that returned the funds.", + "total_amount": "Total price in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies)." + } + }, + "MessageActionPaymentSent": { + "desc": "A payment was sent", + "params": { + "currency": "Three-letter ISO 4217 currency code, or XTR for Telegram Stars.", + "flags": "Flags, see TL conditional fields", + "invoice_slug": "An invoice slug taken from an invoice deep link or from the premium_invoice_slug app config parameter \u00bb", + "recurring_init": "Whether this is the first payment of a recurring payment we just subscribed to", + "recurring_used": "Whether this payment is part of a recurring payment", + "subscription_until_date": "Expiration date of the Telegram Star subscription \u00bb.", + "total_amount": "Price of the product in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies)." + } + }, + "MessageActionPaymentSentMe": { + "desc": "A user just sent a payment to me (a bot)", + "params": { + "charge": "Provider payment identifier", + "currency": "Three-letter ISO 4217 currency code, or XTR for Telegram Stars.", + "flags": "Flags, see TL conditional fields", + "info": "Order info provided by the user", + "payload": "Bot specified invoice payload", + "recurring_init": "Whether this is the first payment of a recurring payment we just subscribed to", + "recurring_used": "Whether this payment is part of a recurring payment", + "shipping_option_id": "Identifier of the shipping option chosen by the user", + "subscription_until_date": "Expiration date of the Telegram Star subscription \u00bb.", + "total_amount": "Price of the product in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies)." + } + }, + "MessageActionPhoneCall": { + "desc": "A phone call", + "params": { + "call_id": "Call ID", + "duration": "Duration of the call in seconds", + "flags": "Flags, see TL conditional fields", + "reason": "If the call has ended, the reason why it ended", + "video": "Is this a video call?" + } + }, + "MessageActionPhoneNumberRequest": { + "desc": "", + "params": {} + }, + "MessageActionPinMessage": { + "desc": "A message was pinned", + "params": {} + }, + "MessageActionPrizeStars": { + "desc": "You won some Telegram Stars in a Telegram Star giveaway \u00bb.", + "params": { + "boost_peer": "Identifier of the peer that was automatically boosted by the winners of the giveaway.", + "flags": "Flags, see TL conditional fields", + "giveaway_msg_id": "ID of the message containing the messageMediaGiveaway", + "stars": "The number of Telegram Stars you won", + "transaction_id": "ID of the telegram star transaction.", + "unclaimed": "If set, this indicates the reverse transaction that refunds the remaining stars to the creator of a giveaway if, when the giveaway ends, the number of members in the channel is smaller than the number of winners in the giveaway." + } + }, + "MessageActionRequestedPeer": { + "desc": "Contains info about one or more peers that the we (the user) shared with the bot after clicking on a keyboardButtonRequestPeer button (service message sent by the user).", + "params": { + "button_id": "button_id contained in the keyboardButtonRequestPeer", + "peers": "The shared peers" + } + }, + "MessageActionRequestedPeerSentMe": { + "desc": "Contains info about one or more peers that the a user shared with the me (the bot) after clicking on a keyboardButtonRequestPeer button (service message received by the bot).", + "params": { + "button_id": "button_id contained in the keyboardButtonRequestPeer", + "peers": "Info about the shared peers." + } + }, + "MessageActionScreenshotTaken": { + "desc": "A screenshot of the chat was taken", + "params": {} + }, + "MessageActionSecureValuesSent": { + "desc": "Request for secure telegram passport values was sent", + "params": { + "types": "Secure value types" + } + }, + "MessageActionSecureValuesSentMe": { + "desc": "Secure telegram passport values were received", + "params": { + "credentials": "Encrypted credentials required to decrypt the data", + "values": "Vector with information about documents and other Telegram Passport elements that were shared with the bot" + } + }, + "MessageActionSetChatTheme": { + "desc": "The chat theme was changed", + "params": { + "theme": "The new chat theme." + } + }, + "MessageActionSetChatWallPaper": { + "desc": "The wallpaper \u00bb of the current chat was changed.", + "params": { + "flags": "Flags, see TL conditional fields", + "for_both": "If set, indicates the wallpaper was forcefully applied for both sides, without explicit confirmation from the other side. If the message is incoming, and we did not like the new wallpaper the other user has chosen for us, we can re-set our previous wallpaper just on our side, by invoking messages.setChatWallPaper, providing only the revert flag (and obviously the peer parameter).", + "same": "If set, indicates the user applied a wallpaper \u00bb previously sent by the other user in a messageActionSetChatWallPaper message.", + "wallpaper": "New wallpaper" + } + }, + "MessageActionSetMessagesTTL": { + "desc": "The Time-To-Live of messages in this chat was changed.", + "params": { + "auto_setting_from": "If set, the chat TTL setting was set not due to a manual change by one of participants, but automatically because one of the participants has the default TTL settings enabled \u00bb. For example, when a user writes to us for the first time and we have set a default messages TTL of 1 week, this service message (with auto_setting_from=our_userid) will be emitted before our first message.", + "flags": "Flags, see TL conditional fields", + "period": "New Time-To-Live of all messages sent in this chat; if 0, autodeletion was disabled." + } + }, + "MessageActionStarGift": { + "desc": "You received a gift, see here \u00bb for more info.", + "params": { + "can_upgrade": "If set, this gift can be upgraded to a collectible gift; can only be set for the receiver of a gift.", + "convert_stars": "The receiver of this gift may convert it to this many Telegram Stars, instead of displaying it on their profile page.convert_stars will be equal to stars only if the gift was bought using recently bought Telegram Stars, otherwise it will be less than stars.", + "converted": "Whether this gift was converted to Telegram Stars and cannot be displayed on the profile anymore.", + "flags": "Flags, see TL conditional fields", + "from_id": "Sender of the gift (unset for anonymous gifts).", + "gift": "Info about the gift", + "gift_msg_id": "For separate upgrades, the identifier of the message with the gift whose upgrade was prepaid (only valid for the receiver of the service message).", + "message": "Additional message from the sender of the gift", + "name_hidden": "If set, the name of the sender of the gift will be hidden if the destination user decides to display the gift on their profile", + "peer": "Receiver of the gift.", + "prepaid_upgrade": "The sender has already pre-paid for the upgrade of this gift to a collectible gift.", + "prepaid_upgrade_hash": "Hash to prepay for a gift upgrade separately \u00bb.", + "refunded": "This gift is not available anymore because a request to refund the payment related to this gift was made, and the money was returned.", + "saved": "Whether this gift was added to the destination user's profile (may be toggled using payments.saveStarGift and fetched using payments.getSavedStarGifts)", + "saved_id": "For channel gifts, ID to use in inputSavedStarGiftChat constructors.", + "upgrade_msg_id": "If set, this gift was upgraded to a collectible gift, and the corresponding messageActionStarGiftUnique is available at the specified message ID.", + "upgrade_separate": "This service message is the notification of a separate pre-payment for the upgrade of a gift we own.", + "upgrade_stars": "The number of Telegram Stars the user can pay to convert the gift into a collectible gift \u00bb.", + "upgraded": "This gift was upgraded to a collectible gift \u00bb." + } + }, + "MessageActionStarGiftUnique": { + "desc": "A gift \u00bb was upgraded to a collectible gift \u00bb.", + "params": { + "can_export_at": "If set, indicates that the current gift can't be exported to the TON blockchain \u00bb yet: the owner will be able to export it at the specified unixtime.", + "can_resell_at": "If set, indicates that the current gift can't be resold \u00bb yet: the owner will be able to put it up for sale at the specified unixtime.", + "can_transfer_at": "If set, indicates that the current gift can't be transferred \u00bb yet: the owner will be able to transfer it at the specified unixtime.", + "flags": "Flags, see TL conditional fields", + "from_id": "Sender of the gift (unset for anonymous gifts).", + "gift": "The collectible gift.", + "peer": "Receiver of the gift.", + "prepaid_upgrade": "The sender has pre-paid for the upgrade of this gift to a collectible gift.", + "refunded": "This gift was upgraded to a collectible gift \u00bb and then re-downgraded to a regular gift because a request to refund the payment related to the upgrade was made, and the money was returned.", + "resale_amount": "Resale price of the gift.", + "saved": "If set, this gift is visible on the user or channel's profile page; can only be set for the receiver of a gift.", + "saved_id": "For channel gifts, ID to use in inputSavedStarGiftChat constructors.", + "transfer_stars": "If set, indicates that the gift can be transferred \u00bb to another user by paying the specified amount of stars.", + "transferred": "If set, this collectible was transferred (either to the current user or by the current user to the other user in the private chat, depending on the out flag of the containing messageService).", + "upgrade": "If set, this collectible was upgraded \u00bb to a collectible gift from a previously received or sent (depending on the out flag of the containing messageService) non-collectible gift." + } + }, + "MessageActionSuggestBirthday": { + "desc": "", + "params": {} + }, + "MessageActionSuggestProfilePhoto": { + "desc": "A new profile picture was suggested using photos.uploadContactProfilePhoto.", + "params": { + "photo": "The photo that the user suggested we set as profile picture." + } + }, + "MessageActionSuggestedPostApproval": { + "desc": "A suggested post \u00bb was approved or rejected.", + "params": { + "balance_too_low": "If set, the post was approved but the user's balance is too low to pay for the suggested post.", + "flags": "Flags, see TL conditional fields", + "price": "Price for the suggested post.", + "reject_comment": "If the suggested post was rejected, can optionally contain a rejection comment.", + "rejected": "Whether the suggested post was rejected.", + "schedule_date": "Scheduling date." + } + }, + "MessageActionSuggestedPostRefund": { + "desc": "A suggested post \u00bb was accepted and posted or scheduled, but either the channel deleted the posted/scheduled post before stars_suggested_post_age_min seconds have elapsed, or the user refunded the payment for the stars used to pay for the suggested post.", + "params": { + "flags": "Flags, see TL conditional fields", + "payer_initiated": "If set, the user refunded the payment for the stars used to pay for the suggested post." + } + }, + "MessageActionSuggestedPostSuccess": { + "desc": "A suggested post \u00bb was successfully posted, and payment for it was successfully received.", + "params": { + "price": "The price." + } + }, + "MessageActionTTLChange": { + "desc": "", + "params": {} + }, + "MessageActionTodoAppendTasks": { + "desc": "Items were appended to the todo list \u00bb.", + "params": { + "list": "Appended items." + } + }, + "MessageActionTodoCompletions": { + "desc": "Items were marked as completed or not completed in a todo list \u00bb.", + "params": { + "completed": "Items marked as completed.", + "incompleted": "Items marked as not completed." + } + }, + "MessageActionTopicCreate": { + "desc": "A forum topic was created.", + "params": { + "flags": "Flags, see TL conditional fields", + "icon_color": "If no custom emoji icon is specified, specifies the color of the fallback topic icon (RGB), one of 0x6FB9F0, 0xFFD67E, 0xCB86DB, 0x8EEE98, 0xFF93B2, or 0xFB6F5F.", + "icon_emoji_id": "ID of the custom emoji used as topic icon.", + "title": "Topic name." + } + }, + "MessageActionTopicEdit": { + "desc": "Forum topic information was edited.", + "params": { + "closed": "Whether the topic was opened or closed.", + "flags": "Flags, see TL conditional fields", + "hidden": "Whether the topic was hidden or unhidden (only valid for the \"General\" topic, id=1).", + "icon_emoji_id": "ID of the new custom emoji used as topic icon, or if it was removed.", + "title": "New topic title." + } + }, + "MessageActionUserJoined": { + "desc": "", + "params": {} + }, + "MessageActionUserUpdatedPhoto": { + "desc": "", + "params": {} + }, + "MessageActionWebViewDataSent": { + "desc": "Data from an opened reply keyboard bot mini app was relayed to the bot that owns it (user side service message).", + "params": { + "text": "Text of the keyboardButtonSimpleWebView that was pressed to open the web app." + } + }, + "MessageActionWebViewDataSentMe": { + "desc": "Data from an opened reply keyboard bot mini app was relayed to the bot that owns it (bot side service message).", + "params": { + "data": "Relayed data.", + "text": "Text of the keyboardButtonSimpleWebView that was pressed to open the web app." + } + }, + "MessageEmpty": { + "desc": "Empty constructor, non-existent message.", + "params": { + "flags": "Flags, see TL conditional fields", + "id": "Message identifier", + "peer_id": "Peer ID, the chat where this message was sent" + } + }, + "MessageEntityBankCard": { + "desc": "Indicates a credit card number", + "params": { + "length": "Length of message entity within message (in UTF-16 code units)", + "offset": "Offset of message entity within message (in UTF-16 code units)" + } + }, + "MessageEntityBlockquote": { + "desc": "Message entity representing a block quote.", + "params": { + "collapsed": "Whether the quote is collapsed by default.", + "flags": "Flags, see TL conditional fields", + "length": "Length of message entity within message (in UTF-16 code units)", + "offset": "Offset of message entity within message (in UTF-16 code units)" + } + }, + "MessageEntityBold": { + "desc": "Message entity representing bold text.", + "params": { + "length": "Length of message entity within message (in UTF-16 code units)", + "offset": "Offset of message entity within message (in UTF-16 code units)" + } + }, + "MessageEntityBotCommand": { + "desc": "Message entity representing a bot /command", + "params": { + "length": "Length of message entity within message (in UTF-16 code units)", + "offset": "Offset of message entity within message (in UTF-16 code units)" + } + }, + "MessageEntityCashtag": { + "desc": "Message entity representing a $cashtag.", + "params": { + "length": "Length of message entity within message (in UTF-16 code units)", + "offset": "Offset of message entity within message (in UTF-16 code units)" + } + }, + "MessageEntityCode": { + "desc": "Message entity representing a codeblock.", + "params": { + "length": "Length of message entity within message (in UTF-16 code units)", + "offset": "Offset of message entity within message (in UTF-16 code units)" + } + }, + "MessageEntityCustomEmoji": { + "desc": "Represents a custom emoji.\nNote that this entity must wrap exactly one regular emoji (the one contained in documentAttributeCustomEmoji.alt) in the related text, otherwise the server will ignore it.", + "params": { + "document_id": "Document ID of the custom emoji, use messages.getCustomEmojiDocuments to fetch the emoji animation and the actual emoji it represents.", + "length": "Length of message entity within message (in UTF-16 code units)", + "offset": "Offset of message entity within message (in UTF-16 code units)" + } + }, + "MessageEntityEmail": { + "desc": "Message entity representing an email@example.com.", + "params": { + "length": "Length of message entity within message (in UTF-16 code units)", + "offset": "Offset of message entity within message (in UTF-16 code units)" + } + }, + "MessageEntityHashtag": { + "desc": "#hashtag message entity", + "params": { + "length": "Length of message entity within message (in UTF-16 code units)", + "offset": "Offset of message entity within message (in UTF-16 code units)" + } + }, + "MessageEntityItalic": { + "desc": "Message entity representing italic text.", + "params": { + "length": "Length of message entity within message (in UTF-16 code units)", + "offset": "Offset of message entity within message (in UTF-16 code units)" + } + }, + "MessageEntityMention": { + "desc": "Message entity mentioning a user by @username; messageEntityMentionName can also be used to mention users by their ID.", + "params": { + "length": "Length of message entity within message (in UTF-16 code units)", + "offset": "Offset of message entity within message (in UTF-16 code units)" + } + }, + "MessageEntityMentionName": { + "desc": "Message entity representing a user mention: for creating a mention use inputMessageEntityMentionName.", + "params": { + "length": "Length of message entity within message (in UTF-16 code units)", + "offset": "Offset of message entity within message (in UTF-16 code units)", + "user_id": "Identifier of the user that was mentioned" + } + }, + "MessageEntityPhone": { + "desc": "Message entity representing a phone number.", + "params": { + "length": "Length of message entity within message (in UTF-16 code units)", + "offset": "Offset of message entity within message (in UTF-16 code units)" + } + }, + "MessageEntityPre": { + "desc": "Message entity representing a preformatted codeblock, allowing the user to specify a programming language for the codeblock.", + "params": { + "language": "Programming language of the code", + "length": "Length of message entity within message (in UTF-16 code units)", + "offset": "Offset of message entity within message (in UTF-16 code units)" + } + }, + "MessageEntitySpoiler": { + "desc": "Message entity representing a spoiler", + "params": { + "length": "Length of message entity within message (in UTF-16 code units)", + "offset": "Offset of message entity within message (in UTF-16 code units)" + } + }, + "MessageEntityStrike": { + "desc": "Message entity representing strikethrough text.", + "params": { + "length": "Length of message entity within message (in UTF-16 code units)", + "offset": "Offset of message entity within message (in UTF-16 code units)" + } + }, + "MessageEntityTextUrl": { + "desc": "Message entity representing a text url: for in-text urls like https://google.com use messageEntityUrl.", + "params": { + "length": "Length of message entity within message (in UTF-16 code units)", + "offset": "Offset of message entity within message (in UTF-16 code units)", + "url": "The actual URL" + } + }, + "MessageEntityUnderline": { + "desc": "Message entity representing underlined text.", + "params": { + "length": "Length of message entity within message (in UTF-16 code units)", + "offset": "Offset of message entity within message (in UTF-16 code units)" + } + }, + "MessageEntityUnknown": { + "desc": "Unknown message entity", + "params": { + "length": "Length of message entity within message (in UTF-16 code units)", + "offset": "Offset of message entity within message (in UTF-16 code units)" + } + }, + "MessageEntityUrl": { + "desc": "Message entity representing an in-text url: https://google.com; for text urls, use messageEntityTextUrl.", + "params": { + "length": "Length of message entity within message (in UTF-16 code units)", + "offset": "Offset of message entity within message (in UTF-16 code units)" + } + }, + "MessageExtendedMedia": { + "desc": "Already purchased paid media, see here \u00bb for more info.", + "params": { + "media": "The media we purchased." + } + }, + "MessageExtendedMediaPreview": { + "desc": "Paid media preview for not yet purchased paid media, see here \u00bb for more info.", + "params": { + "flags": "Flags, see TL conditional fields", + "h": "Height", + "thumb": "Extremely low resolution thumbnail.", + "video_duration": "Video duration for videos.", + "w": "Width" + } + }, + "MessageFwdHeader": { + "desc": "Info about a forwarded message", + "params": { + "channel_post": "ID of the channel message that was forwarded", + "date": "When was the message originally sent", + "flags": "Flags, see TL conditional fields", + "from_id": "The ID of the user that originally sent the message", + "from_name": "The name of the user that originally sent the message", + "imported": "Whether this message was imported from a foreign chat service, click here for more info \u00bb", + "post_author": "For channels and if signatures are enabled, author of the channel message", + "psa_type": "PSA type", + "saved_date": "Only for forwarded messages reforwarded to saved messages \u00bb, indicates when was the original message sent (i.e. if user A sends a message @ unixtime 1, then user B forwards it somewhere @ unixtime 2, then user C saves it to saved messages @ unixtime 3, this field will contain 2, date will contain 1 and the date of the containing message will contain 3).", + "saved_from_id": "Only for forwarded messages reforwarded to saved messages \u00bb, contains the sender of the original message (i.e. if user A sends a message, then user B forwards it somewhere, then user C saves it to saved messages, this field will contain the ID of user B and from_id will contain the ID of user A).", + "saved_from_msg_id": "Only for messages forwarded to saved messages \u00bb, contains the original ID of the message in saved_from_peer.", + "saved_from_name": "Only for forwarded messages from users with forward privacy enabled, sent by users with forward privacy enabled, reforwarded to saved messages \u00bb, contains the sender of the original message (i.e. if user A (fwd privacy enabled) sends a message, then user B (fwd privacy enabled) forwards it somewhere, then user C saves it to saved messages, this field will contain the name of user B and from_name will contain the name of user A).", + "saved_from_peer": "Only for messages forwarded to saved messages \u00bb, contains the dialog where the message was originally sent.", + "saved_out": "Only for messages forwarded to saved messages \u00bb, set if the original message was outgoing (though the message may have been originally outgoing even if this flag is not set, if from_id points to the current user)." + } + }, + "MessageMediaContact": { + "desc": "Attached contact.", + "params": { + "first_name": "Contact's first name", + "last_name": "Contact's last name", + "phone_number": "Phone number", + "user_id": "User identifier or 0, if the user with the given phone number is not registered", + "vcard": "VCARD of contact" + } + }, + "MessageMediaDice": { + "desc": "Dice-based animated sticker", + "params": { + "emoticon": "The emoji, for now , and are supported", + "value": "Dice value" + } + }, + "MessageMediaDocument": { + "desc": "Document (video, audio, voice, sticker, any media type except photo)", + "params": { + "alt_documents": "Videos only, contains alternative qualities of the video.", + "document": "Attached document", + "flags": "Flags, see TL conditional fields", + "nopremium": "Whether this is a normal sticker, if not set this is a premium sticker and a premium sticker animation must be played.", + "round": "Whether this is a round video.", + "spoiler": "Whether this media should be hidden behind a spoiler warning", + "ttl_seconds": "Time to live of self-destructing document", + "video": "Whether this is a video.", + "video_cover": "Custom video cover.", + "video_timestamp": "Start playing the video at the specified timestamp (seconds).", + "voice": "Whether this is a voice message." + } + }, + "MessageMediaEmpty": { + "desc": "Empty constructor.", + "params": {} + }, + "MessageMediaGame": { + "desc": "Telegram game", + "params": { + "game": "Game" + } + }, + "MessageMediaGeo": { + "desc": "Attached map.", + "params": { + "geo": "GeoPoint" + } + }, + "MessageMediaGeoLive": { + "desc": "Indicates a live geolocation", + "params": { + "flags": "Flags, see TL conditional fields", + "geo": "Geolocation", + "heading": "For live locations, a direction in which the location moves, in degrees; 1-360", + "period": "Validity period of provided geolocation", + "proximity_notification_radius": "For live locations, a maximum distance to another chat member for proximity alerts, in meters (0-100000)." + } + }, + "MessageMediaGiveaway": { + "desc": "Contains info about a giveaway, see here \u00bb for more info.", + "params": { + "channels": "The channels that the user must join to participate in the giveaway.", + "countries_iso2": "If set, only users residing in these countries can participate in the giveaway, (specified as a list of two-letter ISO 3166-1 alpha-2 country codes); otherwise there are no country-based limitations.", + "flags": "Flags, see TL conditional fields", + "months": "Duration in months of each Telegram Premium subscription in the giveaway.", + "only_new_subscribers": "If set, only new subscribers starting from the giveaway creation date will be able to participate to the giveaway.", + "prize_description": "Can contain a textual description of additional giveaway prizes.", + "quantity": "Number of Telegram Premium subscriptions given away.", + "stars": "For Telegram Star giveaways, the total number of Telegram Stars being given away.", + "until_date": "The end date of the giveaway.", + "winners_are_visible": "If set, giveaway winners are public and will be listed in a messageMediaGiveawayResults message that will be automatically sent to the channel once the giveaway ends." + } + }, + "MessageMediaGiveawayResults": { + "desc": "A giveaway with public winners has finished, this constructor contains info about the winners.", + "params": { + "additional_peers_count": "Number of other channels that participated in the giveaway.", + "channel_id": "ID of the channel/supergroup that was automatically boosted by the winners of the giveaway for duration of the Premium subscription.", + "flags": "Flags, see TL conditional fields", + "launch_msg_id": "Identifier of the message with the giveaway in channel_id.", + "months": "Duration in months of each Telegram Premium subscription in the giveaway.", + "only_new_subscribers": "If set, only new subscribers starting from the giveaway creation date participated in the giveaway.", + "prize_description": "Can contain a textual description of additional giveaway prizes.", + "refunded": "If set, the giveaway was canceled and was fully refunded.", + "stars": "For Telegram Star giveaways, the total number of Telegram Stars being given away.", + "unclaimed_count": "Number of not-yet-claimed prizes.", + "until_date": "Point in time (Unix timestamp) when the winners were selected. May be bigger than winners selection date specified in initial parameters of the giveaway.", + "winners": "Up to 100 user identifiers of the winners of the giveaway.", + "winners_count": "Total number of winners in the giveaway." + } + }, + "MessageMediaInvoice": { + "desc": "Invoice", + "params": { + "currency": "Three-letter ISO 4217 currency code, or XTR for Telegram Stars.", + "description": "Product description, 1-255 characters", + "extended_media": "Deprecated", + "flags": "Flags, see TL conditional fields", + "photo": "URL of the product photo for the invoice. Can be a photo of the goods or a marketing image for a service. People like it better when they see what they are paying for.", + "receipt_msg_id": "Message ID of receipt: if set, clients should change the text of the first keyboardButtonBuy button always attached to the message to a localized version of the word Receipt", + "shipping_address_requested": "Whether the shipping address was requested", + "start_param": "Unique bot deep-linking parameter that can be used to generate this invoice", + "test": "Whether this is an example invoice", + "title": "Product name, 1-32 characters", + "total_amount": "Total price in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies)." + } + }, + "MessageMediaPaidMedia": { + "desc": "Paid media, see here \u00bb for more info.", + "params": { + "extended_media": "Either the paid-for media, or super low resolution media previews if the media wasn't purchased yet, see here \u00bb for more info.", + "stars_amount": "The price of the media in Telegram Stars." + } + }, + "MessageMediaPhoto": { + "desc": "Attached photo.", + "params": { + "flags": "Flags, see TL conditional fields", + "photo": "Photo", + "spoiler": "Whether this media should be hidden behind a spoiler warning", + "ttl_seconds": "Time to live in seconds of self-destructing photo" + } + }, + "MessageMediaPoll": { + "desc": "Poll", + "params": { + "poll": "The poll", + "results": "The results of the poll" + } + }, + "MessageMediaStory": { + "desc": "Represents a forwarded story or a story mention.", + "params": { + "flags": "Flags, see TL conditional fields", + "id": "Story ID", + "peer": "Peer that posted the story.", + "story": "The story itself, if absent fetch it using stories.getStoriesByID and the peer/id parameters specified above.", + "via_mention": "If set, indicates that this someone has mentioned us in this story (i.e. by tagging us in the description) or vice versa, we have mentioned the other peer (if the message is outgoing)." + } + }, + "MessageMediaToDo": { + "desc": "Represents a todo list \u00bb.", + "params": { + "completions": "Completed items.", + "flags": "Flags, see TL conditional fields", + "todo": "The todo list." + } + }, + "MessageMediaUnsupported": { + "desc": "Current version of the client does not support this media type.", + "params": {} + }, + "MessageMediaVenue": { + "desc": "Venue", + "params": { + "address": "Address", + "geo": "Geolocation of venue", + "provider": "Venue provider: currently only \"foursquare\" and \"gplaces\" (Google Places) need to be supported", + "title": "Venue name", + "venue_id": "Venue ID in the provider's database", + "venue_type": "Venue type in the provider's database" + } + }, + "MessageMediaWebPage": { + "desc": "Preview of webpage", + "params": { + "flags": "Flags, see TL conditional fields", + "force_large_media": "If set, specifies that a large media preview should be used.", + "force_small_media": "If set, specifies that a small media preview should be used.", + "manual": "If set, indicates that the URL used for the webpage preview was specified manually using inputMediaWebPage, and may not be related to any of the URLs specified in the message.", + "safe": "If set, the webpage can be opened directly without user confirmation; otherwise, user confirmation is required, showing the exact URL that will be opened.", + "webpage": "Webpage preview" + } + }, + "MessagePeerReaction": { + "desc": "How a certain peer reacted to the message", + "params": { + "big": "Whether the specified message reaction \u00bb should elicit a bigger and longer reaction", + "date": "When was this reaction added", + "flags": "Flags, see TL conditional fields", + "my": "Starting from layer 159, messages.sendReaction will send reactions from the peer (user or channel) specified using messages.saveDefaultSendAs. If set, this flag indicates that this reaction was sent by us, even if the peer doesn't point to the current account.", + "peer_id": "Peer that reacted to the message", + "reaction": "Reaction emoji", + "unread": "Whether the reaction wasn't yet marked as read by the current user" + } + }, + "MessagePeerVote": { + "desc": "How a peer voted in a poll", + "params": { + "date": "When did the peer cast the vote", + "option": "The option chosen by the peer", + "peer": "Peer ID" + } + }, + "MessagePeerVoteInputOption": { + "desc": "How a peer voted in a poll (reduced constructor, returned if an option was provided to messages.getPollVotes)", + "params": { + "date": "When did the peer cast the vote", + "peer": "The peer that voted for the queried option" + } + }, + "MessagePeerVoteMultiple": { + "desc": "How a peer voted in a multiple-choice poll", + "params": { + "date": "When did the peer cast their votes", + "options": "Options chosen by the peer", + "peer": "Peer ID" + } + }, + "MessageRange": { + "desc": "Indicates a range of chat messages", + "params": { + "max_id": "End of range (message ID)", + "min_id": "Start of range (message ID)" + } + }, + "MessageReactions": { + "desc": "Message reactions \u00bb", + "params": { + "can_see_list": "Whether messages.getMessageReactionsList can be used to see how each specific peer reacted to the message", + "flags": "Flags, see TL conditional fields", + "min": "Similar to min objects, used for message reaction \u00bb constructors that are the same for all users so they don't have the reactions sent by the current user (you can use messages.getMessagesReactions to get the full reaction info).", + "reactions_as_tags": "If set or if there are no reactions, all present and future reactions should be treated as message tags, see here \u00bb for more info.", + "recent_reactions": "List of recent peers and their reactions", + "results": "Reactions", + "top_reactors": "Paid Telegram Star reactions leaderboard \u00bb for this message." + } + }, + "MessageReactor": { + "desc": "Info about a user in the paid Star reactions leaderboard for a message.", + "params": { + "anonymous": "If set, the reactor is anonymous.", + "count": "The number of sent Telegram Stars.", + "flags": "Flags, see TL conditional fields", + "my": "If set, this reactor is the current user.", + "peer_id": "Identifier of the peer that reacted: may be unset for anonymous reactors different from the current user (i.e. if the current user sent an anonymous reaction anonymous will be set but this field will also be set).", + "top": "If set, the reactor is one of the most active reactors; may be unset if the reactor is the current user." + } + }, + "MessageReplies": { + "desc": "Info about the comment section of a channel post, a simple message thread, a forum topic, or a direct messages topic (all features ultimately based on message threads).", + "params": { + "channel_id": "For channel post comments, contains the ID of the associated discussion supergroup", + "comments": "Whether this constructor contains information about the comment section of a channel post, or a simple message thread", + "flags": "Flags, see TL conditional fields", + "max_id": "ID of the latest message in this thread or comment section.", + "read_max_id": "Contains the ID of the latest read message in this thread or comment section.", + "recent_repliers": "For channel post comments, contains information about the last few comment posters for a specific thread, to show a small list of commenter profile pictures in client previews.", + "replies": "Contains the total number of replies in this thread or comment section.", + "replies_pts": "PTS of the message that started this thread." + } + }, + "MessageReplyHeader": { + "desc": "Message replies and thread information", + "params": { + "flags": "Flags, see TL conditional fields", + "forum_topic": "Whether this message was sent in a forum topic (except for the General topic).", + "quote": "Whether this message is quoting a part of another message.", + "quote_entities": "Message entities for styled text from the quote_text field.", + "quote_offset": "Offset of the message quote_text within the original message (in UTF-16 code units).", + "quote_text": "Used to quote-reply to only a certain section (specified here) of the original message.", + "reply_from": "When replying to a message sent by a certain peer to another chat, contains info about the peer that originally sent the message to that other chat.", + "reply_media": "When replying to a media sent by a certain peer to another chat, contains the media of the replied-to message.", + "reply_to_msg_id": "ID of message to which this message is replying", + "reply_to_peer_id": "For replies sent in channel discussion threads of which the current user is not a member, the discussion group ID", + "reply_to_scheduled": "This is a reply to a scheduled message.", + "reply_to_top_id": "ID of the message that started this message thread", + "todo_item_id": "Can be set to reply to the specified item of a todo list \u00bb." + } + }, + "MessageReplyStoryHeader": { + "desc": "Represents a reply to a story", + "params": { + "peer": "Sender of the story.", + "story_id": "Story ID" + } + }, + "MessageReportOption": { + "desc": "Report menu option", + "params": { + "option": "Option identifier: if the user selects this option, re-invoke messages.report, passing this option to option", + "text": "Option title" + } + }, + "MessageService": { + "desc": "Indicates a service message", + "params": { + "action": "Event connected with the service message", + "date": "Message date", + "flags": "Flags, see TL conditional fields", + "from_id": "ID of the sender of this message", + "id": "Message ID", + "legacy": "This is a legacy message: it has to be refetched with the new layer", + "media_unread": "Whether the message contains unread media", + "mentioned": "Whether we were mentioned in the message", + "out": "Whether the message is outgoing", + "peer_id": "Sender of service message", + "post": "Whether it's a channel post", + "reactions": "Reactions \u00bb.", + "reactions_are_possible": "Whether you can react to this message \u00bb.", + "reply_to": "Reply (thread) information", + "saved_peer_id": "Will only be set for service messages within a monoforum topic \u00bb: peer will be equal to the ID of the monoforum and the saved_peer_id flag will be set to the ID of a topic.", + "silent": "Whether the message is silent", + "ttl_period": "Time To Live of the message, once message.date+message.ttl_period === time(), the message will be deleted on the server, and must be deleted locally as well." + } + }, + "MessageViews": { + "desc": "View, forward counter + info about replies of a specific message", + "params": { + "flags": "Flags, see TL conditional fields", + "forwards": "Forward count of message", + "replies": "Reply and thread information of message", + "views": "View count of message" + } + }, + "MissingInvitee": { + "desc": "Info about why a specific user could not be invited \u00bb.", + "params": { + "flags": "Flags, see TL conditional fields", + "premium_required_for_pm": "If set, we could not add the user because of their privacy settings, and additionally, the current account needs to purchase a Telegram Premium subscription to directly share an invite link with the user via a private message.", + "premium_would_allow_invite": "If set, we could not add the user only because the current account needs to purchase a Telegram Premium subscription to complete the operation.", + "user_id": "ID of the user. If neither of the flags below are set, we could not add the user because of their privacy settings, and we can create and directly share an invite link with them using a normal message, instead." + } + }, + "MonoForumDialog": { + "desc": "Represents a monoforum topic \u00bb.", + "params": { + "draft": "A pending message draft.", + "flags": "Flags, see TL conditional fields", + "nopaid_messages_exception": "If set, an admin has exempted this peer from payment to send messages using account.toggleNoPaidMessagesException.", + "peer": "The peer associated to the topic, AKA the topic ID.", + "read_inbox_max_id": "Position up to which all incoming messages are read.", + "read_outbox_max_id": "Position up to which all outgoing messages are read.", + "top_message": "The latest message ID", + "unread_count": "Number of unread messages.", + "unread_mark": "Whether this topic has a manually set (with messages.markDialogUnread) unread mark.", + "unread_reactions_count": "Number of unread reactions." + } + }, + "MyBoost": { + "desc": "Contains information about a single boost slot \u00bb.", + "params": { + "cooldown_until_date": "If peer is set, indicates the (unixtime) date after which this boost can be reassigned to another channel.", + "date": "When (unixtime) we started boosting the peer, 0 otherwise.", + "expires": "Indicates the (unixtime) expiration date of the boost in peer (0 if peer is not set).", + "flags": "Flags, see TL conditional fields", + "peer": "If set, indicates this slot is currently occupied, i.e. we are boosting this peer. Note that we can assign multiple boost slots to the same peer.", + "slot": "Boost slot ID \u00bb" + } + }, + "NearestDc": { + "desc": "Nearest data center, according to geo-ip.", + "params": { + "country": "Country code determined by geo-ip", + "nearest_dc": "Number of nearest data center", + "this_dc": "Number of current data center" + } + }, + "NotificationSoundDefault": { + "desc": "Indicates the default notification sound should be used", + "params": {} + }, + "NotificationSoundLocal": { + "desc": "Indicates a specific local notification sound should be used", + "params": { + "data": "Notification sound identifier (arbitrary data used by the client to identify a specific local notification sound)", + "title": "Notification sound title" + } + }, + "NotificationSoundNone": { + "desc": "No notification sound should be used", + "params": {} + }, + "NotificationSoundRingtone": { + "desc": "A specific previously uploaded notification sound should be used", + "params": { + "id": "Document ID of notification sound uploaded using account.uploadRingtone" + } + }, + "NotifyBroadcasts": { + "desc": "Channel notification settings", + "params": {} + }, + "NotifyChats": { + "desc": "Notifications generated by all groups.", + "params": {} + }, + "NotifyForumTopic": { + "desc": "Notifications generated by a topic in a forum.", + "params": { + "peer": "Forum ID", + "top_msg_id": "Topic ID" + } + }, + "NotifyPeer": { + "desc": "Notifications generated by a certain user or group.", + "params": { + "peer": "user or group" + } + }, + "NotifyUsers": { + "desc": "Notifications generated by all users.", + "params": {} + }, + "OutboxReadDate": { + "desc": "Exact read date of a private message we sent to another user.", + "params": { + "date": "UNIX timestamp with the read date." + } + }, + "Page": { + "desc": "Instant view page", + "params": { + "blocks": "Page elements (like with HTML elements, only as TL constructors)", + "documents": "Media in page", + "flags": "Flags, see TL conditional fields", + "part": "Indicates that not full page preview is available to the client and it will need to fetch full Instant View from the server using messages.getWebPagePreview.", + "photos": "Photos in page", + "rtl": "Whether the page contains RTL text", + "url": "Original page HTTP URL", + "v2": "Whether this is an IV v2 page", + "views": "View count" + } + }, + "PageBlockAnchor": { + "desc": "Link to section within the page itself (like anchor)", + "params": { + "name": "Name of target section" + } + }, + "PageBlockAudio": { + "desc": "Audio", + "params": { + "audio_id": "Audio ID (to be fetched from the container page constructor", + "caption": "Audio caption" + } + }, + "PageBlockAuthorDate": { + "desc": "Author and date of creation of article", + "params": { + "author": "Author name", + "published_date": "Date of publication" + } + }, + "PageBlockBlockquote": { + "desc": "Quote (equivalent to the HTML
)", + "params": { + "caption": "Caption", + "text": "Quote contents" + } + }, + "PageBlockChannel": { + "desc": "Reference to a telegram channel", + "params": { + "channel": "The channel/supergroup/chat" + } + }, + "PageBlockCollage": { + "desc": "Collage of media", + "params": { + "caption": "Caption", + "items": "Media elements" + } + }, + "PageBlockCover": { + "desc": "A page cover", + "params": { + "cover": "Cover" + } + }, + "PageBlockDetails": { + "desc": "A collapsible details block", + "params": { + "blocks": "Block contents", + "flags": "Flags, see TL conditional fields", + "open": "Whether the block is open by default", + "title": "Always visible heading for the block" + } + }, + "PageBlockDivider": { + "desc": "An empty block separating a page", + "params": {} + }, + "PageBlockEmbed": { + "desc": "An embedded webpage", + "params": { + "allow_scrolling": "Whether scrolling should be allowed", + "caption": "Caption", + "flags": "Flags, see TL conditional fields", + "full_width": "Whether the block should be full width", + "h": "Block height, if known", + "html": "HTML-markup of the embedded page", + "poster_photo_id": "Poster photo, if available", + "url": "Web page URL, if available", + "w": "Block width, if known" + } + }, + "PageBlockEmbedPost": { + "desc": "An embedded post", + "params": { + "author": "Author name", + "author_photo_id": "ID of the author's photo", + "blocks": "Post contents", + "caption": "Caption", + "date": "Creation date", + "url": "Web page URL", + "webpage_id": "ID of generated webpage preview" + } + }, + "PageBlockFooter": { + "desc": "Page footer", + "params": { + "text": "Contents" + } + }, + "PageBlockHeader": { + "desc": "Page header", + "params": { + "text": "Contents" + } + }, + "PageBlockKicker": { + "desc": "Kicker", + "params": { + "text": "Contents" + } + }, + "PageBlockList": { + "desc": "Unordered list of IV blocks", + "params": { + "items": "List of blocks in an IV page" + } + }, + "PageBlockMap": { + "desc": "A map", + "params": { + "caption": "Caption", + "geo": "Location of the map center", + "h": "Map height in pixels before applying scale; 16-1024", + "w": "Map width in pixels before applying scale; 16-102", + "zoom": "Map zoom level; 13-20" + } + }, + "PageBlockOrderedList": { + "desc": "Ordered list of IV blocks", + "params": { + "items": "List items" + } + }, + "PageBlockParagraph": { + "desc": "A paragraph", + "params": { + "text": "Text" + } + }, + "PageBlockPhoto": { + "desc": "A photo", + "params": { + "caption": "Caption", + "flags": "Flags, see TL conditional fields", + "photo_id": "Photo ID", + "url": "HTTP URL of page the photo leads to when clicked", + "webpage_id": "ID of preview of the page the photo leads to when clicked" + } + }, + "PageBlockPreformatted": { + "desc": "Preformatted (
 text)",
+      "params": {
+        "language": "Programming language of preformatted text",
+        "text": "Text"
+      }
+    },
+    "PageBlockPullquote": {
+      "desc": "Pullquote",
+      "params": {
+        "caption": "Caption",
+        "text": "Text"
+      }
+    },
+    "PageBlockRelatedArticles": {
+      "desc": "Related articles",
+      "params": {
+        "articles": "Related articles",
+        "title": "Title"
+      }
+    },
+    "PageBlockSlideshow": {
+      "desc": "Slideshow",
+      "params": {
+        "caption": "Caption",
+        "items": "Slideshow items"
+      }
+    },
+    "PageBlockSubheader": {
+      "desc": "Subheader",
+      "params": {
+        "text": "Subheader"
+      }
+    },
+    "PageBlockSubtitle": {
+      "desc": "Subtitle",
+      "params": {
+        "text": "Text"
+      }
+    },
+    "PageBlockTable": {
+      "desc": "Table",
+      "params": {
+        "bordered": "Does the table have a visible border?",
+        "flags": "Flags, see TL conditional fields",
+        "rows": "Table rows",
+        "striped": "Is the table striped?",
+        "title": "Title"
+      }
+    },
+    "PageBlockTitle": {
+      "desc": "Title",
+      "params": {
+        "text": "Title"
+      }
+    },
+    "PageBlockUnsupported": {
+      "desc": "Unsupported IV element",
+      "params": {}
+    },
+    "PageBlockVideo": {
+      "desc": "Video",
+      "params": {
+        "autoplay": "Whether the video is set to autoplay",
+        "caption": "Caption",
+        "flags": "Flags, see TL conditional fields",
+        "loop": "Whether the video is set to loop",
+        "video_id": "Video ID"
+      }
+    },
+    "PageCaption": {
+      "desc": "Page caption",
+      "params": {
+        "credit": "Credits",
+        "text": "Caption"
+      }
+    },
+    "PageListItemBlocks": {
+      "desc": "List item",
+      "params": {
+        "blocks": "Blocks"
+      }
+    },
+    "PageListItemText": {
+      "desc": "List item",
+      "params": {
+        "text": "Text"
+      }
+    },
+    "PageListOrderedItemBlocks": {
+      "desc": "Ordered list of IV blocks",
+      "params": {
+        "blocks": "Item contents",
+        "num": "Number of element within ordered list"
+      }
+    },
+    "PageListOrderedItemText": {
+      "desc": "Ordered list of text items",
+      "params": {
+        "num": "Number of element within ordered list",
+        "text": "Text"
+      }
+    },
+    "PageRelatedArticle": {
+      "desc": "Related article",
+      "params": {
+        "author": "Author name",
+        "description": "Description",
+        "flags": "Flags, see TL conditional fields",
+        "photo_id": "ID of preview photo",
+        "published_date": "Date of publication",
+        "title": "Title",
+        "url": "URL of article",
+        "webpage_id": "Webpage ID of generated IV preview"
+      }
+    },
+    "PageTableCell": {
+      "desc": "Table cell",
+      "params": {
+        "align_center": "Horizontally centered block",
+        "align_right": "Right-aligned block",
+        "colspan": "For how many columns should this cell extend",
+        "flags": "Flags, see TL conditional fields",
+        "header": "Is this element part of the column header",
+        "rowspan": "For how many rows should this cell extend",
+        "text": "Content",
+        "valign_bottom": "Block vertically-aligned to the bottom",
+        "valign_middle": "Vertically centered block"
+      }
+    },
+    "PageTableRow": {
+      "desc": "Table row",
+      "params": {
+        "cells": "Table cells"
+      }
+    },
+    "PaidReactionPrivacyAnonymous": {
+      "desc": "Send paid reactions anonymously.",
+      "params": {}
+    },
+    "PaidReactionPrivacyDefault": {
+      "desc": "Uses the default reaction privacy, set using messages.togglePaidReactionPrivacy.",
+      "params": {}
+    },
+    "PaidReactionPrivacyPeer": {
+      "desc": "Send paid reactions as the specified peer, fetched using channels.getSendAs.",
+      "params": {
+        "peer": "The peer to send reactions as."
+      }
+    },
+    "PasswordKdfAlgoSHA256SHA256PBKDF2HMACSHA512iter100000SHA256ModPow": {
+      "desc": "This key derivation algorithm defines that SRP 2FA login must be used",
+      "params": {
+        "g": "Base (see SRP 2FA login)",
+        "p": "2048-bit modulus (see SRP 2FA login)",
+        "salt1": "One of two salts used by the derivation function (see SRP 2FA login)",
+        "salt2": "One of two salts used by the derivation function (see SRP 2FA login)"
+      }
+    },
+    "PasswordKdfAlgoUnknown": {
+      "desc": "Unknown KDF (most likely, the client is outdated and does not support the specified KDF algorithm)",
+      "params": {}
+    },
+    "PaymentCharge": {
+      "desc": "Payment identifier",
+      "params": {
+        "id": "Telegram payment identifier",
+        "provider_charge_id": "Provider payment identifier"
+      }
+    },
+    "PaymentFormMethod": {
+      "desc": "Represents an additional payment method",
+      "params": {
+        "title": "Payment method description",
+        "url": "URL to open in a webview to process the payment"
+      }
+    },
+    "PaymentRequestedInfo": {
+      "desc": "Order info provided by the user",
+      "params": {
+        "email": "User's email address",
+        "flags": "Flags, see TL conditional fields",
+        "name": "User's full name",
+        "phone": "User's phone number",
+        "shipping_address": "User's shipping address"
+      }
+    },
+    "PaymentSavedCredentialsCard": {
+      "desc": "Saved credit card",
+      "params": {
+        "id": "Card ID",
+        "title": "Title"
+      }
+    },
+    "PeerBlocked": {
+      "desc": "Information about a blocked peer",
+      "params": {
+        "date": "When was the peer blocked",
+        "peer_id": "Peer ID"
+      }
+    },
+    "PeerChannel": {
+      "desc": "Channel/supergroup",
+      "params": {
+        "channel_id": "Channel ID"
+      }
+    },
+    "PeerChat": {
+      "desc": "Group.",
+      "params": {
+        "chat_id": "Group identifier"
+      }
+    },
+    "PeerColor": {
+      "desc": "Represents a color palette \u00bb.",
+      "params": {
+        "background_emoji_id": "Optional custom emoji ID used to generate the pattern.",
+        "color": "Color palette ID, see here \u00bb for more info; if not set, the default palette should be used.",
+        "flags": "Flags, see TL conditional fields"
+      }
+    },
+    "PeerColorCollectible": {
+      "desc": "",
+      "params": {}
+    },
+    "PeerLocated": {
+      "desc": "Peer geolocated nearby",
+      "params": {
+        "distance": "Distance from the peer in meters",
+        "expires": "Validity period of current data",
+        "peer": "Peer"
+      }
+    },
+    "PeerNotifySettings": {
+      "desc": "Notification settings.",
+      "params": {
+        "android_sound": "Notification sound for the official android application",
+        "flags": "Flags, see TL conditional fields",
+        "ios_sound": "Notification sound for the official iOS application",
+        "mute_until": "Mute all notifications until this date",
+        "other_sound": "Notification sound for other applications",
+        "show_previews": "(Ternary value) If set, indicates whether or not to display previews of messages in notifications; otherwise the default behavior should be used.",
+        "silent": "(Ternary value) If set, indicates whether to mute or unmute the peer; otherwise the default behavior should be used.",
+        "stories_android_sound": "Sound for story notifications on the official Android application",
+        "stories_hide_sender": "Whether the sender name should be displayed in story notifications.",
+        "stories_ios_sound": "Sound for story notifications on the official iOS application",
+        "stories_muted": "Whether story notifications should be disabled.",
+        "stories_other_sound": "Sound for story notifications on other applications"
+      }
+    },
+    "PeerSelfLocated": {
+      "desc": "Current peer",
+      "params": {
+        "expires": "Expiry of geolocation info for current peer"
+      }
+    },
+    "PeerSettings": {
+      "desc": "List of actions that are possible when interacting with this user, to be shown as suggested actions in the chat action bar \u00bb, see here \u00bb for more info.",
+      "params": {
+        "add_contact": "Whether we can add the user as contact",
+        "autoarchived": "Whether this peer was automatically archived according to privacy settings and can be unarchived",
+        "block_contact": "Whether we can block the user",
+        "business_bot_can_reply": "This flag is set if both business_bot_id and business_bot_manage_url are set and connected business bots \u00bb can reply to messages in this chat, as specified by the settings during initial configuration.",
+        "business_bot_id": "Contains the ID of the business bot \u00bb managing this chat, used to display info about the bot in the action bar.",
+        "business_bot_manage_url": "Contains a deep link \u00bb, used to open a management menu in the business bot. This flag is set if and only if business_bot_id is set.",
+        "business_bot_paused": "This flag is set if both business_bot_id and business_bot_manage_url are set and all connected business bots \u00bb were paused in this chat using account.toggleConnectedBotPaused \u00bb.",
+        "charge_paid_message_stars": "All users that must pay us \u00bb to send us private messages will have this flag set only for us, containing the amount of required stars, see here \u00bb for more info on paid messages.",
+        "flags": "Flags, see TL conditional fields",
+        "geo_distance": "Distance in meters between us and this peer",
+        "invite_members": "If set, this is a recently created group chat to which new members can be invited",
+        "name_change_date": "When was the user's name last changed.",
+        "need_contacts_exception": "Whether a special exception for contacts is needed",
+        "phone_country": "The country code of the user's phone number.",
+        "photo_change_date": "When was the user's photo last changed.",
+        "registration_month": "Used to display the user's registration year and month, the string is in MM.YYYY format, where MM is the registration month (1-12), and YYYY is the registration year.",
+        "report_geo": "Whether we can report a geogroup as irrelevant for this location",
+        "report_spam": "Whether we can still report the user for spam",
+        "request_chat_broadcast": "This flag is set if request_chat_title and request_chat_date fields are set and the join request \u00bb is related to a channel (otherwise if only the request fields are set, the join request \u00bb is related to a chat).",
+        "request_chat_date": "If set, this is a private chat with an administrator of a chat or channel to which the user sent a join request, and this field contains the timestamp when the join request \u00bb was sent.",
+        "request_chat_title": "If set, this is a private chat with an administrator of a chat or channel to which the user sent a join request, and this field contains the chat/channel's title.",
+        "share_contact": "Whether we can share the user's contact"
+      }
+    },
+    "PeerStories": {
+      "desc": "Stories associated to a peer",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "max_read_id": "If set, contains the ID of the maximum read story",
+        "peer": "The peer",
+        "stories": "Stories"
+      }
+    },
+    "PeerUser": {
+      "desc": "Chat partner",
+      "params": {
+        "user_id": "User identifier"
+      }
+    },
+    "PendingSuggestion": {
+      "desc": "Represents a custom pending suggestion \u00bb.",
+      "params": {
+        "description": "Body of the suggestion.",
+        "suggestion": "The suggestion ID, can be passed to help.dismissSuggestion.",
+        "title": "Title of the suggestion.",
+        "url": "URL to open when the user clicks on the suggestion."
+      }
+    },
+    "PhoneCall": {
+      "desc": "Phone call",
+      "params": {
+        "access_hash": "Access hash",
+        "admin_id": "User ID of the creator of the call",
+        "conference_supported": "If set, the other party supports upgrading of the call to a conference call.",
+        "connections": "List of endpoints the user can connect to exchange call data",
+        "custom_parameters": "Custom JSON-encoded call parameters to be passed to tgcalls.",
+        "date": "Date of creation of the call",
+        "flags": "Flags, see TL conditional fields",
+        "g_a_or_b": "Parameter for key exchange",
+        "id": "Call ID",
+        "key_fingerprint": "Key fingerprint",
+        "p2p_allowed": "Whether P2P connection to the other peer is allowed",
+        "participant_id": "User ID of the other participant in the call",
+        "protocol": "Call protocol info to be passed to libtgvoip",
+        "start_date": "When was the call actually started",
+        "video": "Whether this is a video call"
+      }
+    },
+    "PhoneCallAccepted": {
+      "desc": "An accepted phone call",
+      "params": {
+        "access_hash": "Access hash of phone call",
+        "admin_id": "ID of the call creator",
+        "date": "When was the call accepted",
+        "flags": "Flags, see TL conditional fields",
+        "g_b": "B parameter for secure E2E phone call key exchange",
+        "id": "ID of accepted phone call",
+        "participant_id": "ID of the other user in the call",
+        "protocol": "Protocol to use for phone call",
+        "video": "Whether this is a video call"
+      }
+    },
+    "PhoneCallDiscardReasonBusy": {
+      "desc": "The phone call was discarded because the user is busy in another call",
+      "params": {}
+    },
+    "PhoneCallDiscardReasonDisconnect": {
+      "desc": "The phone call was disconnected",
+      "params": {}
+    },
+    "PhoneCallDiscardReasonHangup": {
+      "desc": "The phone call was ended normally",
+      "params": {}
+    },
+    "PhoneCallDiscardReasonMigrateConferenceCall": {
+      "desc": "This phone call was migrated to a conference call.",
+      "params": {
+        "slug": "Conference link \u00bb slug."
+      }
+    },
+    "PhoneCallDiscardReasonMissed": {
+      "desc": "The phone call was missed",
+      "params": {}
+    },
+    "PhoneCallDiscarded": {
+      "desc": "Indicates a discarded phone call",
+      "params": {
+        "duration": "Duration of the phone call in seconds",
+        "flags": "Flags, see TL conditional fields",
+        "id": "Call ID",
+        "need_debug": "Whether the server required the client to send the libtgvoip call debug data",
+        "need_rating": "Whether the server required the user to rate the call",
+        "reason": "Why was the phone call discarded",
+        "video": "Whether the call was a video call"
+      }
+    },
+    "PhoneCallEmpty": {
+      "desc": "Empty constructor",
+      "params": {
+        "id": "Call ID"
+      }
+    },
+    "PhoneCallProtocol": {
+      "desc": "Protocol info for libtgvoip",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "library_versions": "When using phone.requestCall and phone.acceptCall, specify all library versions supported by the client. The server will merge and choose the best library version supported by both peers, returning only the best value in the result of the callee's phone.acceptCall and in the phoneCallAccepted update received by the caller.",
+        "max_layer": "Maximum layer for remote libtgvoip",
+        "min_layer": "Minimum layer for remote libtgvoip",
+        "udp_p2p": "Whether to allow P2P connection to the other participant",
+        "udp_reflector": "Whether to allow connection to the other participants through the reflector servers"
+      }
+    },
+    "PhoneCallRequested": {
+      "desc": "Requested phone call",
+      "params": {
+        "access_hash": "Access hash",
+        "admin_id": "ID of the creator of the phone call",
+        "date": "When was the phone call created",
+        "flags": "Flags, see TL conditional fields",
+        "g_a_hash": "Parameter for key exchange",
+        "id": "Phone call ID",
+        "participant_id": "ID of the other participant of the phone call",
+        "protocol": "Call protocol info to be passed to libtgvoip",
+        "video": "Whether this is a video call"
+      }
+    },
+    "PhoneCallWaiting": {
+      "desc": "Incoming phone call",
+      "params": {
+        "access_hash": "Access hash",
+        "admin_id": "Admin ID",
+        "date": "Date",
+        "flags": "Flags, see TL conditional fields",
+        "id": "Call ID",
+        "participant_id": "Participant ID",
+        "protocol": "Phone call protocol info",
+        "receive_date": "When was the phone call received",
+        "video": "Is this a video call"
+      }
+    },
+    "PhoneConnection": {
+      "desc": "Identifies an endpoint that can be used to connect to the other user in a phone call",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "id": "Endpoint ID",
+        "ip": "IP address of endpoint",
+        "ipv6": "IPv6 address of endpoint",
+        "peer_tag": "Our peer tag",
+        "port": "Port ID",
+        "tcp": "Whether TCP should be used"
+      }
+    },
+    "PhoneConnectionWebrtc": {
+      "desc": "WebRTC connection parameters",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "id": "Endpoint ID",
+        "ip": "IP address",
+        "ipv6": "IPv6 address",
+        "password": "Password",
+        "port": "Port",
+        "stun": "Whether this is a STUN endpoint",
+        "turn": "Whether this is a TURN endpoint",
+        "username": "Username"
+      }
+    },
+    "Photo": {
+      "desc": "Photo",
+      "params": {
+        "access_hash": "Access hash",
+        "date": "Date of upload",
+        "dc_id": "DC ID to use for download",
+        "file_reference": "file reference",
+        "flags": "Flags, see TL conditional fields",
+        "has_stickers": "Whether the photo has mask stickers attached to it",
+        "id": "ID",
+        "sizes": "Available sizes for download",
+        "video_sizes": "For animated profiles, the MPEG4 videos"
+      }
+    },
+    "PhotoCachedSize": {
+      "desc": "Description of an image and its content.",
+      "params": {
+        "bytes": "Binary data, file content",
+        "h": "Image height",
+        "type": "Thumbnail type",
+        "w": "Image width"
+      }
+    },
+    "PhotoEmpty": {
+      "desc": "Empty constructor, non-existent photo",
+      "params": {
+        "id": "Photo identifier"
+      }
+    },
+    "PhotoPathSize": {
+      "desc": "Messages with animated stickers can have a compressed svg (< 300 bytes) to show the outline of the sticker before fetching the actual lottie animation.",
+      "params": {
+        "bytes": "Compressed SVG path payload, see here for decompression instructions",
+        "type": "Always j"
+      }
+    },
+    "PhotoSize": {
+      "desc": "Image description.",
+      "params": {
+        "h": "Image height",
+        "size": "File size",
+        "type": "Thumbnail type \u00bb",
+        "w": "Image width"
+      }
+    },
+    "PhotoSizeEmpty": {
+      "desc": "Empty constructor. Image with this thumbnail is unavailable.",
+      "params": {
+        "type": "Thumbnail type \u00bb"
+      }
+    },
+    "PhotoSizeProgressive": {
+      "desc": "Progressively encoded photosize",
+      "params": {
+        "h": "Photo height",
+        "sizes": "Sizes of progressive JPEG file prefixes, which can be used to preliminarily show the image.",
+        "type": "Photosize type \u00bb",
+        "w": "Photo width"
+      }
+    },
+    "PhotoStrippedSize": {
+      "desc": "A low-resolution compressed JPG payload",
+      "params": {
+        "bytes": "Thumbnail data, see here for more info on decompression \u00bb",
+        "type": "Thumbnail type"
+      }
+    },
+    "Poll": {
+      "desc": "Poll",
+      "params": {
+        "answers": "The possible answers (2-poll_answers_max), vote using messages.sendVote.",
+        "close_date": "Point in time (Unix timestamp) when the poll will be automatically closed. Must be at least 5 and no more than 600 seconds in the future; can't be used together with close_period.",
+        "close_period": "Amount of time in seconds the poll will be active after creation, 5-600. Can't be used together with close_date.",
+        "closed": "Whether the poll is closed and doesn't accept any more answers",
+        "flags": "Flags, see TL conditional fields",
+        "id": "ID of the poll",
+        "multiple_choice": "Whether multiple options can be chosen as answer",
+        "public_voters": "Whether cast votes are publicly visible to all users (non-anonymous poll)",
+        "question": "The question of the poll (only Premium users can use custom emoji entities here).",
+        "quiz": "Whether this is a quiz (with wrong and correct answers, results shown in the return type)"
+      }
+    },
+    "PollAnswer": {
+      "desc": "A possible answer of a poll",
+      "params": {
+        "option": "The param that has to be passed to messages.sendVote.",
+        "text": "Textual representation of the answer (only Premium users can use custom emoji entities here)."
+      }
+    },
+    "PollAnswerVoters": {
+      "desc": "A poll answer, and how users voted on it",
+      "params": {
+        "chosen": "Whether we have chosen this answer",
+        "correct": "For quizzes, whether the option we have chosen is correct",
+        "flags": "Flags, see TL conditional fields",
+        "option": "The param that has to be passed to messages.sendVote.",
+        "voters": "How many users voted for this option"
+      }
+    },
+    "PollResults": {
+      "desc": "Results of poll",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "min": "Similar to min objects, used for poll constructors that are the same for all users so they don't have the option chosen by the current user (you can use messages.getPollResults to get the full poll results).",
+        "recent_voters": "IDs of the last users that recently voted in the poll",
+        "results": "Poll results",
+        "solution": "Explanation of quiz solution",
+        "solution_entities": "Message entities for styled text in quiz solution",
+        "total_voters": "Total number of people that voted in the poll"
+      }
+    },
+    "PopularContact": {
+      "desc": "Popular contact",
+      "params": {
+        "client_id": "Contact identifier",
+        "importers": "How many people imported this contact"
+      }
+    },
+    "PostAddress": {
+      "desc": "Shipping address",
+      "params": {
+        "city": "City",
+        "country_iso2": "ISO 3166-1 alpha-2 country code",
+        "post_code": "Address post code",
+        "state": "State, if applicable (empty otherwise)",
+        "street_line1": "First line for the address",
+        "street_line2": "Second line for the address"
+      }
+    },
+    "PostInteractionCountersMessage": {
+      "desc": "Interaction counters for a message.",
+      "params": {
+        "forwards": "Number of forwards to public channels",
+        "msg_id": "Message ID",
+        "reactions": "Number of reactions",
+        "views": "Number of views"
+      }
+    },
+    "PostInteractionCountersStory": {
+      "desc": "Interaction counters for a story.",
+      "params": {
+        "forwards": "Number of forwards and reposts to public chats and channels",
+        "reactions": "Number of reactions",
+        "story_id": "Story ID",
+        "views": "Number of views"
+      }
+    },
+    "PremiumGiftCodeOption": {
+      "desc": "Contains info about a giveaway/gift option.",
+      "params": {
+        "amount": "Total price in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).",
+        "currency": "Three-letter ISO 4217 currency code",
+        "flags": "Flags, see TL conditional fields",
+        "months": "Duration in months of each gifted Telegram Premium subscription.",
+        "store_product": "Identifier of the store product associated with the option, official apps only.",
+        "store_quantity": "Number of times the store product must be paid",
+        "users": "Number of users which will be able to activate the gift codes."
+      }
+    },
+    "PremiumGiftOption": {
+      "desc": "Telegram Premium gift option",
+      "params": {}
+    },
+    "PremiumSubscriptionOption": {
+      "desc": "Describes a Telegram Premium subscription option",
+      "params": {
+        "amount": "Total price in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).",
+        "bot_url": "Deep link used to initiate payment",
+        "can_purchase_upgrade": "Whether this subscription option can be used to upgrade the existing Telegram Premium subscription. When upgrading Telegram Premium subscriptions bought through stores, make sure that the store transaction ID is equal to transaction, to avoid upgrading someone else's account, if the client is currently logged into multiple accounts.",
+        "currency": "Three-letter ISO 4217 currency code",
+        "current": "Whether this subscription option is currently in use.",
+        "flags": "Flags, see TL conditional fields",
+        "months": "Duration of subscription in months",
+        "store_product": "Store product ID, only for official apps",
+        "transaction": "Identifier of the last in-store transaction for the currently used subscription on the current account."
+      }
+    },
+    "PrepaidGiveaway": {
+      "desc": "Contains info about a prepaid giveaway \u00bb.",
+      "params": {
+        "date": "Payment date.",
+        "id": "Prepaid giveaway ID.",
+        "months": "Duration in months of each gifted Telegram Premium subscription.",
+        "quantity": "Number of given away Telegram Premium subscriptions."
+      }
+    },
+    "PrepaidStarsGiveaway": {
+      "desc": "Contains info about a prepaid Telegram Star giveaway \u00bb.",
+      "params": {
+        "boosts": "Number of boosts the channel will gain by launching the giveaway.",
+        "date": "When was the giveaway paid for",
+        "id": "Prepaid giveaway ID.",
+        "quantity": "Number of giveaway winners",
+        "stars": "Number of given away Telegram Stars \u00bb"
+      }
+    },
+    "PrivacyKeyAbout": {
+      "desc": "Whether people can see your bio",
+      "params": {}
+    },
+    "PrivacyKeyAddedByPhone": {
+      "desc": "Whether this user can be added to our contact list by their phone number",
+      "params": {}
+    },
+    "PrivacyKeyBirthday": {
+      "desc": "Whether the user can see our birthday.",
+      "params": {}
+    },
+    "PrivacyKeyChatInvite": {
+      "desc": "Whether the user can be invited to chats",
+      "params": {}
+    },
+    "PrivacyKeyForwards": {
+      "desc": "Whether messages forwarded from the user will be anonymously forwarded",
+      "params": {}
+    },
+    "PrivacyKeyNoPaidMessages": {
+      "desc": "Who can send you messages without paying, if paid messages \u00bb are enabled.",
+      "params": {}
+    },
+    "PrivacyKeyPhoneCall": {
+      "desc": "Whether the user accepts phone calls",
+      "params": {}
+    },
+    "PrivacyKeyPhoneNumber": {
+      "desc": "Whether the user allows us to see his phone number",
+      "params": {}
+    },
+    "PrivacyKeyPhoneP2P": {
+      "desc": "Whether P2P connections in phone calls with this user are allowed",
+      "params": {}
+    },
+    "PrivacyKeyProfilePhoto": {
+      "desc": "Whether the profile picture of the user is visible",
+      "params": {}
+    },
+    "PrivacyKeyStarGiftsAutoSave": {
+      "desc": "Whether received gifts will be automatically displayed on our profile",
+      "params": {}
+    },
+    "PrivacyKeyStatusTimestamp": {
+      "desc": "Whether we can see the last online timestamp of this user.",
+      "params": {}
+    },
+    "PrivacyKeyVoiceMessages": {
+      "desc": "Whether the user accepts voice messages",
+      "params": {}
+    },
+    "PrivacyValueAllowAll": {
+      "desc": "Allow all users",
+      "params": {}
+    },
+    "PrivacyValueAllowBots": {
+      "desc": "Allow bots and mini apps",
+      "params": {}
+    },
+    "PrivacyValueAllowChatParticipants": {
+      "desc": "Allow all participants of certain chats",
+      "params": {
+        "chats": "Allowed chat IDs (either a chat or a supergroup ID, verbatim the way it is received in the constructor (i.e. unlike with bot API IDs, here group and supergroup IDs should be treated in the same way))."
+      }
+    },
+    "PrivacyValueAllowCloseFriends": {
+      "desc": "Allow only close friends \u00bb",
+      "params": {}
+    },
+    "PrivacyValueAllowContacts": {
+      "desc": "Allow all contacts",
+      "params": {}
+    },
+    "PrivacyValueAllowPremium": {
+      "desc": "Allow only users with a Premium subscription \u00bb, currently only usable for inputPrivacyKeyChatInvite.",
+      "params": {}
+    },
+    "PrivacyValueAllowUsers": {
+      "desc": "Allow only certain users",
+      "params": {
+        "users": "Allowed users"
+      }
+    },
+    "PrivacyValueDisallowAll": {
+      "desc": "Disallow all users",
+      "params": {}
+    },
+    "PrivacyValueDisallowBots": {
+      "desc": "Disallow bots and mini apps",
+      "params": {}
+    },
+    "PrivacyValueDisallowChatParticipants": {
+      "desc": "Disallow only participants of certain chats",
+      "params": {
+        "chats": "Disallowed chats IDs (either a chat or a supergroup ID, verbatim the way it is received in the constructor (i.e. unlike with bot API IDs, here group and supergroup IDs should be treated in the same way))."
+      }
+    },
+    "PrivacyValueDisallowContacts": {
+      "desc": "Disallow only contacts",
+      "params": {}
+    },
+    "PrivacyValueDisallowUsers": {
+      "desc": "Disallow only certain users",
+      "params": {
+        "users": "Disallowed users"
+      }
+    },
+    "ProfileTabFiles": {
+      "desc": "Represents the shared files tab of a profile.",
+      "params": {}
+    },
+    "ProfileTabGifs": {
+      "desc": "Represents the gifs tab of a profile page.",
+      "params": {}
+    },
+    "ProfileTabGifts": {
+      "desc": "Represents the gifts tab of a profile page.",
+      "params": {}
+    },
+    "ProfileTabLinks": {
+      "desc": "Represents the shared links tab of a profile page.",
+      "params": {}
+    },
+    "ProfileTabMedia": {
+      "desc": "Represents the media tab of a profile page.",
+      "params": {}
+    },
+    "ProfileTabMusic": {
+      "desc": "Represents the music tab of a profile page.",
+      "params": {}
+    },
+    "ProfileTabPosts": {
+      "desc": "Represents the stories tab of a profile page.",
+      "params": {}
+    },
+    "ProfileTabVoice": {
+      "desc": "Represents the voice messages tab of a profile page.",
+      "params": {}
+    },
+    "PublicForwardMessage": {
+      "desc": "Contains info about a forward of a story as a message.",
+      "params": {
+        "message": "Info about the message with the reposted story."
+      }
+    },
+    "PublicForwardStory": {
+      "desc": "Contains info about a forward of a story as a repost by a public channel.",
+      "params": {
+        "peer": "The channel that reposted the story.",
+        "story": "The reposted story (may be different from the original story)."
+      }
+    },
+    "QuickReply": {
+      "desc": "A quick reply shortcut.",
+      "params": {
+        "count": "Total number of messages in the shortcut.",
+        "shortcut": "Shortcut name.",
+        "shortcut_id": "Unique shortcut ID.",
+        "top_message": "ID of the last message in the shortcut."
+      }
+    },
+    "ReactionCount": {
+      "desc": "Reactions",
+      "params": {
+        "chosen_order": "If set, indicates that the current user also sent this reaction. The integer value indicates when was the reaction added: the bigger the value, the newer the reaction.",
+        "count": "Number of users that reacted with this emoji.",
+        "flags": "Flags, see TL conditional fields",
+        "reaction": "The reaction."
+      }
+    },
+    "ReactionCustomEmoji": {
+      "desc": "Custom emoji message reaction",
+      "params": {
+        "document_id": "Custom emoji document ID"
+      }
+    },
+    "ReactionEmoji": {
+      "desc": "Normal emoji message reaction",
+      "params": {
+        "emoticon": "Emoji"
+      }
+    },
+    "ReactionEmpty": {
+      "desc": "No reaction",
+      "params": {}
+    },
+    "ReactionNotificationsFromAll": {
+      "desc": "Receive notifications about reactions made by any user.",
+      "params": {}
+    },
+    "ReactionNotificationsFromContacts": {
+      "desc": "Receive notifications about reactions made only by our contacts.",
+      "params": {}
+    },
+    "ReactionPaid": {
+      "desc": "Represents a paid Telegram Star reaction \u00bb.",
+      "params": {}
+    },
+    "ReactionsNotifySettings": {
+      "desc": "Reaction notification settings, see here \u00bb for more info.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "messages_notify_from": "Message reaction notification settings, if not set completely disables notifications/updates about message reactions.",
+        "show_previews": "If false, push notifications \u00bb about message/story reactions will only be of type REACT_HIDDEN/REACT_STORY_HIDDEN, without any information about the reacted-to story or the reaction itself.",
+        "sound": "Notification sound for reactions \u00bb",
+        "stories_notify_from": "Story reaction notification settings, if not set completely disables notifications/updates about reactions to stories."
+      }
+    },
+    "ReadParticipantDate": {
+      "desc": "Contains info about when a certain participant has read a message",
+      "params": {
+        "date": "When the user read the message",
+        "user_id": "User ID"
+      }
+    },
+    "ReceivedNotifyMessage": {
+      "desc": "Message ID, for which PUSH-notifications were cancelled.",
+      "params": {
+        "flags": "Reserved for future use",
+        "id": "Message ID, for which PUSH-notifications were canceled"
+      }
+    },
+    "RecentMeUrlChat": {
+      "desc": "Recent t.me link to a chat",
+      "params": {
+        "chat_id": "Chat ID",
+        "url": "t.me URL"
+      }
+    },
+    "RecentMeUrlChatInvite": {
+      "desc": "Recent t.me invite link to a chat",
+      "params": {
+        "chat_invite": "Chat invitation",
+        "url": "t.me URL"
+      }
+    },
+    "RecentMeUrlStickerSet": {
+      "desc": "Recent t.me stickerset installation URL",
+      "params": {
+        "set": "Stickerset",
+        "url": "t.me URL"
+      }
+    },
+    "RecentMeUrlUnknown": {
+      "desc": "Unknown t.me url",
+      "params": {
+        "url": "URL"
+      }
+    },
+    "RecentMeUrlUser": {
+      "desc": "Recent t.me link to a user",
+      "params": {
+        "url": "URL",
+        "user_id": "User ID"
+      }
+    },
+    "ReplyInlineMarkup": {
+      "desc": "Bot or inline keyboard",
+      "params": {
+        "rows": "Bot or inline keyboard rows"
+      }
+    },
+    "ReplyKeyboardForceReply": {
+      "desc": "Force the user to send a reply",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "placeholder": "The placeholder to be shown in the input field when the keyboard is active; 1-64 characters.",
+        "selective": "Use this parameter if you want to show the keyboard to specific users only. Targets: 1) users that are @mentioned in the text of the Message object; 2) if the bot's message is a reply (has reply_to_message_id), sender of the original message. Example: A user requests to change the bot's language, bot replies to the request with a keyboard to select the new language. Other users in the group don't see the keyboard.",
+        "single_use": "Requests clients to hide the keyboard as soon as it's been used. The keyboard will still be available, but clients will automatically display the usual letter-keyboard in the chat \u2013 the user can press a special button in the input field to see the custom keyboard again."
+      }
+    },
+    "ReplyKeyboardHide": {
+      "desc": "Hide sent bot keyboard",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "selective": "Use this flag if you want to remove the keyboard for specific users only. Targets: 1) users that are @mentioned in the text of the Message object; 2) if the bot's message is a reply (has reply_to_message_id), sender of the original message.Example: A user votes in a poll, bot returns confirmation message in reply to the vote and removes the keyboard for that user, while still showing the keyboard with poll options to users who haven't voted yet"
+      }
+    },
+    "ReplyKeyboardMarkup": {
+      "desc": "Bot keyboard",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "persistent": "Requests clients to always show the keyboard when the regular keyboard is hidden.",
+        "placeholder": "The placeholder to be shown in the input field when the keyboard is active; 1-64 characters.",
+        "resize": "Requests clients to resize the keyboard vertically for optimal fit (e.g., make the keyboard smaller if there are just two rows of buttons). If not set, the custom keyboard is always of the same height as the app's standard keyboard.",
+        "rows": "Button row",
+        "selective": "Use this parameter if you want to show the keyboard to specific users only. Targets: 1) users that are @mentioned in the text of the Message object; 2) if the bot's message is a reply (has reply_to_message_id), sender of the original message.Example: A user requests to change the bot's language, bot replies to the request with a keyboard to select the new language. Other users in the group don't see the keyboard.",
+        "single_use": "Requests clients to hide the keyboard as soon as it's been used. The keyboard will still be available, but clients will automatically display the usual letter-keyboard in the chat \u2013 the user can press a special button in the input field to see the custom keyboard again."
+      }
+    },
+    "ReportResultAddComment": {
+      "desc": "The user should enter an additional comment for the moderators, and then messages.report must be re-invoked, passing the comment to messages.report.message.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "option": "The messages.report method must be re-invoked, passing this option to option",
+        "optional": "Whether this step can be skipped by the user, passing an empty message to messages.report, or if a non-empty message is mandatory."
+      }
+    },
+    "ReportResultChooseOption": {
+      "desc": "The user must choose one of the following options, and then messages.report must be re-invoked, passing the option's option identifier to messages.report.option.",
+      "params": {
+        "options": "Available options, rendered as menu entries.",
+        "title": "Title of the option popup"
+      }
+    },
+    "ReportResultReported": {
+      "desc": "The report was sent successfully, no further actions are required.",
+      "params": {}
+    },
+    "RequestPeerTypeBroadcast": {
+      "desc": "Choose a channel",
+      "params": {
+        "bot_admin_rights": "If specified, allows only choosing channels where the bot is an admin with at least the specified admin rights.",
+        "creator": "Whether to allow only choosing channels that were created by the current user.",
+        "flags": "Flags, see TL conditional fields",
+        "has_username": "If specified, allows only choosing channels with or without a username, according to the value of Bool.",
+        "user_admin_rights": "If specified, allows only choosing channels where the current user is an admin with at least the specified admin rights."
+      }
+    },
+    "RequestPeerTypeChat": {
+      "desc": "Choose a chat or supergroup",
+      "params": {
+        "bot_admin_rights": "If specified, allows only choosing chats or supergroups where the bot is an admin with at least the specified admin rights.",
+        "bot_participant": "Whether to allow only choosing chats or supergroups where the bot is a participant.",
+        "creator": "Whether to allow only choosing chats or supergroups that were created by the current user.",
+        "flags": "Flags, see TL conditional fields",
+        "forum": "If specified, allows only choosing chats or supergroups that are or aren't forums, according to the value of Bool.",
+        "has_username": "If specified, allows only choosing channels with or without a username, according to the value of Bool.",
+        "user_admin_rights": "If specified, allows only choosing chats or supergroups where the current user is an admin with at least the specified admin rights."
+      }
+    },
+    "RequestPeerTypeUser": {
+      "desc": "Choose a user.",
+      "params": {
+        "bot": "Whether to allow choosing only bots.",
+        "flags": "Flags, see TL conditional fields",
+        "premium": "Whether to allow choosing only Premium users."
+      }
+    },
+    "RequestedPeerChannel": {
+      "desc": "Info about a channel/supergroup, shared by a user with the currently logged in bot using messages.sendBotRequestedPeer.",
+      "params": {
+        "channel_id": "Channel/supergroup ID.",
+        "flags": "Flags, see TL conditional fields",
+        "photo": "Channel/supergroup photo.",
+        "title": "Channel/supergroup title.",
+        "username": "Channel/supergroup username."
+      }
+    },
+    "RequestedPeerChat": {
+      "desc": "Info about a chat, shared by a user with the currently logged in bot using messages.sendBotRequestedPeer.",
+      "params": {
+        "chat_id": "Chat ID.",
+        "flags": "Flags, see TL conditional fields",
+        "photo": "Chat photo.",
+        "title": "Chat title."
+      }
+    },
+    "RequestedPeerUser": {
+      "desc": "Info about a user, shared by a user with the currently logged in bot using messages.sendBotRequestedPeer.",
+      "params": {
+        "first_name": "First name.",
+        "flags": "Flags, see TL conditional fields",
+        "last_name": "Last name.",
+        "photo": "Profile photo.",
+        "user_id": "User ID.",
+        "username": "Username."
+      }
+    },
+    "RequirementToContactEmpty": {
+      "desc": "This user can be freely contacted.",
+      "params": {}
+    },
+    "RequirementToContactPaidMessages": {
+      "desc": "This user requires us to pay the specified amount of Telegram Stars to send them a message, see here \u00bb for the full flow.",
+      "params": {
+        "stars_amount": "The required amount of Telegram Stars."
+      }
+    },
+    "RequirementToContactPremium": {
+      "desc": "This user requires us to buy a Premium subscription in order to contact them.",
+      "params": {}
+    },
+    "RestrictionReason": {
+      "desc": "Restriction reason.",
+      "params": {
+        "platform": "Platform identifier (ios, android, wp, all, etc.), can be concatenated with a dash as separator (android-ios, ios-wp, etc)",
+        "reason": "Restriction reason (porno, terms, etc.). Ignore this restriction reason if it is contained in the ignore_restriction_reasons \u00bb client configuration parameter.",
+        "text": "Error message to be shown to the user"
+      }
+    },
+    "SavedDialog": {
+      "desc": "Represents a saved dialog \u00bb.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "peer": "The dialog",
+        "pinned": "Is the dialog pinned",
+        "top_message": "The latest message ID"
+      }
+    },
+    "SavedPhoneContact": {
+      "desc": "Saved contact",
+      "params": {
+        "date": "Date added",
+        "first_name": "First name",
+        "last_name": "Last name",
+        "phone": "Phone number"
+      }
+    },
+    "SavedReactionTag": {
+      "desc": "Info about a saved message reaction tag \u00bb.",
+      "params": {
+        "count": "Number of messages tagged with this tag.",
+        "flags": "Flags, see TL conditional fields",
+        "reaction": "Reaction associated to the tag.",
+        "title": "Custom tag name assigned by the user (max 12 UTF-8 chars)."
+      }
+    },
+    "SavedStarGift": {
+      "desc": "Represents a gift owned by a peer.",
+      "params": {
+        "can_export_at": "If set, indicates that the current gift can't be exported to the TON blockchain \u00bb yet: the owner will be able to export it at the specified unixtime.",
+        "can_resell_at": "If set, indicates that the current gift can't be resold \u00bb yet: the owner will be able to put it up for sale at the specified unixtime.",
+        "can_transfer_at": "If set, indicates that the current gift can't be transferred \u00bb yet: the owner will be able to transfer it at the specified unixtime.",
+        "can_upgrade": "Only set for non-collectible gifts, if they can be upgraded to a collectible gift \u00bb.",
+        "collection_id": "IDs of the collections \u00bb that this gift is a part of.",
+        "convert_stars": "For non-collectible gifts, the receiver of this gift may convert it to this many Telegram Stars, instead of displaying it on their profile page.",
+        "date": "Reception date of the gift.",
+        "flags": "Flags, see TL conditional fields",
+        "from_id": "Sender of the gift (unset for anonymous gifts).",
+        "gift": "The collectible gift.",
+        "message": "Message attached to the gift.",
+        "msg_id": "For gifts received by users, ID to use in inputSavedStarGiftUser constructors.",
+        "name_hidden": "If set, the gift sender in from_id and the message are set only for the receiver of the gift.",
+        "pinned_to_top": "Whether this gift is pinned on top of the user's profile page.",
+        "prepaid_upgrade_hash": "Hash to prepay for a gift upgrade separately \u00bb.",
+        "refunded": "This gift was upgraded to a collectible gift \u00bb and then re-downgraded to a regular gift because a request to refund the payment related to the upgrade was made, and the money was returned.",
+        "saved_id": "For gifts received by channels, ID to use in inputSavedStarGiftChat constructors.",
+        "transfer_stars": "If set, indicates that the gift can be transferred \u00bb to another user by paying the specified amount of stars.",
+        "unsaved": "If set, the gift is not pinned on the user's profile.",
+        "upgrade_separate": "If set, someone already separately pre-paid for the upgrade of this gift.",
+        "upgrade_stars": "Only for pre-paid non-collectible gifts, the number of Telegram Stars the sender has already paid to convert the gift into a collectible gift \u00bb (this is different from the meaning of the flag in messageActionStarGift, where it signals the upgrade price for not yet upgraded gifts)."
+      }
+    },
+    "SearchPostsFlood": {
+      "desc": "Indicates if the specified global post search \u00bb requires payment.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "query_is_free": "The specified query is free (and it will not use up free search slots).",
+        "remains": "Remaining number of free search slots.",
+        "stars_amount": "The number of Telegram Stars to pay for each non-free search.",
+        "total_daily": "Total number of daily free search slots.",
+        "wait_till": "If there are no more search slots, specifies the unixtime when more search slots will be available."
+      }
+    },
+    "SearchResultPosition": {
+      "desc": "Information about a message in a specific position",
+      "params": {
+        "date": "When was the message sent",
+        "msg_id": "Message ID",
+        "offset": "0-based message position in the full list of suitable messages"
+      }
+    },
+    "SearchResultsCalendarPeriod": {
+      "desc": "Information about found messages sent on a specific day, used to split the messages in messages.searchResultsCalendar constructors by days.",
+      "params": {
+        "count": "All messages that were sent on this day.",
+        "date": "The day this object is referring to.",
+        "max_msg_id": "Last message ID that was sent on this day.",
+        "min_msg_id": "First message ID that was sent on this day."
+      }
+    },
+    "SecureCredentialsEncrypted": {
+      "desc": "Encrypted credentials required to decrypt telegram passport data.",
+      "params": {
+        "data": "Encrypted JSON-serialized data with unique user's payload, data hashes and secrets required for EncryptedPassportElement decryption and authentication, as described in decrypting data \u00bb",
+        "hash": "Data hash for data authentication as described in decrypting data \u00bb",
+        "secret": "Secret, encrypted with the bot's public RSA key, required for data decryption as described in decrypting data \u00bb"
+      }
+    },
+    "SecureData": {
+      "desc": "Secure passport data, for more info see the passport docs \u00bb",
+      "params": {
+        "data": "Data",
+        "data_hash": "Data hash",
+        "secret": "Secret"
+      }
+    },
+    "SecureFile": {
+      "desc": "Secure passport file, for more info see the passport docs \u00bb",
+      "params": {
+        "access_hash": "Access hash",
+        "date": "Date of upload",
+        "dc_id": "DC ID",
+        "file_hash": "File hash",
+        "id": "ID",
+        "secret": "Secret",
+        "size": "File size"
+      }
+    },
+    "SecureFileEmpty": {
+      "desc": "Empty constructor",
+      "params": {}
+    },
+    "SecurePasswordKdfAlgoPBKDF2HMACSHA512iter100000": {
+      "desc": "PBKDF2 with SHA512 and 100000 iterations KDF algo",
+      "params": {
+        "salt": "Salt"
+      }
+    },
+    "SecurePasswordKdfAlgoSHA512": {
+      "desc": "SHA512 KDF algo",
+      "params": {
+        "salt": "Salt"
+      }
+    },
+    "SecurePasswordKdfAlgoUnknown": {
+      "desc": "Unknown KDF algo (most likely the client has to be updated)",
+      "params": {}
+    },
+    "SecurePlainEmail": {
+      "desc": "Email address to use in telegram passport: it must be verified, first \u00bb.",
+      "params": {
+        "email": "Email address"
+      }
+    },
+    "SecurePlainPhone": {
+      "desc": "Phone number to use in telegram passport: it must be verified, first \u00bb.",
+      "params": {
+        "phone": "Phone number"
+      }
+    },
+    "SecureRequiredType": {
+      "desc": "Required type",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "native_names": "Native names",
+        "selfie_required": "Is a selfie required",
+        "translation_required": "Is a translation required",
+        "type": "Secure value type"
+      }
+    },
+    "SecureRequiredTypeOneOf": {
+      "desc": "One of",
+      "params": {
+        "types": "Secure required value types"
+      }
+    },
+    "SecureSecretSettings": {
+      "desc": "Secure settings",
+      "params": {
+        "secure_algo": "Secure KDF algo",
+        "secure_secret": "Secure secret",
+        "secure_secret_id": "Secret ID"
+      }
+    },
+    "SecureValue": {
+      "desc": "Secure value",
+      "params": {
+        "data": "Encrypted Telegram Passport element data",
+        "files": "Array of encrypted passport files with photos the of the documents",
+        "flags": "Flags, see TL conditional fields",
+        "front_side": "Encrypted passport file with the front side of the document",
+        "hash": "Data hash",
+        "plain_data": "Plaintext verified passport data",
+        "reverse_side": "Encrypted passport file with the reverse side of the document",
+        "selfie": "Encrypted passport file with a selfie of the user holding the document",
+        "translation": "Array of encrypted passport files with translated versions of the provided documents",
+        "type": "Secure passport value type"
+      }
+    },
+    "SecureValueError": {
+      "desc": "Secure value error",
+      "params": {
+        "hash": "Hash",
+        "text": "Error message",
+        "type": "Type of element which has the issue"
+      }
+    },
+    "SecureValueErrorData": {
+      "desc": "Represents an issue in one of the data fields that was provided by the user. The error is considered resolved when the field's value changes.",
+      "params": {
+        "data_hash": "Data hash",
+        "field": "Name of the data field which has the error",
+        "text": "Error message",
+        "type": "The section of the user's Telegram Passport which has the error, one of secureValueTypePersonalDetails, secureValueTypePassport, secureValueTypeDriverLicense, secureValueTypeIdentityCard, secureValueTypeInternalPassport, secureValueTypeAddress"
+      }
+    },
+    "SecureValueErrorFile": {
+      "desc": "Represents an issue with a document scan. The error is considered resolved when the file with the document scan changes.",
+      "params": {
+        "file_hash": "File hash",
+        "text": "Error message",
+        "type": "One of secureValueTypeUtilityBill, secureValueTypeBankStatement, secureValueTypeRentalAgreement, secureValueTypePassportRegistration, secureValueTypeTemporaryRegistration"
+      }
+    },
+    "SecureValueErrorFiles": {
+      "desc": "Represents an issue with a list of scans. The error is considered resolved when the list of files containing the scans changes.",
+      "params": {
+        "file_hash": "File hash",
+        "text": "Error message",
+        "type": "One of secureValueTypeUtilityBill, secureValueTypeBankStatement, secureValueTypeRentalAgreement, secureValueTypePassportRegistration, secureValueTypeTemporaryRegistration"
+      }
+    },
+    "SecureValueErrorFrontSide": {
+      "desc": "Represents an issue with the front side of a document. The error is considered resolved when the file with the front side of the document changes.",
+      "params": {
+        "file_hash": "File hash",
+        "text": "Error message",
+        "type": "One of secureValueTypePassport, secureValueTypeDriverLicense, secureValueTypeIdentityCard, secureValueTypeInternalPassport"
+      }
+    },
+    "SecureValueErrorReverseSide": {
+      "desc": "Represents an issue with the reverse side of a document. The error is considered resolved when the file with reverse side of the document changes.",
+      "params": {
+        "file_hash": "File hash",
+        "text": "Error message",
+        "type": "One of secureValueTypeDriverLicense, secureValueTypeIdentityCard"
+      }
+    },
+    "SecureValueErrorSelfie": {
+      "desc": "Represents an issue with the selfie with a document. The error is considered resolved when the file with the selfie changes.",
+      "params": {
+        "file_hash": "File hash",
+        "text": "Error message",
+        "type": "One of secureValueTypePassport, secureValueTypeDriverLicense, secureValueTypeIdentityCard, secureValueTypeInternalPassport"
+      }
+    },
+    "SecureValueErrorTranslationFile": {
+      "desc": "Represents an issue with one of the files that constitute the translation of a document. The error is considered resolved when the file changes.",
+      "params": {
+        "file_hash": "File hash",
+        "text": "Error message",
+        "type": "One of secureValueTypePersonalDetails, secureValueTypePassport, secureValueTypeDriverLicense, secureValueTypeIdentityCard, secureValueTypeInternalPassport, secureValueTypeUtilityBill, secureValueTypeBankStatement, secureValueTypeRentalAgreement, secureValueTypePassportRegistration, secureValueTypeTemporaryRegistration"
+      }
+    },
+    "SecureValueErrorTranslationFiles": {
+      "desc": "Represents an issue with the translated version of a document. The error is considered resolved when a file with the document translation changes.",
+      "params": {
+        "file_hash": "Hash",
+        "text": "Error message",
+        "type": "One of secureValueTypePersonalDetails, secureValueTypePassport, secureValueTypeDriverLicense, secureValueTypeIdentityCard, secureValueTypeInternalPassport, secureValueTypeUtilityBill, secureValueTypeBankStatement, secureValueTypeRentalAgreement, secureValueTypePassportRegistration, secureValueTypeTemporaryRegistration"
+      }
+    },
+    "SecureValueHash": {
+      "desc": "Secure value hash",
+      "params": {
+        "hash": "Hash",
+        "type": "Secure value type"
+      }
+    },
+    "SecureValueTypeAddress": {
+      "desc": "Address",
+      "params": {}
+    },
+    "SecureValueTypeBankStatement": {
+      "desc": "Bank statement",
+      "params": {}
+    },
+    "SecureValueTypeDriverLicense": {
+      "desc": "Driver's license",
+      "params": {}
+    },
+    "SecureValueTypeEmail": {
+      "desc": "Email",
+      "params": {}
+    },
+    "SecureValueTypeIdentityCard": {
+      "desc": "Identity card",
+      "params": {}
+    },
+    "SecureValueTypeInternalPassport": {
+      "desc": "Internal passport",
+      "params": {}
+    },
+    "SecureValueTypePassport": {
+      "desc": "Passport",
+      "params": {}
+    },
+    "SecureValueTypePassportRegistration": {
+      "desc": "Internal registration passport",
+      "params": {}
+    },
+    "SecureValueTypePersonalDetails": {
+      "desc": "Personal details",
+      "params": {}
+    },
+    "SecureValueTypePhone": {
+      "desc": "Phone",
+      "params": {}
+    },
+    "SecureValueTypeRentalAgreement": {
+      "desc": "Rental agreement",
+      "params": {}
+    },
+    "SecureValueTypeTemporaryRegistration": {
+      "desc": "Temporary registration",
+      "params": {}
+    },
+    "SecureValueTypeUtilityBill": {
+      "desc": "Utility bill",
+      "params": {}
+    },
+    "SendAsPeer": {
+      "desc": "Indicates a peer that can be used to send messages",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "peer": "Peer",
+        "premium_required": "Whether a Telegram Premium account is required to send messages as this peer"
+      }
+    },
+    "SendMessageCancelAction": {
+      "desc": "Invalidate all previous action updates. E.g. when user deletes entered text or aborts a video upload.",
+      "params": {}
+    },
+    "SendMessageChooseContactAction": {
+      "desc": "User is selecting a contact to share.",
+      "params": {}
+    },
+    "SendMessageChooseStickerAction": {
+      "desc": "User is choosing a sticker",
+      "params": {}
+    },
+    "SendMessageEmojiInteraction": {
+      "desc": "User has clicked on an animated emoji triggering a reaction, click here for more info \u00bb.",
+      "params": {
+        "emoticon": "Emoji",
+        "interaction": "A JSON object with interaction info, click here for more info \u00bb",
+        "msg_id": "Message ID of the animated emoji that was clicked"
+      }
+    },
+    "SendMessageEmojiInteractionSeen": {
+      "desc": "User is watching an animated emoji reaction triggered by another user, click here for more info \u00bb.",
+      "params": {
+        "emoticon": "Emoji"
+      }
+    },
+    "SendMessageGamePlayAction": {
+      "desc": "User is playing a game",
+      "params": {}
+    },
+    "SendMessageGeoLocationAction": {
+      "desc": "User is selecting a location to share.",
+      "params": {}
+    },
+    "SendMessageHistoryImportAction": {
+      "desc": "Chat history is being imported",
+      "params": {
+        "progress": "Progress percentage"
+      }
+    },
+    "SendMessageRecordAudioAction": {
+      "desc": "User is recording a voice message.",
+      "params": {}
+    },
+    "SendMessageRecordRoundAction": {
+      "desc": "User is recording a round video to share",
+      "params": {}
+    },
+    "SendMessageRecordVideoAction": {
+      "desc": "User is recording a video.",
+      "params": {}
+    },
+    "SendMessageTextDraftAction": {
+      "desc": "",
+      "params": {}
+    },
+    "SendMessageTypingAction": {
+      "desc": "User is typing.",
+      "params": {}
+    },
+    "SendMessageUploadAudioAction": {
+      "desc": "User is uploading a voice message.",
+      "params": {
+        "progress": "Progress percentage"
+      }
+    },
+    "SendMessageUploadDocumentAction": {
+      "desc": "User is uploading a file.",
+      "params": {
+        "progress": "Progress percentage"
+      }
+    },
+    "SendMessageUploadPhotoAction": {
+      "desc": "User is uploading a photo.",
+      "params": {
+        "progress": "Progress percentage"
+      }
+    },
+    "SendMessageUploadRoundAction": {
+      "desc": "User is uploading a round video",
+      "params": {
+        "progress": "Progress percentage"
+      }
+    },
+    "SendMessageUploadVideoAction": {
+      "desc": "User is uploading a video.",
+      "params": {
+        "progress": "Progress percentage"
+      }
+    },
+    "ShippingOption": {
+      "desc": "Shipping option",
+      "params": {
+        "id": "Option ID",
+        "prices": "List of price portions",
+        "title": "Title"
+      }
+    },
+    "SmsJob": {
+      "desc": "Info about an SMS job.",
+      "params": {
+        "job_id": "Job ID",
+        "phone_number": "Destination phone number",
+        "text": "Text"
+      }
+    },
+    "SpeakingInGroupCallAction": {
+      "desc": "User is currently speaking in the group call",
+      "params": {}
+    },
+    "SponsoredMessage": {
+      "desc": "A sponsored message.",
+      "params": {
+        "additional_info": "If set, contains additional information about the sponsored message to be shown along with the message.",
+        "button_text": "Label of the sponsored message button.",
+        "can_report": "Whether this message can be reported as specified here \u00bb.",
+        "color": "If set, the sponsored message should use the message accent color \u00bb specified in color.",
+        "entities": "Message entities for styled text in message.",
+        "flags": "Flags, see TL conditional fields",
+        "max_display_duration": "For sponsored messages to show on channel videos \u00bb, autohide the ad after after the specified amount of seconds.",
+        "media": "If set, contains some media.",
+        "message": "Sponsored message",
+        "min_display_duration": "For sponsored messages to show on channel videos \u00bb, allow the user to hide the ad only after the specified amount of seconds.",
+        "photo": "If set, contains a custom profile photo bubble that should be displayed for the sponsored message, like for messages sent in groups.",
+        "random_id": "Message ID",
+        "recommended": "Whether the message needs to be labeled as \"recommended\" instead of \"sponsored\"",
+        "sponsor_info": "If set, contains additional information about the sponsor to be shown along with the message.",
+        "title": "Contains the title of the sponsored message.",
+        "url": "Contains the URL to open when the user clicks on the sponsored message."
+      }
+    },
+    "SponsoredMessageReportOption": {
+      "desc": "A report option for a sponsored message \u00bb.",
+      "params": {
+        "option": "Option identifier to pass to channels.reportSponsoredMessage.",
+        "text": "Localized description of the option."
+      }
+    },
+    "SponsoredPeer": {
+      "desc": "A sponsored peer.",
+      "params": {
+        "additional_info": "If set, contains additional information about the sponsored message to be shown along with the peer.",
+        "flags": "Flags, see TL conditional fields",
+        "peer": "The sponsored peer.",
+        "random_id": "ID of the sponsored peer, to be passed to messages.viewSponsoredMessage, messages.clickSponsoredMessage or messages.reportSponsoredMessage (the same methods used for sponsored messages »).",
+        "sponsor_info": "If set, contains additional information about the sponsor to be shown along with the peer."
+      }
+    },
+    "StarGift": {
+      "desc": "Represents a star gift, see here \u00bb for more info.",
+      "params": {
+        "availability_remains": "For limited-supply gifts: the remaining number of gifts that may be bought.",
+        "availability_resale": "The total number of (upgraded to collectibles) gifts of this type currently on resale",
+        "availability_total": "For limited-supply gifts: the total number of gifts that was available in the initial supply.",
+        "birthday": "Whether this is a birthday-themed gift",
+        "convert_stars": "The receiver of this gift may convert it to this many Telegram Stars, instead of displaying it on their profile page.convert_stars will be equal to stars only if the gift was bought using recently bought Telegram Stars, otherwise it will be less than stars.",
+        "first_sale_date": "For sold out gifts only: when was the gift first bought.",
+        "flags": "Flags, see TL conditional fields",
+        "id": "Identifier of the gift",
+        "last_sale_date": "For sold out gifts only: when was the gift last bought.",
+        "limited": "Whether this is a limited-supply gift.",
+        "limited_per_user": "If set, the maximum number of gifts of this type that can be owned by a single user is limited and specified in per_user_total, and the remaining slots for the current user in per_user_remains.",
+        "locked_until_date": "If set, the specified gift possibly cannot be sent until the specified date, see here \u00bb for the full flow.",
+        "per_user_remains": "Remaining number of gifts of this type that can be owned by the current user.",
+        "per_user_total": "Maximum number of gifts of this type that can be owned by any user.",
+        "released_by": "This gift was released by the specified peer.",
+        "require_premium": "This gift can only be bought by users with a Premium subscription.",
+        "resell_min_stars": "The minimum price in Stars for gifts of this type currently on resale.",
+        "sold_out": "Whether this gift sold out and cannot be bought anymore.",
+        "stars": "Price of the gift in Telegram Stars.",
+        "sticker": "Sticker that represents the gift.",
+        "title": "Title of the gift",
+        "upgrade_stars": "The number of Telegram Stars the user can pay to convert the gift into a collectible gift \u00bb."
+      }
+    },
+    "StarGiftAttributeBackdrop": {
+      "desc": "The backdrop of a collectible gift \u00bb.",
+      "params": {
+        "backdrop_id": "Unique ID of the backdrop",
+        "center_color": "Color of the center of the backdrop in RGB24 format.",
+        "edge_color": "Color of the edges of the backdrop in RGB24 format.",
+        "name": "Name of the backdrop",
+        "pattern_color": "Color of the starGiftAttributePattern applied on the backdrop in RGB24 format.",
+        "rarity_permille": "The number of upgraded gifts that receive this backdrop for each 1000 gifts upgraded.",
+        "text_color": "Color of the text on the backdrop in RGB24 format."
+      }
+    },
+    "StarGiftAttributeCounter": {
+      "desc": "Indicates the total number of gifts that have the specified attribute.",
+      "params": {
+        "attribute": "The attribute (just the ID, without the attribute itself).",
+        "count": "Total number of gifts with this attribute."
+      }
+    },
+    "StarGiftAttributeIdBackdrop": {
+      "desc": "The ID of a backdrop of a collectible gift \u00bb.",
+      "params": {
+        "backdrop_id": "Unique ID of the backdrop."
+      }
+    },
+    "StarGiftAttributeIdModel": {
+      "desc": "The ID of a model of a collectible gift \u00bb.",
+      "params": {
+        "document_id": "The sticker representing the upgraded gift"
+      }
+    },
+    "StarGiftAttributeIdPattern": {
+      "desc": "The ID of a pattern of a collectible gift \u00bb.",
+      "params": {
+        "document_id": "The sticker representing the symbol"
+      }
+    },
+    "StarGiftAttributeModel": {
+      "desc": "The model of a collectible gift \u00bb.",
+      "params": {
+        "document": "The sticker representing the upgraded gift",
+        "name": "Name of the model",
+        "rarity_permille": "The number of upgraded gifts that receive this backdrop for each 1000 gifts upgraded."
+      }
+    },
+    "StarGiftAttributeOriginalDetails": {
+      "desc": "Info about the sender, receiver and message attached to the original gift \u00bb, before it was upgraded to a collectible gift \u00bb.",
+      "params": {
+        "date": "When was the gift sent.",
+        "flags": "Flags, see TL conditional fields",
+        "message": "Original message attached to the gift, if present.",
+        "recipient_id": "Original receiver of the gift.",
+        "sender_id": "Original sender of the gift, absent if the gift was private."
+      }
+    },
+    "StarGiftAttributePattern": {
+      "desc": "A sticker applied on the backdrop of a collectible gift \u00bb using a repeating pattern.",
+      "params": {
+        "document": "The symbol",
+        "name": "Name of the symbol",
+        "rarity_permille": "The number of upgraded gifts that receive this backdrop for each 1000 gifts upgraded."
+      }
+    },
+    "StarGiftCollection": {
+      "desc": "Represents a star gift collection \u00bb.",
+      "params": {
+        "collection_id": "The ID of the collection.",
+        "flags": "Flags, see TL conditional fields",
+        "gifts_count": "Number of gifts in the collection.",
+        "hash": "Field to use instead of collection_id when generating the hash to pass to payments.getStarGiftCollections.",
+        "icon": "Optional icon for the collection, taken from the first gift in the collection.",
+        "title": "Title of the collection."
+      }
+    },
+    "StarGiftUnique": {
+      "desc": "Represents a collectible star gift, see here \u00bb for more info.",
+      "params": {
+        "attributes": "Collectible attributes",
+        "availability_issued": "Total number of gifts of the same type that were upgraded to a collectible gift.",
+        "availability_total": "Total number of gifts of the same type that can be upgraded or were already upgraded to a collectible gift.",
+        "flags": "Flags, see TL conditional fields",
+        "gift_address": "For NFTs on the TON blockchain, contains the address of the NFT (append it to the ton_blockchain_explorer_url client configuration value \u00bb to obtain a link with information about the address).",
+        "gift_id": "Unique ID of the gift.",
+        "id": "Identifier of the collectible gift.",
+        "num": "Unique identifier of this collectible gift among all (already upgraded) collectible gifts of the same type.",
+        "owner_address": "For NFTs on the TON blockchain, contains the address of the owner (append it to the ton_blockchain_explorer_url client configuration value \u00bb to obtain a link with information about the address).",
+        "owner_id": "The owner of the gift.",
+        "owner_name": "The name of the owner if neither owner_id nor owner_address are set.",
+        "released_by": "This gift was released by the specified peer.",
+        "require_premium": "This gift can only be bought by users with a Premium subscription.",
+        "resale_ton_only": "Whether the gift can be bought only using Toncoins.",
+        "resell_amount": "Resale price of the gift.",
+        "slug": "Slug that can be used to create a collectible gift deep link \u00bb, or elsewhere in the API where a collectible slug is accepted.",
+        "theme_available": "A chat theme associated to this gift is available, see here \u00bb for more info on how to use it.",
+        "theme_peer": "The current chat where the associated chat theme is installed, if any (gift-based themes can only be installed in one chat at a time).",
+        "title": "Collectible title.",
+        "value_amount": "Price of the gift.",
+        "value_currency": "Currency for the gift's price."
+      }
+    },
+    "StarGiftUpgradePreview": {
+      "desc": "",
+      "params": {}
+    },
+    "StarGiftUpgradePrice": {
+      "desc": "",
+      "params": {}
+    },
+    "StarRefProgram": {
+      "desc": "Indo about an affiliate program offered by a bot",
+      "params": {
+        "bot_id": "ID of the bot that offers the program",
+        "commission_permille": "An affiliate gets a commission of starRefProgram.commission_permille\u2030 Telegram Stars for every mini app transaction made by users they refer",
+        "daily_revenue_per_user": "The amount of daily revenue per user in Telegram Stars of the bot that created the affiliate program. To obtain the approximated revenue per referred user, multiply this value by commission_permille and divide by 1000.",
+        "duration_months": "An affiliate gets a commission for every mini app transaction made by users they refer, for duration_months months after a referral link is imported, starting the bot for the first time",
+        "end_date": "Point in time (Unix timestamp) when the affiliate program will be closed (optional, if not set the affiliate program isn't scheduled to be closed)",
+        "flags": "Flags, see TL conditional fields"
+      }
+    },
+    "StarsAmount": {
+      "desc": "Describes a real (i.e. possibly decimal) amount of Telegram Stars.",
+      "params": {
+        "amount": "The integer amount of Telegram Stars.",
+        "nanos": "The decimal amount of Telegram Stars, expressed as nanostars (i.e. 1 nanostar is equal to 1/1'000'000'000th (one billionth) of a Telegram Star). This field may also be negative (the allowed range is -999999999 to 999999999)."
+      }
+    },
+    "StarsGiftOption": {
+      "desc": "Telegram Stars gift option.",
+      "params": {
+        "amount": "Price of the product in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).",
+        "currency": "Three-letter ISO 4217 currency code",
+        "extended": "If set, the option must only be shown in the full list of topup options.",
+        "flags": "Flags, see TL conditional fields",
+        "stars": "Amount of Telegram stars.",
+        "store_product": "Identifier of the store product associated with the option, official apps only."
+      }
+    },
+    "StarsGiveawayOption": {
+      "desc": "Contains info about a Telegram Star giveaway option.",
+      "params": {
+        "amount": "Total price in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).",
+        "currency": "Three-letter ISO 4217 currency code",
+        "default": "If set, this option must be pre-selected by default in the option list.",
+        "extended": "If set, this option must only be shown in the full list of giveaway options (i.e. they must be added to the list only when the user clicks on the expand button).",
+        "flags": "Flags, see TL conditional fields",
+        "stars": "The number of Telegram Stars that will be distributed among winners",
+        "store_product": "Identifier of the store product associated with the option, official apps only.",
+        "winners": "Allowed options for the number of giveaway winners.",
+        "yearly_boosts": "Number of times the chat will be boosted for one year if the inputStorePaymentStarsGiveaway.boost_peer flag is populated"
+      }
+    },
+    "StarsGiveawayWinnersOption": {
+      "desc": "Allowed options for the number of giveaway winners.",
+      "params": {
+        "default": "If set, this option must be pre-selected by default in the option list.",
+        "flags": "Flags, see TL conditional fields",
+        "per_user_stars": "The number of Telegram Stars each winner will receive.",
+        "users": "The number of users that will be randomly chosen as winners."
+      }
+    },
+    "StarsRating": {
+      "desc": "Represents the profile's star rating, see here \u00bb for more info.",
+      "params": {
+        "current_level_stars": "The numerical value of the rating required for the current level.",
+        "flags": "Flags, see TL conditional fields",
+        "level": "The current level, may be negative.",
+        "next_level_stars": "The numerical value of the rating required for the next level.",
+        "stars": "Numerical value of the current rating."
+      }
+    },
+    "StarsRevenueStatus": {
+      "desc": "Describes Telegram Star revenue balances \u00bb.",
+      "params": {
+        "available_balance": "Amount of withdrawable Telegram Stars.",
+        "current_balance": "Amount of not-yet-withdrawn Telegram Stars.",
+        "flags": "Flags, see TL conditional fields",
+        "next_withdrawal_at": "Unixtime indicating when will withdrawal be available to the user. If not set, withdrawal can be started now.",
+        "overall_revenue": "Total amount of earned Telegram Stars.",
+        "withdrawal_enabled": "If set, the user may withdraw up to available_balance stars."
+      }
+    },
+    "StarsSubscription": {
+      "desc": "Represents a Telegram Star subscription \u00bb.",
+      "params": {
+        "bot_canceled": "Set if this bot subscription was cancelled by the bot",
+        "can_refulfill": "Whether we left the associated private channel, but we can still rejoin it using payments.fulfillStarsSubscription because the current subscription period hasn't expired yet.",
+        "canceled": "Whether this subscription was cancelled.",
+        "chat_invite_hash": "Invitation link, used to renew the subscription after cancellation or expiration.",
+        "flags": "Flags, see TL conditional fields",
+        "id": "Subscription ID.",
+        "invoice_slug": "For bot subscriptions, the identifier of the subscription invoice",
+        "missing_balance": "Whether this subscription has expired because there are not enough stars on the user's balance to extend it.",
+        "peer": "Identifier of the associated private chat.",
+        "photo": "For bot subscriptions, the photo from the subscription invoice",
+        "pricing": "Pricing of the subscription in Telegram Stars.",
+        "title": "For bot subscriptions, the title of the subscription invoice",
+        "until_date": "Expiration date of the current subscription period."
+      }
+    },
+    "StarsSubscriptionPricing": {
+      "desc": "Pricing of a Telegram Star subscription \u00bb.",
+      "params": {
+        "amount": "Price of the subscription in Telegram Stars.",
+        "period": "The user should pay amount stars every period seconds to gain and maintain access to the channel. Currently the only allowed subscription period is 30*24*60*60, i.e. the user will be debited amount stars every month."
+      }
+    },
+    "StarsTonAmount": {
+      "desc": "Describes an amount of toncoin in nanotons (i.e. 1/1_000_000_000 of a toncoin).",
+      "params": {
+        "amount": "The amount in nanotons."
+      }
+    },
+    "StarsTopupOption": {
+      "desc": "Telegram Stars topup option.",
+      "params": {
+        "amount": "Price of the product in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).",
+        "currency": "Three-letter ISO 4217 currency code",
+        "extended": "If set, the option must only be shown in the full list of topup options.",
+        "flags": "Flags, see TL conditional fields",
+        "stars": "Amount of Telegram stars.",
+        "store_product": "Identifier of the store product associated with the option, official apps only."
+      }
+    },
+    "StarsTransaction": {
+      "desc": "Represents a Telegram Stars or TON transaction \u00bb.",
+      "params": {
+        "ads_proceeds_from_date": "Indicates that this is payment for ad revenue from the specified unixtime (always set together with ads_proceeds_to_date).",
+        "ads_proceeds_to_date": "Indicates that this is payment for ad revenue to the specified unixtime.",
+        "amount": "Amount of Telegram Stars or TON.",
+        "bot_payload": "Bot specified invoice payload (i.e. the payload passed to inputMediaInvoice when creating the invoice).",
+        "business_transfer": "This transaction transfers stars from the balance of a user account connected to a business bot, to the balance of the business bot, see here \u00bb for more info.",
+        "date": "Date of the transaction (unixtime).",
+        "description": "For transactions with bots, description of the bought product.",
+        "extended_media": "The purchased paid media \u00bb.",
+        "failed": "This transaction has failed.",
+        "flags": "Flags, see TL conditional fields",
+        "floodskip_number": "This transaction is payment for paid bot broadcasts.  Paid broadcasts are only allowed if the allow_paid_floodskip parameter of messages.sendMessage and other message sending methods is set while trying to broadcast more than 30 messages per second to bot users. The integer value returned by this flag indicates the number of billed API calls.",
+        "gift": "This transaction was a gift from the user in peer.peer.",
+        "giveaway_post_id": "ID of the message containing the messageMediaGiveaway, for incoming star giveaway prizes.",
+        "id": "Transaction ID.",
+        "msg_id": "For paid media transactions \u00bb, message ID of the paid media posted to peer.peer (can point to a deleted message; either way, extended_media will always contain the bought media).",
+        "paid_messages": "This transaction is related to the reception or transmission of a paid message \u00bb.",
+        "peer": "Source of the incoming transaction, or its recipient for outgoing transactions.",
+        "pending": "The transaction is currently pending.",
+        "photo": "For transactions with bots, photo of the bought product.",
+        "posts_search": "Represents payment for a paid global post search \u00bb.",
+        "premium_gift_months": "This transaction indicates the payment for a gifted Telegram Premium subscription \u00bb.",
+        "reaction": "This transaction is a paid reaction \u00bb.",
+        "refund": "Whether this transaction is a refund.",
+        "stargift": "This transaction indicates a purchase or a sale (conversion back to Stars) of a gift \u00bb.",
+        "stargift_prepaid_upgrade": "Represents payment for a separate prepaid upgrade of a gift.",
+        "stargift_resale": "This transaction is related to the resale of a collectible gift \u00bb.",
+        "stargift_upgrade": "This transaction pays for the upgrade of a gift to a collectible gift \u00bb.",
+        "starref_amount": "For transactions made by referred users, the amount of Telegram Stars received by the affiliate, can be negative for refunds.",
+        "starref_commission_permille": "This transaction is the receival (or refund) of an affiliate commission (i.e. this is the transaction received by the peer that created the referral link, flag 17 is for transactions made by users that imported the referral link).",
+        "starref_peer": "For transactions made by referred users, the peer that received the affiliate commission.",
+        "subscription_period": "The number of seconds between consecutive Telegram Star debiting for Telegram Star subscriptions \u00bb.",
+        "title": "For transactions with bots, title of the bought product.",
+        "transaction_date": "If neither pending nor failed are set, the transaction was completed successfully, and this field will contain the point in time (Unix timestamp) when the withdrawal was completed successfully.",
+        "transaction_url": "If neither pending nor failed are set, the transaction was completed successfully, and this field will contain a URL where the withdrawal transaction can be viewed."
+      }
+    },
+    "StarsTransactionPeer": {
+      "desc": "Describes a Telegram Star transaction with another peer.",
+      "params": {
+        "peer": "The peer."
+      }
+    },
+    "StarsTransactionPeerAPI": {
+      "desc": "Describes a Telegram Star transaction used to pay for paid API usage, such as paid bot broadcasts.",
+      "params": {}
+    },
+    "StarsTransactionPeerAds": {
+      "desc": "Describes a Telegram Star transaction used to pay for Telegram ads as specified here \u00bb.",
+      "params": {}
+    },
+    "StarsTransactionPeerAppStore": {
+      "desc": "Describes a Telegram Star transaction with the App Store, used when purchasing Telegram Stars through the App Store.",
+      "params": {}
+    },
+    "StarsTransactionPeerFragment": {
+      "desc": "Describes a Telegram Star transaction with Fragment, used when purchasing Telegram Stars through Fragment.",
+      "params": {}
+    },
+    "StarsTransactionPeerPlayMarket": {
+      "desc": "Describes a Telegram Star transaction with the Play Store, used when purchasing Telegram Stars through the Play Store.",
+      "params": {}
+    },
+    "StarsTransactionPeerPremiumBot": {
+      "desc": "Describes a Telegram Star transaction made using @PremiumBot (i.e. using the inputInvoiceStars flow described here \u00bb).",
+      "params": {}
+    },
+    "StarsTransactionPeerUnsupported": {
+      "desc": "Describes a Telegram Star transaction that cannot be described using the current layer.",
+      "params": {}
+    },
+    "StatsAbsValueAndPrev": {
+      "desc": "Statistics value couple; initial and final value for period of time currently in consideration",
+      "params": {
+        "current": "Current value",
+        "previous": "Previous value"
+      }
+    },
+    "StatsDateRangeDays": {
+      "desc": "Channel statistics date range",
+      "params": {
+        "max_date": "Final date",
+        "min_date": "Initial date"
+      }
+    },
+    "StatsGraph": {
+      "desc": "Channel statistics graph",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "json": "Statistics data",
+        "zoom_token": "Zoom token"
+      }
+    },
+    "StatsGraphAsync": {
+      "desc": "This channel statistics graph must be generated asynchronously using stats.loadAsyncGraph to reduce server load",
+      "params": {
+        "token": "Token to use for fetching the async graph"
+      }
+    },
+    "StatsGraphError": {
+      "desc": "An error occurred while generating the statistics graph",
+      "params": {
+        "error": "The error"
+      }
+    },
+    "StatsGroupTopAdmin": {
+      "desc": "Information about an active admin in a supergroup",
+      "params": {
+        "banned": "Number of banned users for statistics period in consideration",
+        "deleted": "Number of deleted messages for statistics period in consideration",
+        "kicked": "Number of kicked users for statistics period in consideration",
+        "user_id": "User ID"
+      }
+    },
+    "StatsGroupTopInviter": {
+      "desc": "Information about an active supergroup inviter",
+      "params": {
+        "invitations": "Number of invitations for statistics period in consideration",
+        "user_id": "User ID"
+      }
+    },
+    "StatsGroupTopPoster": {
+      "desc": "Information about an active user in a supergroup",
+      "params": {
+        "avg_chars": "Average number of characters per message",
+        "messages": "Number of messages for statistics period in consideration",
+        "user_id": "User ID"
+      }
+    },
+    "StatsPercentValue": {
+      "desc": "Channel statistics percentage.\nCompute the percentage simply by doing part * total / 100",
+      "params": {
+        "part": "Partial value",
+        "total": "Total value"
+      }
+    },
+    "StatsURL": {
+      "desc": "URL with chat statistics",
+      "params": {
+        "url": "Chat statistics"
+      }
+    },
+    "StickerKeyword": {
+      "desc": "Keywords for a certain sticker",
+      "params": {
+        "document_id": "Sticker ID",
+        "keyword": "Keywords"
+      }
+    },
+    "StickerPack": {
+      "desc": "A stickerpack is a group of stickers associated to the same emoji.\nIt is not a sticker pack the way it is usually intended, you may be looking for a StickerSet.",
+      "params": {
+        "documents": "Stickers",
+        "emoticon": "Emoji"
+      }
+    },
+    "StickerSet": {
+      "desc": "Represents a stickerset (stickerpack)",
+      "params": {
+        "access_hash": "Access hash of stickerset",
+        "archived": "Whether this stickerset was archived (due to too many saved stickers in the current account)",
+        "channel_emoji_status": "If set, this custom emoji stickerset can be used in channel/supergroup emoji statuses.",
+        "count": "Number of stickers in pack",
+        "creator": "Whether we created this stickerset",
+        "emojis": "This is a custom emoji stickerset",
+        "flags": "Flags, see TL conditional fields",
+        "hash": "Hash",
+        "id": "ID of the stickerset",
+        "installed_date": "When was this stickerset installed",
+        "masks": "Is this a mask stickerset",
+        "official": "Is this stickerset official",
+        "short_name": "Short name of stickerset, used when sharing stickerset using stickerset deep links.",
+        "text_color": "Whether the color of this TGS custom emoji stickerset should be changed to the text color when used in messages, the accent color if used as emoji status, white on chat photos, or another appropriate color based on context.",
+        "thumb_dc_id": "DC ID of thumbnail",
+        "thumb_document_id": "Document ID of custom emoji thumbnail, fetch the document using messages.getCustomEmojiDocuments",
+        "thumb_version": "Thumbnail version",
+        "thumbs": "Stickerset thumbnail",
+        "title": "Title of stickerset"
+      }
+    },
+    "StickerSetCovered": {
+      "desc": "Stickerset with a single sticker as preview",
+      "params": {
+        "cover": "Preview",
+        "set": "Stickerset"
+      }
+    },
+    "StickerSetFullCovered": {
+      "desc": "Stickerset preview with all stickers of the stickerset included.\nCurrently used only for custom emoji stickersets, to avoid a further call to messages.getStickerSet.",
+      "params": {
+        "documents": "Stickers",
+        "keywords": "Keywords for some or every sticker in the stickerset.",
+        "packs": "Emoji information about every sticker in the stickerset",
+        "set": "Stickerset"
+      }
+    },
+    "StickerSetMultiCovered": {
+      "desc": "Stickerset, with multiple stickers as preview",
+      "params": {
+        "covers": "Preview stickers",
+        "set": "Stickerset"
+      }
+    },
+    "StickerSetNoCovered": {
+      "desc": "Just the stickerset information, with no previews.",
+      "params": {
+        "set": "Stickerset information."
+      }
+    },
+    "StoriesStealthMode": {
+      "desc": "Information about the current stealth mode session.",
+      "params": {
+        "active_until_date": "The date up to which stealth mode will be active.",
+        "cooldown_until_date": "The date starting from which the user will be allowed to re-enable stealth mode again.",
+        "flags": "Flags, see TL conditional fields"
+      }
+    },
+    "StoryAlbum": {
+      "desc": "Represents a story album \u00bb.",
+      "params": {
+        "album_id": "ID of the album.",
+        "flags": "Flags, see TL conditional fields",
+        "icon_photo": "Photo from the first story of the album, if it's a photo.",
+        "icon_video": "Video from the first story of the album, if it's a video.",
+        "title": "Name of the album."
+      }
+    },
+    "StoryFwdHeader": {
+      "desc": "Contains info about the original poster of a reposted story.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "from": "Peer that originally posted the story; will be empty for stories forwarded from a user with forwards privacy enabled, in which case from_name will be set, instead.",
+        "from_name": "Will be set for stories forwarded from a user with forwards privacy enabled, in which case from will also be empty.",
+        "modified": "Whether the story media was modified before reposting it (for example by overlaying a round video with a reaction).",
+        "story_id": ", contains the story ID"
+      }
+    },
+    "StoryItem": {
+      "desc": "Represents a story.",
+      "params": {
+        "albums": "Albums this story is part of.",
+        "caption": "Story caption.",
+        "close_friends": "Whether this story can only be viewed by our close friends, see here \u00bb for more info",
+        "contacts": "Whether this story can only be viewed by our contacts",
+        "date": "When was the story posted.",
+        "edited": "Indicates whether the story was edited.",
+        "entities": "Message entities for styled text",
+        "expire_date": "When does the story expire.",
+        "flags": "Flags, see TL conditional fields",
+        "from_id": "Sender of the story.",
+        "fwd_from": "For reposted stories \u00bb, contains info about the original story.",
+        "id": "ID of the story.",
+        "media": "Story media.",
+        "media_areas": "List of media areas, see here \u00bb for more info on media areas.",
+        "min": "Full information about this story was omitted for space and performance reasons; use stories.getStoriesByID to fetch full info about this story when and if needed.",
+        "noforwards": "Whether this story is protected and thus cannot be forwarded; clients should also prevent users from saving attached media (i.e. videos should only be streamed, photos should be kept in RAM, et cetera).",
+        "out": "indicates whether we sent this story.",
+        "pinned": "Whether this story is pinned on the user's profile",
+        "privacy": "Privacy rules indicating who can and can't view this story",
+        "public": "Whether this story is public and can be viewed by everyone",
+        "selected_contacts": "Whether this story can only be viewed by a select list of our contacts",
+        "sent_reaction": "The reaction we sent.",
+        "views": "View date and reaction information"
+      }
+    },
+    "StoryItemDeleted": {
+      "desc": "Represents a previously active story, that was deleted",
+      "params": {
+        "id": "Story ID"
+      }
+    },
+    "StoryItemSkipped": {
+      "desc": "Represents an active story, whose full information was omitted for space and performance reasons; use stories.getStoriesByID to fetch full info about the skipped story when and if needed.",
+      "params": {
+        "close_friends": "Whether this story can only be viewed by our close friends, see here \u00bb for more info",
+        "date": "When was the story posted.",
+        "expire_date": "When does the story expire.",
+        "flags": "Flags, see TL conditional fields",
+        "id": "Story ID"
+      }
+    },
+    "StoryReaction": {
+      "desc": "How a certain peer reacted to a story",
+      "params": {
+        "date": "Reaction date",
+        "peer_id": "The peer",
+        "reaction": "The reaction"
+      }
+    },
+    "StoryReactionPublicForward": {
+      "desc": "A certain peer has forwarded the story as a message to a public chat or channel.",
+      "params": {
+        "message": "The message with the forwarded story."
+      }
+    },
+    "StoryReactionPublicRepost": {
+      "desc": "A certain peer has reposted the story.",
+      "params": {
+        "peer_id": "The peer that reposted the story.",
+        "story": "The reposted story."
+      }
+    },
+    "StoryView": {
+      "desc": "Story view date and reaction information",
+      "params": {
+        "blocked": "Whether we have completely blocked this user, including from viewing more of our stories.",
+        "blocked_my_stories_from": "Whether we have blocked this user from viewing more of our stories.",
+        "date": "When did the user view the story",
+        "flags": "Flags, see TL conditional fields",
+        "reaction": "If present, contains the reaction that the user left on the story",
+        "user_id": "The user that viewed the story"
+      }
+    },
+    "StoryViewPublicForward": {
+      "desc": "A certain peer has forwarded the story as a message to a public chat or channel.",
+      "params": {
+        "blocked": "Whether we have completely blocked this user, including from viewing more of our stories.",
+        "blocked_my_stories_from": "Whether we have blocked this user from viewing more of our stories.",
+        "flags": "Flags, see TL conditional fields",
+        "message": "The message with the forwarded story."
+      }
+    },
+    "StoryViewPublicRepost": {
+      "desc": "A certain peer has reposted the story.",
+      "params": {
+        "blocked": "Whether we have completely blocked this user, including from viewing more of our stories.",
+        "blocked_my_stories_from": "Whether we have blocked this user from viewing more of our stories.",
+        "flags": "Flags, see TL conditional fields",
+        "peer_id": "The peer that reposted the story.",
+        "story": "The reposted story."
+      }
+    },
+    "StoryViews": {
+      "desc": "Aggregated view and reaction information of a story.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "forwards_count": "Forward counter of the story",
+        "has_viewers": "If set, indicates that the viewers list is currently viewable, and was not yet deleted because the story has expired while the user didn't have a Premium account.",
+        "reactions": "All reactions sent to this story",
+        "reactions_count": "Number of reactions added to the story",
+        "recent_viewers": "User IDs of some recent viewers of the story",
+        "views_count": "View counter of the story"
+      }
+    },
+    "SuggestedPost": {
+      "desc": "Contains info about a suggested post \u00bb.",
+      "params": {
+        "accepted": "Whether the suggested post was accepted.",
+        "flags": "Flags, see TL conditional fields",
+        "price": "Price of the suggested post.",
+        "rejected": "Whether the suggested post was rejected.",
+        "schedule_date": "Scheduling date."
+      }
+    },
+    "TextAnchor": {
+      "desc": "Text linking to another section of the page",
+      "params": {
+        "name": "Section name",
+        "text": "Text"
+      }
+    },
+    "TextBold": {
+      "desc": "Bold text",
+      "params": {
+        "text": "Text"
+      }
+    },
+    "TextConcat": {
+      "desc": "Concatenation of rich texts",
+      "params": {
+        "texts": "Concatenated rich texts"
+      }
+    },
+    "TextEmail": {
+      "desc": "Rich text email link",
+      "params": {
+        "email": "Email address",
+        "text": "Link text"
+      }
+    },
+    "TextEmpty": {
+      "desc": "Empty rich text element",
+      "params": {}
+    },
+    "TextFixed": {
+      "desc": "fixed-width rich text",
+      "params": {
+        "text": "Text"
+      }
+    },
+    "TextImage": {
+      "desc": "Inline image",
+      "params": {
+        "document_id": "Document ID",
+        "h": "Height",
+        "w": "Width"
+      }
+    },
+    "TextItalic": {
+      "desc": "Italic text",
+      "params": {
+        "text": "Text"
+      }
+    },
+    "TextMarked": {
+      "desc": "Highlighted text",
+      "params": {
+        "text": "Text"
+      }
+    },
+    "TextPhone": {
+      "desc": "Rich text linked to a phone number",
+      "params": {
+        "phone": "Phone number",
+        "text": "Text"
+      }
+    },
+    "TextPlain": {
+      "desc": "Plain text",
+      "params": {
+        "text": "Text"
+      }
+    },
+    "TextStrike": {
+      "desc": "Strikethrough text",
+      "params": {
+        "text": "Text"
+      }
+    },
+    "TextSubscript": {
+      "desc": "Subscript text",
+      "params": {
+        "text": "Text"
+      }
+    },
+    "TextSuperscript": {
+      "desc": "Superscript text",
+      "params": {
+        "text": "Text"
+      }
+    },
+    "TextUnderline": {
+      "desc": "Underlined text",
+      "params": {
+        "text": "Text"
+      }
+    },
+    "TextUrl": {
+      "desc": "Link",
+      "params": {
+        "text": "Text of link",
+        "url": "Webpage HTTP URL",
+        "webpage_id": "If a preview was already generated for the page, the page ID"
+      }
+    },
+    "TextWithEntities": {
+      "desc": "Styled text with message entities",
+      "params": {
+        "entities": "Message entities for styled text",
+        "text": "Text"
+      }
+    },
+    "Theme": {
+      "desc": "Theme",
+      "params": {
+        "access_hash": "Theme access hash",
+        "creator": "Whether the current user is the creator of this theme",
+        "default": "Whether this is the default theme",
+        "document": "Theme",
+        "emoticon": "Theme emoji",
+        "flags": "Flags, see TL conditional fields",
+        "for_chat": "Whether this theme is meant to be used as a chat theme",
+        "id": "Theme ID",
+        "installs_count": "Installation count",
+        "settings": "Theme settings",
+        "slug": "Unique theme ID",
+        "title": "Theme name"
+      }
+    },
+    "ThemeSettings": {
+      "desc": "Theme settings",
+      "params": {
+        "accent_color": "Accent color, ARGB format",
+        "base_theme": "Base theme",
+        "flags": "Flags, see TL conditional fields",
+        "message_colors": "The fill to be used as a background for outgoing messages, in RGB24 format. If just one or two equal colors are provided, describes a solid fill of a background. If two different colors are provided, describes the top and bottom colors of a 0-degree gradient.If three or four colors are provided, describes a freeform gradient fill of a background.",
+        "message_colors_animated": "If set, the freeform gradient fill needs to be animated on every sent message.",
+        "outbox_accent_color": "Accent color of outgoing messages in ARGB format",
+        "wallpaper": "Wallpaper"
+      }
+    },
+    "Timezone": {
+      "desc": "Timezone information.",
+      "params": {
+        "id": "Unique timezone ID.",
+        "name": "Human-readable and localized timezone name.",
+        "utc_offset": "UTC offset in seconds, which may be displayed in hh:mm format by the client together with the human-readable name (i.e. $name UTC -01:00)."
+      }
+    },
+    "TodoCompletion": {
+      "desc": "A completed todo list \u00bb item.",
+      "params": {
+        "completed_by": "ID of the user that completed the item.",
+        "date": "When was the item completed.",
+        "id": "The ID of the completed item."
+      }
+    },
+    "TodoItem": {
+      "desc": "An item of a todo list \u00bb.",
+      "params": {
+        "id": "ID of the item, a positive (non-zero) integer unique within the current list.",
+        "title": "Text of the item, maximum length equal to todo_item_length_max \u00bb."
+      }
+    },
+    "TodoList": {
+      "desc": "Represents a todo list \u00bb.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "list": "Items of the list.",
+        "others_can_append": "If set, users different from the creator of the list can append items to the list.",
+        "others_can_complete": "If set, users different from the creator of the list can complete items in the list.",
+        "title": "Title of the todo list, maximum length equal to todo_title_length_max \u00bb."
+      }
+    },
+    "TopPeer": {
+      "desc": "Top peer",
+      "params": {
+        "peer": "Peer",
+        "rating": "Rating as computed in top peer rating \u00bb"
+      }
+    },
+    "TopPeerCategoryBotsApp": {
+      "desc": "Most frequently used Main Mini Bot Apps.",
+      "params": {}
+    },
+    "TopPeerCategoryBotsInline": {
+      "desc": "Most used inline bots",
+      "params": {}
+    },
+    "TopPeerCategoryBotsPM": {
+      "desc": "Most used bots",
+      "params": {}
+    },
+    "TopPeerCategoryChannels": {
+      "desc": "Most frequently visited channels",
+      "params": {}
+    },
+    "TopPeerCategoryCorrespondents": {
+      "desc": "Users we've chatted most frequently with",
+      "params": {}
+    },
+    "TopPeerCategoryForwardChats": {
+      "desc": "Chats to which the users often forwards messages to",
+      "params": {}
+    },
+    "TopPeerCategoryForwardUsers": {
+      "desc": "Users to which the users often forwards messages to",
+      "params": {}
+    },
+    "TopPeerCategoryGroups": {
+      "desc": "Often-opened groups and supergroups",
+      "params": {}
+    },
+    "TopPeerCategoryPeers": {
+      "desc": "Top peer category",
+      "params": {
+        "category": "Top peer category of peers",
+        "count": "Count of peers",
+        "peers": "Peers"
+      }
+    },
+    "TopPeerCategoryPhoneCalls": {
+      "desc": "Most frequently called users",
+      "params": {}
+    },
+    "UpdateAttachMenuBots": {
+      "desc": "The list of installed attachment menu entries \u00bb has changed, use messages.getAttachMenuBots to fetch the updated list.",
+      "params": {}
+    },
+    "UpdateAutoSaveSettings": {
+      "desc": "Media autosave settings have changed and must be refetched using account.getAutoSaveSettings.",
+      "params": {}
+    },
+    "UpdateBotBusinessConnect": {
+      "desc": "Connecting or disconnecting a business bot or changing the connection settings will emit an updateBotBusinessConnect update to the bot, with the new settings and a connection_id that will be used by the bot to handle updates from and send messages as the user.",
+      "params": {
+        "connection": "Business connection settings",
+        "qts": "New qts value, see updates \u00bb for more info."
+      }
+    },
+    "UpdateBotCallbackQuery": {
+      "desc": "A callback button was pressed, and the button data was sent to the bot that created the button",
+      "params": {
+        "chat_instance": "Global identifier, uniquely corresponding to the chat to which the message with the callback button was sent. Useful for high scores in games.",
+        "data": "Callback data",
+        "flags": "Flags, see TL conditional fields",
+        "game_short_name": "Short name of a Game to be returned, serves as the unique identifier for the game",
+        "msg_id": "Message ID",
+        "peer": "Chat where the inline keyboard was sent",
+        "query_id": "Query ID",
+        "user_id": "ID of the user that pressed the button"
+      }
+    },
+    "UpdateBotChatBoost": {
+      "desc": "A channel/supergroup boost has changed (bots only)",
+      "params": {
+        "boost": "New boost information",
+        "peer": "Channel",
+        "qts": "QTS event sequence identifier"
+      }
+    },
+    "UpdateBotChatInviteRequester": {
+      "desc": "Someone has requested to join a chat or channel (bots only, users will receive an updatePendingJoinRequests, instead)",
+      "params": {
+        "about": "Bio of the user",
+        "date": "When was the join request \u00bb made",
+        "invite": "Chat invite link that was used by the user to send the join request \u00bb",
+        "peer": "The chat or channel in question",
+        "qts": "QTS event sequence identifier",
+        "user_id": "The user ID that is asking to join the chat or channel"
+      }
+    },
+    "UpdateBotCommands": {
+      "desc": "The command set of a certain bot in a certain chat has changed.",
+      "params": {
+        "bot_id": "ID of the bot that changed its command set",
+        "commands": "New bot commands",
+        "peer": "The affected chat"
+      }
+    },
+    "UpdateBotDeleteBusinessMessage": {
+      "desc": "A message was deleted in a connected business chat \u00bb.",
+      "params": {
+        "connection_id": "Business connection ID.",
+        "messages": "IDs of the messages that were deleted.",
+        "peer": "Peer where the messages were deleted.",
+        "qts": "New qts value, see updates \u00bb for more info."
+      }
+    },
+    "UpdateBotEditBusinessMessage": {
+      "desc": "A message was edited in a connected business chat \u00bb.",
+      "params": {
+        "connection_id": "Business connection ID",
+        "flags": "Flags, see TL conditional fields",
+        "message": "New message.",
+        "qts": "New qts value, see updates \u00bb for more info.",
+        "reply_to_message": "The message that message is replying to."
+      }
+    },
+    "UpdateBotInlineQuery": {
+      "desc": "An incoming inline query",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "geo": "Attached geolocation",
+        "offset": "Offset to navigate through results",
+        "peer_type": "Type of the chat from which the inline query was sent.",
+        "query": "Text of query",
+        "query_id": "Query ID",
+        "user_id": "User that sent the query"
+      }
+    },
+    "UpdateBotInlineSend": {
+      "desc": "The result of an inline query that was chosen by a user and sent to their chat partner. Please see our documentation on the feedback collecting for details on how to enable these updates for your bot.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "geo": "Optional. Sender location, only for bots that require user location",
+        "id": "The unique identifier for the result that was chosen",
+        "msg_id": "Identifier of the sent inline message. Available only if there is an inline keyboard attached to the message. Will be also received in callback queries and can be used to edit the message.",
+        "query": "The query that was used to obtain the result",
+        "user_id": "The user that chose the result"
+      }
+    },
+    "UpdateBotMenuButton": {
+      "desc": "The menu button behavior for the specified bot has changed",
+      "params": {
+        "bot_id": "Bot ID",
+        "button": "New menu button"
+      }
+    },
+    "UpdateBotMessageReaction": {
+      "desc": "Bots only: a user has changed their reactions on a message with public reactions.",
+      "params": {
+        "actor": "The user that (un)reacted to the message.",
+        "date": "Date of the change.",
+        "msg_id": "ID of the reacted-to message.",
+        "new_reactions": "New reactions",
+        "old_reactions": "Old reactions",
+        "peer": "Peer of the reacted-to message.",
+        "qts": "QTS event sequence identifier"
+      }
+    },
+    "UpdateBotMessageReactions": {
+      "desc": "Bots only: the number of reactions on a message with anonymous reactions has changed.",
+      "params": {
+        "date": "Date of the change.",
+        "msg_id": "ID of the reacted-to message.",
+        "peer": "Peer of the reacted-to message.",
+        "qts": "QTS event sequence identifier",
+        "reactions": "New reaction counters."
+      }
+    },
+    "UpdateBotNewBusinessMessage": {
+      "desc": "A message was received via a connected business chat \u00bb.",
+      "params": {
+        "connection_id": "Connection ID.",
+        "flags": "Flags, see TL conditional fields",
+        "message": "New message.",
+        "qts": "New qts value, see updates \u00bb for more info.",
+        "reply_to_message": "The message that message is replying to."
+      }
+    },
+    "UpdateBotPrecheckoutQuery": {
+      "desc": "This object contains information about an incoming pre-checkout query.",
+      "params": {
+        "currency": "Three-letter ISO 4217 currency code, or XTR for Telegram Stars.",
+        "flags": "Flags, see TL conditional fields",
+        "info": "Order info provided by the user",
+        "payload": "Bot specified invoice payload",
+        "query_id": "Unique query identifier",
+        "shipping_option_id": "Identifier of the shipping option chosen by the user",
+        "total_amount": "Total amount in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).",
+        "user_id": "User who sent the query"
+      }
+    },
+    "UpdateBotPurchasedPaidMedia": {
+      "desc": "Bots only: a user has purchased a paid media.",
+      "params": {
+        "payload": "Payload passed by the bot in inputMediaPaidMedia.payload",
+        "qts": "New qts value, see updates \u00bb for more info.",
+        "user_id": "The user that bought the media"
+      }
+    },
+    "UpdateBotShippingQuery": {
+      "desc": "This object contains information about an incoming shipping query.",
+      "params": {
+        "payload": "Bot specified invoice payload",
+        "query_id": "Unique query identifier",
+        "shipping_address": "User specified shipping address",
+        "user_id": "User who sent the query"
+      }
+    },
+    "UpdateBotStopped": {
+      "desc": "A bot was stopped or re-started.",
+      "params": {
+        "date": "When did this action occur",
+        "qts": "New qts value, see updates \u00bb for more info.",
+        "stopped": "Whether the bot was stopped or started",
+        "user_id": "The user ID"
+      }
+    },
+    "UpdateBotSubscriptionExpire": {
+      "desc": "",
+      "params": {}
+    },
+    "UpdateBotWebhookJSON": {
+      "desc": "A new incoming event; for bots only",
+      "params": {
+        "data": "The event"
+      }
+    },
+    "UpdateBotWebhookJSONQuery": {
+      "desc": "A new incoming query; for bots only",
+      "params": {
+        "data": "Query data",
+        "query_id": "Query identifier",
+        "timeout": "Query timeout"
+      }
+    },
+    "UpdateBusinessBotCallbackQuery": {
+      "desc": "A callback button sent via a business connection was pressed, and the button data was sent to the bot that created the button.",
+      "params": {
+        "chat_instance": "Global identifier, uniquely corresponding to the chat to which the message with the callback button was sent. Useful for high scores in games.",
+        "connection_id": "Business connection ID",
+        "data": "Callback data",
+        "flags": "Flags, see TL conditional fields",
+        "message": "Message that contains the keyboard (also contains info about the chat where the message was sent).",
+        "query_id": "Query ID",
+        "reply_to_message": "The message that message is replying to.",
+        "user_id": "ID of the user that pressed the button"
+      }
+    },
+    "UpdateChannel": {
+      "desc": "Channel/supergroup (channel and/or channelFull) information was updated.",
+      "params": {
+        "channel_id": "Channel ID"
+      }
+    },
+    "UpdateChannelAvailableMessages": {
+      "desc": "The history of a channel/supergroup was hidden.",
+      "params": {
+        "available_min_id": "Identifier of a maximum unavailable message in a channel due to hidden history.",
+        "channel_id": "Channel/supergroup ID"
+      }
+    },
+    "UpdateChannelMessageForwards": {
+      "desc": "The forward counter of a message in a channel has changed",
+      "params": {
+        "channel_id": "Channel ID",
+        "forwards": "New forward counter",
+        "id": "ID of the message"
+      }
+    },
+    "UpdateChannelMessageViews": {
+      "desc": "The view counter of a message in a channel has changed",
+      "params": {
+        "channel_id": "Channel ID",
+        "id": "ID of the message",
+        "views": "New view counter"
+      }
+    },
+    "UpdateChannelParticipant": {
+      "desc": "A participant has left, joined, was banned or admined in a channel or supergroup.",
+      "params": {
+        "actor_id": "User that triggered the change (inviter, admin that kicked the user, or the even the user_id itself)",
+        "channel_id": "Channel ID",
+        "date": "Date of the event",
+        "flags": "Flags, see TL conditional fields",
+        "invite": "Chat invite used to join the channel/supergroup",
+        "new_participant": "New participant status",
+        "prev_participant": "Previous participant status",
+        "qts": "New qts value, see updates \u00bb for more info.",
+        "user_id": "User that was affected by the change",
+        "via_chatlist": "Whether the participant joined using a chat folder deep link \u00bb."
+      }
+    },
+    "UpdateChannelPinnedTopic": {
+      "desc": "A forum topic \u00bb was pinned or unpinned.",
+      "params": {
+        "channel_id": "The forum ID",
+        "flags": "Flags, see TL conditional fields",
+        "pinned": "Whether the topic was pinned or unpinned",
+        "topic_id": "The topic ID"
+      }
+    },
+    "UpdateChannelPinnedTopics": {
+      "desc": "The pinned topics of a forum have changed.",
+      "params": {
+        "channel_id": "Forum ID.",
+        "flags": "Flags, see TL conditional fields",
+        "order": "Ordered list containing the IDs of all pinned topics."
+      }
+    },
+    "UpdateChannelReadMessagesContents": {
+      "desc": "The specified channel/supergroup messages were read (emitted specifically for messages like voice messages or video, only once the media is watched and marked as read using channels.readMessageContents)",
+      "params": {
+        "channel_id": "Channel/supergroup ID",
+        "flags": "Flags, see TL conditional fields",
+        "messages": "IDs of messages that were read",
+        "saved_peer_id": "If set, the messages were read within the specified monoforum topic \u00bb.",
+        "top_msg_id": "Forum topic ID."
+      }
+    },
+    "UpdateChannelTooLong": {
+      "desc": "There are new updates in the specified channel, the client must fetch them.\nIf the difference is too long or if the channel isn't currently in the states, start fetching from the specified pts.",
+      "params": {
+        "channel_id": "The channel",
+        "flags": "Flags, see TL conditional fields",
+        "pts": "The PTS."
+      }
+    },
+    "UpdateChannelUserTyping": {
+      "desc": "A user is typing in a supergroup, channel or message thread",
+      "params": {
+        "action": "Whether the user is typing, sending a media or doing something else",
+        "channel_id": "Channel ID",
+        "flags": "Flags, see TL conditional fields",
+        "from_id": "The peer that is typing",
+        "top_msg_id": "Thread ID"
+      }
+    },
+    "UpdateChannelViewForumAsMessages": {
+      "desc": "Users may also choose to display messages from all topics as if they were sent to a normal group, using a \"View as messages\" setting in the local client.\nThis setting only affects the current account, and is synced to other logged in sessions using the channels.toggleViewForumAsMessages method; invoking this method will update the value of the view_forum_as_messages flag of channelFull or dialog and emit an updateChannelViewForumAsMessages.",
+      "params": {
+        "channel_id": "The forum ID",
+        "enabled": "The new value of the toggle."
+      }
+    },
+    "UpdateChannelWebPage": {
+      "desc": "A webpage preview of a link in a channel/supergroup message was generated",
+      "params": {
+        "channel_id": "Channel/supergroup ID",
+        "pts": "Event count after generation",
+        "pts_count": "Number of events that were generated",
+        "webpage": "Generated webpage preview"
+      }
+    },
+    "UpdateChat": {
+      "desc": "Chat (chat and/or chatFull) information was updated.",
+      "params": {
+        "chat_id": "Chat ID"
+      }
+    },
+    "UpdateChatDefaultBannedRights": {
+      "desc": "Default banned rights in a normal chat were updated",
+      "params": {
+        "default_banned_rights": "New default banned rights",
+        "peer": "The chat",
+        "version": "Version"
+      }
+    },
+    "UpdateChatParticipant": {
+      "desc": "A user has joined or left a specific chat",
+      "params": {
+        "actor_id": "User that triggered the change (inviter, admin that kicked the user, or the even the user_id itself)",
+        "chat_id": "Chat ID",
+        "date": "When did this event occur",
+        "flags": "Flags, see TL conditional fields",
+        "invite": "The invite that was used to join the group",
+        "new_participant": "New participant info (empty if this participant just left)",
+        "prev_participant": "Previous participant info (empty if this participant just joined)",
+        "qts": "New qts value, see updates \u00bb for more info.",
+        "user_id": "User that was affected by the change"
+      }
+    },
+    "UpdateChatParticipantAdd": {
+      "desc": "New group member.",
+      "params": {
+        "chat_id": "Group ID",
+        "date": "When was the participant added",
+        "inviter_id": "ID of the user, who added member to the group",
+        "user_id": "ID of the new member",
+        "version": "Chat version number"
+      }
+    },
+    "UpdateChatParticipantAdmin": {
+      "desc": "Admin permissions of a user in a basic group were changed",
+      "params": {
+        "chat_id": "Chat ID",
+        "is_admin": "Whether the user was rendered admin",
+        "user_id": "ID of the (de)admined user",
+        "version": "Used in basic groups to reorder updates and make sure that all of them was received."
+      }
+    },
+    "UpdateChatParticipantDelete": {
+      "desc": "A member has left the group.",
+      "params": {
+        "chat_id": "Group ID",
+        "user_id": "ID of the user",
+        "version": "Used in basic groups to reorder updates and make sure that all of them was received."
+      }
+    },
+    "UpdateChatParticipants": {
+      "desc": "Composition of chat participants changed.",
+      "params": {
+        "participants": "Updated chat participants"
+      }
+    },
+    "UpdateChatUserTyping": {
+      "desc": "The user is preparing a message in a group; typing, recording, uploading, etc. This update is valid for 6 seconds. If no further updates of this kind are received after 6 seconds, it should be considered that the user stopped doing whatever they were doing",
+      "params": {
+        "action": "Type of action",
+        "chat_id": "Group id",
+        "from_id": "Peer that started typing (can be the chat itself, in case of anonymous admins)."
+      }
+    },
+    "UpdateConfig": {
+      "desc": "The server-side configuration has changed; the client should re-fetch the config using help.getConfig and help.getAppConfig.",
+      "params": {}
+    },
+    "UpdateContactsReset": {
+      "desc": "All contacts were deleted",
+      "params": {}
+    },
+    "UpdateDcOptions": {
+      "desc": "Changes in the data center configuration options.",
+      "params": {
+        "dc_options": "New connection options"
+      }
+    },
+    "UpdateDeleteChannelMessages": {
+      "desc": "Some messages in a supergroup/channel were deleted",
+      "params": {
+        "channel_id": "Channel ID",
+        "messages": "IDs of messages that were deleted",
+        "pts": "Event count after generation",
+        "pts_count": "Number of events that were generated"
+      }
+    },
+    "UpdateDeleteMessages": {
+      "desc": "Messages were deleted.",
+      "params": {
+        "messages": "List of identifiers of deleted messages",
+        "pts": "New quality of actions in a message box",
+        "pts_count": "Number of generated events"
+      }
+    },
+    "UpdateDeleteQuickReply": {
+      "desc": "A quick reply shortcut \u00bb was deleted. This will not emit updateDeleteQuickReplyMessages updates, even if all the messages in the shortcut are also deleted by this update.",
+      "params": {
+        "shortcut_id": "ID of the quick reply shortcut that was deleted."
+      }
+    },
+    "UpdateDeleteQuickReplyMessages": {
+      "desc": "One or more messages in a quick reply shortcut \u00bb were deleted.",
+      "params": {
+        "messages": "IDs of the deleted messages.",
+        "shortcut_id": "Quick reply shortcut ID."
+      }
+    },
+    "UpdateDeleteScheduledMessages": {
+      "desc": "Some scheduled messages were deleted (or sent) from the schedule queue of a chat",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "messages": "Deleted scheduled messages",
+        "peer": "Peer",
+        "sent_messages": "If set, this update indicates that some scheduled messages were sent (not simply deleted from the schedule queue).  In this case, the messages field will contain the scheduled message IDs for the sent messages (initially returned in updateNewScheduledMessage), and sent_messages will contain the real message IDs for the sent messages."
+      }
+    },
+    "UpdateDialogFilter": {
+      "desc": "A new folder was added",
+      "params": {
+        "filter": "Folder info",
+        "flags": "Flags, see TL conditional fields",
+        "id": "Folder ID"
+      }
+    },
+    "UpdateDialogFilterOrder": {
+      "desc": "New folder order",
+      "params": {
+        "order": "Ordered folder IDs"
+      }
+    },
+    "UpdateDialogFilters": {
+      "desc": "Clients should update folder info",
+      "params": {}
+    },
+    "UpdateDialogPinned": {
+      "desc": "A dialog was pinned/unpinned",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "folder_id": "Peer folder ID, for more info click here",
+        "peer": "The dialog",
+        "pinned": "Whether the dialog was pinned"
+      }
+    },
+    "UpdateDialogUnreadMark": {
+      "desc": "The manual unread mark of a chat was changed",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "peer": "The dialog",
+        "saved_peer_id": "If set, the mark is related to the specified monoforum topic ID \u00bb.",
+        "unread": "Was the chat marked or unmarked as read"
+      }
+    },
+    "UpdateDraftMessage": {
+      "desc": "Notifies a change of a message draft.",
+      "params": {
+        "draft": "The draft",
+        "flags": "Flags, see TL conditional fields",
+        "peer": "The peer to which the draft is associated",
+        "saved_peer_id": "If set, the draft is related to the specified monoforum topic ID \u00bb.",
+        "top_msg_id": "ID of the forum topic to which the draft is associated"
+      }
+    },
+    "UpdateEditChannelMessage": {
+      "desc": "A message was edited in a channel/supergroup",
+      "params": {
+        "message": "The new message",
+        "pts": "Event count after generation",
+        "pts_count": "Number of events that were generated"
+      }
+    },
+    "UpdateEditMessage": {
+      "desc": "A message was edited",
+      "params": {
+        "message": "The new edited message",
+        "pts": "PTS",
+        "pts_count": "PTS count"
+      }
+    },
+    "UpdateEncryptedChatTyping": {
+      "desc": "Interlocutor is typing a message in an encrypted chat. Update period is 6 second. If upon this time there is no repeated update, it shall be considered that the interlocutor stopped typing.",
+      "params": {
+        "chat_id": "Chat ID"
+      }
+    },
+    "UpdateEncryptedMessagesRead": {
+      "desc": "Communication history in an encrypted chat was marked as read.",
+      "params": {
+        "chat_id": "Chat ID",
+        "date": "Time when messages were read",
+        "max_date": "Maximum value of data for read messages"
+      }
+    },
+    "UpdateEncryption": {
+      "desc": "Change of state in an encrypted chat.",
+      "params": {
+        "chat": "Encrypted chat",
+        "date": "Date of change"
+      }
+    },
+    "UpdateFavedStickers": {
+      "desc": "The list of favorited stickers was changed, the client should call messages.getFavedStickers to refetch the new list",
+      "params": {}
+    },
+    "UpdateFolderPeers": {
+      "desc": "The peer list of a peer folder was updated",
+      "params": {
+        "folder_peers": "New peer list",
+        "pts": "Event count after generation",
+        "pts_count": "Number of events that were generated"
+      }
+    },
+    "UpdateGeoLiveViewed": {
+      "desc": "Live geoposition message was viewed",
+      "params": {
+        "msg_id": "Message ID of geoposition message",
+        "peer": "The user that viewed the live geoposition"
+      }
+    },
+    "UpdateGroupCall": {
+      "desc": "A new groupcall was started",
+      "params": {
+        "call": "Info about the group call or livestream",
+        "chat_id": "The channel/supergroup where this group call or livestream takes place",
+        "flags": "Flags, see TL conditional fields"
+      }
+    },
+    "UpdateGroupCallChainBlocks": {
+      "desc": "Contains updates to the blockchain of a conference call, see here \u00bb for more info.",
+      "params": {
+        "blocks": "Blocks.",
+        "call": "The conference call.",
+        "next_offset": "Offset of the next block.",
+        "sub_chain_id": "Subchain ID."
+      }
+    },
+    "UpdateGroupCallConnection": {
+      "desc": "New WebRTC parameters",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "params": "WebRTC parameters",
+        "presentation": "Are these parameters related to the screen capture session currently in progress?"
+      }
+    },
+    "UpdateGroupCallEncryptedMessage": {
+      "desc": "",
+      "params": {}
+    },
+    "UpdateGroupCallMessage": {
+      "desc": "",
+      "params": {}
+    },
+    "UpdateGroupCallParticipants": {
+      "desc": "The participant list of a certain group call has changed",
+      "params": {
+        "call": "Group call",
+        "participants": "New participant list",
+        "version": "Version"
+      }
+    },
+    "UpdateInlineBotCallbackQuery": {
+      "desc": "This notification is received by bots when a button is pressed",
+      "params": {
+        "chat_instance": "Global identifier, uniquely corresponding to the chat to which the message with the callback button was sent. Useful for high scores in games.",
+        "data": "Data associated with the callback button. Be aware that a bad client can send arbitrary data in this field.",
+        "flags": "Flags, see TL conditional fields",
+        "game_short_name": "Short name of a Game to be returned, serves as the unique identifier for the game",
+        "msg_id": "ID of the inline message with the button",
+        "query_id": "Query ID",
+        "user_id": "ID of the user that pressed the button"
+      }
+    },
+    "UpdateLangPack": {
+      "desc": "Language pack updated",
+      "params": {
+        "difference": "Changed strings"
+      }
+    },
+    "UpdateLangPackTooLong": {
+      "desc": "A language pack has changed, the client should manually fetch the changed strings using langpack.getDifference",
+      "params": {
+        "lang_code": "Language code"
+      }
+    },
+    "UpdateLoginToken": {
+      "desc": "A login token (for login via QR code) was accepted.",
+      "params": {}
+    },
+    "UpdateMessageExtendedMedia": {
+      "desc": "You bought a paid media \u00bb: this update contains the revealed media.",
+      "params": {
+        "extended_media": "Revealed media, contains only messageExtendedMedia constructors.",
+        "msg_id": "ID of the message containing the paid media",
+        "peer": "Peer where the paid media was posted"
+      }
+    },
+    "UpdateMessageID": {
+      "desc": "Sent message with random_id client identifier was assigned an identifier.",
+      "params": {
+        "id": "id identifier of a respective Message",
+        "random_id": "Previously transferred client random_id identifier"
+      }
+    },
+    "UpdateMessagePoll": {
+      "desc": "The results of a poll have changed",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "poll": "If the server knows the client hasn't cached this poll yet, the poll itself",
+        "poll_id": "Poll ID",
+        "results": "New poll results"
+      }
+    },
+    "UpdateMessagePollVote": {
+      "desc": "A specific peer has voted in a poll",
+      "params": {
+        "options": "Chosen option(s)",
+        "peer": "The peer that voted in the poll",
+        "poll_id": "Poll ID",
+        "qts": "New qts value, see updates \u00bb for more info."
+      }
+    },
+    "UpdateMessageReactions": {
+      "desc": "New message reactions \u00bb are available",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "msg_id": "Message ID",
+        "peer": "Peer",
+        "reactions": "Reactions",
+        "saved_peer_id": "If set, the reactions are in the specified monoforum topic \u00bb.",
+        "top_msg_id": "Forum topic ID"
+      }
+    },
+    "UpdateMonoForumNoPaidException": {
+      "desc": "An admin has (un)exempted this monoforum topic \u00bb from payment to send messages using account.toggleNoPaidMessagesException.",
+      "params": {
+        "channel_id": "The monoforum ID.",
+        "exception": "If set, an admin has exempted this peer, otherwise the peer was unexempted.",
+        "flags": "Flags, see TL conditional fields",
+        "saved_peer_id": "The peer/topic ID."
+      }
+    },
+    "UpdateMoveStickerSetToTop": {
+      "desc": "A stickerset was just moved to top, see here for more info \u00bb",
+      "params": {
+        "emojis": "This update is referring to a custom emoji stickerset",
+        "flags": "Flags, see TL conditional fields",
+        "masks": "This update is referring to a mask stickerset",
+        "stickerset": "Stickerset ID"
+      }
+    },
+    "UpdateNewAuthorization": {
+      "desc": "A new session logged into the current user's account through an unknown device.",
+      "params": {
+        "date": "Authorization date",
+        "device": "Name of device, for example Android",
+        "flags": "Flags, see TL conditional fields",
+        "hash": "Hash used for caching, for more info click here",
+        "location": "Location, for example USA, NY (IP=1.2.3.4)",
+        "unconfirmed": "Whether the session is unconfirmed, see here \u00bb for more info."
+      }
+    },
+    "UpdateNewChannelMessage": {
+      "desc": "A new message was sent in a channel/supergroup",
+      "params": {
+        "message": "New message",
+        "pts": "Event count after generation",
+        "pts_count": "Number of events that were generated"
+      }
+    },
+    "UpdateNewEncryptedMessage": {
+      "desc": "New encrypted message.",
+      "params": {
+        "message": "Message",
+        "qts": "New qts value, see updates \u00bb for more info."
+      }
+    },
+    "UpdateNewMessage": {
+      "desc": "New message in a private chat or in a basic group.",
+      "params": {
+        "message": "Message",
+        "pts": "New quantity of actions in a message box",
+        "pts_count": "Number of generated events"
+      }
+    },
+    "UpdateNewQuickReply": {
+      "desc": "A new quick reply shortcut \u00bb was created.",
+      "params": {
+        "quick_reply": "Quick reply shortcut."
+      }
+    },
+    "UpdateNewScheduledMessage": {
+      "desc": "A message was added to the schedule queue of a chat",
+      "params": {
+        "message": "Message"
+      }
+    },
+    "UpdateNewStickerSet": {
+      "desc": "A new stickerset was installed",
+      "params": {
+        "stickerset": "The installed stickerset"
+      }
+    },
+    "UpdateNewStoryReaction": {
+      "desc": "Represents a new reaction to a story.",
+      "params": {
+        "peer": "The peer where the story was posted.",
+        "reaction": "The reaction.",
+        "story_id": "Story ID."
+      }
+    },
+    "UpdateNotifySettings": {
+      "desc": "Changes in notification settings.",
+      "params": {
+        "notify_settings": "New notification settings",
+        "peer": "Notification source"
+      }
+    },
+    "UpdatePaidReactionPrivacy": {
+      "desc": "Contains the current default paid reaction privacy, see here \u00bb for more info.",
+      "params": {
+        "private": "Paid reaction privacy settings."
+      }
+    },
+    "UpdatePeerBlocked": {
+      "desc": "We blocked a peer, see here \u00bb for more info on blocklists.",
+      "params": {
+        "blocked": "Whether the peer was blocked or unblocked",
+        "blocked_my_stories_from": "Whether the peer was added/removed to/from the story blocklist; if not set, this update affects the main blocklist, see here \u00bb for more info.",
+        "flags": "Flags, see TL conditional fields",
+        "peer_id": "The (un)blocked peer"
+      }
+    },
+    "UpdatePeerHistoryTTL": {
+      "desc": "The Time-To-Live for messages sent by the current user in a specific chat has changed",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "peer": "The chat",
+        "ttl_period": "The new Time-To-Live"
+      }
+    },
+    "UpdatePeerLocated": {
+      "desc": "List of peers near you was updated",
+      "params": {
+        "peers": "Geolocated peer list update"
+      }
+    },
+    "UpdatePeerSettings": {
+      "desc": "Settings of a certain peer have changed",
+      "params": {
+        "peer": "The peer",
+        "settings": "Associated peer settings"
+      }
+    },
+    "UpdatePeerWallpaper": {
+      "desc": "The wallpaper \u00bb of a given peer has changed.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "peer": "The peer where the wallpaper has changed.",
+        "wallpaper": "The new wallpaper, if none the wallpaper was removed and the default wallpaper should be used.",
+        "wallpaper_overridden": "Whether the other user has chosen a custom wallpaper for us using messages.setChatWallPaper and the for_both flag, see here \u00bb for more info."
+      }
+    },
+    "UpdatePendingJoinRequests": {
+      "desc": "Someone has requested to join a chat or channel",
+      "params": {
+        "peer": "Chat or channel",
+        "recent_requesters": "IDs of users that have recently requested to join",
+        "requests_pending": "Number of pending join requests \u00bb for the chat or channel"
+      }
+    },
+    "UpdatePhoneCall": {
+      "desc": "An incoming phone call",
+      "params": {
+        "phone_call": "Phone call"
+      }
+    },
+    "UpdatePhoneCallSignalingData": {
+      "desc": "Incoming phone call signaling payload",
+      "params": {
+        "data": "Signaling payload",
+        "phone_call_id": "Phone call ID"
+      }
+    },
+    "UpdatePinnedChannelMessages": {
+      "desc": "Messages were pinned/unpinned in a channel/supergroup",
+      "params": {
+        "channel_id": "Channel ID",
+        "flags": "Flags, see TL conditional fields",
+        "messages": "Messages",
+        "pinned": "Whether the messages were pinned or unpinned",
+        "pts": "Event count after generation",
+        "pts_count": "Number of events that were generated"
+      }
+    },
+    "UpdatePinnedDialogs": {
+      "desc": "Pinned dialogs were updated",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "folder_id": "Peer folder ID, for more info click here",
+        "order": "New order of pinned dialogs"
+      }
+    },
+    "UpdatePinnedForumTopic": {
+      "desc": "",
+      "params": {}
+    },
+    "UpdatePinnedForumTopics": {
+      "desc": "",
+      "params": {}
+    },
+    "UpdatePinnedMessages": {
+      "desc": "Some messages were pinned in a chat",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "messages": "Message IDs",
+        "peer": "Peer",
+        "pinned": "Whether the messages were pinned or unpinned",
+        "pts": "Event count after generation",
+        "pts_count": "Number of events that were generated"
+      }
+    },
+    "UpdatePinnedSavedDialogs": {
+      "desc": "Pinned saved dialogs \u00bb were updated",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "order": "New order of pinned saved dialogs"
+      }
+    },
+    "UpdatePrivacy": {
+      "desc": "Privacy rules were changed",
+      "params": {
+        "key": "Peers to which the privacy rules apply",
+        "rules": "New privacy rules"
+      }
+    },
+    "UpdatePtsChanged": {
+      "desc": "Common message box sequence PTS has changed, state has to be refetched using updates.getState",
+      "params": {}
+    },
+    "UpdateQuickReplies": {
+      "desc": "Info about or the order of quick reply shortcuts \u00bb was changed.",
+      "params": {
+        "quick_replies": "New quick reply shortcut order and information."
+      }
+    },
+    "UpdateQuickReplyMessage": {
+      "desc": "A new message was added to a quick reply shortcut \u00bb.",
+      "params": {
+        "message": "The message that was added (the message.quick_reply_shortcut_id field will contain the shortcut ID)."
+      }
+    },
+    "UpdateReadChannelDiscussionInbox": {
+      "desc": "Incoming comments in a discussion thread were marked as read",
+      "params": {
+        "broadcast_id": "If set, contains the ID of the channel that contains the post that started the comment thread in the discussion group (channel_id)",
+        "broadcast_post": "If set, contains the ID of the channel post that started the comment thread",
+        "channel_id": "Discussion group ID",
+        "flags": "Flags, see TL conditional fields",
+        "read_max_id": "Message ID of latest read incoming message for this thread",
+        "top_msg_id": "ID of the group message that started the thread (message in linked discussion group)"
+      }
+    },
+    "UpdateReadChannelDiscussionOutbox": {
+      "desc": "Outgoing comments in a discussion thread were marked as read",
+      "params": {
+        "channel_id": "Supergroup ID",
+        "read_max_id": "Message ID of latest read outgoing message for this thread",
+        "top_msg_id": "ID of the group message that started the thread"
+      }
+    },
+    "UpdateReadChannelInbox": {
+      "desc": "Incoming messages in a channel/supergroup were read",
+      "params": {
+        "channel_id": "Channel/supergroup ID",
+        "flags": "Flags, see TL conditional fields",
+        "folder_id": "Peer folder ID, for more info click here",
+        "max_id": "Position up to which all incoming messages are read.",
+        "pts": "Event count after generation",
+        "still_unread_count": "Count of messages weren't read yet"
+      }
+    },
+    "UpdateReadChannelOutbox": {
+      "desc": "Outgoing messages in a channel/supergroup were read",
+      "params": {
+        "channel_id": "Channel/supergroup ID",
+        "max_id": "Position up to which all outgoing messages are read."
+      }
+    },
+    "UpdateReadFeaturedEmojiStickers": {
+      "desc": "Some featured custom emoji stickers were marked as read",
+      "params": {}
+    },
+    "UpdateReadFeaturedStickers": {
+      "desc": "Some featured stickers were marked as read",
+      "params": {}
+    },
+    "UpdateReadHistoryInbox": {
+      "desc": "Incoming messages were read",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "folder_id": "Peer folder ID, for more info click here",
+        "max_id": "Maximum ID of messages read",
+        "peer": "Peer",
+        "pts": "Event count after generation",
+        "pts_count": "Number of events that were generated",
+        "still_unread_count": "Number of messages that are still unread"
+      }
+    },
+    "UpdateReadHistoryOutbox": {
+      "desc": "Outgoing messages were read",
+      "params": {
+        "max_id": "Maximum ID of read outgoing messages",
+        "peer": "Peer",
+        "pts": "Event count after generation",
+        "pts_count": "Number of events that were generated"
+      }
+    },
+    "UpdateReadMessagesContents": {
+      "desc": "Contents of messages in the common message box were read (emitted specifically for messages like voice messages or video, only once the media is watched and marked as read using messages.readMessageContents).",
+      "params": {
+        "date": "When was the last message in messages marked as read.",
+        "flags": "Flags, see TL conditional fields",
+        "messages": "IDs of read messages",
+        "pts": "Event count after generation",
+        "pts_count": "Number of events that were generated"
+      }
+    },
+    "UpdateReadMonoForumInbox": {
+      "desc": "Incoming messages in a monoforum topic were read",
+      "params": {
+        "channel_id": "ID of the monoforum.",
+        "read_max_id": "Position up to which all incoming messages are read.",
+        "saved_peer_id": "Topic ID."
+      }
+    },
+    "UpdateReadMonoForumOutbox": {
+      "desc": "Outgoing messages in a monoforum were read.",
+      "params": {
+        "channel_id": "ID of the monoforum.",
+        "read_max_id": "Position up to which all outgoing messages are read.",
+        "saved_peer_id": "Topic ID."
+      }
+    },
+    "UpdateReadStories": {
+      "desc": "Stories of a specific peer were marked as read.",
+      "params": {
+        "max_id": "ID of the last story that was marked as read",
+        "peer": "The peer"
+      }
+    },
+    "UpdateRecentEmojiStatuses": {
+      "desc": "The list of recent emoji statuses has changed",
+      "params": {}
+    },
+    "UpdateRecentReactions": {
+      "desc": "The list of recent message reactions has changed",
+      "params": {}
+    },
+    "UpdateRecentStickers": {
+      "desc": "The recent sticker list was updated",
+      "params": {}
+    },
+    "UpdateSavedDialogPinned": {
+      "desc": "A saved message dialog was pinned/unpinned",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "peer": "The dialog",
+        "pinned": "Whether the dialog was pinned"
+      }
+    },
+    "UpdateSavedGifs": {
+      "desc": "The saved gif list has changed, the client should refetch it using messages.getSavedGifs",
+      "params": {}
+    },
+    "UpdateSavedReactionTags": {
+      "desc": "The list of reaction tag \u00bb names assigned by the user has changed and should be refetched using messages.getSavedReactionTags \u00bb.",
+      "params": {}
+    },
+    "UpdateSavedRingtones": {
+      "desc": "The list of saved notification sounds has changed, use account.getSavedRingtones to fetch the new list.",
+      "params": {}
+    },
+    "UpdateSentPhoneCode": {
+      "desc": "A paid login SMS code was successfully sent.",
+      "params": {
+        "sent_code": "Info about the sent code."
+      }
+    },
+    "UpdateSentStoryReaction": {
+      "desc": "Indicates we reacted to a story \u00bb.",
+      "params": {
+        "peer": "The peer that sent the story",
+        "reaction": "The reaction that was sent",
+        "story_id": "ID of the story we reacted to"
+      }
+    },
+    "UpdateServiceNotification": {
+      "desc": "A service message for the user.",
+      "params": {
+        "entities": "Message entities for styled text",
+        "flags": "Flags, see TL conditional fields",
+        "inbox_date": "When was the notification receivedThe message must also be stored locally as part of the message history with the user id 777000 (Telegram Notifications).",
+        "invert_media": "If set, any eventual webpage preview will be shown on top of the message instead of at the bottom.",
+        "media": "Media content (optional)",
+        "message": "Message text",
+        "popup": "If set, the message must be displayed in a popup.",
+        "type": "String, identical in format and contents to the type field in API errors. Describes type of service message. It is acceptable to ignore repeated messages of the same type within a short period of time (15 minutes)."
+      }
+    },
+    "UpdateShort": {
+      "desc": "Shortened constructor containing info on one update not requiring auxiliary data",
+      "params": {
+        "date": "Date of event",
+        "update": "Update"
+      }
+    },
+    "UpdateShortChatMessage": {
+      "desc": "Shortened constructor containing info on one new incoming text message from a chat",
+      "params": {
+        "chat_id": "ID of the chat where the message was sent",
+        "date": "date",
+        "entities": "Entities for styled text",
+        "flags": "Flags, see TL conditional fields",
+        "from_id": "ID of the sender of the message",
+        "fwd_from": "Info about a forwarded message",
+        "id": "ID of the message",
+        "media_unread": "Whether the message contains some unread mentions",
+        "mentioned": "Whether we were mentioned in this message",
+        "message": "Message",
+        "out": "Whether the message is outgoing",
+        "pts": "PTS",
+        "pts_count": "PTS count",
+        "reply_to": "Reply (thread) information",
+        "silent": "If true, the message is a silent message, no notifications should be triggered",
+        "ttl_period": "Time To Live of the message, once updateShortChatMessage.date+updateShortChatMessage.ttl_period === time(), the message will be deleted on the server, and must be deleted locally as well.",
+        "via_bot_id": "Info about the inline bot used to generate this message"
+      }
+    },
+    "UpdateShortMessage": {
+      "desc": "Info about a message sent to (received from) another user",
+      "params": {
+        "date": "date",
+        "entities": "Entities for styled text",
+        "flags": "Flags, see TL conditional fields",
+        "fwd_from": "Info about a forwarded message",
+        "id": "The message ID",
+        "media_unread": "Whether there are some unread mentions in this message",
+        "mentioned": "Whether we were mentioned in the message",
+        "message": "The message",
+        "out": "Whether the message is outgoing",
+        "pts": "PTS",
+        "pts_count": "PTS count",
+        "reply_to": "Reply and thread information",
+        "silent": "If true, the message is a silent message, no notifications should be triggered",
+        "ttl_period": "Time To Live of the message, once message.date+message.ttl_period === time(), the message will be deleted on the server, and must be deleted locally as well.",
+        "user_id": "The ID of the sender (if outgoing will be the ID of the destination) of the message",
+        "via_bot_id": "Info about the inline bot used to generate this message"
+      }
+    },
+    "UpdateShortSentMessage": {
+      "desc": "Shortened constructor containing info on one outgoing message to a contact (the destination chat has to be extracted from the method call that returned this object).",
+      "params": {
+        "date": "date",
+        "entities": "Entities for styled text",
+        "flags": "Flags, see TL conditional fields",
+        "id": "ID of the sent message",
+        "media": "Attached media",
+        "out": "Whether the message is outgoing",
+        "pts": "PTS",
+        "pts_count": "PTS count",
+        "ttl_period": "Time To Live of the message, once message.date+message.ttl_period === time(), the message will be deleted on the server, and must be deleted locally as well."
+      }
+    },
+    "UpdateSmsJob": {
+      "desc": "A new SMS job was received",
+      "params": {
+        "job_id": "SMS job ID"
+      }
+    },
+    "UpdateStarsBalance": {
+      "desc": "The current account's Telegram Stars balance \u00bb has changed.",
+      "params": {
+        "balance": "New balance."
+      }
+    },
+    "UpdateStarsRevenueStatus": {
+      "desc": "The Telegram Star balance of a channel/bot we own has changed \u00bb.",
+      "params": {
+        "peer": "Channel/bot",
+        "status": "New Telegram Star balance."
+      }
+    },
+    "UpdateStickerSets": {
+      "desc": "Installed stickersets have changed, the client should refetch them as described in the docs.",
+      "params": {
+        "emojis": "Whether the list of installed custom emoji stickersets has changed",
+        "flags": "Flags, see TL conditional fields",
+        "masks": "Whether mask stickersets have changed"
+      }
+    },
+    "UpdateStickerSetsOrder": {
+      "desc": "The order of stickersets was changed",
+      "params": {
+        "emojis": "Whether the updated stickers are custom emoji stickers",
+        "flags": "Flags, see TL conditional fields",
+        "masks": "Whether the updated stickers are mask stickers",
+        "order": "New sticker order by sticker ID"
+      }
+    },
+    "UpdateStoriesStealthMode": {
+      "desc": "Indicates that stories stealth mode was activated.",
+      "params": {
+        "stealth_mode": "Information about the current stealth mode session."
+      }
+    },
+    "UpdateStory": {
+      "desc": "A new story was posted.",
+      "params": {
+        "peer": "ID of the poster.",
+        "story": "The story that was posted."
+      }
+    },
+    "UpdateStoryID": {
+      "desc": "A story was successfully uploaded.",
+      "params": {
+        "id": "The id that was attributed to the story.",
+        "random_id": "The random_id that was passed to stories.sendStory."
+      }
+    },
+    "UpdateTheme": {
+      "desc": "A cloud theme was updated",
+      "params": {
+        "theme": "Theme"
+      }
+    },
+    "UpdateTranscribeAudio": {
+      "desc": "",
+      "params": {}
+    },
+    "UpdateTranscribedAudio": {
+      "desc": "A pending voice message transcription \u00bb initiated with messages.transcribeAudio was updated.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "msg_id": "Transcribed message ID",
+        "peer": "Peer of the transcribed message",
+        "pending": "Whether this transcription is still pending and further updateTranscribedAudio about it will be sent in the future.",
+        "text": "Transcribed text",
+        "transcription_id": "Transcription ID"
+      }
+    },
+    "UpdateUser": {
+      "desc": "User (user and/or userFull) information was updated.",
+      "params": {
+        "user_id": "User ID"
+      }
+    },
+    "UpdateUserEmojiStatus": {
+      "desc": "The emoji status of a certain user has changed",
+      "params": {
+        "emoji_status": "New emoji status",
+        "user_id": "User ID"
+      }
+    },
+    "UpdateUserName": {
+      "desc": "Changes the user's first name, last name and username.",
+      "params": {
+        "first_name": "New first name. Corresponds to the new value of real_first_name field of the userFull constructor.",
+        "last_name": "New last name. Corresponds to the new value of real_last_name field of the userFull constructor.",
+        "user_id": "User identifier",
+        "usernames": "Usernames."
+      }
+    },
+    "UpdateUserPhone": {
+      "desc": "A user's phone number was changed",
+      "params": {
+        "phone": "New phone number",
+        "user_id": "User ID"
+      }
+    },
+    "UpdateUserStatus": {
+      "desc": "Contact status update.",
+      "params": {
+        "status": "New status",
+        "user_id": "User identifier"
+      }
+    },
+    "UpdateUserTyping": {
+      "desc": "The user is preparing a message; typing, recording, uploading, etc. This update is valid for 6 seconds. If no further updates of this kind are received after 6 seconds, it should be considered that the user stopped doing whatever they were doing",
+      "params": {
+        "action": "Action type",
+        "user_id": "User id"
+      }
+    },
+    "UpdateWebPage": {
+      "desc": "An instant view webpage preview was generated",
+      "params": {
+        "pts": "Event count after generation",
+        "pts_count": "Number of events that were generated",
+        "webpage": "Webpage preview"
+      }
+    },
+    "UpdateWebViewResultSent": {
+      "desc": "Indicates to a bot that a webview was closed and an inline message was sent on behalf of the user using messages.sendWebViewResultMessage",
+      "params": {
+        "query_id": "Web app interaction ID"
+      }
+    },
+    "Updates": {
+      "desc": "Full constructor of updates",
+      "params": {
+        "chats": "List of chats mentioned in updates",
+        "date": "Current date",
+        "seq": "Total number of sent updates",
+        "updates": "List of updates",
+        "users": "List of users mentioned in updates"
+      }
+    },
+    "UpdatesCombined": {
+      "desc": "Constructor for a group of updates.",
+      "params": {
+        "chats": "List of chats mentioned in updates",
+        "date": "Current date",
+        "seq": "Value seq for the latest update in a group",
+        "seq_start": "Value seq for the earliest update in a group",
+        "updates": "List of updates",
+        "users": "List of users mentioned in updates"
+      }
+    },
+    "UpdatesTooLong": {
+      "desc": "Too many updates, it is necessary to execute updates.getDifference.",
+      "params": {}
+    },
+    "UrlAuthResultAccepted": {
+      "desc": "Details about an accepted authorization request, for more info click here \u00bb",
+      "params": {
+        "url": "The URL name of the website on which the user has logged in."
+      }
+    },
+    "UrlAuthResultDefault": {
+      "desc": "Details about an accepted authorization request, for more info click here \u00bb",
+      "params": {}
+    },
+    "UrlAuthResultRequest": {
+      "desc": "Details about the authorization request, for more info click here \u00bb",
+      "params": {
+        "bot": "Username of a bot, which will be used for user authorization. If not specified, the current bot's username will be assumed. The url's domain must be the same as the domain linked with the bot. See Linking your domain to the bot for more details.",
+        "domain": "The domain name of the website on which the user will log in.",
+        "flags": "Flags, see TL conditional fields",
+        "request_write_access": "Whether the bot would like to send messages to the user"
+      }
+    },
+    "User": {
+      "desc": "Indicates info about a certain user.",
+      "params": {
+        "access_hash": "Access hash of the user, see here \u00bb for more info. If this flag is set, when updating the local peer database, generate a virtual flag called min_access_hash, which is: - Set to true if min is set AND -- The phone flag is not set OR -- The phone flag is set and the associated phone number string is non-empty - Set to false otherwise. Then, apply both access_hash and min_access_hash to the local database if: - min_access_hash is false OR - min_access_hash is true AND -- There is no locally cached object for this user OR -- There is no access_hash in the local cache OR -- The cached object's min_access_hash is also true If the final merged object stored to the database has the min_access_hash field set to true, the related access_hash is only suitable to use in inputPeerPhotoFileLocation \u00bb, to directly download the profile pictures of users, everywhere else a inputPeer*FromMessage constructor will have to be generated as specified here \u00bb. Bots can also use min access hashes in some conditions, by passing 0 instead of the min access hash.",
+        "apply_min_photo": "If set and min is set, the value of photo can be used to update the local database, see the documentation of that flag for more info.",
+        "attach_menu_enabled": "Whether we installed the attachment menu web app offered by this bot. When updating the local peer database, do not apply changes to this field if the min flag is set.",
+        "bot": "Is this user a bot? Changes to this flag should invalidate the local userFull cache for this user ID, see here \u00bb for more info.",
+        "bot_active_users": "Monthly Active Users (MAU) of this bot (may be absent for small bots).",
+        "bot_attach_menu": "Whether this bot offers an attachment menu web app",
+        "bot_business": "Whether this bot can be connected to a user as specified here \u00bb.",
+        "bot_can_edit": "Whether we can edit the profile picture, name, about text and description of this bot because we own it. When updating the local peer database, do not apply changes to this field if the min flag is set. Changes to this flag (if min is not set) should invalidate the local userFull cache for this user ID.",
+        "bot_chat_history": "Can the bot see all messages in groups?",
+        "bot_has_main_app": "If set, this bot has configured a Main Mini App \u00bb.",
+        "bot_info_version": "Version of the bot_info field in userFull, incremented every time it changes. Changes to this flag should invalidate the local userFull cache for this user ID, see here \u00bb for more info.",
+        "bot_inline_geo": "Whether the bot can request our geolocation in inline mode",
+        "bot_inline_placeholder": "Inline placeholder for this inline bot",
+        "bot_nochats": "Can the bot be added to groups?",
+        "bot_verification_icon": "Describes a bot verification icon \u00bb.",
+        "close_friend": "Whether we marked this user as a close friend, see here \u00bb for more info. When updating the local peer database, do not apply changes to this field if the min flag is set.",
+        "color": "The user's accent color.",
+        "contact": "Whether this user is a contact When updating the local peer database, do not apply changes to this field if the min flag is set.",
+        "contact_require_premium": "See here for more info on this flag \u00bb.",
+        "deleted": "Whether the account of this user was deleted. Changes to this flag should invalidate the local userFull cache for this user ID, see here \u00bb for more info.",
+        "emoji_status": "Emoji status",
+        "fake": "If set, this user was reported by many users as a fake or scam user: be careful when interacting with them.",
+        "first_name": "First name. When updating the local peer database, apply changes to this field only if: - The min flag is not set OR - The min flag is set AND -- The min flag of the locally cached user entry is set.",
+        "flags": "Flags, see TL conditional fields",
+        "flags2": "Flags, see TL conditional fields",
+        "id": "ID of the user, see here \u00bb for more info and the available ID range.",
+        "lang_code": "Language code of the user",
+        "last_name": "Last name. When updating the local peer database, apply changes to this field only if: - The min flag is not set OR - The min flag is set AND -- The min flag of the locally cached user entry is set.",
+        "min": "See min",
+        "mutual_contact": "Whether this user is a mutual contact. When updating the local peer database, do not apply changes to this field if the min flag is set.",
+        "phone": "Phone number. When updating the local peer database, apply changes to this field only if: - The min flag is not set OR - The min flag is set AND -- The min flag of the locally cached user entry is set.",
+        "photo": "Profile picture of user. When updating the local peer database, apply changes to this field only if: - The min flag is not set OR - The min flag is set AND -- The apply_min_photo flag is set OR -- The min flag of the locally cached user entry is set.",
+        "premium": "Whether this user is a Telegram Premium user Changes to this flag should invalidate the local userFull cache for this user ID, see here \u00bb for more info. Changes to this flag if the self flag is set should also trigger the following calls, to refresh the respective caches: - The help.getConfig cache - The messages.getTopReactions cache if the bot flag is not set",
+        "profile_color": "The user's profile color.",
+        "restricted": "Access to this user must be restricted for the reason specified in restriction_reason",
+        "restriction_reason": "Contains the reason why access to this user must be restricted.",
+        "scam": "This may be a scam user",
+        "self": "Whether this user indicates the currently logged in user",
+        "send_paid_messages_stars": "If set, the user has enabled paid messages \u00bb, we might need to pay the specified amount of Stars to send them messages, depending on the configured exceptions: check userFull.send_paid_messages_stars or users.getRequirementsToContact to see if the currently logged in user actually has to pay or not, see here \u00bb for the full flow.",
+        "status": "Online status of user. When updating the local peer database, apply changes to this field only if: - The min flag is not set OR - The min flag is set AND -- The min flag of the locally cached user entry is set OR -- The locally cached user entry is equal to userStatusEmpty.",
+        "stories_hidden": "Whether we have hidden \u00bb all active stories of this user. When updating the local peer database, do not apply changes to this field if the min flag is set.",
+        "stories_max_id": "ID of the maximum read story.  When updating the local peer database, do not apply changes to this field if the min flag of the incoming constructor is set.",
+        "stories_unavailable": "No stories from this user are visible.",
+        "support": "Whether this is an official support user",
+        "username": "Main active username. When updating the local peer database, apply changes to this field only if: - The min flag is not set OR - The min flag is set AND -- The min flag of the locally cached user entry is set. Changes to this flag should invalidate the local userFull cache for this user ID if the above conditions are respected and the bot_can_edit flag is also set.",
+        "usernames": "Additional usernames. When updating the local peer database, apply changes to this field only if: - The min flag is not set OR - The min flag is set AND -- The min flag of the locally cached user entry is set. Changes to this flag (if the above conditions are respected) should invalidate the local userFull cache for this user ID.",
+        "verified": "Whether this user is verified"
+      }
+    },
+    "UserEmpty": {
+      "desc": "Empty constructor, non-existent user.",
+      "params": {
+        "id": "User identifier or 0"
+      }
+    },
+    "UserFull": {
+      "desc": "Extended user info",
+      "params": {
+        "about": "Bio of the user",
+        "birthday": "Contains info about the user's birthday \u00bb.",
+        "blocked": "Whether you have blocked this user",
+        "blocked_my_stories_from": "Whether we've blocked this user, preventing them from seeing our stories \u00bb.",
+        "bot_broadcast_admin_rights": "A suggested set of administrator rights for the bot, to be shown when adding the bot as admin to a channel, see here for more info on how to handle them \u00bb.",
+        "bot_can_manage_emoji_status": "If set, this is a bot that can change our emoji status \u00bb",
+        "bot_group_admin_rights": "A suggested set of administrator rights for the bot, to be shown when adding the bot as admin to a group, see here for more info on how to handle them \u00bb.",
+        "bot_info": "For bots, info about the bot (bot commands, etc)",
+        "bot_verification": "Describes a bot verification icon \u00bb.",
+        "business_away_message": "Telegram Business away message \u00bb.",
+        "business_greeting_message": "Telegram Business greeting message \u00bb.",
+        "business_intro": "Specifies a custom Telegram Business profile introduction \u00bb.",
+        "business_location": "Telegram Business location \u00bb.",
+        "business_work_hours": "Telegram Business working hours \u00bb.",
+        "can_pin_message": "Whether you can pin messages in the chat with this user, you can do this only for a chat with yourself",
+        "can_view_revenue": "If set, this user can view ad revenue statistics \u00bb for this bot.",
+        "common_chats_count": "Chats in common with this user",
+        "contact_require_premium": "If set, we cannot write to this user: subscribe to Telegram Premium to get permission to write to this user. To set this flag for ourselves invoke account.setGlobalPrivacySettings, setting the settings.new_noncontact_peers_require_premium flag, see here \u00bb for more info.",
+        "disallowed_gifts": "Disallows the reception of specific gift types.",
+        "display_gifts_button": "If this flag is set for both us and another user (changed through globalPrivacySettings), a gift button should always be displayed in the text field in private chats with the other user: once clicked, the gift UI should be displayed, offering the user options to gift Telegram Premium \u00bb subscriptions or Telegram Gifts \u00bb.",
+        "fallback_photo": "Fallback profile photo, displayed if no photo is present in profile_photo or personal_photo, due to privacy settings.",
+        "flags": "Flags, see TL conditional fields",
+        "flags2": "Flags, see TL conditional fields",
+        "folder_id": "Peer folder ID, for more info click here",
+        "has_scheduled": "Whether scheduled messages are available",
+        "id": "User ID",
+        "main_tab": "The main tab for the user's profile, see here \u00bb for more info.",
+        "notify_settings": "Notification settings",
+        "personal_channel_id": "ID of the associated personal channel \u00bb, that should be shown in the profile page.",
+        "personal_channel_message": "ID of the latest message of the associated personal channel \u00bb, that should be previewed in the profile page.",
+        "personal_photo": "Personal profile photo, to be shown instead of profile_photo.",
+        "phone_calls_available": "Whether this user can make VoIP calls",
+        "phone_calls_private": "Whether this user's privacy settings allow you to call them",
+        "pinned_msg_id": "Message ID of the last pinned message",
+        "private_forward_name": "Anonymized text to be shown instead of the user's name on forwarded messages",
+        "profile_photo": "Profile photo",
+        "read_dates_private": "If set, we cannot fetch the exact read date of messages we send to this user using messages.getOutboxReadDate.  The exact read date of messages might still be unavailable for other reasons, see here \u00bb for more info.  To set this flag for ourselves invoke account.setGlobalPrivacySettings, setting the settings.hide_read_marks flag.",
+        "saved_music": "The first song on the music tab of the profile, see here \u00bb for more info on the music profile tab.",
+        "send_paid_messages_stars": "If set and bigger than 0, this user has enabled paid messages \u00bb and we must pay the specified amount of Stars to send messages to them, see here \u00bb for the full flow. If set and equal to 0, the user requires payment in general but we were exempted from paying for any of the reasons specified in the docs \u00bb.",
+        "settings": "Peer settings",
+        "sponsored_enabled": "Whether ads were re-enabled for the current account (only accessible to the currently logged-in user), see here \u00bb for more info.",
+        "stargifts_count": "Number of gifts the user has chosen to display on their profile",
+        "starref_program": "This bot has an active referral program \u00bb",
+        "stars_my_pending_rating": "Our pending star rating, only visible for ourselves.",
+        "stars_my_pending_rating_date": "When the pending star rating will be applied, only visible for ourselves.",
+        "stars_rating": "The user's star rating.",
+        "stories": "Active stories \u00bb",
+        "stories_pinned_available": "Whether this user has some pinned stories.",
+        "theme": "The chat theme associated with this user \u00bb.",
+        "translations_disabled": "Whether the real-time chat translation popup should be hidden.",
+        "ttl_period": "Time To Live of all messages in this chat; once a message is this many seconds old, it must be deleted.",
+        "video_calls_available": "Whether the user can receive video calls",
+        "voice_messages_forbidden": "Whether this user doesn't allow sending voice messages in a private chat with them",
+        "wallpaper": "Wallpaper to use in the private chat with the user.",
+        "wallpaper_overridden": "Whether the other user has chosen a custom wallpaper for us using messages.setChatWallPaper and the for_both flag, see here \u00bb for more info."
+      }
+    },
+    "UserProfilePhoto": {
+      "desc": "User profile photo.",
+      "params": {
+        "dc_id": "DC ID where the photo is stored",
+        "flags": "Flags, see TL conditional fields",
+        "has_video": "Whether an animated profile picture is available for this user",
+        "personal": "Whether this profile photo is only visible to us (i.e. it was set using photos.uploadContactProfilePhoto).",
+        "photo_id": "Identifier of the respective photo",
+        "stripped_thumb": "Stripped thumbnail"
+      }
+    },
+    "UserProfilePhotoEmpty": {
+      "desc": "Profile photo has not been set, or was hidden.",
+      "params": {}
+    },
+    "UserStatusEmpty": {
+      "desc": "User status has not been set yet.",
+      "params": {}
+    },
+    "UserStatusHidden": {
+      "desc": "",
+      "params": {}
+    },
+    "UserStatusLastMonth": {
+      "desc": "Online status: last seen last month",
+      "params": {
+        "by_me": "If set, the exact user status of this user is actually available to us, but to view it we must first purchase a Premium subscription, or allow this user to see our exact last online status. See here \u00bb for more info.",
+        "flags": "Flags, see TL conditional fields"
+      }
+    },
+    "UserStatusLastWeek": {
+      "desc": "Online status: last seen last week",
+      "params": {
+        "by_me": "If set, the exact user status of this user is actually available to us, but to view it we must first purchase a Premium subscription, or allow this user to see our exact last online status. See here \u00bb for more info.",
+        "flags": "Flags, see TL conditional fields"
+      }
+    },
+    "UserStatusOffline": {
+      "desc": "The user's offline status.",
+      "params": {
+        "was_online": "Time the user was last seen online"
+      }
+    },
+    "UserStatusOnline": {
+      "desc": "Online status of the user.",
+      "params": {
+        "expires": "Time to expiration of the current online status"
+      }
+    },
+    "UserStatusRecently": {
+      "desc": "Online status: last seen recently",
+      "params": {
+        "by_me": "If set, the exact user status of this user is actually available to us, but to view it we must first purchase a Premium subscription, or allow this user to see our exact last online status. See here \u00bb for more info.",
+        "flags": "Flags, see TL conditional fields"
+      }
+    },
+    "Username": {
+      "desc": "Contains information about a username.",
+      "params": {
+        "active": "Whether the username is active.",
+        "editable": "Whether the username is editable, meaning it wasn't bought on fragment.",
+        "flags": "Flags, see TL conditional fields",
+        "username": "The username."
+      }
+    },
+    "VideoSize": {
+      "desc": "An animated profile picture in MPEG4 format",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "h": "Video height",
+        "size": "File size",
+        "type": "u for animated profile pictures, and v for trimmed and downscaled video previews",
+        "video_start_ts": "Timestamp that should be shown as static preview to the user (seconds)",
+        "w": "Video width"
+      }
+    },
+    "VideoSizeEmojiMarkup": {
+      "desc": "An animated profile picture based on a custom emoji sticker.",
+      "params": {
+        "background_colors": "1, 2, 3 or 4 RBG-24 colors used to generate a solid (1), gradient (2) or freeform gradient (3, 4) background, similar to how fill wallpapers are generated. The rotation angle for gradient backgrounds is 0.",
+        "emoji_id": "Custom emoji ID: the custom emoji sticker is shown at the center of the profile picture and occupies at most 67% of it."
+      }
+    },
+    "VideoSizeStickerMarkup": {
+      "desc": "An animated profile picture based on a sticker.",
+      "params": {
+        "background_colors": "1, 2, 3 or 4 RBG-24 colors used to generate a solid (1), gradient (2) or freeform gradient (3, 4) background, similar to how fill wallpapers are generated. The rotation angle for gradient backgrounds is 0.",
+        "sticker_id": "Sticker ID",
+        "stickerset": "Stickerset"
+      }
+    },
+    "WallPaper": {
+      "desc": "Represents a wallpaper based on an image.",
+      "params": {
+        "access_hash": "Access hash",
+        "creator": "Whether we created this wallpaper",
+        "dark": "Whether this wallpaper should be used in dark mode.",
+        "default": "Whether this is the default wallpaper",
+        "document": "The actual wallpaper",
+        "flags": "Flags, see TL conditional fields",
+        "id": "Identifier",
+        "pattern": "Whether this is a pattern wallpaper \u00bb",
+        "settings": "Info on how to generate the wallpaper, according to these instructions \u00bb.",
+        "slug": "Unique wallpaper ID, used when generating wallpaper links or importing wallpaper links."
+      }
+    },
+    "WallPaperNoFile": {
+      "desc": "Represents a wallpaper only based on colors/gradients.",
+      "params": {
+        "dark": "Whether this wallpaper should be used in dark mode.",
+        "default": "Whether this is the default wallpaper",
+        "flags": "Flags, see TL conditional fields",
+        "id": "Wallpaper ID",
+        "settings": "Info on how to generate the wallpaper."
+      }
+    },
+    "WallPaperSettings": {
+      "desc": "Wallpaper rendering information.",
+      "params": {
+        "background_color": "Used for solid \u00bb, gradient \u00bb and freeform gradient \u00bb fills.",
+        "blur": "For image wallpapers \u00bb: if set, the JPEG must be downscaled to fit in 450x450 square and then box-blurred with radius 12.",
+        "emoticon": "If set, this wallpaper can be used as a channel wallpaper and is represented by the specified UTF-8 emoji.",
+        "flags": "Flags, see TL conditional fields",
+        "fourth_background_color": "Used for freeform gradient \u00bb fills.",
+        "intensity": "Used for pattern wallpapers \u00bb.",
+        "motion": "If set, the background needs to be slightly moved when the device is rotated.",
+        "rotation": "Clockwise rotation angle of the gradient, in degrees; 0-359. Should be always divisible by 45.",
+        "second_background_color": "Used for gradient \u00bb and freeform gradient \u00bb fills.",
+        "third_background_color": "Used for freeform gradient \u00bb fills."
+      }
+    },
+    "WebAuthorization": {
+      "desc": "Represents a bot logged in using the Telegram login widget",
+      "params": {
+        "bot_id": "Bot ID",
+        "browser": "Browser user-agent",
+        "date_active": "When was the web session last active",
+        "date_created": "When was the web session created",
+        "domain": "The domain name of the website on which the user has logged in.",
+        "hash": "Authorization hash",
+        "ip": "IP address",
+        "platform": "Platform",
+        "region": "Region, determined from IP address"
+      }
+    },
+    "WebDocument": {
+      "desc": "Remote document",
+      "params": {
+        "access_hash": "Access hash",
+        "attributes": "Attributes for media types",
+        "mime_type": "MIME type",
+        "size": "File size",
+        "url": "Document URL"
+      }
+    },
+    "WebDocumentNoProxy": {
+      "desc": "Remote document that can be downloaded without proxying through telegram",
+      "params": {
+        "attributes": "Attributes for media types",
+        "mime_type": "MIME type",
+        "size": "File size",
+        "url": "Document URL"
+      }
+    },
+    "WebPage": {
+      "desc": "Webpage preview",
+      "params": {
+        "attributes": "Webpage attributes",
+        "author": "Author of the content",
+        "cached_page": "Page contents in instant view format",
+        "description": "Content description",
+        "display_url": "Webpage URL to be displayed to the user",
+        "document": "Preview of the content as a media file",
+        "duration": "Duration of the content, in seconds",
+        "embed_height": "Height of the embedded preview",
+        "embed_type": "MIME type of the embedded preview, (e.g., text/html or video/mp4)",
+        "embed_url": "URL to show in the embedded preview",
+        "embed_width": "Width of the embedded preview",
+        "flags": "Flags, see TL conditional fields",
+        "has_large_media": "Whether the size of the media in the preview can be changed.",
+        "hash": "Hash used for caching, for more info click here",
+        "id": "Preview ID",
+        "photo": "Image representing the content",
+        "site_name": "Short name of the site (e.g., Google Docs, App Store)",
+        "title": "Title of the content",
+        "type": "Type of the web page. One of the following: - app- article- document- gif- photo- profile- telegram_album- telegram_background- telegram_bot- telegram_botapp- telegram_call- telegram_channel- telegram_channel_boost- telegram_channel_direct- telegram_channel_request- telegram_chat- telegram_chat_request- telegram_chatlist- telegram_collection- telegram_community- telegram_giftcode- telegram_group_boost- telegram_livestream- telegram_megagroup- telegram_megagroup_request- telegram_message- telegram_nft- telegram_stickerset- telegram_story- telegram_story_album- telegram_theme- telegram_user- telegram_videochat- telegram_voicechat- video",
+        "url": "URL of previewed webpage",
+        "video_cover_photo": "Represents a custom video cover."
+      }
+    },
+    "WebPageAttributeStarGiftCollection": {
+      "desc": "Contains info about a gift collection \u00bb for a webPage preview of a gift collection \u00bb (the webPage will have a type of telegram_collection).",
+      "params": {
+        "icons": "Gifts in the collection."
+      }
+    },
+    "WebPageAttributeStickerSet": {
+      "desc": "Contains info about a stickerset \u00bb, for a webPage preview of a stickerset deep link \u00bb (the webPage will have a type of telegram_stickerset).",
+      "params": {
+        "emojis": "Whether this i s a custom emoji stickerset.",
+        "flags": "Flags, see TL conditional fields",
+        "stickers": "A subset of the stickerset in the stickerset.",
+        "text_color": "Whether the color of this TGS custom emoji stickerset should be changed to the text color when used in messages, the accent color if used as emoji status, white on chat photos, or another appropriate color based on context."
+      }
+    },
+    "WebPageAttributeStory": {
+      "desc": "Webpage preview of a Telegram story",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "id": "Story ID",
+        "peer": "Peer that posted the story",
+        "story": "May contain the story, if not the story should be fetched when and if needed using stories.getStoriesByID with the above id and peer."
+      }
+    },
+    "WebPageAttributeTheme": {
+      "desc": "Page theme",
+      "params": {
+        "documents": "Theme files",
+        "flags": "Flags, see TL conditional fields",
+        "settings": "Theme settings"
+      }
+    },
+    "WebPageAttributeUniqueStarGift": {
+      "desc": "Contains info about collectible gift \u00bb for a webPage preview of a collectible gift \u00bb (the webPage will have a type of telegram_nft).",
+      "params": {
+        "gift": "The starGiftUnique constructor."
+      }
+    },
+    "WebPageEmpty": {
+      "desc": "No preview is available for the webpage",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "id": "Preview ID",
+        "url": "URL of the webpage."
+      }
+    },
+    "WebPageNotModified": {
+      "desc": "The preview of the webpage hasn't changed",
+      "params": {
+        "cached_page_views": "Page view count",
+        "flags": "Flags, see TL conditional fields"
+      }
+    },
+    "WebPagePending": {
+      "desc": "A preview of the webpage is currently being generated",
+      "params": {
+        "date": "When was the processing started",
+        "flags": "Flags, see TL conditional fields",
+        "id": "ID of preview",
+        "url": "URL of the webpage"
+      }
+    },
+    "WebPageUrlPending": {
+      "desc": "",
+      "params": {}
+    },
+    "WebViewMessageSent": {
+      "desc": "Info about a sent inline webview message",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "msg_id": "Message ID"
+      }
+    },
+    "WebViewResultUrl": {
+      "desc": "Contains the webview URL with appropriate theme and user info parameters added",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "fullscreen": "If set, the app must be opened in fullscreen",
+        "fullsize": "If set, the app must be opened in fullsize mode instead of compact mode.",
+        "query_id": "Webview session ID (only returned by inline button mini apps, menu button mini apps, attachment menu mini apps).",
+        "url": "Webview URL to open"
+      }
+    },
+    "account.AuthorizationForm": {
+      "desc": "Telegram Passport authorization form",
+      "params": {
+        "errors": "Telegram Passport errors",
+        "flags": "Flags, see TL conditional fields",
+        "privacy_policy_url": "URL of the service's privacy policy",
+        "required_types": "Required Telegram Passport documents",
+        "users": "Info about the bot to which the form will be submitted",
+        "values": "Already submitted Telegram Passport documents"
+      }
+    },
+    "account.Authorizations": {
+      "desc": "Logged-in sessions",
+      "params": {
+        "authorization_ttl_days": "Time-to-live of session",
+        "authorizations": "Logged-in sessions"
+      }
+    },
+    "account.AutoDownloadSettings": {
+      "desc": "Media autodownload settings",
+      "params": {
+        "high": "High data usage preset",
+        "low": "Low data usage preset",
+        "medium": "Medium data usage preset"
+      }
+    },
+    "account.AutoSaveSettings": {
+      "desc": "Contains media autosave settings",
+      "params": {
+        "broadcasts_settings": "Default media autosave settings for channels",
+        "chats": "Chats mentioned in the peer-specific granular autosave settings",
+        "chats_settings": "Default media autosave settings for groups and supergroups",
+        "exceptions": "Peer-specific granular autosave settings",
+        "users": "Users mentioned in the peer-specific granular autosave settings",
+        "users_settings": "Default media autosave settings for private chats"
+      }
+    },
+    "account.BusinessChatLinks": {
+      "desc": "Contains info about business chat deep links \u00bb created by the current account.",
+      "params": {
+        "chats": "Mentioned chats",
+        "links": "Links",
+        "users": "Mentioned users"
+      }
+    },
+    "account.ChatThemes": {
+      "desc": "Available chat themes",
+      "params": {
+        "chats": "Chats mentioned in the themes field.",
+        "flags": "Flags, see TL conditional fields",
+        "hash": "Hash to pass to the method that returned this constructor, to avoid refetching the result if it hasn't changed.",
+        "next_offset": "Next offset for pagination.",
+        "themes": "Themes.",
+        "users": "Users mentioned in the themes field."
+      }
+    },
+    "account.ChatThemesNotModified": {
+      "desc": "The available chat themes were not modified",
+      "params": {}
+    },
+    "account.ConnectedBots": {
+      "desc": "Info about currently connected business bots.",
+      "params": {
+        "connected_bots": "Info about the connected bots",
+        "users": "Bot information"
+      }
+    },
+    "account.ContentSettings": {
+      "desc": "Sensitive content settings",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "sensitive_can_change": "Whether the current client can change the sensitive content settings to view NSFW content",
+        "sensitive_enabled": "Whether viewing of sensitive (NSFW) content is enabled"
+      }
+    },
+    "account.EmailVerified": {
+      "desc": "The email was verified correctly.",
+      "params": {
+        "email": "The verified email address."
+      }
+    },
+    "account.EmailVerifiedLogin": {
+      "desc": "The email was verified correctly, and a login code was just sent to it.",
+      "params": {
+        "email": "The verified email address.",
+        "sent_code": "Info about the sent login code"
+      }
+    },
+    "account.EmojiStatuses": {
+      "desc": "A list of emoji statuses",
+      "params": {
+        "hash": "Hash used for caching, for more info click here",
+        "statuses": "Emoji statuses"
+      }
+    },
+    "account.EmojiStatusesNotModified": {
+      "desc": "The server-side list of emoji statuses hasn't changed",
+      "params": {}
+    },
+    "account.PaidMessagesRevenue": {
+      "desc": "Total number of non-refunded Telegram Stars a user has spent on sending us messages either directly or through a channel, see here \u00bb for more info on paid messages.",
+      "params": {
+        "stars_amount": "Amount in Stars."
+      }
+    },
+    "account.Password": {
+      "desc": "Configuration for two-factor authorization",
+      "params": {
+        "current_algo": "The KDF algorithm for SRP two-factor authentication of the current password",
+        "email_unconfirmed_pattern": "A password recovery email with the specified pattern is still awaiting verification",
+        "flags": "Flags, see TL conditional fields",
+        "has_password": "Whether the user has a password",
+        "has_recovery": "Whether the user has a recovery method configured",
+        "has_secure_values": "Whether telegram passport is enabled",
+        "hint": "Text hint for the password",
+        "login_email_pattern": "A verified login email with the specified pattern is configured",
+        "new_algo": "The KDF algorithm for SRP two-factor authentication to use when creating new passwords",
+        "new_secure_algo": "The KDF algorithm for telegram passport",
+        "pending_reset_date": "The 2FA password will be automatically removed at this date, unless the user cancels the operation",
+        "secure_random": "Secure random string",
+        "srp_B": "Srp B param for SRP authorization",
+        "srp_id": "Srp ID param for SRP authorization"
+      }
+    },
+    "account.PasswordInputSettings": {
+      "desc": "Settings for setting up a new password",
+      "params": {
+        "email": "Password recovery email",
+        "flags": "Flags, see TL conditional fields",
+        "hint": "Text hint for the password",
+        "new_algo": "The SRP algorithm to use",
+        "new_password_hash": "The computed password hash",
+        "new_secure_settings": "Telegram passport settings"
+      }
+    },
+    "account.PasswordSettings": {
+      "desc": "Private info associated to the password info (recovery email, telegram passport info & so on)",
+      "params": {
+        "email": "2FA Recovery email",
+        "flags": "Flags, see TL conditional fields",
+        "secure_settings": "Telegram passport settings"
+      }
+    },
+    "account.PrivacyRules": {
+      "desc": "Privacy rules",
+      "params": {
+        "chats": "Chats to which the rules apply",
+        "rules": "Privacy rules",
+        "users": "Users to which the rules apply"
+      }
+    },
+    "account.ResetPasswordFailedWait": {
+      "desc": "You recently requested a password reset that was canceled, please wait until the specified date before requesting another reset.",
+      "params": {
+        "retry_date": "Wait until this date before requesting another reset."
+      }
+    },
+    "account.ResetPasswordOk": {
+      "desc": "The 2FA password was reset successfully.",
+      "params": {}
+    },
+    "account.ResetPasswordRequestedWait": {
+      "desc": "You successfully requested a password reset, please wait until the specified date before finalizing the reset.",
+      "params": {
+        "until_date": "Wait until this date before finalizing the reset."
+      }
+    },
+    "account.ResolvedBusinessChatLinks": {
+      "desc": "Contains info about a single resolved business chat deep link \u00bb.",
+      "params": {
+        "chats": "Mentioned chats",
+        "entities": "Message entities for styled text",
+        "flags": "Flags, see TL conditional fields",
+        "message": "Message to pre-fill in the message input field.",
+        "peer": "Destination peer",
+        "users": "Mentioned users"
+      }
+    },
+    "account.SavedMusicIds": {
+      "desc": "List of IDs of songs (document.ids) currently pinned on our profile, see here \u00bb for more info.",
+      "params": {
+        "ids": "Full list of document.ids"
+      }
+    },
+    "account.SavedMusicIdsNotModified": {
+      "desc": "The list of IDs of songs (document.ids) currently pinned on our profile hasn't changed.",
+      "params": {}
+    },
+    "account.SavedRingtone": {
+      "desc": "The notification sound was already in MP3 format and was saved without any modification",
+      "params": {}
+    },
+    "account.SavedRingtoneConverted": {
+      "desc": "The notification sound was not in MP3 format and was successfully converted and saved, use the returned Document to refer to the notification sound from now on",
+      "params": {
+        "document": "The converted notification sound"
+      }
+    },
+    "account.SavedRingtones": {
+      "desc": "A list of saved notification sounds",
+      "params": {
+        "hash": "Hash used for caching, for more info click here",
+        "ringtones": "Saved notification sounds"
+      }
+    },
+    "account.SavedRingtonesNotModified": {
+      "desc": "The notification sound list hasn't changed.",
+      "params": {}
+    },
+    "account.SentEmailCode": {
+      "desc": "The sent email code",
+      "params": {
+        "email_pattern": "The email (to which the code was sent) must match this pattern",
+        "length": "The length of the verification code"
+      }
+    },
+    "account.Takeout": {
+      "desc": "Takeout info",
+      "params": {
+        "id": "Takeout ID"
+      }
+    },
+    "account.Themes": {
+      "desc": "Installed themes",
+      "params": {
+        "hash": "Hash used for caching, for more info click here",
+        "themes": "Themes"
+      }
+    },
+    "account.ThemesNotModified": {
+      "desc": "No new themes were installed",
+      "params": {}
+    },
+    "account.TmpPassword": {
+      "desc": "Temporary payment password",
+      "params": {
+        "tmp_password": "Temporary password",
+        "valid_until": "Validity period"
+      }
+    },
+    "account.WallPapers": {
+      "desc": "Installed wallpapers",
+      "params": {
+        "hash": "Hash used for caching, for more info click here",
+        "wallpapers": "Wallpapers"
+      }
+    },
+    "account.WallPapersNotModified": {
+      "desc": "No new wallpapers were found",
+      "params": {}
+    },
+    "account.WebAuthorizations": {
+      "desc": "Web authorizations",
+      "params": {
+        "authorizations": "Web authorization list",
+        "users": "Users"
+      }
+    },
+    "auth.Authorization": {
+      "desc": "Contains user authorization info.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "future_auth_token": "A future auth token",
+        "otherwise_relogin_days": "If and only if setup_password_required is set and the user declines to set a 2-step verification password, they will be able to log into their account via SMS again only after this many days pass.",
+        "setup_password_required": "Suggests the user to set up a 2-step verification password to be able to log in again",
+        "tmp_sessions": "Temporary passport sessions",
+        "user": "Info on authorized user"
+      }
+    },
+    "auth.AuthorizationSignUpRequired": {
+      "desc": "An account with this phone number doesn't exist on telegram: the user has to enter basic information and sign up",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "terms_of_service": "Telegram's terms of service: the user must read and accept the terms of service before signing up to telegram"
+      }
+    },
+    "auth.CodeTypeCall": {
+      "desc": "The next time, the authentication code is to be delivered via an outgoing phone call.",
+      "params": {}
+    },
+    "auth.CodeTypeFlashCall": {
+      "desc": "The next time, the authentication code will be delivered via an immediately canceled incoming call.",
+      "params": {}
+    },
+    "auth.CodeTypeFragmentSms": {
+      "desc": "The next time, the authentication code will be delivered via fragment.com",
+      "params": {}
+    },
+    "auth.CodeTypeMissedCall": {
+      "desc": "The next time, the authentication code will be delivered via an immediately canceled incoming call, handled manually by the user.",
+      "params": {}
+    },
+    "auth.CodeTypeSms": {
+      "desc": "The next time, the authentication code will be delivered via an immediately canceled incoming call.",
+      "params": {}
+    },
+    "auth.ExportedAuthorization": {
+      "desc": "Data for copying of authorization between data centers.",
+      "params": {
+        "bytes": "authorizes key",
+        "id": "current user identifier"
+      }
+    },
+    "auth.LoggedOut": {
+      "desc": "Future auth token \u00bb to be used on subsequent authorizations",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "future_auth_token": "Future auth token \u00bb to be used on subsequent authorizations"
+      }
+    },
+    "auth.LoginToken": {
+      "desc": "Login token (for QR code login)",
+      "params": {
+        "expires": "Expiration date of QR code",
+        "token": "Token to render in QR code"
+      }
+    },
+    "auth.LoginTokenMigrateTo": {
+      "desc": "Repeat the query to the specified DC",
+      "params": {
+        "dc_id": "DC ID",
+        "token": "Token to use for login"
+      }
+    },
+    "auth.LoginTokenSuccess": {
+      "desc": "Login via token (QR code) succeeded!",
+      "params": {
+        "authorization": "Authorization info"
+      }
+    },
+    "auth.PasswordRecovery": {
+      "desc": "Recovery info of a 2FA password, only for accounts with a recovery email configured.",
+      "params": {
+        "email_pattern": "The email to which the recovery code was sent must match this pattern."
+      }
+    },
+    "auth.SentCode": {
+      "desc": "Contains info about a sent verification code.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "next_type": "Phone code type that will be sent next, if the phone code is not received within timeout seconds: to send it use auth.resendCode",
+        "phone_code_hash": "Phone code hash, to be stored and later re-used with auth.signIn",
+        "timeout": "Timeout for reception of the phone code",
+        "type": "Phone code type"
+      }
+    },
+    "auth.SentCodePaymentRequired": {
+      "desc": "Official apps may receive this constructor, indicating that due to the high cost of SMS verification codes for the user's country/provider, the user must purchase a Telegram Premium subscription in order to proceed with the login/signup.",
+      "params": {
+        "phone_code_hash": "Phone code hash, to be stored and later re-used with auth.signIn",
+        "store_product": "Store identifier of the Telegram Premium subscription.",
+        "support_email_address": "An email address that can be contacted for more information about this request.",
+        "support_email_subject": "The mandatory subject for the email."
+      }
+    },
+    "auth.SentCodeSuccess": {
+      "desc": "The user successfully authorized using future auth tokens",
+      "params": {
+        "authorization": "Authorization info"
+      }
+    },
+    "auth.SentCodeTypeApp": {
+      "desc": "The code was sent through the telegram app",
+      "params": {
+        "length": "Length of the code in bytes"
+      }
+    },
+    "auth.SentCodeTypeCall": {
+      "desc": "The code will be sent via a phone call: a synthesized voice will tell the user which verification code to input.",
+      "params": {
+        "length": "Length of the verification code"
+      }
+    },
+    "auth.SentCodeTypeEmailCode": {
+      "desc": "The code was sent via the previously configured login email \u00bb",
+      "params": {
+        "apple_signin_allowed": "Whether authorization through Apple ID is allowed",
+        "email_pattern": "Pattern of the email",
+        "flags": "Flags, see TL conditional fields",
+        "google_signin_allowed": "Whether authorization through Google ID is allowed",
+        "length": "Length of the sent verification code",
+        "reset_available_period": "Clients should wait for the specified amount of seconds before allowing the user to invoke auth.resetLoginEmail (will be 0 for Premium users).",
+        "reset_pending_date": "An email reset was already requested, and will occur at the specified date."
+      }
+    },
+    "auth.SentCodeTypeFirebaseSms": {
+      "desc": "An authentication code should be delivered via SMS after Firebase attestation, as described in the auth documentation \u00bb.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "length": "Length of the code that will be delivered.",
+        "nonce": "On Android, the nonce to be used as described in the auth documentation \u00bb",
+        "play_integrity_nonce": "Play Integrity API nonce",
+        "play_integrity_project_id": "Google Play Integrity project ID",
+        "push_timeout": "On iOS: if a push notification with the ios_push_secret isn't received within push_timeout seconds, the next_type authentication method must be used, with auth.resendCode.",
+        "receipt": "On iOS, must be compared with the receipt extracted from the received push notification."
+      }
+    },
+    "auth.SentCodeTypeFlashCall": {
+      "desc": "The code will be sent via a flash phone call, that will be closed immediately. The phone code will then be the phone number itself, just make sure that the phone number matches the specified pattern.",
+      "params": {
+        "pattern": "pattern to match"
+      }
+    },
+    "auth.SentCodeTypeFragmentSms": {
+      "desc": "The code was delivered via fragment.com.",
+      "params": {
+        "length": "Length of the delivered code.",
+        "url": "Open the specified URL to log into fragment.com with the wallet that owns the specified phone number and view the code."
+      }
+    },
+    "auth.SentCodeTypeMissedCall": {
+      "desc": "The code will be sent via a flash phone call, that will be closed immediately. The last digits of the phone number that calls are the code that must be entered manually by the user.",
+      "params": {
+        "length": "Length of the verification code",
+        "prefix": "Prefix of the phone number from which the call will be made"
+      }
+    },
+    "auth.SentCodeTypeSetUpEmailRequired": {
+      "desc": "The user should add and verify an email address in order to login as described here \u00bb.",
+      "params": {
+        "apple_signin_allowed": "Whether authorization through Apple ID is allowed",
+        "flags": "Flags, see TL conditional fields",
+        "google_signin_allowed": "Whether authorization through Google ID is allowed"
+      }
+    },
+    "auth.SentCodeTypeSms": {
+      "desc": "The code was sent via SMS",
+      "params": {
+        "length": "Length of the code in bytes"
+      }
+    },
+    "auth.SentCodeTypeSmsPhrase": {
+      "desc": "The code was sent via SMS as a secret phrase starting with the word specified in beginning",
+      "params": {
+        "beginning": "If set, the secret phrase (and the SMS) starts with this word.",
+        "flags": "Flags, see TL conditional fields"
+      }
+    },
+    "auth.SentCodeTypeSmsWord": {
+      "desc": "The code was sent via SMS as a secret word, starting with the letter specified in beginning",
+      "params": {
+        "beginning": "If set, the secret word in the sent SMS (which may contain multiple words) starts with this letter.",
+        "flags": "Flags, see TL conditional fields"
+      }
+    },
+    "bots.BotInfo": {
+      "desc": "Localized information about a bot.",
+      "params": {
+        "about": "Bot about text",
+        "description": "Bot description",
+        "name": "Bot name"
+      }
+    },
+    "bots.PopularAppBots": {
+      "desc": "Popular Main Mini Apps, to be used in the apps tab of global search \u00bb.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "next_offset": "Offset for pagination.",
+        "users": "The bots associated to each Main Mini App, see here \u00bb for more info."
+      }
+    },
+    "bots.PreviewInfo": {
+      "desc": "Contains info about Main Mini App previews, see here \u00bb for more info.",
+      "params": {
+        "lang_codes": "All available language codes for which preview medias were uploaded (regardless of the language code passed to bots.getPreviewInfo).",
+        "media": "All preview medias for the language code passed to bots.getPreviewInfo."
+      }
+    },
+    "channels.AdminLogResults": {
+      "desc": "Admin log events",
+      "params": {
+        "chats": "Chats mentioned in events",
+        "events": "Admin log events",
+        "users": "Users mentioned in events"
+      }
+    },
+    "channels.ChannelParticipant": {
+      "desc": "Represents a channel participant",
+      "params": {
+        "chats": "Mentioned chats",
+        "participant": "The channel participant",
+        "users": "Users"
+      }
+    },
+    "channels.ChannelParticipants": {
+      "desc": "Represents multiple channel participants",
+      "params": {
+        "chats": "Mentioned chats",
+        "count": "Total number of participants that correspond to the given query",
+        "participants": "Participants",
+        "users": "Users mentioned in participant info"
+      }
+    },
+    "channels.ChannelParticipantsNotModified": {
+      "desc": "No new participant info could be found",
+      "params": {}
+    },
+    "channels.SendAsPeers": {
+      "desc": "A list of peers that can be used to send messages in a specific group",
+      "params": {
+        "chats": "Mentioned chats",
+        "peers": "Peers that can be used to send messages to the group",
+        "users": "Mentioned users"
+      }
+    },
+    "channels.SponsoredMessageReportResultAdsHidden": {
+      "desc": "Sponsored messages were hidden for the user in all chats.",
+      "params": {}
+    },
+    "channels.SponsoredMessageReportResultChooseOption": {
+      "desc": "The user must choose a report option from the localized options available in options, and after selection, channels.reportSponsoredMessage must be invoked again, passing the option's option field to the option param of the method.",
+      "params": {
+        "options": "Localized list of options.",
+        "title": "Title of the option selection popup."
+      }
+    },
+    "channels.SponsoredMessageReportResultReported": {
+      "desc": "The sponsored message was reported successfully.",
+      "params": {}
+    },
+    "chatlists.ChatlistInvite": {
+      "desc": "Info about a chat folder deep link \u00bb.",
+      "params": {
+        "chats": "Related chat information",
+        "emoticon": "Emoji to use as icon for the folder.",
+        "flags": "Flags, see TL conditional fields",
+        "peers": "Supergroups and channels to join",
+        "title": "Name of the link",
+        "title_noanimate": "If set, any animated emojis present in title should not be animated and should be instead frozen on the first frame.",
+        "users": "Related user information"
+      }
+    },
+    "chatlists.ChatlistInviteAlready": {
+      "desc": "Updated info about a chat folder deep link \u00bb we already imported.",
+      "params": {
+        "already_peers": "Peers that were already imported",
+        "chats": "Related chat information",
+        "filter_id": "ID of the imported folder",
+        "missing_peers": "New peers to be imported",
+        "users": "Related user information"
+      }
+    },
+    "chatlists.ChatlistUpdates": {
+      "desc": "Updated information about a chat folder deep link \u00bb.",
+      "params": {
+        "chats": "Related chat information",
+        "missing_peers": "New peers to join",
+        "users": "Related user information"
+      }
+    },
+    "chatlists.ExportedChatlistInvite": {
+      "desc": "Info about an exported chat folder deep link \u00bb.",
+      "params": {
+        "filter": "Folder ID",
+        "invite": "The exported chat folder deep link \u00bb."
+      }
+    },
+    "chatlists.ExportedInvites": {
+      "desc": "Info about multiple chat folder deep links \u00bb.",
+      "params": {
+        "chats": "Related chat information",
+        "invites": "The chat folder deep links \u00bb.",
+        "users": "Related user information"
+      }
+    },
+    "contacts.Blocked": {
+      "desc": "Full list of blocked users.",
+      "params": {
+        "blocked": "List of blocked users",
+        "chats": "Blocked chats",
+        "users": "List of users"
+      }
+    },
+    "contacts.BlockedSlice": {
+      "desc": "Incomplete list of blocked users.",
+      "params": {
+        "blocked": "List of blocked users",
+        "chats": "Blocked chats",
+        "count": "Total number of elements in the list",
+        "users": "List of users"
+      }
+    },
+    "contacts.ContactBirthdays": {
+      "desc": "Birthday information of our contacts.",
+      "params": {
+        "contacts": "Birthday info",
+        "users": "User information"
+      }
+    },
+    "contacts.Contacts": {
+      "desc": "The current user's contact list and info on users.",
+      "params": {
+        "contacts": "Contact list",
+        "saved_count": "Number of contacts that were saved successfully",
+        "users": "User list"
+      }
+    },
+    "contacts.ContactsNotModified": {
+      "desc": "Contact list on the server is the same as the list on the client.",
+      "params": {}
+    },
+    "contacts.Found": {
+      "desc": "Users found by name substring and auxiliary data.",
+      "params": {
+        "chats": "Found chats",
+        "my_results": "Personalized results",
+        "results": "List of found user identifiers",
+        "users": "List of users"
+      }
+    },
+    "contacts.ImportedContacts": {
+      "desc": "Info on successfully imported contacts.",
+      "params": {
+        "imported": "List of successfully imported contacts",
+        "popular_invites": "Popular contacts",
+        "retry_contacts": "List of contact ids that could not be imported due to system limitation and will need to be imported at a later date.",
+        "users": "List of users"
+      }
+    },
+    "contacts.ResolvedPeer": {
+      "desc": "Resolved peer",
+      "params": {
+        "chats": "Chats",
+        "peer": "The peer",
+        "users": "Users"
+      }
+    },
+    "contacts.SponsoredPeers": {
+      "desc": "Sponsored peers.",
+      "params": {
+        "chats": "Info about sponsored chats and channels",
+        "peers": "Sponsored peers.",
+        "users": "Info about sponsored users"
+      }
+    },
+    "contacts.SponsoredPeersEmpty": {
+      "desc": "There are no sponsored peers for this query.",
+      "params": {}
+    },
+    "contacts.TopPeers": {
+      "desc": "Top peers",
+      "params": {
+        "categories": "Top peers by top peer category",
+        "chats": "Chats",
+        "users": "Users"
+      }
+    },
+    "contacts.TopPeersDisabled": {
+      "desc": "Top peers disabled",
+      "params": {}
+    },
+    "contacts.TopPeersNotModified": {
+      "desc": "Top peer info hasn't changed",
+      "params": {}
+    },
+    "fragment.CollectibleInfo": {
+      "desc": "Info about a fragment collectible.",
+      "params": {
+        "amount": "Total price in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).",
+        "crypto_amount": "Price, in the smallest units of the cryptocurrency.",
+        "crypto_currency": "Cryptocurrency name.",
+        "currency": "Three-letter ISO 4217 currency code for amount",
+        "purchase_date": "Purchase date (unixtime)",
+        "url": "Fragment URL with more info about the collectible"
+      }
+    },
+    "help.AppConfig": {
+      "desc": "Contains various client configuration parameters",
+      "params": {
+        "config": "Client configuration parameters",
+        "hash": "Hash used for caching, for more info click here"
+      }
+    },
+    "help.AppConfigNotModified": {
+      "desc": "The client configuration parameters haven't changed",
+      "params": {}
+    },
+    "help.AppUpdate": {
+      "desc": "An update is available for the application.",
+      "params": {
+        "can_not_skip": "Unskippable, the new info must be shown to the user (with a popup or something else)",
+        "document": "Application binary",
+        "entities": "Message entities for styled text",
+        "flags": "Flags, see TL conditional fields",
+        "id": "Update ID",
+        "sticker": "Associated sticker",
+        "text": "Text description of the update",
+        "url": "Application download URL",
+        "version": "New version name"
+      }
+    },
+    "help.CountriesList": {
+      "desc": "Name, ISO code, localized name and phone codes/patterns of all available countries",
+      "params": {
+        "countries": "Name, ISO code, localized name and phone codes/patterns of all available countries",
+        "hash": "Hash used for caching, for more info click here"
+      }
+    },
+    "help.CountriesListNotModified": {
+      "desc": "The country list has not changed",
+      "params": {}
+    },
+    "help.Country": {
+      "desc": "Name, ISO code, localized name and phone codes/patterns of a specific country",
+      "params": {
+        "country_codes": "Phone codes/patterns",
+        "default_name": "Name of the country in the country's language",
+        "flags": "Flags, see TL conditional fields",
+        "hidden": "Whether this country should not be shown in the list",
+        "iso2": "ISO code of country",
+        "name": "Name of the country in the user's language, if different from the original name"
+      }
+    },
+    "help.CountryCode": {
+      "desc": "Country code and phone number pattern of a specific country",
+      "params": {
+        "country_code": "ISO country code",
+        "flags": "Flags, see TL conditional fields",
+        "patterns": "Phone patterns: for example, XXX XXX XXX",
+        "prefixes": "Possible phone prefixes"
+      }
+    },
+    "help.DeepLinkInfo": {
+      "desc": "Deep link info, see the here for more details",
+      "params": {
+        "entities": "Message entities for styled text",
+        "flags": "Flags, see TL conditional fields",
+        "message": "Message to show to the user",
+        "update_app": "An update of the app is required to parse this link"
+      }
+    },
+    "help.DeepLinkInfoEmpty": {
+      "desc": "Deep link info empty",
+      "params": {}
+    },
+    "help.InviteText": {
+      "desc": "Text of a text message with an invitation to install Telegram.",
+      "params": {
+        "message": "Text of the message"
+      }
+    },
+    "help.NoAppUpdate": {
+      "desc": "No updates are available for the application.",
+      "params": {}
+    },
+    "help.PassportConfig": {
+      "desc": "Telegram passport configuration",
+      "params": {
+        "countries_langs": "Localization",
+        "hash": "Hash used for caching, for more info click here"
+      }
+    },
+    "help.PassportConfigNotModified": {
+      "desc": "Password configuration not modified",
+      "params": {}
+    },
+    "help.PeerColorOption": {
+      "desc": "Contains info about a color palette \u00bb.",
+      "params": {
+        "channel_min_level": "Channels can use this palette only after reaching at least the boost level specified in this field.",
+        "color_id": "Palette ID.",
+        "colors": "Light mode palette. Will be empty for IDs 0 to 6 inclusive, in which case a palette containing a single color from the following colors should be used: red, orange, violet, green, cyan, blue, pink for indexes 0 to 6 (i.e. the same colors used for randomized fallback message accent colors).",
+        "dark_colors": "Dark mode palette. Optional, defaults to the palette in colors (or the autogenerated palette for IDs 0 to 6) if absent.",
+        "flags": "Flags, see TL conditional fields",
+        "group_min_level": "Supergroups can use this palette only after reaching at least the boost level specified in this field.",
+        "hidden": "Whether this palette should not be displayed as an option to the user when choosing a palette to apply to profile pages or message accents."
+      }
+    },
+    "help.PeerColorProfileSet": {
+      "desc": "Represents a color palette that can be used in profile pages \u00bb.",
+      "params": {
+        "bg_colors": "A list of 1-2 colors in RGB format describing the colors used to generate the actual background used in the profile page.",
+        "palette_colors": "A list of 1-2 colors in RGB format, shown in the color palette settings to describe the current palette.",
+        "story_colors": "A list of 2 colors in RGB format describing the colors of the gradient used for the unread active story indicator around the profile photo."
+      }
+    },
+    "help.PeerColorSet": {
+      "desc": "Represents a color palette that can be used in message accents \u00bb.",
+      "params": {
+        "colors": "A list of 1-3 colors in RGB format, describing the accent color."
+      }
+    },
+    "help.PeerColors": {
+      "desc": "Contains info about multiple color palettes \u00bb.",
+      "params": {
+        "colors": "Usable color palettes.",
+        "hash": "Hash used for caching, for more info click here"
+      }
+    },
+    "help.PeerColorsNotModified": {
+      "desc": "The list of color palettes has not changed.",
+      "params": {}
+    },
+    "help.PremiumPromo": {
+      "desc": "Telegram Premium promotion information",
+      "params": {
+        "period_options": "Telegram Premium subscription options",
+        "status_entities": "Message entities for styled text",
+        "status_text": "Description of the current state of the user's Telegram Premium subscription",
+        "users": "Related user information",
+        "video_sections": "A list of premium feature identifiers \u00bb, associated to each video",
+        "videos": "A list of videos"
+      }
+    },
+    "help.PromoData": {
+      "desc": "A set of useful suggestions and a PSA/MTProxy sponsored peer, see here \u00bb for more info.",
+      "params": {
+        "chats": "Chat info",
+        "custom_pending_suggestion": "Contains a list of custom pending suggestions \u00bb.",
+        "dismissed_suggestions": "Contains a list of inverted suggestions \u00bb.",
+        "expires": "Unixtime when to re-invoke help.getPromoData.",
+        "flags": "Flags, see TL conditional fields",
+        "peer": "MTProxy/PSA peer",
+        "pending_suggestions": "Contains a list of pending suggestions \u00bb.",
+        "proxy": "Set when connecting using an MTProxy that has configured an associated peer (that will be passed in peer, i.e. the channel that sponsored the MTProxy) that should be pinned on top of the chat list.",
+        "psa_message": "For Public Service Announcement peers, contains the PSA itself.",
+        "psa_type": "For Public Service Announcement peers, indicates the type of the PSA.",
+        "users": "User info"
+      }
+    },
+    "help.PromoDataEmpty": {
+      "desc": "No PSA/MTProxy info is available",
+      "params": {
+        "expires": "Re-fetch PSA/MTProxy info after the specified number of seconds"
+      }
+    },
+    "help.RecentMeUrls": {
+      "desc": "Recent t.me URLs",
+      "params": {
+        "chats": "Chats",
+        "urls": "URLs",
+        "users": "Users"
+      }
+    },
+    "help.Support": {
+      "desc": "Info on support user.",
+      "params": {
+        "phone_number": "Phone number",
+        "user": "User"
+      }
+    },
+    "help.SupportName": {
+      "desc": "Localized name for telegram support",
+      "params": {
+        "name": "Localized name"
+      }
+    },
+    "help.TermsOfService": {
+      "desc": "Info about the latest telegram Terms Of Service",
+      "params": {
+        "entities": "Message entities for styled text",
+        "flags": "Flags, see TL conditional fields",
+        "id": "ID of the new terms",
+        "min_age_confirm": "Minimum age required to sign up to telegram, the user must confirm that they is older than the minimum age.",
+        "popup": "Whether a prompt must be showed to the user, in order to accept the new terms.",
+        "text": "Text of the new terms"
+      }
+    },
+    "help.TermsOfServiceUpdate": {
+      "desc": "Info about an update of telegram's terms of service. If the terms of service are declined, then the account.deleteAccount method should be called with the reason \"Decline ToS update\"",
+      "params": {
+        "expires": "New TOS updates will have to be queried using help.getTermsOfServiceUpdate in expires seconds",
+        "terms_of_service": "New terms of service"
+      }
+    },
+    "help.TermsOfServiceUpdateEmpty": {
+      "desc": "No changes were made to telegram's terms of service",
+      "params": {
+        "expires": "New TOS updates will have to be queried using help.getTermsOfServiceUpdate in expires seconds"
+      }
+    },
+    "help.TimezonesList": {
+      "desc": "Timezone information that may be used elsewhere in the API, such as to set Telegram Business opening hours \u00bb.",
+      "params": {
+        "hash": "Hash used for caching, for more info click here",
+        "timezones": "Timezones"
+      }
+    },
+    "help.TimezonesListNotModified": {
+      "desc": "The timezone list has not changed.",
+      "params": {}
+    },
+    "help.UserInfo": {
+      "desc": "Internal use",
+      "params": {
+        "author": "Author",
+        "date": "Date",
+        "entities": "Message entities for styled text",
+        "message": "Info"
+      }
+    },
+    "help.UserInfoEmpty": {
+      "desc": "Internal use",
+      "params": {}
+    },
+    "messages.AffectedFoundMessages": {
+      "desc": "Messages found and affected by changes",
+      "params": {
+        "messages": "Affected message IDs",
+        "offset": "If bigger than zero, the request must be repeated to remove more messages",
+        "pts": "Event count after generation",
+        "pts_count": "Number of events that were generated"
+      }
+    },
+    "messages.AffectedHistory": {
+      "desc": "Affected part of communication history with the user or in a chat.",
+      "params": {
+        "offset": "If a parameter contains positive value, it is necessary to repeat the method call using the given value; during the proceeding of all the history the value itself shall gradually decrease",
+        "pts": "Number of events occurred in a text box",
+        "pts_count": "Number of affected events"
+      }
+    },
+    "messages.AffectedMessages": {
+      "desc": "Events affected by operation",
+      "params": {
+        "pts": "Event count after generation",
+        "pts_count": "Number of events that were generated"
+      }
+    },
+    "messages.AllStickers": {
+      "desc": "Info about all installed stickers",
+      "params": {
+        "hash": "Hash used for caching, for more info click here",
+        "sets": "All stickersets"
+      }
+    },
+    "messages.AllStickersNotModified": {
+      "desc": "Info about all installed stickers hasn't changed",
+      "params": {}
+    },
+    "messages.ArchivedStickers": {
+      "desc": "Archived stickersets",
+      "params": {
+        "count": "Number of archived stickers",
+        "sets": "Archived stickersets"
+      }
+    },
+    "messages.AvailableEffects": {
+      "desc": "The full list of usable animated message effects \u00bb.",
+      "params": {
+        "documents": "Documents specified in the effects constructors.",
+        "effects": "Message effects",
+        "hash": "Hash used for caching, for more info click here"
+      }
+    },
+    "messages.AvailableEffectsNotModified": {
+      "desc": "The full list of usable animated message effects \u00bb hasn't changed.",
+      "params": {}
+    },
+    "messages.AvailableReactions": {
+      "desc": "Animations and metadata associated with message reactions \u00bb",
+      "params": {
+        "hash": "Hash used for caching, for more info click here",
+        "reactions": "Animations and metadata associated with message reactions \u00bb"
+      }
+    },
+    "messages.AvailableReactionsNotModified": {
+      "desc": "No new reactions are available",
+      "params": {}
+    },
+    "messages.BotApp": {
+      "desc": "Contains information about a direct link Mini App",
+      "params": {
+        "app": "Bot app information",
+        "flags": "Flags, see TL conditional fields",
+        "has_settings": "Deprecated flag, can be ignored.",
+        "inactive": "Whether the web app was never used by the user, and confirmation must be asked from the user before opening it.",
+        "request_write_access": "The bot is asking permission to send messages to the user: if the user agrees, set the write_allowed flag when invoking messages.requestAppWebView."
+      }
+    },
+    "messages.BotCallbackAnswer": {
+      "desc": "Callback answer sent by the bot in response to a button press",
+      "params": {
+        "alert": "Whether an alert should be shown to the user instead of a toast notification",
+        "cache_time": "For how long should this answer be cached",
+        "flags": "Flags, see TL conditional fields",
+        "has_url": "Whether an URL is present",
+        "message": "Alert to show",
+        "native_ui": "Whether to show games in WebView or in native UI.",
+        "url": "URL to open"
+      }
+    },
+    "messages.BotPreparedInlineMessage": {
+      "desc": "Represents a prepared inline message saved by a bot, to be sent to the user via a web app \u00bb",
+      "params": {
+        "expire_date": "Expiration date of the message",
+        "id": "The ID of the saved message, to be passed to the id field of the web_app_send_prepared_message event \u00bb"
+      }
+    },
+    "messages.BotResults": {
+      "desc": "Result of a query to an inline bot",
+      "params": {
+        "cache_time": "Caching validity of the results",
+        "flags": "Flags, see TL conditional fields",
+        "gallery": "Whether the result is a picture gallery",
+        "next_offset": "The next offset to use when navigating through results",
+        "query_id": "Query ID",
+        "results": "The results",
+        "switch_pm": "Shown as a button on top of the remaining inline result list; if clicked, redirects the user to a private chat with the bot with the specified start parameter.",
+        "switch_webview": "Shown as a button on top of the remaining inline result list; if clicked, opens the specified inline mode mini app.",
+        "users": "Users mentioned in the results"
+      }
+    },
+    "messages.ChannelMessages": {
+      "desc": "Channel messages",
+      "params": {
+        "chats": "Chats",
+        "count": "Total number of results were found server-side (may not be all included here)",
+        "flags": "Flags, see TL conditional fields",
+        "inexact": "If set, returned results may be inexact",
+        "messages": "Found messages",
+        "offset_id_offset": "Indicates the absolute position of messages[0] within the total result set with count count. This is useful, for example, if the result was fetched using offset_id, and we need to display a progress/total counter (like photo 134 of 200, for all media in a chat, we could simply use photo ${offset_id_offset} of ${count}.",
+        "pts": "Event count after generation",
+        "topics": "Forum topic information",
+        "users": "Users"
+      }
+    },
+    "messages.ChatAdminsWithInvites": {
+      "desc": "Info about chat invites generated by admins.",
+      "params": {
+        "admins": "Info about chat invites generated by admins.",
+        "users": "Mentioned users"
+      }
+    },
+    "messages.ChatFull": {
+      "desc": "Full info about a channel, supergroup, gigagroup or basic group.",
+      "params": {
+        "chats": "Mentioned chats",
+        "full_chat": "Full info",
+        "users": "Mentioned users"
+      }
+    },
+    "messages.ChatInviteImporters": {
+      "desc": "Info about the users that joined the chat using a specific chat invite",
+      "params": {
+        "count": "Number of users that joined",
+        "importers": "The users that joined",
+        "users": "The users that joined"
+      }
+    },
+    "messages.Chats": {
+      "desc": "List of chats with auxiliary data.",
+      "params": {
+        "chats": "List of chats"
+      }
+    },
+    "messages.ChatsSlice": {
+      "desc": "Partial list of chats, more would have to be fetched with pagination",
+      "params": {
+        "chats": "Chats",
+        "count": "Total number of results that were found server-side (not all are included in chats)"
+      }
+    },
+    "messages.CheckedHistoryImportPeer": {
+      "desc": "Contains a confirmation text to be shown to the user, upon importing chat history, click here for more info \u00bb.",
+      "params": {
+        "confirm_text": "A confirmation text to be shown to the user, upon importing chat history \u00bb."
+      }
+    },
+    "messages.DhConfig": {
+      "desc": "New set of configuring parameters.",
+      "params": {
+        "g": "New value prime, see Wikipedia",
+        "p": "New value primitive root, see Wikipedia",
+        "random": "Random sequence of bytes of assigned length",
+        "version": "Version of set of parameters"
+      }
+    },
+    "messages.DhConfigNotModified": {
+      "desc": "Configuring parameters did not change.",
+      "params": {
+        "random": "Random sequence of bytes of assigned length"
+      }
+    },
+    "messages.DialogFilters": {
+      "desc": "Folder and folder tags information",
+      "params": {
+        "filters": "Folders.",
+        "flags": "Flags, see TL conditional fields",
+        "tags_enabled": "Whether folder tags are enabled."
+      }
+    },
+    "messages.Dialogs": {
+      "desc": "Full list of chats with messages and auxiliary data.",
+      "params": {
+        "chats": "List of groups mentioned in the chats",
+        "dialogs": "List of chats",
+        "messages": "List of last messages from each chat",
+        "users": "List of users mentioned in messages and groups"
+      }
+    },
+    "messages.DialogsNotModified": {
+      "desc": "Dialogs haven't changed",
+      "params": {
+        "count": "Number of dialogs found server-side by the query"
+      }
+    },
+    "messages.DialogsSlice": {
+      "desc": "Incomplete list of dialogs with messages and auxiliary data.",
+      "params": {
+        "chats": "List of chats mentioned in dialogs",
+        "count": "Total number of dialogs",
+        "dialogs": "List of dialogs",
+        "messages": "List of last messages from dialogs",
+        "users": "List of users mentioned in messages and chats"
+      }
+    },
+    "messages.DiscussionMessage": {
+      "desc": "Information about a message thread",
+      "params": {
+        "chats": "Chats mentioned in constructor",
+        "flags": "Flags, see TL conditional fields",
+        "max_id": "Message ID of latest reply in this thread",
+        "messages": "The messages from which the thread starts. The messages are returned in reverse chronological order (i.e., in order of decreasing message ID).",
+        "read_inbox_max_id": "Message ID of latest read incoming message in this thread",
+        "read_outbox_max_id": "Message ID of latest read outgoing message in this thread",
+        "unread_count": "Number of unread messages",
+        "users": "Users mentioned in constructor"
+      }
+    },
+    "messages.EmojiGroups": {
+      "desc": "Represents a list of emoji categories.",
+      "params": {
+        "groups": "A list of emoji categories.",
+        "hash": "Hash used for caching, for more info click here"
+      }
+    },
+    "messages.EmojiGroupsNotModified": {
+      "desc": "The list of emoji categories hasn't changed.",
+      "params": {}
+    },
+    "messages.ExportedChatInvite": {
+      "desc": "Info about a chat invite",
+      "params": {
+        "invite": "Info about the chat invite",
+        "users": "Mentioned users"
+      }
+    },
+    "messages.ExportedChatInviteReplaced": {
+      "desc": "The specified chat invite was replaced with another one",
+      "params": {
+        "invite": "The replaced chat invite",
+        "new_invite": "The invite that replaces the previous invite",
+        "users": "Mentioned users"
+      }
+    },
+    "messages.ExportedChatInvites": {
+      "desc": "Info about chat invites exported by a certain admin.",
+      "params": {
+        "count": "Number of invites exported by the admin",
+        "invites": "Exported invites",
+        "users": "Info about the admin"
+      }
+    },
+    "messages.FavedStickers": {
+      "desc": "Favorited stickers",
+      "params": {
+        "hash": "Hash used for caching, for more info click here",
+        "packs": "Emojis associated to stickers",
+        "stickers": "Favorited stickers"
+      }
+    },
+    "messages.FavedStickersNotModified": {
+      "desc": "No new favorited stickers were found",
+      "params": {}
+    },
+    "messages.FeaturedStickers": {
+      "desc": "Featured stickersets",
+      "params": {
+        "count": "Total number of featured stickers",
+        "flags": "Flags, see TL conditional fields",
+        "hash": "Hash used for caching, for more info click here",
+        "premium": "Whether this is a premium stickerset",
+        "sets": "Featured stickersets",
+        "unread": "IDs of new featured stickersets"
+      }
+    },
+    "messages.FeaturedStickersNotModified": {
+      "desc": "Featured stickers haven't changed",
+      "params": {
+        "count": "Total number of featured stickers"
+      }
+    },
+    "messages.ForumTopics": {
+      "desc": "Contains information about multiple forum topics",
+      "params": {
+        "chats": "Related chats",
+        "count": "Total number of topics matching query; may be more than the topics contained in topics, in which case pagination is required.",
+        "flags": "Flags, see TL conditional fields",
+        "messages": "Related messages (contains the messages mentioned by forumTopic.top_message).",
+        "order_by_create_date": "Whether the returned topics are ordered by creation date; if set, pagination by offset_date should use forumTopic.date; otherwise topics are ordered by the last message date, so paginate by the date of the message referenced by forumTopic.top_message.",
+        "pts": "Event count after generation",
+        "topics": "Forum topics",
+        "users": "Related users"
+      }
+    },
+    "messages.FoundStickerSets": {
+      "desc": "Found stickersets",
+      "params": {
+        "hash": "Hash used for caching, for more info click here",
+        "sets": "Found stickersets"
+      }
+    },
+    "messages.FoundStickerSetsNotModified": {
+      "desc": "No further results were found",
+      "params": {}
+    },
+    "messages.FoundStickers": {
+      "desc": "Found stickers",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "hash": "Hash used for caching, for more info click here",
+        "next_offset": "Offset for pagination",
+        "stickers": "Found stickers"
+      }
+    },
+    "messages.FoundStickersNotModified": {
+      "desc": "No new stickers were found for the specified query",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "next_offset": "Offset for pagination"
+      }
+    },
+    "messages.HighScores": {
+      "desc": "Highscores in a game",
+      "params": {
+        "scores": "Highscores",
+        "users": "Users, associated to the highscores"
+      }
+    },
+    "messages.HistoryImport": {
+      "desc": "ID of a specific chat import session, click here for more info \u00bb.",
+      "params": {
+        "id": "History import ID"
+      }
+    },
+    "messages.HistoryImportParsed": {
+      "desc": "Contains information about a chat export file generated by a foreign chat app, click here for more info.\nIf neither the pm or group flags are set, the specified chat export was generated from a chat of unknown type.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "group": "The chat export file was generated from a group chat.",
+        "pm": "The chat export file was generated from a private chat.",
+        "title": "Title of the chat."
+      }
+    },
+    "messages.InactiveChats": {
+      "desc": "Inactive chat list",
+      "params": {
+        "chats": "Chat list",
+        "dates": "When was the chat last active",
+        "users": "Users mentioned in the chat list"
+      }
+    },
+    "messages.InvitedUsers": {
+      "desc": "Contains info about successfully or unsuccessfully invited \u00bb users.",
+      "params": {
+        "missing_invitees": "A list of users that could not be invited, along with the reason why they couldn't be invited.",
+        "updates": "List of updates about successfully invited users (and eventually info about the created group)"
+      }
+    },
+    "messages.MessageEditData": {
+      "desc": "Message edit data for media",
+      "params": {
+        "caption": "Media caption, if the specified media's caption can be edited",
+        "flags": "Flags, see TL conditional fields"
+      }
+    },
+    "messages.MessageEmpty": {
+      "desc": "Empty constructor. Can be used, for example, in case when an action did not require to create a service message.",
+      "params": {}
+    },
+    "messages.MessageReactionsList": {
+      "desc": "List of peers that reacted to a specific message",
+      "params": {
+        "chats": "Mentioned chats",
+        "count": "Total number of reactions matching query",
+        "flags": "Flags, see TL conditional fields",
+        "next_offset": "If set, indicates the next offset to use to load more results by invoking messages.getMessageReactionsList.",
+        "reactions": "List of peers that reacted to a specific message",
+        "users": "Mentioned users"
+      }
+    },
+    "messages.MessageViews": {
+      "desc": "View, forward counter + info about replies",
+      "params": {
+        "chats": "Chats mentioned in constructor",
+        "users": "Users mentioned in constructor",
+        "views": "View, forward counter + info about replies"
+      }
+    },
+    "messages.Messages": {
+      "desc": "Full list of messages with auxiliary data.",
+      "params": {
+        "chats": "List of chats mentioned in dialogs",
+        "messages": "List of messages",
+        "users": "List of users mentioned in messages and chats"
+      }
+    },
+    "messages.MessagesNotModified": {
+      "desc": "No new messages matching the query were found",
+      "params": {
+        "count": "Number of results found server-side by the given query"
+      }
+    },
+    "messages.MessagesSlice": {
+      "desc": "Incomplete list of messages and auxiliary data.",
+      "params": {
+        "chats": "List of chats mentioned in messages",
+        "count": "Total number of messages in the list",
+        "flags": "Flags, see TL conditional fields",
+        "inexact": "If set, indicates that the results may be inexact",
+        "messages": "List of messages",
+        "next_rate": "Rate to use in the offset_rate parameter in the next call to messages.searchGlobal",
+        "offset_id_offset": "Indicates the absolute position of messages[0] within the total result set with count count. This is useful, for example, if the result was fetched using offset_id, and we need to display a progress/total counter (like photo 134 of 200, for all media in a chat, we could simply use photo ${offset_id_offset} of ${count}).",
+        "search_flood": "For global post searches \u00bb, the remaining amount of free searches, here query_is_free is related to the current call only, not to the next paginated call, and all subsequent pagination calls will always be free.",
+        "users": "List of users mentioned in messages and chats"
+      }
+    },
+    "messages.MyStickers": {
+      "desc": "The list of stickersets owned by the current account \u00bb.",
+      "params": {
+        "count": "Total number of owned stickersets.",
+        "sets": "Stickersets"
+      }
+    },
+    "messages.PeerDialogs": {
+      "desc": "Dialog info of multiple peers",
+      "params": {
+        "chats": "Chats",
+        "dialogs": "Dialog info",
+        "messages": "Messages mentioned in dialog info",
+        "state": "Current update state of dialog",
+        "users": "Users"
+      }
+    },
+    "messages.PeerSettings": {
+      "desc": "Peer settings",
+      "params": {
+        "chats": "Mentioned chats",
+        "settings": "Peer settings",
+        "users": "Mentioned users"
+      }
+    },
+    "messages.PreparedInlineMessage": {
+      "desc": "Represents a prepared inline message received via a bot's mini app, that can be sent to some chats \u00bb",
+      "params": {
+        "cache_time": "Caching validity of the results",
+        "peer_types": "Types of chats where this message can be sent",
+        "query_id": "The query_id to pass to messages.sendInlineBotResult",
+        "result": "The contents of the message, to be shown in a preview",
+        "users": "Users mentioned in the results"
+      }
+    },
+    "messages.QuickReplies": {
+      "desc": "Info about quick reply shortcuts \u00bb.",
+      "params": {
+        "chats": "Mentioned chats",
+        "messages": "Messages mentioned in quick_replies.",
+        "quick_replies": "Quick reply shortcuts.",
+        "users": "Mentioned users"
+      }
+    },
+    "messages.QuickRepliesNotModified": {
+      "desc": "Info about quick reply shortcuts \u00bb hasn't changed.",
+      "params": {}
+    },
+    "messages.Reactions": {
+      "desc": "List of message reactions",
+      "params": {
+        "hash": "Hash used for caching, can also be locally regenerated using the algorithm specified here \u00bb.",
+        "reactions": "Reactions"
+      }
+    },
+    "messages.ReactionsNotModified": {
+      "desc": "The server-side list of message reactions hasn't changed",
+      "params": {}
+    },
+    "messages.RecentStickers": {
+      "desc": "Recently used stickers",
+      "params": {
+        "dates": "When was each sticker last used",
+        "hash": "Hash used for caching, for more info click here",
+        "packs": "Emojis associated to stickers",
+        "stickers": "Recent stickers"
+      }
+    },
+    "messages.RecentStickersNotModified": {
+      "desc": "No new recent sticker was found",
+      "params": {}
+    },
+    "messages.SavedDialogs": {
+      "desc": "Represents some saved message dialogs \u00bb.",
+      "params": {
+        "chats": "Mentioned chats",
+        "dialogs": "Saved message dialogs \u00bb.",
+        "messages": "List of last messages from each saved dialog",
+        "users": "Mentioned users"
+      }
+    },
+    "messages.SavedDialogsNotModified": {
+      "desc": "The saved dialogs haven't changed",
+      "params": {
+        "count": "Number of saved dialogs found server-side by the query"
+      }
+    },
+    "messages.SavedDialogsSlice": {
+      "desc": "Incomplete list of saved message dialogs \u00bb with messages and auxiliary data.",
+      "params": {
+        "chats": "Mentioned chats",
+        "count": "Total number of saved message dialogs",
+        "dialogs": "List of saved message dialogs",
+        "messages": "List of last messages from dialogs",
+        "users": "Mentioned users"
+      }
+    },
+    "messages.SavedGifs": {
+      "desc": "Saved gifs",
+      "params": {
+        "gifs": "List of saved gifs",
+        "hash": "Hash used for caching, for more info click here"
+      }
+    },
+    "messages.SavedGifsNotModified": {
+      "desc": "No new saved gifs were found",
+      "params": {}
+    },
+    "messages.SavedReactionTags": {
+      "desc": "List of reaction tag \u00bb names assigned by the user.",
+      "params": {
+        "hash": "Hash used for caching, for more info click here. Can also be manually regenerated, if needed, using the custom algorithm specified here \u00bb.",
+        "tags": "Saved reaction tags."
+      }
+    },
+    "messages.SavedReactionTagsNotModified": {
+      "desc": "The list of reaction tag \u00bb names assigned by the user hasn't changed.",
+      "params": {}
+    },
+    "messages.SearchCounter": {
+      "desc": "Indicates how many results would be found by a messages.search call with the same parameters",
+      "params": {
+        "count": "Number of results that were found server-side",
+        "filter": "Provided message filter",
+        "flags": "Flags, see TL conditional fields",
+        "inexact": "If set, the results may be inexact"
+      }
+    },
+    "messages.SearchResultsCalendar": {
+      "desc": "Information about found messages sent on a specific day",
+      "params": {
+        "chats": "Mentioned chats",
+        "count": "Total number of results matching query",
+        "flags": "Flags, see TL conditional fields",
+        "inexact": "If set, indicates that the results may be inexact",
+        "messages": "Messages",
+        "min_date": "Starting timestamp of attached messages",
+        "min_msg_id": "Ending timestamp of attached messages",
+        "offset_id_offset": "Indicates the absolute position of messages[0] within the total result set with count count. This is useful, for example, if we need to display a progress/total counter (like photo 134 of 200, for all media in a chat, we could simply use photo ${offset_id_offset} of ${count}.",
+        "periods": "Used to split the messages by days: multiple SearchResultsCalendarPeriod constructors are returned, each containing information about the first, last and total number of messages matching the filter that were sent on a specific day.  This information can be easily used to split the returned messages by day.",
+        "users": "Mentioned users"
+      }
+    },
+    "messages.SearchResultsPositions": {
+      "desc": "Information about sparse positions of messages",
+      "params": {
+        "count": "Total number of found messages",
+        "positions": "List of message positions"
+      }
+    },
+    "messages.SentEncryptedFile": {
+      "desc": "Message with a file enclosure sent to a protected chat",
+      "params": {
+        "date": "Sending date",
+        "file": "Attached file"
+      }
+    },
+    "messages.SentEncryptedMessage": {
+      "desc": "Message without file attachments sent to an encrypted file.",
+      "params": {
+        "date": "Date of sending"
+      }
+    },
+    "messages.SponsoredMessages": {
+      "desc": "A set of sponsored messages associated to a channel",
+      "params": {
+        "between_delay": "For sponsored messages to show on channel videos \u00bb, the number of seconds to wait after the previous ad is hidden, before showing the next ad.",
+        "chats": "Chats mentioned in the sponsored messages",
+        "flags": "Flags, see TL conditional fields",
+        "messages": "Sponsored messages",
+        "posts_between": "If set, specifies the minimum number of messages between shown sponsored messages; otherwise, only one sponsored message must be shown after all ordinary messages.",
+        "start_delay": "For sponsored messages to show on channel videos \u00bb, the number of seconds to wait before showing the first ad.",
+        "users": "Users mentioned in the sponsored messages"
+      }
+    },
+    "messages.SponsoredMessagesEmpty": {
+      "desc": "No sponsored messages are available.",
+      "params": {}
+    },
+    "messages.StickerSet": {
+      "desc": "Stickerset and stickers inside it",
+      "params": {
+        "documents": "Stickers in stickerset",
+        "keywords": "Keywords for some or every sticker in the stickerset.",
+        "packs": "Emoji info for stickers",
+        "set": "The stickerset"
+      }
+    },
+    "messages.StickerSetInstallResultArchive": {
+      "desc": "The stickerset was installed, but since there are too many stickersets some were archived",
+      "params": {
+        "sets": "Archived stickersets"
+      }
+    },
+    "messages.StickerSetInstallResultSuccess": {
+      "desc": "The stickerset was installed successfully",
+      "params": {}
+    },
+    "messages.StickerSetNotModified": {
+      "desc": "The stickerset hasn't changed",
+      "params": {}
+    },
+    "messages.Stickers": {
+      "desc": "Found stickers",
+      "params": {
+        "hash": "Hash used for caching, for more info click here",
+        "stickers": "Stickers"
+      }
+    },
+    "messages.StickersNotModified": {
+      "desc": "No new stickers were found for the given query",
+      "params": {}
+    },
+    "messages.TranscribedAudio": {
+      "desc": "Transcribed text from a voice message \u00bb",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "pending": "Whether the transcription is partial because audio transcription is still in progress, if set the user may receive further updateTranscribedAudio updates with the updated transcription.",
+        "text": "Transcripted text",
+        "transcription_id": "Transcription ID",
+        "trial_remains_num": "For non-Premium users, this flag will be set, indicating the remaining transcriptions in the free trial period.",
+        "trial_remains_until_date": "For non-Premium users, this flag will be set, indicating the date when the trial_remains_num counter will be reset to the maximum value of transcribe_audio_trial_weekly_number."
+      }
+    },
+    "messages.TranslateResult": {
+      "desc": "Translated text with entities",
+      "params": {
+        "result": "Text+entities, for each input message."
+      }
+    },
+    "messages.VotesList": {
+      "desc": "How users voted in a poll",
+      "params": {
+        "chats": "Mentioned chats",
+        "count": "Total number of votes for all options (or only for the chosen option, if provided to messages.getPollVotes)",
+        "flags": "Flags, see TL conditional fields",
+        "next_offset": "Offset to use with the next messages.getPollVotes request, empty string if no more results are available.",
+        "users": "Info about users that voted in the poll",
+        "votes": "Vote info for each user"
+      }
+    },
+    "messages.WebPage": {
+      "desc": "Represents an Instant View webpage.",
+      "params": {
+        "chats": "Chats mentioned in the webpage.",
+        "users": "Users mentioned in the webpage.",
+        "webpage": "The instant view webpage."
+      }
+    },
+    "messages.WebPagePreview": {
+      "desc": "Represents a webpage preview.",
+      "params": {
+        "chats": "Chats mentioned in the gift field.",
+        "media": "The messageMediaWebPage or a messageMediaEmpty if there is no preview.",
+        "users": "Users mentioned within the media object."
+      }
+    },
+    "messages.WebViewResult": {
+      "desc": "",
+      "params": {}
+    },
+    "payments.BankCardData": {
+      "desc": "Credit card info, provided by the card's bank(s)",
+      "params": {
+        "open_urls": "Info URL(s) provided by the card's bank(s)",
+        "title": "Credit card title"
+      }
+    },
+    "payments.CheckCanSendGiftResultFail": {
+      "desc": "The specified gift cannot be sent yet for the specified reason.",
+      "params": {
+        "reason": "The reason why it can't be sent yet."
+      }
+    },
+    "payments.CheckCanSendGiftResultOk": {
+      "desc": "The specified gift can be sent.",
+      "params": {}
+    },
+    "payments.CheckedGiftCode": {
+      "desc": "Contains info about a Telegram Premium giftcode link.",
+      "params": {
+        "chats": "Mentioned chats",
+        "date": "Creation date of the gift code.",
+        "flags": "Flags, see TL conditional fields",
+        "from_id": "The peer that created the gift code.",
+        "giveaway_msg_id": "Message ID of the giveaway in the channel specified in from_id.",
+        "months": "Duration in months of the gifted Telegram Premium subscription.",
+        "to_id": "The destination user of the gift.",
+        "used_date": "When was the giftcode imported, if it was imported.",
+        "users": "Mentioned users",
+        "via_giveaway": "Whether this giftcode was created by a giveaway."
+      }
+    },
+    "payments.ConnectedStarRefBots": {
+      "desc": "Active affiliations",
+      "params": {
+        "connected_bots": "The affiliations",
+        "count": "Total number of active affiliations",
+        "users": "Peers mentioned in connected_bots"
+      }
+    },
+    "payments.ExportedInvoice": {
+      "desc": "Exported invoice deep link",
+      "params": {
+        "url": "Exported invoice deep link"
+      }
+    },
+    "payments.GiveawayInfo": {
+      "desc": "Contains info about an ongoing giveaway.",
+      "params": {
+        "admin_disallowed_chat_id": "If set, the current user can't participate in the giveaway, because they are an administrator in one of the channels (ID specified in this flag) that created the giveaway.",
+        "disallowed_country": "If set, the current user can't participate in this giveaway, because their phone number is from the specified disallowed country (specified as a two-letter ISO 3166-1 alpha-2 country code).",
+        "flags": "Flags, see TL conditional fields",
+        "joined_too_early_date": "The current user can't participate in the giveaway, because they were already a member of the channel when the giveaway started, and the only_new_subscribers was set when starting the giveaway.",
+        "participating": "The current user is participating in the giveaway.",
+        "preparing_results": "If set, the giveaway has ended and the results are being prepared.",
+        "start_date": "When was the giveaway started"
+      }
+    },
+    "payments.GiveawayInfoResults": {
+      "desc": "A giveaway has ended.",
+      "params": {
+        "activated_count": "Number of winners, which activated their gift codes.",
+        "finish_date": "End date of the giveaway. May be bigger than the end date specified in parameters of the giveaway.",
+        "flags": "Flags, see TL conditional fields",
+        "gift_code_slug": "If we're one of the winners of this giveaway, contains the Premium gift code, see here \u00bb for more info on the full giveaway flow.",
+        "refunded": "Whether the giveaway was canceled and was fully refunded.",
+        "stars_prize": "If we're one of the winners of this Telegram Star giveaway, the number Telegram Stars we won.",
+        "start_date": "Start date of the giveaway",
+        "winner": "Whether we're one of the winners of this giveaway.",
+        "winners_count": "Number of winners in the giveaway"
+      }
+    },
+    "payments.PaymentForm": {
+      "desc": "Payment form",
+      "params": {
+        "additional_methods": "Additional payment methods",
+        "bot_id": "Bot ID",
+        "can_save_credentials": "Whether the user can choose to save credentials.",
+        "description": "Description",
+        "flags": "Flags, see TL conditional fields",
+        "form_id": "Form ID",
+        "invoice": "Invoice",
+        "native_params": "Contains information about the payment provider, if available, to support it natively without the need for opening the URL.A JSON object that can contain the following fields:- apple_pay_merchant_id: Apple Pay merchant ID- google_pay_public_key: Google Pay public key- need_country: True, if the user country must be provided,- need_zip: True, if the user ZIP/postal code must be provided,- need_cardholder_name: True, if the cardholder name must be provided",
+        "native_provider": "Payment provider name.One of the following:- stripe",
+        "password_missing": "Indicates that the user can save payment credentials, but only after setting up a 2FA password (currently the account doesn't have a 2FA password)",
+        "photo": "Product photo",
+        "provider_id": "Payment provider ID.",
+        "saved_credentials": "Contains information about saved card credentials",
+        "saved_info": "Saved server-side order information",
+        "title": "Form title",
+        "url": "Payment form URL",
+        "users": "Users"
+      }
+    },
+    "payments.PaymentFormStarGift": {
+      "desc": "Represents a payment form for a gift, see here \u00bb for more info.",
+      "params": {
+        "form_id": "Form ID.",
+        "invoice": "Invoice"
+      }
+    },
+    "payments.PaymentFormStars": {
+      "desc": "Represents a payment form, for payments to be using Telegram Stars, see here \u00bb for more info.",
+      "params": {
+        "bot_id": "Bot ID.",
+        "description": "Description",
+        "flags": "Flags, see TL conditional fields",
+        "form_id": "Form ID.",
+        "invoice": "Invoice",
+        "photo": "Product photo",
+        "title": "Form title",
+        "users": "Info about users mentioned in the other fields."
+      }
+    },
+    "payments.PaymentReceipt": {
+      "desc": "Receipt",
+      "params": {
+        "bot_id": "Bot ID",
+        "credentials_title": "Payment credential name",
+        "currency": "Three-letter ISO 4217 currency code",
+        "date": "Date of generation",
+        "description": "Description",
+        "flags": "Flags, see TL conditional fields",
+        "info": "Info",
+        "invoice": "Invoice",
+        "photo": "Photo",
+        "provider_id": "Provider ID",
+        "shipping": "Selected shipping option",
+        "tip_amount": "Tipped amount",
+        "title": "Title",
+        "total_amount": "Total amount in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies).",
+        "users": "Users"
+      }
+    },
+    "payments.PaymentReceiptStars": {
+      "desc": "Receipt for payment made using Telegram Stars.",
+      "params": {
+        "bot_id": "Bot ID",
+        "currency": "Currency, always XTR.",
+        "date": "Date of generation",
+        "description": "Description",
+        "flags": "Flags, see TL conditional fields",
+        "invoice": "Invoice",
+        "photo": "Product photo",
+        "title": "Title",
+        "total_amount": "Amount of Telegram Stars.",
+        "transaction_id": "Transaction ID",
+        "users": "Info about users mentioned in the other fields."
+      }
+    },
+    "payments.PaymentResult": {
+      "desc": "Payment result",
+      "params": {
+        "updates": "Info about the payment"
+      }
+    },
+    "payments.PaymentVerificationNeeded": {
+      "desc": "Payment was not successful, additional verification is needed",
+      "params": {
+        "url": "URL for additional payment credentials verification"
+      }
+    },
+    "payments.ResaleStarGifts": {
+      "desc": "List of gifts currently on resale \u00bb.",
+      "params": {
+        "attributes": "Possible gift attributes, only set if payments.getResaleStarGifts.attributes_hash is set (on the first call, it must be equal to 0).",
+        "attributes_hash": "Hash of the attributes field, pass this to payments.getResaleStarGifts.attributes_hash to avoid returning any attributes (flag not set) if they haven't changed.",
+        "chats": "Chats mentioned in the attributes.",
+        "count": "Total number of results.",
+        "counters": "Indicates the total number of gifts that have a specific attribute, only set if payments.getResaleStarGifts.offset is empty (since this field is not related to the current result page but to all of them, it's only returned on the first page).",
+        "flags": "Flags, see TL conditional fields",
+        "gifts": "Collectible gifts on resale (may be less than count, in which case next_offset will be set).",
+        "next_offset": "Offset for pagination, pass this to payments.getResaleStarGifts.offset to fetch the next results.",
+        "users": "Users mentioned in the attributes."
+      }
+    },
+    "payments.SavedInfo": {
+      "desc": "Saved server-side order information",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "has_saved_credentials": "Whether the user has some saved payment credentials",
+        "saved_info": "Saved server-side order information"
+      }
+    },
+    "payments.SavedStarGifts": {
+      "desc": "Represents a list of gifts.",
+      "params": {
+        "chat_notifications_enabled": "Ternary value: can be not set, set&true, set&false. Can only be set for channels we own: the value indicates whether we enabled gift notifications for this channel.",
+        "chats": "Channels mentioned in gifts",
+        "count": "Total number of results (can be less than the returned gifts, in which case next_offset will be set).",
+        "flags": "Flags, see TL conditional fields",
+        "gifts": "Gifts",
+        "next_offset": "Offset to pass to payments.getSavedStarGifts to fetch the next page of results.",
+        "users": "Users mentioned in gifts"
+      }
+    },
+    "payments.StarGiftCollections": {
+      "desc": "Represents a list of star gift collections \u00bb.",
+      "params": {
+        "collections": "Star gift collections."
+      }
+    },
+    "payments.StarGiftCollectionsNotModified": {
+      "desc": "The list of star gift collections \u00bb hasn't changed.",
+      "params": {}
+    },
+    "payments.StarGiftUpgradePreview": {
+      "desc": "A preview of the possible attributes (chosen randomly) a gift \u00bb can receive after upgrading it to a collectible gift \u00bb, see here \u00bb for more info.",
+      "params": {
+        "sample_attributes": "Possible gift attributes"
+      }
+    },
+    "payments.StarGiftWithdrawalUrl": {
+      "desc": "A URL that can be used to import the exported NFT on Fragment.",
+      "params": {
+        "url": "The URL to open."
+      }
+    },
+    "payments.StarGifts": {
+      "desc": "Available gifts \u00bb.",
+      "params": {
+        "chats": "Chats mentioned in the gifts field.",
+        "gifts": "List of available gifts.",
+        "hash": "Hash used for caching, for more info click here",
+        "users": "Users mentioned in the gifts field."
+      }
+    },
+    "payments.StarGiftsNotModified": {
+      "desc": "The list of available gifts \u00bb hasn't changed.",
+      "params": {}
+    },
+    "payments.StarsRevenueAdsAccountUrl": {
+      "desc": "Contains a URL leading to a page where the user will be able to place ads for the channel/bot, paying using Telegram Stars.",
+      "params": {
+        "url": "URL to open."
+      }
+    },
+    "payments.StarsRevenueStats": {
+      "desc": "Star revenue statistics, see here \u00bb for more info.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "revenue_graph": "Star revenue graph (number of earned stars)",
+        "status": "Current balance, current withdrawable balance and overall earned Telegram Stars",
+        "top_hours_graph": "For ad revenue statistics, ad impressions graph",
+        "usd_rate": "Current conversion rate of Telegram Stars to USD"
+      }
+    },
+    "payments.StarsRevenueWithdrawalUrl": {
+      "desc": "Contains the URL to use to withdraw Telegram Star revenue.",
+      "params": {
+        "url": "Contains the URL to use to withdraw Telegram Star revenue."
+      }
+    },
+    "payments.StarsStatus": {
+      "desc": "Info about the current Telegram Star subscriptions, balance and transaction history \u00bb.",
+      "params": {
+        "balance": "Current Telegram Star balance.",
+        "chats": "Chats mentioned in history.",
+        "flags": "Flags, see TL conditional fields",
+        "history": "List of Telegram Star transactions (partial if next_offset is set).",
+        "next_offset": "Offset to use to fetch more transactions from the transaction history using payments.getStarsTransactions.",
+        "subscriptions": "Info about current Telegram Star subscriptions, only returned when invoking payments.getStarsTransactions and payments.getStarsSubscriptions.",
+        "subscriptions_missing_balance": "The number of Telegram Stars the user should buy to be able to extend expired subscriptions soon (i.e. the current balance is not enough to extend all expired subscriptions).",
+        "subscriptions_next_offset": "Offset for pagination of subscriptions: only usable and returned when invoking payments.getStarsSubscriptions.",
+        "users": "Users mentioned in history."
+      }
+    },
+    "payments.SuggestedStarRefBots": {
+      "desc": "A list of suggested mini apps with available affiliate programs",
+      "params": {
+        "count": "Total number of results (for pagination)",
+        "flags": "Flags, see TL conditional fields",
+        "next_offset": "Next offset for pagination",
+        "suggested_bots": "Suggested affiliate programs (full or partial list to be fetched using pagination)",
+        "users": "Peers mentioned in suggested_bots"
+      }
+    },
+    "payments.UniqueStarGift": {
+      "desc": "Represents a collectible gift \u00bb.",
+      "params": {
+        "chats": "Chats mentioned in the gift field.",
+        "gift": "The starGiftUnique constructor.",
+        "users": "Users mentioned in the gift field."
+      }
+    },
+    "payments.UniqueStarGiftValueInfo": {
+      "desc": "Information about the value of a collectible gift \u00bb.",
+      "params": {
+        "average_price": "The current average sale price of collectible gifts of the same type, in the smallest unit of the currency specified in currency.",
+        "currency": "Three-letter ISO 4217 currency code (a localized fiat currency used to represent prices and price estimations in this constructor).",
+        "flags": "Flags, see TL conditional fields",
+        "floor_price": "The current minimum price of collectible gifts of the same type, in the smallest unit of the currency specified in currency.",
+        "fragment_listed_count": "Number of gifts of the same type currently being resold on fragment.",
+        "fragment_listed_url": "Fragment link to the listing of gifts of the same type currently being resold on fragment.",
+        "initial_sale_date": "Initial purchase date of the gift.",
+        "initial_sale_price": "Initial purchase price in the smallest unit of the currency specified in currency (automatically converted from initial_sale_stars).",
+        "initial_sale_stars": "Initial purchase price in Stars.",
+        "last_sale_date": "Last resale date of the gift.",
+        "last_sale_on_fragment": "If set, the last sale was completed on Fragment.",
+        "last_sale_price": "Last resale price, in the smallest unit of the currency specified in currency.",
+        "listed_count": "Number of gifts of the same type currently being resold on Telegram.",
+        "value": "Estimated value of the gift, in the smallest unit of the currency specified in currency.",
+        "value_is_average": "If set, the value is calculated from the average value of sold gifts of the same type. Otherwise, it is based on the sale price of the gift."
+      }
+    },
+    "payments.ValidatedRequestedInfo": {
+      "desc": "Validated user-provided info",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "id": "ID",
+        "shipping_options": "Shipping options"
+      }
+    },
+    "phone.ExportedGroupCallInvite": {
+      "desc": "An invite to a group call or livestream",
+      "params": {
+        "link": "Invite link"
+      }
+    },
+    "phone.GroupCall": {
+      "desc": "Contains info about a group call, and partial info about its participants.",
+      "params": {
+        "call": "Info about the group call",
+        "chats": "Chats mentioned in the participants vector",
+        "participants": "A partial list of participants.",
+        "participants_next_offset": "Next offset to use when fetching the remaining participants using phone.getGroupParticipants",
+        "users": "Users mentioned in the participants vector"
+      }
+    },
+    "phone.GroupCallStreamChannels": {
+      "desc": "Info about RTMP streams in a group call or livestream",
+      "params": {
+        "channels": "RTMP streams"
+      }
+    },
+    "phone.GroupCallStreamRtmpUrl": {
+      "desc": "RTMP URL and stream key to be used in streaming software",
+      "params": {
+        "key": "Stream key",
+        "url": "RTMP URL"
+      }
+    },
+    "phone.GroupParticipants": {
+      "desc": "Info about the participants of a group call or livestream",
+      "params": {
+        "chats": "Mentioned chats",
+        "count": "Number of participants",
+        "next_offset": "If not empty, the specified list of participants is partial, and more participants can be fetched specifying this parameter as offset in phone.getGroupParticipants.",
+        "participants": "List of participants",
+        "users": "Mentioned users",
+        "version": "Version info"
+      }
+    },
+    "phone.JoinAsPeers": {
+      "desc": "A list of peers that can be used to join a group call, presenting yourself as a specific user/channel.",
+      "params": {
+        "chats": "Chats mentioned in the peers vector",
+        "peers": "Peers",
+        "users": "Users mentioned in the peers vector"
+      }
+    },
+    "phone.PhoneCall": {
+      "desc": "A VoIP phone call",
+      "params": {
+        "phone_call": "The VoIP phone call",
+        "users": "VoIP phone call participants"
+      }
+    },
+    "photos.Photo": {
+      "desc": "Photo with auxiliary data.",
+      "params": {
+        "photo": "Photo",
+        "users": "Users"
+      }
+    },
+    "photos.Photos": {
+      "desc": "Full list of photos with auxiliary data.",
+      "params": {
+        "photos": "List of photos",
+        "users": "List of mentioned users"
+      }
+    },
+    "photos.PhotosSlice": {
+      "desc": "Incomplete list of photos with auxiliary data.",
+      "params": {
+        "count": "Total number of photos",
+        "photos": "List of photos",
+        "users": "List of mentioned users"
+      }
+    },
+    "premium.BoostsList": {
+      "desc": "List of boosts that were applied to a peer by multiple users.",
+      "params": {
+        "boosts": "Boosts",
+        "count": "Total number of results",
+        "flags": "Flags, see TL conditional fields",
+        "next_offset": "Offset that can be used for pagination.",
+        "users": "Mentioned users"
+      }
+    },
+    "premium.BoostsStatus": {
+      "desc": "Contains info about the current boost status of a peer.",
+      "params": {
+        "boost_url": "Boost deep link \u00bb that can be used to boost the chat.",
+        "boosts": "Total number of boosts acquired so far.",
+        "current_level_boosts": "The number of boosts acquired so far in the current level.",
+        "flags": "Flags, see TL conditional fields",
+        "gift_boosts": "The number of boosts acquired from created Telegram Premium gift codes and giveaways; only returned to channel/supergroup admins.",
+        "level": "The current boost level of the channel/supergroup.",
+        "my_boost": "Whether we're currently boosting this channel/supergroup, my_boost_slots will also be set.",
+        "my_boost_slots": "Indicates which of our boost slots we've assigned to this peer (populated if my_boost is set).",
+        "next_level_boosts": "Total number of boosts needed to reach the next level; if absent, the next level isn't available.",
+        "premium_audience": "Only returned to channel/supergroup admins: contains the approximated number of Premium users subscribed to the channel/supergroup, related to the total number of subscribers.",
+        "prepaid_giveaways": "A list of prepaid giveaways available for the chat; only returned to channel/supergroup admins."
+      }
+    },
+    "premium.MyBoosts": {
+      "desc": "A list of peers we are currently boosting, and how many boost slots we have left.",
+      "params": {
+        "chats": "Referenced chats",
+        "my_boosts": "Info about boosted peers and remaining boost slots.",
+        "users": "Referenced users"
+      }
+    },
+    "smsjobs.EligibleToJoin": {
+      "desc": "SMS jobs eligibility",
+      "params": {
+        "monthly_sent_sms": "Monthly sent SMSes",
+        "terms_url": "Terms of service URL"
+      }
+    },
+    "smsjobs.Status": {
+      "desc": "Status",
+      "params": {
+        "allow_international": "Allow international numbers",
+        "flags": "Flags, see TL conditional fields",
+        "last_gift_slug": "Last gift deep link",
+        "recent_remains": "Remaining",
+        "recent_sent": "Recently sent",
+        "recent_since": "Since",
+        "terms_url": "Terms of service URL",
+        "total_sent": "Total sent",
+        "total_since": "Total since"
+      }
+    },
+    "stats.BroadcastStats": {
+      "desc": "Channel statistics.",
+      "params": {
+        "enabled_notifications": "Percentage of subscribers with enabled notifications",
+        "followers": "Follower count change for period in consideration",
+        "followers_graph": "Followers growth graph (relative subscriber count)",
+        "growth_graph": "Channel growth graph (absolute subscriber count)",
+        "interactions_graph": "Interactions graph (absolute)",
+        "iv_interactions_graph": "IV interactions graph (absolute)",
+        "languages_graph": "Subscriber language graph (pie chart)",
+        "mute_graph": "Muted users graph (relative)",
+        "new_followers_by_source_graph": "New followers by source graph (absolute)",
+        "period": "Period in consideration",
+        "reactions_by_emotion_graph": "A graph containing the number of reactions on posts categorized by emotion",
+        "reactions_per_post": "total_reactions/postcount, for posts posted during the period in consideration. Note that in this case, current refers to the period in consideration (min_date till max_date), and prev refers to the previous period ((min_date - (max_date - min_date)) till min_date)",
+        "reactions_per_story": "total_reactions/storycount, for posts posted during the period in consideration. Note that in this case, current refers to the period in consideration (min_date till max_date), and prev refers to the previous period ((min_date - (max_date - min_date)) till min_date)",
+        "recent_posts_interactions": "Detailed statistics about number of views and shares of recently sent messages and stories",
+        "shares_per_post": "total_sharecount/postcount, for posts posted during the period in consideration. Note that in this case, current refers to the period in consideration (min_date till max_date), and prev refers to the previous period ((min_date - (max_date - min_date)) till min_date)",
+        "shares_per_story": "total_shares/storycount, for posts posted during the period in consideration. Note that in this case, current refers to the period in consideration (min_date till max_date), and prev refers to the previous period ((min_date - (max_date - min_date)) till min_date)",
+        "story_interactions_graph": "A graph containing the number of story views and shares",
+        "story_reactions_by_emotion_graph": "A graph containing the number of reactions on stories categorized by emotion",
+        "top_hours_graph": "Views per hour graph (absolute)",
+        "views_by_source_graph": "Views by source graph (absolute)",
+        "views_per_post": "total_viewcount/postcount, for posts posted during the period in consideration. Note that in this case, current refers to the period in consideration (min_date till max_date), and prev refers to the previous period ((min_date - (max_date - min_date)) till min_date).",
+        "views_per_story": "total_views/storycount, for posts posted during the period in consideration. Note that in this case, current refers to the period in consideration (min_date till max_date), and prev refers to the previous period ((min_date - (max_date - min_date)) till min_date)"
+      }
+    },
+    "stats.MegagroupStats": {
+      "desc": "Supergroup statistics",
+      "params": {
+        "actions_graph": "Group activity graph (deleted, modified messages, blocked users)",
+        "growth_graph": "Supergroup growth graph (absolute subscriber count)",
+        "languages_graph": "Subscriber language graph (pie chart)",
+        "members": "Member count change for period in consideration",
+        "members_graph": "Members growth (relative subscriber count)",
+        "messages": "Message number change for period in consideration",
+        "messages_graph": "Message activity graph (stacked bar graph, message type)",
+        "new_members_by_source_graph": "New members by source graph",
+        "period": "Period in consideration",
+        "posters": "Number of users that posted messages, for range in consideration",
+        "top_admins": "Info about most active group admins",
+        "top_hours_graph": "Activity per hour graph (absolute)",
+        "top_inviters": "Info about most active group inviters",
+        "top_posters": "Info about most active group members",
+        "users": "Info about users mentioned in statistics",
+        "viewers": "Number of users that viewed messages, for range in consideration",
+        "weekdays_graph": "Activity per day of week graph (absolute)"
+      }
+    },
+    "stats.MessageStats": {
+      "desc": "Message statistics",
+      "params": {
+        "reactions_by_emotion_graph": "A graph containing the number of reactions on stories categorized by emotion",
+        "views_graph": "Message view graph"
+      }
+    },
+    "stats.PublicForwards": {
+      "desc": "Contains info about the forwards of a story as a message to public chats and reposts by public channels.",
+      "params": {
+        "chats": "Mentioned chats",
+        "count": "Total number of results",
+        "flags": "Flags, see TL conditional fields",
+        "forwards": "Info about the forwards of a story.",
+        "next_offset": "Offset used for pagination.",
+        "users": "Mentioned users"
+      }
+    },
+    "stats.StoryStats": {
+      "desc": "Contains statistics about a story.",
+      "params": {
+        "reactions_by_emotion_graph": "A bar graph containing the number of story reactions categorized by \"emotion\" (i.e. Positive, Negative, Other, etc...)",
+        "views_graph": "A graph containing the number of story views and shares"
+      }
+    },
+    "stickers.SuggestedShortName": {
+      "desc": "A suggested short name for a stickerpack",
+      "params": {
+        "short_name": "Suggested short name"
+      }
+    },
+    "storage.FileGif": {
+      "desc": "GIF image. MIME type: image/gif.",
+      "params": {}
+    },
+    "storage.FileJpeg": {
+      "desc": "JPEG image. MIME type: image/jpeg.",
+      "params": {}
+    },
+    "storage.FileMov": {
+      "desc": "Quicktime video. MIME type: video/quicktime.",
+      "params": {}
+    },
+    "storage.FileMp3": {
+      "desc": "Mp3 audio. MIME type: audio/mpeg.",
+      "params": {}
+    },
+    "storage.FileMp4": {
+      "desc": "MPEG-4 video. MIME type: video/mp4.",
+      "params": {}
+    },
+    "storage.FilePartial": {
+      "desc": "Part of a bigger file.",
+      "params": {}
+    },
+    "storage.FilePdf": {
+      "desc": "PDF document image. MIME type: application/pdf.",
+      "params": {}
+    },
+    "storage.FilePng": {
+      "desc": "PNG image. MIME type: image/png.",
+      "params": {}
+    },
+    "storage.FileUnknown": {
+      "desc": "Unknown type.",
+      "params": {}
+    },
+    "storage.FileWebp": {
+      "desc": "WEBP image. MIME type: image/webp.",
+      "params": {}
+    },
+    "stories.Albums": {
+      "desc": "Story albums \u00bb.",
+      "params": {
+        "albums": "The albums.",
+        "hash": "Hash to pass to stories.getAlbums to avoid returning any results if they haven't changed."
+      }
+    },
+    "stories.AlbumsNotModified": {
+      "desc": "The story album list \u00bb hasn't changed.",
+      "params": {}
+    },
+    "stories.AllStories": {
+      "desc": "Full list of active (or active and hidden) stories.",
+      "params": {
+        "chats": "Mentioned chats",
+        "count": "Total number of active (or active and hidden) stories",
+        "flags": "Flags, see TL conditional fields",
+        "has_more": "Whether more results can be fetched as described here \u00bb.",
+        "peer_stories": "Stories",
+        "state": "State to use for pagination",
+        "stealth_mode": "Current stealth mode information",
+        "users": "Mentioned users"
+      }
+    },
+    "stories.AllStoriesNotModified": {
+      "desc": "The list of active (or active and hidden) stories has not changed.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "state": "State to use to ask for updates",
+        "stealth_mode": "Current stealth mode information"
+      }
+    },
+    "stories.CanSendStoryCount": {
+      "desc": "Contains the number of available active story slots (equal to the value of the story_expiring_limit_* client configuration parameter minus the number of currently active stories).",
+      "params": {
+        "count_remains": "Remaining active story slots."
+      }
+    },
+    "stories.FoundStories": {
+      "desc": "Stories found using global story search \u00bb.",
+      "params": {
+        "chats": "Mentioned chats",
+        "count": "Total number of results found for the query.",
+        "flags": "Flags, see TL conditional fields",
+        "next_offset": "Offset used to fetch the next page, if not set this is the final page.",
+        "stories": "Matching stories.",
+        "users": "Mentioned users"
+      }
+    },
+    "stories.PeerStories": {
+      "desc": "Active story list of a specific peer.",
+      "params": {
+        "chats": "Mentioned chats",
+        "stories": "Stories",
+        "users": "Mentioned users"
+      }
+    },
+    "stories.Stories": {
+      "desc": "List of stories",
+      "params": {
+        "chats": "Mentioned chats",
+        "count": "Total number of stories that can be fetched",
+        "flags": "Flags, see TL conditional fields",
+        "pinned_to_top": "IDs of pinned stories.",
+        "stories": "Stories",
+        "users": "Mentioned users"
+      }
+    },
+    "stories.StoryReactionsList": {
+      "desc": "List of peers that reacted to or intercated with a specific story",
+      "params": {
+        "chats": "Mentioned chats",
+        "count": "Total number of reactions matching query",
+        "flags": "Flags, see TL conditional fields",
+        "next_offset": "If set, indicates the next offset to use to load more results by invoking stories.getStoryReactionsList.",
+        "reactions": "List of peers that reacted to or interacted with a specific story",
+        "users": "Mentioned users"
+      }
+    },
+    "stories.StoryViews": {
+      "desc": "Reaction and view counters for a list of stories",
+      "params": {
+        "users": "Mentioned users",
+        "views": "View date and reaction information of multiple stories"
+      }
+    },
+    "stories.StoryViewsList": {
+      "desc": "Reaction and view counters for a story",
+      "params": {
+        "chats": "Mentioned chats",
+        "count": "Total number of results that can be fetched",
+        "flags": "Flags, see TL conditional fields",
+        "forwards_count": "Total number of story forwards/reposts",
+        "next_offset": "Offset for pagination",
+        "reactions_count": "Number of reactions that were added to the story",
+        "users": "Mentioned users",
+        "views": "Story view date and reaction information",
+        "views_count": "Total number of story views"
+      }
+    },
+    "updates.ChannelDifference": {
+      "desc": "The new updates",
+      "params": {
+        "chats": "Chats",
+        "final": "Whether there are more updates to be fetched using getDifference, starting from the provided pts",
+        "flags": "Flags, see TL conditional fields",
+        "new_messages": "New messages",
+        "other_updates": "Other updates",
+        "pts": "The PTS from which to start getting updates the next time",
+        "timeout": "Clients are supposed to refetch the channel difference after timeout seconds have elapsed, if the user is currently viewing the chat, see here \u00bb for more info.",
+        "users": "Users"
+      }
+    },
+    "updates.ChannelDifferenceEmpty": {
+      "desc": "There are no new updates",
+      "params": {
+        "final": "Whether there are more updates that must be fetched (always false)",
+        "flags": "Flags, see TL conditional fields",
+        "pts": "The latest PTS",
+        "timeout": "Clients are supposed to refetch the channel difference after timeout seconds have elapsed, if the user is currently viewing the chat, see here \u00bb for more info."
+      }
+    },
+    "updates.ChannelDifferenceTooLong": {
+      "desc": "The provided pts + limit < remote pts. Simply, there are too many updates to be fetched (more than limit), the client has to resolve the update gap in one of the following ways (assuming the existence of a persistent database to locally store messages):",
+      "params": {
+        "chats": "Chats from messages",
+        "dialog": "Dialog containing the latest PTS that can be used to reset the channel state",
+        "final": "Whether there are more updates that must be fetched (always false)",
+        "flags": "Flags, see TL conditional fields",
+        "messages": "The latest messages",
+        "timeout": "Clients are supposed to refetch the channel difference after timeout seconds have elapsed",
+        "users": "Users from messages"
+      }
+    },
+    "updates.Difference": {
+      "desc": "Full list of occurred events.",
+      "params": {
+        "chats": "List of chats mentioned in events",
+        "new_encrypted_messages": "List of new encrypted secret chat messages",
+        "new_messages": "List of new messages",
+        "other_updates": "List of updates",
+        "state": "Current state",
+        "users": "List of users mentioned in events"
+      }
+    },
+    "updates.DifferenceEmpty": {
+      "desc": "No events.",
+      "params": {
+        "date": "Current date",
+        "seq": "Number of sent updates"
+      }
+    },
+    "updates.DifferenceSlice": {
+      "desc": "Incomplete list of occurred events.",
+      "params": {
+        "chats": "List of chats mentioned in events",
+        "intermediate_state": "Intermediary state",
+        "new_encrypted_messages": "New messages from the encrypted event sequence",
+        "new_messages": "List of new messages",
+        "other_updates": "List of updates",
+        "users": "List of users mentioned in events"
+      }
+    },
+    "updates.DifferenceTooLong": {
+      "desc": "The difference is too long, and the specified state must be used to refetch updates.",
+      "params": {
+        "pts": "The new state to use."
+      }
+    },
+    "updates.State": {
+      "desc": "Updates state.",
+      "params": {
+        "date": "Date of condition",
+        "pts": "Number of events occurred in a text box",
+        "qts": "Position in a sequence of updates in secret chats. For further details refer to article secret chats",
+        "seq": "Number of sent updates",
+        "unread_count": "Number of unread messages"
+      }
+    },
+    "upload.CdnFile": {
+      "desc": "Represent a chunk of a CDN file.",
+      "params": {
+        "bytes": "The data"
+      }
+    },
+    "upload.CdnFileReuploadNeeded": {
+      "desc": "The file was cleared from the temporary RAM cache of the CDN and has to be re-uploaded.",
+      "params": {
+        "request_token": "Request token (see CDN)"
+      }
+    },
+    "upload.File": {
+      "desc": "File content.",
+      "params": {
+        "bytes": "Binary data, file content",
+        "mtime": "Modification time",
+        "type": "File type"
+      }
+    },
+    "upload.FileCdnRedirect": {
+      "desc": "The file must be downloaded from a CDN DC.",
+      "params": {
+        "dc_id": "CDN DC ID",
+        "encryption_iv": "Encryption IV (see CDN files)",
+        "encryption_key": "Encryption key (see CDN files)",
+        "file_hashes": "File hashes (see CDN files)",
+        "file_token": "File token (see CDN files)"
+      }
+    },
+    "upload.WebFile": {
+      "desc": "Represents a chunk of an HTTP webfile downloaded through telegram's secure MTProto servers",
+      "params": {
+        "bytes": "Data",
+        "file_type": "File type",
+        "mime_type": "Mime type",
+        "mtime": "Modified time",
+        "size": "File size"
+      }
+    },
+    "users.SavedMusic": {
+      "desc": "List of songs currently pinned on a user's profile, see here \u00bb for more info.",
+      "params": {
+        "count": "Total number of songs (can be bigger than documents depending on the passed limit, and the default maximum limit in which case pagination is required).",
+        "documents": "Songs."
+      }
+    },
+    "users.SavedMusicNotModified": {
+      "desc": "This subset of the songs currently pinned on a user's profile hasn't changed, see here \u00bb for more info.",
+      "params": {
+        "count": "Total number of songs on the user's profile."
+      }
+    },
+    "users.UserFull": {
+      "desc": "Full user information",
+      "params": {
+        "chats": "Mentioned chats",
+        "full_user": "Full user information",
+        "users": "Mentioned users"
+      }
+    },
+    "users.Users": {
+      "desc": "Describes a list of users (or bots).",
+      "params": {
+        "users": "Users"
+      }
+    },
+    "users.UsersSlice": {
+      "desc": "Describes a partial list of users.",
+      "params": {
+        "count": "Total number of users (bigger than the users specified in users)",
+        "users": "Subset of users."
+      }
+    }
+  },
+  "method": {
+    "InitConnection": {
+      "desc": "Initialize connection",
+      "params": {
+        "api_id": "Application identifier (see. App configuration)",
+        "app_version": "Application version",
+        "device_model": "Device model",
+        "flags": "Flags, see TL conditional fields",
+        "lang_code": "Either an ISO 639-1 language code or a language pack name obtained from a language pack link.",
+        "lang_pack": "Platform identifier (i.e. android, tdesktop, etc).",
+        "params": "Additional initConnection parameters. For now, only the tz_offset field is supported, for specifying the timezone offset in seconds.",
+        "proxy": "Info about an MTProto proxy",
+        "query": "The query itself",
+        "system_lang_code": "Code for the language used on the device's OS, ISO 639-1 standard",
+        "system_version": "Operation system version"
+      }
+    },
+    "InvokeAfterMsg": {
+      "desc": "Invokes a query after successful completion of one of the previous queries.",
+      "params": {
+        "msg_id": "Message identifier on which a current query depends",
+        "query": "The query itself"
+      }
+    },
+    "InvokeAfterMsgs": {
+      "desc": "Invokes a query after a successful completion of previous queries",
+      "params": {
+        "msg_ids": "List of messages on which a current query depends",
+        "query": "The query itself"
+      }
+    },
+    "InvokeWithApnsSecret": {
+      "desc": "Official clients only, invoke with Apple push verification.",
+      "params": {
+        "nonce": "Nonce.",
+        "query": "Query.",
+        "secret": "Secret."
+      }
+    },
+    "InvokeWithBusinessConnection": {
+      "desc": "Invoke a method using a Telegram Business Bot connection, see here \u00bb for more info, including a list of the methods that can be wrapped in this constructor.",
+      "params": {
+        "connection_id": "Business connection ID.",
+        "query": "The actual query."
+      }
+    },
+    "InvokeWithGooglePlayIntegrity": {
+      "desc": "Official clients only, invoke with Google Play Integrity token.",
+      "params": {
+        "nonce": "Nonce.",
+        "query": "Query.",
+        "token": "Token."
+      }
+    },
+    "InvokeWithLayer": {
+      "desc": "Invoke the specified query using the specified API layer",
+      "params": {
+        "layer": "The layer to use",
+        "query": "The query"
+      }
+    },
+    "InvokeWithMessagesRange": {
+      "desc": "Invoke with the given message range",
+      "params": {
+        "query": "Query",
+        "range": "Message range"
+      }
+    },
+    "InvokeWithReCaptcha": {
+      "desc": "Official clients only: re-execute a method call that required reCAPTCHA verification via a RECAPTCHA_CHECK_%s__%s, where the first placeholder is the action, and the second one is the reCAPTCHA key ID.",
+      "params": {
+        "query": "The original method call.",
+        "token": "reCAPTCHA token received after verification."
+      }
+    },
+    "InvokeWithTakeout": {
+      "desc": "Invoke a method within a takeout session, see here \u00bb for more info.",
+      "params": {
+        "query": "Query",
+        "takeout_id": "Takeout session ID \u00bb"
+      }
+    },
+    "InvokeWithoutUpdates": {
+      "desc": "Invoke a request without subscribing the used connection for updates (this is enabled by default for file queries).",
+      "params": {
+        "query": "The query"
+      }
+    },
+    "account.AcceptAuthorization": {
+      "desc": "Sends a Telegram Passport authorization form, effectively sharing data with the service",
+      "params": {
+        "bot_id": "Bot ID",
+        "credentials": "Encrypted values",
+        "public_key": "Service's public key",
+        "scope": "Telegram Passport element types requested by the service",
+        "value_hashes": "Types of values sent and their hashes"
+      }
+    },
+    "account.CancelPasswordEmail": {
+      "desc": "Cancel the code that was sent to verify an email to use as 2FA recovery method.",
+      "params": {}
+    },
+    "account.ChangeAuthorizationSettings": {
+      "desc": "Change settings related to a session.",
+      "params": {
+        "call_requests_disabled": "Whether to enable or disable receiving calls: if the flag is not set, the previous setting is not changed",
+        "confirmed": "If set, confirms a newly logged in session \u00bb.",
+        "encrypted_requests_disabled": "Whether to enable or disable receiving encrypted chats: if the flag is not set, the previous setting is not changed",
+        "flags": "Flags, see TL conditional fields",
+        "hash": "Session ID from the authorization constructor, fetchable using account.getAuthorizations"
+      }
+    },
+    "account.ChangePhone": {
+      "desc": "Change the phone number of the current account",
+      "params": {
+        "phone_code": "Phone code received when calling account.sendChangePhoneCode",
+        "phone_code_hash": "Phone code hash received when calling account.sendChangePhoneCode",
+        "phone_number": "New phone number"
+      }
+    },
+    "account.CheckUsername": {
+      "desc": "Validates a username and checks availability.",
+      "params": {
+        "username": "usernameAccepted characters: A-z (case-insensitive), 0-9 and underscores.Length: 5-32 characters."
+      }
+    },
+    "account.ClearRecentEmojiStatuses": {
+      "desc": "Clears list of recently used emoji statuses",
+      "params": {}
+    },
+    "account.ConfirmPasswordEmail": {
+      "desc": "Verify an email to use as 2FA recovery method.",
+      "params": {
+        "code": "The phone code that was received after setting a recovery email"
+      }
+    },
+    "account.ConfirmPhone": {
+      "desc": "Confirm a phone number to cancel account deletion, for more info click here \u00bb",
+      "params": {
+        "phone_code": "SMS code, for more info click here \u00bb",
+        "phone_code_hash": "Phone code hash, for more info click here \u00bb"
+      }
+    },
+    "account.CreateBusinessChatLink": {
+      "desc": "Create a business chat deep link \u00bb.",
+      "params": {
+        "link": "Info about the link to create."
+      }
+    },
+    "account.CreateTheme": {
+      "desc": "Create a theme",
+      "params": {
+        "document": "Theme file",
+        "flags": "Flags, see TL conditional fields",
+        "settings": "Theme settings, multiple values can be provided for the different base themes (day/night mode, etc).",
+        "slug": "Unique theme ID used to generate theme deep links, can be empty to autogenerate a random ID.",
+        "title": "Theme name"
+      }
+    },
+    "account.DeclinePasswordReset": {
+      "desc": "Abort a pending 2FA password reset, see here for more info \u00bb",
+      "params": {}
+    },
+    "account.DeleteAccount": {
+      "desc": "Delete the user's account from the telegram servers.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "password": "2FA password: this field can be omitted even for accounts with 2FA enabled: in this case account account deletion will be delayed by 7 days as specified in the docs \u00bb",
+        "reason": "Why is the account being deleted, can be empty"
+      }
+    },
+    "account.DeleteAutoSaveExceptions": {
+      "desc": "Clear all peer-specific autosave settings.",
+      "params": {}
+    },
+    "account.DeleteBusinessChatLink": {
+      "desc": "Delete a business chat deep link \u00bb.",
+      "params": {
+        "slug": "Slug of the link, obtained as specified here \u00bb."
+      }
+    },
+    "account.DeleteSecureValue": {
+      "desc": "Delete stored Telegram Passport documents, for more info see the passport docs \u00bb",
+      "params": {
+        "types": "Document types to delete"
+      }
+    },
+    "account.DisablePeerConnectedBot": {
+      "desc": "Permanently disconnect a specific chat from all business bots \u00bb (equivalent to specifying it in recipients.exclude_users during initial configuration with account.updateConnectedBot \u00bb); to reconnect of a chat disconnected using this method the user must reconnect the entire bot by invoking account.updateConnectedBot \u00bb.",
+      "params": {
+        "peer": "The chat to disconnect"
+      }
+    },
+    "account.EditBusinessChatLink": {
+      "desc": "Edit a created business chat deep link \u00bb.",
+      "params": {
+        "link": "New link information.",
+        "slug": "Slug of the link, obtained as specified here \u00bb."
+      }
+    },
+    "account.FinishTakeoutSession": {
+      "desc": "Terminate a takeout session, see here \u00bb for more info.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "success": "Data exported successfully"
+      }
+    },
+    "account.GetAccountTTL": {
+      "desc": "Get days to live of account",
+      "params": {}
+    },
+    "account.GetAllSecureValues": {
+      "desc": "Get all saved Telegram Passport documents, for more info see the passport docs \u00bb",
+      "params": {}
+    },
+    "account.GetAuthorizationForm": {
+      "desc": "Returns a Telegram Passport authorization form for sharing data with a service",
+      "params": {
+        "bot_id": "User identifier of the service's bot",
+        "public_key": "Service's public key",
+        "scope": "Telegram Passport element types requested by the service"
+      }
+    },
+    "account.GetAuthorizations": {
+      "desc": "Get logged-in sessions",
+      "params": {}
+    },
+    "account.GetAutoDownloadSettings": {
+      "desc": "Get media autodownload settings",
+      "params": {}
+    },
+    "account.GetAutoSaveSettings": {
+      "desc": "Get autosave settings",
+      "params": {}
+    },
+    "account.GetBotBusinessConnection": {
+      "desc": "Bots may invoke this method to re-fetch the updateBotBusinessConnect constructor associated with a specific business connection_id, see here \u00bb for more info on connected business bots.\nThis is needed for example for freshly logged in bots that are receiving some updateBotNewBusinessMessage, etc. updates because some users have already connected to the bot before it could login.\nIn this case, the bot is receiving messages from the business connection, but it hasn't cached the associated updateBotBusinessConnect with info about the connection (can it reply to messages? etc.) yet, and cannot receive the old ones because they were sent when the bot wasn't logged into the session yet.\nThis method can be used to fetch info about a not-yet-cached business connection, and should not be invoked if the info is already cached or to fetch changes, as eventual changes will automatically be sent as new updateBotBusinessConnect updates to the bot using the usual update delivery methods \u00bb.",
+      "params": {
+        "connection_id": "Business connection ID \u00bb."
+      }
+    },
+    "account.GetBusinessChatLinks": {
+      "desc": "List all created business chat deep links \u00bb.",
+      "params": {}
+    },
+    "account.GetChannelDefaultEmojiStatuses": {
+      "desc": "Get a list of default suggested channel emoji statuses.",
+      "params": {
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "account.GetChannelRestrictedStatusEmojis": {
+      "desc": "Returns fetch the full list of custom emoji IDs \u00bb that cannot be used in channel emoji statuses \u00bb.",
+      "params": {
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "account.GetChatThemes": {
+      "desc": "Get all available chat themes \u00bb.",
+      "params": {
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "account.GetCollectibleEmojiStatuses": {
+      "desc": "Obtain a list of emoji statuses \u00bb for owned collectible gifts.",
+      "params": {
+        "hash": "Hash for pagination"
+      }
+    },
+    "account.GetConnectedBots": {
+      "desc": "List all currently connected business bots \u00bb",
+      "params": {}
+    },
+    "account.GetContactSignUpNotification": {
+      "desc": "Whether the user will receive notifications when contacts sign up",
+      "params": {}
+    },
+    "account.GetContentSettings": {
+      "desc": "Get sensitive content settings",
+      "params": {}
+    },
+    "account.GetDefaultBackgroundEmojis": {
+      "desc": "Get a set of suggested custom emoji stickers that can be used in an accent color pattern.",
+      "params": {
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "account.GetDefaultEmojiStatuses": {
+      "desc": "Get a list of default suggested emoji statuses",
+      "params": {
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "account.GetDefaultGroupPhotoEmojis": {
+      "desc": "Get a set of suggested custom emoji stickers that can be used as group picture",
+      "params": {
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "account.GetDefaultProfilePhotoEmojis": {
+      "desc": "Get a set of suggested custom emoji stickers that can be used as profile picture",
+      "params": {
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "account.GetGlobalPrivacySettings": {
+      "desc": "Get global privacy settings",
+      "params": {}
+    },
+    "account.GetMultiWallPapers": {
+      "desc": "Get info about multiple wallpapers",
+      "params": {
+        "wallpapers": "Wallpapers to fetch info about"
+      }
+    },
+    "account.GetNotifyExceptions": {
+      "desc": "Returns list of chats with non-default notification settings",
+      "params": {
+        "compare_sound": "If set, chats with non-default sound will be returned",
+        "compare_stories": "If set, chats with non-default notification settings for stories will be returned",
+        "flags": "Flags, see TL conditional fields",
+        "peer": "If specified, only chats of the specified category will be returned"
+      }
+    },
+    "account.GetNotifySettings": {
+      "desc": "Gets current notification settings for a given user/group, from all users/all groups.",
+      "params": {
+        "peer": "Notification source"
+      }
+    },
+    "account.GetPaidMessagesRevenue": {
+      "desc": "Get the number of stars we have received from the specified user thanks to paid messages \u00bb; the received amount will be equal to the sent amount multiplied by stars_paid_message_commission_permille divided by 1000.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "parent_peer": "If set, can contain the ID of a monoforum (channel direct messages) to obtain the number of stars the user has spent to send us direct messages via the channel.",
+        "user_id": "The user that paid to send us messages."
+      }
+    },
+    "account.GetPassword": {
+      "desc": "Obtain configuration for two-factor authorization with password",
+      "params": {}
+    },
+    "account.GetPasswordSettings": {
+      "desc": "Get private info associated to the password info (recovery email, telegram passport info & so on)",
+      "params": {
+        "password": "The password (see SRP)"
+      }
+    },
+    "account.GetPrivacy": {
+      "desc": "Get privacy settings of current account",
+      "params": {
+        "key": "Peer category whose privacy settings should be fetched"
+      }
+    },
+    "account.GetReactionsNotifySettings": {
+      "desc": "Get the current reaction notification settings \u00bb.",
+      "params": {}
+    },
+    "account.GetRecentEmojiStatuses": {
+      "desc": "Get recently used emoji statuses",
+      "params": {
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "account.GetSavedMusicIds": {
+      "desc": "Fetch the full list of only the IDs of songs currently added to the profile, see here \u00bb for more info.",
+      "params": {
+        "hash": "Hash generated \u00bb from the previously returned list of IDs."
+      }
+    },
+    "account.GetSavedRingtones": {
+      "desc": "Fetch saved notification sounds",
+      "params": {
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "account.GetSecureValue": {
+      "desc": "Get saved Telegram Passport document, for more info see the passport docs \u00bb",
+      "params": {
+        "types": "Requested value types"
+      }
+    },
+    "account.GetTheme": {
+      "desc": "Get theme information",
+      "params": {
+        "format": "Theme format, a string that identifies the theming engines supported by the client",
+        "theme": "Theme"
+      }
+    },
+    "account.GetThemes": {
+      "desc": "Get installed themes",
+      "params": {
+        "format": "Theme format, a string that identifies the theming engines supported by the client",
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "account.GetTmpPassword": {
+      "desc": "Get temporary payment password",
+      "params": {
+        "password": "SRP password parameters",
+        "period": "Time during which the temporary password will be valid, in seconds; should be between 60 and 86400"
+      }
+    },
+    "account.GetUniqueGiftChatThemes": {
+      "desc": "Obtain all chat themes \u00bb associated to owned collectible gifts \u00bb.",
+      "params": {
+        "hash": "Hash from a previously returned account.chatThemes constructor, to avoid returning any result if the theme list hasn't changed.",
+        "limit": "Maximum number of results to return, see pagination",
+        "offset": "Offset for pagination."
+      }
+    },
+    "account.GetWallPaper": {
+      "desc": "Get info about a certain wallpaper",
+      "params": {
+        "wallpaper": "The wallpaper to get info about"
+      }
+    },
+    "account.GetWallPapers": {
+      "desc": "Returns a list of available wallpapers.",
+      "params": {
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "account.GetWebAuthorizations": {
+      "desc": "Get web login widget authorizations",
+      "params": {}
+    },
+    "account.InitTakeoutSession": {
+      "desc": "Initialize a takeout session, see here \u00bb for more info.",
+      "params": {
+        "contacts": "Whether to export contacts",
+        "file_max_size": "Maximum size of files to export",
+        "files": "Whether to export files",
+        "flags": "Flags, see TL conditional fields",
+        "message_channels": "Whether to export messages in channels",
+        "message_chats": "Whether to export messages in basic groups",
+        "message_megagroups": "Whether to export messages in supergroups",
+        "message_users": "Whether to export messages in private chats"
+      }
+    },
+    "account.InstallTheme": {
+      "desc": "Install a theme",
+      "params": {
+        "base_theme": "Indicates a basic theme provided by all clients",
+        "dark": "Whether to install the dark version",
+        "flags": "Flags, see TL conditional fields",
+        "format": "Theme format, a string that identifies the theming engines supported by the client",
+        "theme": "Theme to install"
+      }
+    },
+    "account.InstallWallPaper": {
+      "desc": "Install wallpaper",
+      "params": {
+        "settings": "Wallpaper settings",
+        "wallpaper": "Wallpaper to install"
+      }
+    },
+    "account.InvalidateSignInCodes": {
+      "desc": "Invalidate the specified login codes, see here \u00bb for more info.",
+      "params": {
+        "codes": "The login codes to invalidate."
+      }
+    },
+    "account.RegisterDevice": {
+      "desc": "Register device to receive PUSH notifications",
+      "params": {
+        "app_sandbox": "If (boolTrue) is transmitted, a sandbox-certificate will be used during transmission.",
+        "flags": "Flags, see TL conditional fields",
+        "no_muted": "Avoid receiving (silent and invisible background) notifications. Useful to save battery.",
+        "other_uids": "List of user identifiers of other users currently using the client",
+        "secret": "For FCM and APNS VoIP, optional encryption key used to encrypt push notifications",
+        "token": "Device token, see PUSH updates for the possible values.",
+        "token_type": "Device token type, see PUSH updates for the possible values."
+      }
+    },
+    "account.ReorderUsernames": {
+      "desc": "Reorder usernames associated with the currently logged-in user.",
+      "params": {
+        "order": "The new order for active usernames. All active usernames must be specified."
+      }
+    },
+    "account.ReportPeer": {
+      "desc": "Report a peer for violation of telegram's Terms of Service",
+      "params": {
+        "message": "Comment for report moderation",
+        "peer": "The peer to report",
+        "reason": "The reason why this peer is being reported"
+      }
+    },
+    "account.ReportProfilePhoto": {
+      "desc": "Report a profile photo of a dialog",
+      "params": {
+        "message": "Comment for report moderation",
+        "peer": "The dialog",
+        "photo_id": "Dialog photo ID",
+        "reason": "Report reason"
+      }
+    },
+    "account.ResendPasswordEmail": {
+      "desc": "Resend the code to verify an email to use as 2FA recovery method.",
+      "params": {}
+    },
+    "account.ResetAuthorization": {
+      "desc": "Log out an active authorized session by its hash",
+      "params": {
+        "hash": "Session hash"
+      }
+    },
+    "account.ResetNotifySettings": {
+      "desc": "Resets all notification settings from users and groups.",
+      "params": {}
+    },
+    "account.ResetPassword": {
+      "desc": "Initiate a 2FA password reset: can only be used if the user is already logged-in, see here for more info \u00bb",
+      "params": {}
+    },
+    "account.ResetWallPapers": {
+      "desc": "Delete all installed wallpapers, reverting to the default wallpaper set.",
+      "params": {}
+    },
+    "account.ResetWebAuthorization": {
+      "desc": "Log out an active web telegram login session",
+      "params": {
+        "hash": "Session hash"
+      }
+    },
+    "account.ResetWebAuthorizations": {
+      "desc": "Reset all active web telegram login sessions",
+      "params": {}
+    },
+    "account.ResolveBusinessChatLink": {
+      "desc": "Resolve a business chat deep link \u00bb.",
+      "params": {
+        "slug": "Slug of the link, obtained as specified here \u00bb."
+      }
+    },
+    "account.SaveAutoDownloadSettings": {
+      "desc": "Change media autodownload settings",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "high": "Whether to save media in the high data usage preset",
+        "low": "Whether to save media in the low data usage preset",
+        "settings": "Media autodownload settings"
+      }
+    },
+    "account.SaveAutoSaveSettings": {
+      "desc": "Modify autosave settings",
+      "params": {
+        "broadcasts": "Whether the new settings should affect all channels",
+        "chats": "Whether the new settings should affect all groups",
+        "flags": "Flags, see TL conditional fields",
+        "peer": "Whether the new settings should affect a specific peer",
+        "settings": "The new autosave settings",
+        "users": "Whether the new settings should affect all private chats"
+      }
+    },
+    "account.SaveMusic": {
+      "desc": "Adds or removes a song from the current user's profile see here \u00bb for more info on the music tab of the profile page.",
+      "params": {
+        "after_id": "If set, the song will be added after the passed song (must be already pinned on the profile).",
+        "flags": "Flags, see TL conditional fields",
+        "id": "The song to add or remove; can be an already added song when reordering songs with after_id. Adding an already added song will never re-add it, only move it to the top of the song list (or after the song passed in after_id).",
+        "unsave": "If set, removes the song."
+      }
+    },
+    "account.SaveRingtone": {
+      "desc": "Save or remove saved notification sound.",
+      "params": {
+        "id": "Notification sound uploaded using account.uploadRingtone",
+        "unsave": "Whether to add or delete the notification sound"
+      }
+    },
+    "account.SaveSecureValue": {
+      "desc": "Securely save Telegram Passport document, for more info see the passport docs \u00bb",
+      "params": {
+        "secure_secret_id": "Passport secret hash, for more info see the passport docs \u00bb",
+        "value": "Secure value, for more info see the passport docs \u00bb"
+      }
+    },
+    "account.SaveTheme": {
+      "desc": "Save a theme",
+      "params": {
+        "theme": "Theme to save",
+        "unsave": "Unsave"
+      }
+    },
+    "account.SaveWallPaper": {
+      "desc": "Install/uninstall wallpaper",
+      "params": {
+        "settings": "Wallpaper settings",
+        "unsave": "Uninstall wallpaper?",
+        "wallpaper": "Wallpaper to install or uninstall"
+      }
+    },
+    "account.SendChangePhoneCode": {
+      "desc": "Verify a new phone number to associate to the current account",
+      "params": {
+        "phone_number": "New phone number",
+        "settings": "Phone code settings"
+      }
+    },
+    "account.SendConfirmPhoneCode": {
+      "desc": "Send confirmation code to cancel account deletion, for more info click here \u00bb",
+      "params": {
+        "hash": "The hash from the service notification, for more info click here \u00bb",
+        "settings": "Phone code settings"
+      }
+    },
+    "account.SendVerifyEmailCode": {
+      "desc": "Send an email verification code.",
+      "params": {
+        "email": "The email where to send the code.",
+        "purpose": "Verification purpose."
+      }
+    },
+    "account.SendVerifyPhoneCode": {
+      "desc": "Send the verification phone code for telegram passport.",
+      "params": {
+        "phone_number": "The phone number to verify",
+        "settings": "Phone code settings"
+      }
+    },
+    "account.SetAccountTTL": {
+      "desc": "Set account self-destruction period",
+      "params": {
+        "ttl": "Time to live in days"
+      }
+    },
+    "account.SetAuthorizationTTL": {
+      "desc": "Set time-to-live of current session",
+      "params": {
+        "authorization_ttl_days": "Time-to-live of current session in days"
+      }
+    },
+    "account.SetContactSignUpNotification": {
+      "desc": "Toggle contact sign up notifications",
+      "params": {
+        "silent": "Whether to disable contact sign up notifications"
+      }
+    },
+    "account.SetContentSettings": {
+      "desc": "Set sensitive content settings (for viewing or hiding NSFW content)",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "sensitive_enabled": "Enable NSFW content"
+      }
+    },
+    "account.SetGlobalPrivacySettings": {
+      "desc": "Set global privacy settings",
+      "params": {
+        "settings": "Global privacy settings"
+      }
+    },
+    "account.SetMainProfileTab": {
+      "desc": "Changes the main profile tab of the current user, see here \u00bb for more info.",
+      "params": {
+        "tab": "The tab to set as main tab."
+      }
+    },
+    "account.SetPrivacy": {
+      "desc": "Change privacy settings of current account",
+      "params": {
+        "key": "New privacy rule",
+        "rules": "Peers to which the privacy rule will apply."
+      }
+    },
+    "account.SetReactionsNotifySettings": {
+      "desc": "Change the reaction notification settings \u00bb.",
+      "params": {
+        "settings": "New reaction notification settings."
+      }
+    },
+    "account.ToggleConnectedBotPaused": {
+      "desc": "Pause or unpause a specific chat, temporarily disconnecting it from all business bots \u00bb.",
+      "params": {
+        "paused": "Whether to pause or unpause the chat",
+        "peer": "The chat to pause"
+      }
+    },
+    "account.ToggleNoPaidMessagesException": {
+      "desc": "Allow a user to send us messages without paying if paid messages \u00bb are enabled.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "parent_peer": "If set, applies the setting within the monoforum aka direct messages \u00bb (pass the ID of the monoforum, not the ID of the associated channel).",
+        "refund_charged": "If set and require_payment is not set, refunds the amounts the user has already paid us to send us messages (directly or via a monoforum).",
+        "require_payment": "If set, requires the user to pay in order to send us messages. Can only be set by monoforums, not users, i.e. parent_peer must be set if this flag is set; users must instead use the inputPrivacyKeyNoPaidMessages privacy setting to remove a previously added exemption. If not set, allows the user to send us messages without paying (can be unset by both monoforums and users).",
+        "user_id": "The user to exempt or unexempt."
+      }
+    },
+    "account.ToggleSponsoredMessages": {
+      "desc": "Disable or re-enable Telegram ads for the current Premium account.",
+      "params": {
+        "enabled": "Enable or disable ads."
+      }
+    },
+    "account.ToggleUsername": {
+      "desc": "Activate or deactivate a purchased fragment.com username associated to the currently logged-in user.",
+      "params": {
+        "active": "Whether to activate or deactivate it",
+        "username": "Username"
+      }
+    },
+    "account.UnregisterDevice": {
+      "desc": "Deletes a device by its token, stops sending PUSH-notifications to it.",
+      "params": {
+        "other_uids": "List of user identifiers of other users currently using the client",
+        "token": "Device token, see PUSH updates for the possible values.",
+        "token_type": "Device token type, see PUSH updates for the possible values."
+      }
+    },
+    "account.UpdateBirthday": {
+      "desc": "Update our birthday, see here \u00bb for more info.",
+      "params": {
+        "birthday": "Birthday.",
+        "flags": "Flags, see TL conditional fields"
+      }
+    },
+    "account.UpdateBusinessAwayMessage": {
+      "desc": "Set a list of Telegram Business away messages.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "message": "Away message configuration and contents."
+      }
+    },
+    "account.UpdateBusinessGreetingMessage": {
+      "desc": "Set a list of Telegram Business greeting messages.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "message": "Greeting message configuration and contents."
+      }
+    },
+    "account.UpdateBusinessIntro": {
+      "desc": "Set or remove the Telegram Business introduction \u00bb.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "intro": "Telegram Business introduction, to remove it call the method without setting this flag."
+      }
+    },
+    "account.UpdateBusinessLocation": {
+      "desc": "Businesses \u00bb may advertise their location using this method, see here \u00bb for more info.",
+      "params": {
+        "address": "Mandatory when setting/updating the location, contains a textual description of the address (max 96 UTF-8 chars).",
+        "flags": "Flags, see TL conditional fields",
+        "geo_point": "Optional, contains a set of geographical coordinates."
+      }
+    },
+    "account.UpdateBusinessWorkHours": {
+      "desc": "Specify a set of Telegram Business opening hours.\nThis info will be contained in userFull.business_work_hours.",
+      "params": {
+        "business_work_hours": "Opening hours (optional, if not set removes all opening hours).",
+        "flags": "Flags, see TL conditional fields"
+      }
+    },
+    "account.UpdateColor": {
+      "desc": "Update the accent color and background custom emoji \u00bb of the current account.",
+      "params": {
+        "background_emoji_id": "Custom emoji ID used in the accent color pattern.",
+        "color": "ID of the accent color palette \u00bb to use (not RGB24, see here \u00bb for more info).",
+        "flags": "Flags, see TL conditional fields",
+        "for_profile": "Whether to change the accent color emoji pattern of the profile page; otherwise, the accent color and emoji pattern of messages will be changed."
+      }
+    },
+    "account.UpdateConnectedBot": {
+      "desc": "Connect a business bot \u00bb to the current account, or to change the current connection settings.",
+      "params": {
+        "bot": "The bot to connect or disconnect",
+        "deleted": "Whether to fully disconnect the bot from the current account.",
+        "flags": "Flags, see TL conditional fields",
+        "recipients": "Configuration for the business connection",
+        "rights": "Business bot rights."
+      }
+    },
+    "account.UpdateDeviceLocked": {
+      "desc": "When client-side passcode lock feature is enabled, will not show message texts in incoming PUSH notifications.",
+      "params": {
+        "period": "Inactivity period after which to start hiding message texts in PUSH notifications."
+      }
+    },
+    "account.UpdateEmojiStatus": {
+      "desc": "Set an emoji status",
+      "params": {
+        "emoji_status": "Emoji status to set"
+      }
+    },
+    "account.UpdateNotifySettings": {
+      "desc": "Edits notification settings from a given user/group, from all users/all groups.",
+      "params": {
+        "peer": "Notification source",
+        "settings": "Notification settings"
+      }
+    },
+    "account.UpdatePasswordSettings": {
+      "desc": "Set a new 2FA password",
+      "params": {
+        "new_settings": "The new password (see SRP)",
+        "password": "The old password (see SRP)"
+      }
+    },
+    "account.UpdatePersonalChannel": {
+      "desc": "Associate (or remove) a personal channel \u00bb, that will be listed on our personal profile page \u00bb.",
+      "params": {
+        "channel": "The channel, pass inputChannelEmpty to remove it."
+      }
+    },
+    "account.UpdateProfile": {
+      "desc": "Updates user profile.",
+      "params": {
+        "about": "New bio",
+        "first_name": "New user first name",
+        "flags": "Flags, see TL conditional fields",
+        "last_name": "New user last name"
+      }
+    },
+    "account.UpdateStatus": {
+      "desc": "Updates online user status.",
+      "params": {
+        "offline": "If (boolTrue) is transmitted, user status will change to (userStatusOffline)."
+      }
+    },
+    "account.UpdateTheme": {
+      "desc": "Update theme",
+      "params": {
+        "document": "Theme file",
+        "flags": "Flags, see TL conditional fields",
+        "format": "Theme format, a string that identifies the theming engines supported by the client",
+        "settings": "Theme settings",
+        "slug": "Unique theme ID",
+        "theme": "Theme to update",
+        "title": "Theme name"
+      }
+    },
+    "account.UpdateUsername": {
+      "desc": "Changes username for the current user.",
+      "params": {
+        "username": "username or empty string if username is to be removedAccepted characters: a-z (case-insensitive), 0-9 and underscores.Length: 5-32 characters."
+      }
+    },
+    "account.UploadRingtone": {
+      "desc": "Upload notification sound, use account.saveRingtone to convert it and add it to the list of saved notification sounds.",
+      "params": {
+        "file": "Notification sound",
+        "file_name": "File name",
+        "mime_type": "MIME type of file"
+      }
+    },
+    "account.UploadTheme": {
+      "desc": "Upload theme",
+      "params": {
+        "file": "Previously uploaded theme file with platform-specific colors for UI components, can be left unset when creating themes that only modify the wallpaper or accent colors.",
+        "file_name": "File name",
+        "flags": "Flags, see TL conditional fields",
+        "mime_type": "MIME type, must be application/x-tgtheme-{format}, where format depends on the client",
+        "thumb": "Thumbnail"
+      }
+    },
+    "account.UploadWallPaper": {
+      "desc": "Create and upload a new wallpaper",
+      "params": {
+        "file": "The JPG/PNG wallpaper",
+        "flags": "Flags, see TL conditional fields",
+        "for_chat": "Set this flag when uploading wallpapers to be passed to messages.setChatWallPaper.",
+        "mime_type": "MIME type of uploaded wallpaper",
+        "settings": "Wallpaper settings"
+      }
+    },
+    "account.VerifyEmail": {
+      "desc": "Verify an email address.",
+      "params": {
+        "purpose": "Verification purpose",
+        "verification": "Email verification code or token"
+      }
+    },
+    "account.VerifyPhone": {
+      "desc": "Verify a phone number for telegram passport.",
+      "params": {
+        "phone_code": "Code received after the call to account.sendVerifyPhoneCode",
+        "phone_code_hash": "Phone code hash received from the call to account.sendVerifyPhoneCode",
+        "phone_number": "Phone number"
+      }
+    },
+    "auth.AcceptLoginToken": {
+      "desc": "Accept QR code login token, logging in the app that generated it.",
+      "params": {
+        "token": "Login token embedded in QR code, for more info, see login via QR code."
+      }
+    },
+    "auth.BindTempAuthKey": {
+      "desc": "Binds a temporary authorization key temp_auth_key_id to the permanent authorization key perm_auth_key_id. Each permanent key may only be bound to one temporary key at a time, binding a new temporary key overwrites the previous one.",
+      "params": {
+        "encrypted_message": "See Generating encrypted_message",
+        "expires_at": "Unix timestamp to invalidate temporary key, see Binding message contents",
+        "nonce": "Random long from Binding message contents",
+        "perm_auth_key_id": "Permanent auth_key_id to bind to"
+      }
+    },
+    "auth.CancelCode": {
+      "desc": "Cancel the login verification code",
+      "params": {
+        "phone_code_hash": "Phone code hash from auth.sendCode",
+        "phone_number": "Phone number"
+      }
+    },
+    "auth.CheckPassword": {
+      "desc": "Try logging to an account protected by a 2FA password.",
+      "params": {
+        "password": "The account's password (see SRP)"
+      }
+    },
+    "auth.CheckRecoveryPassword": {
+      "desc": "Check if the 2FA recovery code sent using auth.requestPasswordRecovery is valid, before passing it to auth.recoverPassword.",
+      "params": {
+        "code": "Code received via email"
+      }
+    },
+    "auth.DropTempAuthKeys": {
+      "desc": "Delete all temporary authorization keys except for the ones specified",
+      "params": {
+        "except_auth_keys": "The auth keys that shouldn't be dropped."
+      }
+    },
+    "auth.ExportAuthorization": {
+      "desc": "Returns data for copying authorization to another data-center.",
+      "params": {
+        "dc_id": "Number of a target data-center"
+      }
+    },
+    "auth.ExportLoginToken": {
+      "desc": "Generate a login token, for login via QR code.\nThe generated login token should be encoded using base64url, then shown as a tg://login?token=base64encodedtoken deep link \u00bb in the QR code.",
+      "params": {
+        "api_hash": "Application identifier hash (see. App configuration)",
+        "api_id": "Application identifier (see. App configuration)",
+        "except_ids": "List of already logged-in user IDs, to prevent logging in twice with the same user"
+      }
+    },
+    "auth.ImportAuthorization": {
+      "desc": "Logs in a user using a key transmitted from his native data-center.",
+      "params": {
+        "bytes": "Authorization key",
+        "id": "User ID"
+      }
+    },
+    "auth.ImportBotAuthorization": {
+      "desc": "Login as a bot",
+      "params": {
+        "api_hash": "Application identifier hash (see. App configuration)",
+        "api_id": "Application identifier (see. App configuration)",
+        "bot_auth_token": "Bot token (see bots)",
+        "flags": "Reserved for future use"
+      }
+    },
+    "auth.ImportLoginToken": {
+      "desc": "Login using a redirected login token, generated in case of DC mismatch during QR code login.",
+      "params": {
+        "token": "Login token"
+      }
+    },
+    "auth.ImportWebTokenAuthorization": {
+      "desc": "Login by importing an authorization token",
+      "params": {
+        "api_hash": "API hash",
+        "api_id": "API ID",
+        "web_auth_token": "The authorization token"
+      }
+    },
+    "auth.LogOut": {
+      "desc": "Logs out the user.",
+      "params": {}
+    },
+    "auth.RecoverPassword": {
+      "desc": "Reset the 2FA password using the recovery code sent using auth.requestPasswordRecovery.",
+      "params": {
+        "code": "Code received via email",
+        "flags": "Flags, see TL conditional fields",
+        "new_settings": "New password"
+      }
+    },
+    "auth.ReportMissingCode": {
+      "desc": "Official apps only, reports that the SMS authentication code wasn't delivered.",
+      "params": {
+        "mnc": "MNC of the current network operator.",
+        "phone_code_hash": "The phone code hash obtained from auth.sendCode",
+        "phone_number": "Phone number where we were supposed to receive the code"
+      }
+    },
+    "auth.RequestFirebaseSms": {
+      "desc": "Request an SMS code via Firebase.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "ios_push_secret": "Secret token received via an apple push notification",
+        "phone_code_hash": "Phone code hash returned by auth.sendCode",
+        "phone_number": "Phone number",
+        "play_integrity_token": "On Android, an object obtained as described in the auth documentation \u00bb",
+        "safety_net_token": "On Android, a JWS object obtained as described in the auth documentation \u00bb"
+      }
+    },
+    "auth.RequestPasswordRecovery": {
+      "desc": "Request recovery code of a 2FA password, only for accounts with a recovery email configured.",
+      "params": {}
+    },
+    "auth.ResendCode": {
+      "desc": "Resend the login code via another medium, the phone code type is determined by the return value of the previous auth.sendCode/auth.resendCode: see login for more info.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "phone_code_hash": "The phone code hash obtained from auth.sendCode",
+        "phone_number": "The phone number",
+        "reason": "Official clients only, used if the device integrity verification failed, and no secret could be obtained to invoke auth.requestFirebaseSms: in this case, the device integrity verification failure reason must be passed here."
+      }
+    },
+    "auth.ResetAuthorizations": {
+      "desc": "Terminates all user's authorized sessions except for the current one.",
+      "params": {}
+    },
+    "auth.ResetLoginEmail": {
+      "desc": "Reset the login email \u00bb.",
+      "params": {
+        "phone_code_hash": "Phone code hash, obtained as described in the documentation \u00bb",
+        "phone_number": "Phone number of the account"
+      }
+    },
+    "auth.SendCode": {
+      "desc": "Send the verification code for login",
+      "params": {
+        "api_hash": "Application secret hash (see App configuration)",
+        "api_id": "Application identifier (see App configuration)",
+        "phone_number": "Phone number in international format",
+        "settings": "Settings for the code type to send"
+      }
+    },
+    "auth.SignIn": {
+      "desc": "Signs in a user with a validated phone number.",
+      "params": {
+        "email_verification": "Email verification code or token",
+        "flags": "Flags, see TL conditional fields",
+        "phone_code": "Valid numerical code from the SMS-message",
+        "phone_code_hash": "SMS-message ID, obtained from auth.sendCode",
+        "phone_number": "Phone number in the international format"
+      }
+    },
+    "auth.SignUp": {
+      "desc": "Registers a validated phone number in the system.",
+      "params": {
+        "first_name": "New user first name",
+        "flags": "Flags, see TL conditional fields",
+        "last_name": "New user last name",
+        "no_joined_notifications": "If set, users on Telegram that have already added phone_number to their contacts will not receive signup notifications about this user.",
+        "phone_code_hash": "SMS-message ID",
+        "phone_number": "Phone number in the international format"
+      }
+    },
+    "bots.AddPreviewMedia": {
+      "desc": "Add a main mini app preview, see here \u00bb for more info.",
+      "params": {
+        "bot": "The bot that owns the Main Mini App.",
+        "lang_code": "ISO 639-1 language code, indicating the localization of the preview to add.",
+        "media": "The photo/video preview, uploaded using messages.uploadMedia."
+      }
+    },
+    "bots.AllowSendMessage": {
+      "desc": "Allow the specified bot to send us messages",
+      "params": {
+        "bot": "The bot"
+      }
+    },
+    "bots.AnswerWebhookJSONQuery": {
+      "desc": "Answers a custom query; for bots only",
+      "params": {
+        "data": "JSON-serialized answer to the query",
+        "query_id": "Identifier of a custom query"
+      }
+    },
+    "bots.CanSendMessage": {
+      "desc": "Check whether the specified bot can send us messages",
+      "params": {
+        "bot": "The bot"
+      }
+    },
+    "bots.CheckDownloadFileParams": {
+      "desc": "Check if a mini app can request the download of a specific file: called when handling web_app_request_file_download events \u00bb",
+      "params": {
+        "bot": "The bot that owns the mini app that requested the download",
+        "file_name": "The filename from the web_app_request_file_download event \u00bb",
+        "url": "The url from the web_app_request_file_download event \u00bb"
+      }
+    },
+    "bots.DeletePreviewMedia": {
+      "desc": "Delete a main mini app preview, see here \u00bb for more info.",
+      "params": {
+        "bot": "The bot that owns the Main Mini App.",
+        "lang_code": "ISO 639-1 language code, indicating the localization of the preview to delete.",
+        "media": "The photo/video preview to delete, previously fetched as specified here \u00bb."
+      }
+    },
+    "bots.EditPreviewMedia": {
+      "desc": "Edit a main mini app preview, see here \u00bb for more info.",
+      "params": {
+        "bot": "The bot that owns the Main Mini App.",
+        "lang_code": "ISO 639-1 language code, indicating the localization of the preview to edit.",
+        "media": "The photo/video preview to replace, previously fetched as specified here \u00bb.",
+        "new_media": "The new photo/video preview, uploaded using messages.uploadMedia."
+      }
+    },
+    "bots.GetAdminedBots": {
+      "desc": "Get a list of bots owned by the current user",
+      "params": {}
+    },
+    "bots.GetBotCommands": {
+      "desc": "Obtain a list of bot commands for the specified bot scope and language code",
+      "params": {
+        "lang_code": "Language code",
+        "scope": "Command scope"
+      }
+    },
+    "bots.GetBotInfo": {
+      "desc": "Get localized name, about text and description of a bot (or of the current account, if called by a bot).",
+      "params": {
+        "bot": "If called by a user, must contain the peer of a bot we own.",
+        "flags": "Flags, see TL conditional fields",
+        "lang_code": "Language code, if left empty this method will return the fallback about text and description."
+      }
+    },
+    "bots.GetBotMenuButton": {
+      "desc": "Gets the menu button action for a given user or for all users, previously set using bots.setBotMenuButton; users can see this information in the botInfo constructor.",
+      "params": {
+        "user_id": "User ID or empty for the default menu button."
+      }
+    },
+    "bots.GetBotRecommendations": {
+      "desc": "Obtain a list of similarly themed bots, selected based on similarities in their subscriber bases, see here \u00bb for more info.",
+      "params": {
+        "bot": "The method will return bots related to the passed bot."
+      }
+    },
+    "bots.GetPopularAppBots": {
+      "desc": "Fetch popular Main Mini Apps, to be used in the apps tab of global search \u00bb.",
+      "params": {
+        "limit": "Maximum number of results to return, see pagination",
+        "offset": "Offset for pagination, initially an empty string, then re-use the next_offset returned by the previous query."
+      }
+    },
+    "bots.GetPreviewInfo": {
+      "desc": "Bot owners only, fetch main mini app preview information, see here \u00bb for more info.",
+      "params": {
+        "bot": "The bot that owns the Main Mini App.",
+        "lang_code": "Fetch previews for the specified ISO 639-1 language code."
+      }
+    },
+    "bots.GetPreviewMedias": {
+      "desc": "Fetch main mini app previews, see here \u00bb for more info.",
+      "params": {
+        "bot": "The bot that owns the Main Mini App."
+      }
+    },
+    "bots.InvokeWebViewCustomMethod": {
+      "desc": "Send a custom request from a mini bot app, triggered by a web_app_invoke_custom_method event \u00bb.",
+      "params": {
+        "bot": "Identifier of the bot associated to the mini bot app",
+        "custom_method": "Identifier of the custom method to invoke",
+        "params": "Method parameters"
+      }
+    },
+    "bots.ReorderPreviewMedias": {
+      "desc": "Reorder a main mini app previews, see here \u00bb for more info.",
+      "params": {
+        "bot": "The bot that owns the Main Mini App.",
+        "lang_code": "ISO 639-1 language code, indicating the localization of the previews to reorder.",
+        "order": "New order of the previews."
+      }
+    },
+    "bots.ReorderUsernames": {
+      "desc": "Reorder usernames associated to a bot we own.",
+      "params": {
+        "bot": "The bot",
+        "order": "The new order for active usernames. All active usernames must be specified."
+      }
+    },
+    "bots.ResetBotCommands": {
+      "desc": "Clear bot commands for the specified bot scope and language code",
+      "params": {
+        "lang_code": "Language code",
+        "scope": "Command scope"
+      }
+    },
+    "bots.SendCustomRequest": {
+      "desc": "Sends a custom request; for bots only",
+      "params": {
+        "custom_method": "The method name",
+        "params": "JSON-serialized method parameters"
+      }
+    },
+    "bots.SetBotBroadcastDefaultAdminRights": {
+      "desc": "Set the default suggested admin rights for bots being added as admins to channels, see here for more info on how to handle them \u00bb.",
+      "params": {
+        "admin_rights": "Admin rights"
+      }
+    },
+    "bots.SetBotCommands": {
+      "desc": "Set bot command list",
+      "params": {
+        "commands": "Bot commands",
+        "lang_code": "Language code",
+        "scope": "Command scope"
+      }
+    },
+    "bots.SetBotGroupDefaultAdminRights": {
+      "desc": "Set the default suggested admin rights for bots being added as admins to groups, see here for more info on how to handle them \u00bb.",
+      "params": {
+        "admin_rights": "Admin rights"
+      }
+    },
+    "bots.SetBotInfo": {
+      "desc": "Set localized name, about text and description of a bot (or of the current account, if called by a bot).",
+      "params": {
+        "about": "New about text",
+        "bot": "If called by a user, must contain the peer of a bot we own.",
+        "description": "New description",
+        "flags": "Flags, see TL conditional fields",
+        "lang_code": "Language code, if left empty update the fallback about text and description",
+        "name": "New bot name"
+      }
+    },
+    "bots.SetBotMenuButton": {
+      "desc": "Sets the menu button action \u00bb for a given user or for all users",
+      "params": {
+        "button": "Bot menu button action",
+        "user_id": "User ID"
+      }
+    },
+    "bots.SetCustomVerification": {
+      "desc": "Verify a user or chat on behalf of an organization \u00bb.",
+      "params": {
+        "bot": "Must not be set if invoked by a bot, must be set to the ID of an owned bot if invoked by a user.",
+        "custom_description": "Custom description for the verification, the UTF-8 length limit for this field is contained in bot_verification_description_length_limit \u00bb. If not set, Was verified by organization \"organization_name\" will be used as description.",
+        "enabled": "If set, adds the verification; otherwise removes verification.",
+        "flags": "Flags, see TL conditional fields",
+        "peer": "The peer to verify"
+      }
+    },
+    "bots.ToggleUserEmojiStatusPermission": {
+      "desc": "Allow or prevent a bot from changing our emoji status \u00bb",
+      "params": {
+        "bot": "The bot",
+        "enabled": "Whether to allow or prevent the bot from changing our emoji status"
+      }
+    },
+    "bots.ToggleUsername": {
+      "desc": "Activate or deactivate a purchased fragment.com username associated to a bot we own.",
+      "params": {
+        "active": "Whether to activate or deactivate it",
+        "bot": "The bot",
+        "username": "Username"
+      }
+    },
+    "bots.UpdateStarRefProgram": {
+      "desc": "Create, edit or delete the affiliate program of a bot we own",
+      "params": {
+        "bot": "The bot",
+        "commission_permille": "The permille commission rate: it indicates the share of Telegram Stars received by affiliates for every transaction made by users they referred inside of the bot.    The minimum and maximum values for this parameter are contained in the starref_min_commission_permille and starref_max_commission_permille client configuration parameters.   Can be 0 to terminate the affiliate program.  Both the duration and the commission may only be raised after creation of the program: to lower them, the program must first be terminated and a new one created.",
+        "duration_months": "Indicates the duration of the affiliate program; if not set, there is no expiration date.",
+        "flags": "Flags, see TL conditional fields"
+      }
+    },
+    "bots.UpdateUserEmojiStatus": {
+      "desc": "Change the emoji status of a user (invoked by bots, see here \u00bb for more info on the full flow)",
+      "params": {
+        "emoji_status": "The emoji status",
+        "user_id": "The user whose emoji status should be changed"
+      }
+    },
+    "channels.CheckSearchPostsFlood": {
+      "desc": "Check if the specified global post search \u00bb requires payment.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "query": "The query."
+      }
+    },
+    "channels.CheckUsername": {
+      "desc": "Check if a username is free and can be assigned to a channel/supergroup",
+      "params": {
+        "channel": "The channel/supergroup that will assigned the specified username",
+        "username": "The username to check"
+      }
+    },
+    "channels.ConvertToGigagroup": {
+      "desc": "Convert a supergroup to a gigagroup, when requested by channel suggestions.",
+      "params": {
+        "channel": "The supergroup to convert"
+      }
+    },
+    "channels.CreateChannel": {
+      "desc": "Create a supergroup/channel.",
+      "params": {
+        "about": "Channel description",
+        "address": "Geogroup address, see here \u00bb for more info on geogroups.",
+        "broadcast": "Whether to create a channel",
+        "flags": "Flags, see TL conditional fields",
+        "for_import": "Whether the supergroup is being created to import messages from a foreign chat service using messages.initHistoryImport",
+        "forum": "Whether to create a forum",
+        "geo_point": "Geogroup location, see here \u00bb for more info on geogroups.",
+        "megagroup": "Whether to create a supergroup",
+        "title": "Channel title",
+        "ttl_period": "Time-to-live of all messages that will be sent in the supergroup: once message.date+message.ttl_period === time(), the message will be deleted on the server, and must be deleted locally as well. You can use messages.setDefaultHistoryTTL to edit this value later."
+      }
+    },
+    "channels.CreateForumTopic": {
+      "desc": "Create a forum topic; requires manage_topics rights.",
+      "params": {
+        "channel": "The forum",
+        "flags": "Flags, see TL conditional fields",
+        "icon_color": "If no custom emoji icon is specified, specifies the color of the fallback topic icon (RGB), one of 0x6FB9F0, 0xFFD67E, 0xCB86DB, 0x8EEE98, 0xFF93B2, or 0xFB6F5F.",
+        "icon_emoji_id": "ID of the custom emoji used as topic icon. Telegram Premium users can use any custom emoji, other users can only use the custom emojis contained in the inputStickerSetEmojiDefaultTopicIcons emoji pack.",
+        "random_id": "Unique client message ID to prevent duplicate sending of the same event",
+        "send_as": "Create the topic as the specified peer",
+        "title": "Topic title (maximum UTF-8 length: 128)"
+      }
+    },
+    "channels.DeactivateAllUsernames": {
+      "desc": "Disable all purchased usernames of a supergroup or channel",
+      "params": {
+        "channel": "Supergroup or channel"
+      }
+    },
+    "channels.DeleteChannel": {
+      "desc": "Delete a channel/supergroup",
+      "params": {
+        "channel": "Channel/supergroup to delete"
+      }
+    },
+    "channels.DeleteHistory": {
+      "desc": "Delete the history of a supergroup",
+      "params": {
+        "channel": "Supergroup whose history must be deleted",
+        "flags": "Flags, see TL conditional fields",
+        "for_everyone": "Whether the history should be deleted for everyone",
+        "max_id": "ID of message up to which the history must be deleted"
+      }
+    },
+    "channels.DeleteMessages": {
+      "desc": "Delete messages in a channel/supergroup",
+      "params": {
+        "channel": "Channel/supergroup",
+        "id": "IDs of messages to delete"
+      }
+    },
+    "channels.DeleteParticipantHistory": {
+      "desc": "Delete all messages sent by a specific participant of a given supergroup",
+      "params": {
+        "channel": "Supergroup",
+        "participant": "The participant whose messages should be deleted"
+      }
+    },
+    "channels.DeleteTopicHistory": {
+      "desc": "Delete message history of a forum topic",
+      "params": {
+        "channel": "Forum",
+        "top_msg_id": "Topic ID"
+      }
+    },
+    "channels.EditAdmin": {
+      "desc": "Modify the admin rights of a user in a supergroup/channel.",
+      "params": {
+        "admin_rights": "The admin rights",
+        "channel": "The supergroup/channel.",
+        "rank": "Indicates the role (rank) of the admin in the group: just an arbitrary string",
+        "user_id": "The ID of the user whose admin rights should be modified"
+      }
+    },
+    "channels.EditBanned": {
+      "desc": "Ban/unban/kick a user in a supergroup/channel.",
+      "params": {
+        "banned_rights": "The banned rights",
+        "channel": "The supergroup/channel.",
+        "participant": "Participant to ban"
+      }
+    },
+    "channels.EditCreator": {
+      "desc": "Transfer channel ownership",
+      "params": {
+        "channel": "Channel",
+        "password": "2FA password of account",
+        "user_id": "New channel owner"
+      }
+    },
+    "channels.EditForumTopic": {
+      "desc": "Edit forum topic; requires manage_topics rights.",
+      "params": {
+        "channel": "Supergroup",
+        "closed": "If present, will update the open/closed status of the topic.",
+        "flags": "Flags, see TL conditional fields",
+        "hidden": "If present, will hide/unhide the topic (only valid for the \"General\" topic, id=1).",
+        "icon_emoji_id": "If present, updates the custom emoji used as topic icon. Telegram Premium users can use any custom emoji, other users can only use the custom emojis contained in the inputStickerSetEmojiDefaultTopicIcons emoji pack. Pass 0 to switch to the fallback topic icon.",
+        "title": "If present, will update the topic title (maximum UTF-8 length: 128).",
+        "topic_id": "Topic ID"
+      }
+    },
+    "channels.EditLocation": {
+      "desc": "Edit location of geogroup, see here \u00bb for more info on geogroups.",
+      "params": {
+        "address": "Address string",
+        "channel": "Geogroup",
+        "geo_point": "New geolocation"
+      }
+    },
+    "channels.EditPhoto": {
+      "desc": "Change the photo of a channel/supergroup",
+      "params": {
+        "channel": "Channel/supergroup whose photo should be edited",
+        "photo": "New photo"
+      }
+    },
+    "channels.EditTitle": {
+      "desc": "Edit the name of a channel/supergroup",
+      "params": {
+        "channel": "Channel/supergroup",
+        "title": "New name"
+      }
+    },
+    "channels.ExportMessageLink": {
+      "desc": "Get link and embed info of a message in a channel/supergroup",
+      "params": {
+        "channel": "Channel",
+        "flags": "Flags, see TL conditional fields",
+        "grouped": "Whether to include other grouped media (for albums)",
+        "id": "Message ID",
+        "thread": "Whether to also include a thread ID, if available, inside of the link"
+      }
+    },
+    "channels.GetAdminLog": {
+      "desc": "Get the admin log of a channel/supergroup",
+      "params": {
+        "admins": "Only show events from these admins",
+        "channel": "Channel",
+        "events_filter": "Event filter",
+        "flags": "Flags, see TL conditional fields",
+        "limit": "Maximum number of results to return, see pagination",
+        "max_id": "Maximum ID of message to return (see pagination)",
+        "min_id": "Minimum ID of message to return (see pagination)",
+        "q": "Search query, can be empty"
+      }
+    },
+    "channels.GetAdminedPublicChannels": {
+      "desc": "Get channels/supergroups/geogroups we're admin in. Usually called when the user exceeds the limit for owned public channels/supergroups/geogroups, and the user is given the choice to remove one of his channels/supergroups/geogroups.",
+      "params": {
+        "by_location": "Get geogroups",
+        "check_limit": "If set and the user has reached the limit of owned public channels/supergroups/geogroups, instead of returning the channel list one of the specified errors will be returned.Useful to check if a new public channel can indeed be created, even before asking the user to enter a channel username to use in channels.checkUsername/channels.updateUsername.",
+        "flags": "Flags, see TL conditional fields",
+        "for_personal": "Set this flag to only fetch the full list of channels that may be passed to account.updatePersonalChannel to display them on our profile page."
+      }
+    },
+    "channels.GetChannelRecommendations": {
+      "desc": "Obtain a list of similarly themed public channels, selected based on similarities in their subscriber bases.",
+      "params": {
+        "channel": "The method will return channels related to the passed channel. If not set, the method will returns channels related to channels the user has joined.",
+        "flags": "Flags, see TL conditional fields"
+      }
+    },
+    "channels.GetChannels": {
+      "desc": "Get info about channels/supergroups",
+      "params": {
+        "id": "IDs of channels/supergroups to get info about"
+      }
+    },
+    "channels.GetForumTopics": {
+      "desc": "Get topics of a forum",
+      "params": {
+        "channel": "Supergroup",
+        "flags": "Flags, see TL conditional fields",
+        "limit": "Maximum number of results to return, see pagination. For optimal performance, the number of returned topics is chosen by the server and can be smaller than the specified limit.",
+        "offset_date": "Offsets for pagination, for more info click here, date of the last message of the last found topic. Use 0 or any date in the future to get results from the last topic.",
+        "offset_id": "Offsets for pagination, for more info click here, ID of the last message of the last found topic (or initially 0).",
+        "offset_topic": "Offsets for pagination, for more info click here, ID of the last found topic (or initially 0).",
+        "q": "Search query"
+      }
+    },
+    "channels.GetForumTopicsByID": {
+      "desc": "Get forum topics by their ID",
+      "params": {
+        "channel": "Forum",
+        "topics": "Topic IDs"
+      }
+    },
+    "channels.GetFullChannel": {
+      "desc": "Get full info about a supergroup, gigagroup or channel",
+      "params": {
+        "channel": "The channel, supergroup or gigagroup to get info about"
+      }
+    },
+    "channels.GetGroupsForDiscussion": {
+      "desc": "Get all groups that can be used as discussion groups.",
+      "params": {}
+    },
+    "channels.GetInactiveChannels": {
+      "desc": "Get inactive channels and supergroups",
+      "params": {}
+    },
+    "channels.GetLeftChannels": {
+      "desc": "Get a list of channels/supergroups we left, requires a takeout session, see here \u00bb for more info.",
+      "params": {
+        "offset": "Offset for pagination"
+      }
+    },
+    "channels.GetMessageAuthor": {
+      "desc": "Can only be invoked by non-bot admins of a monoforum \u00bb, obtains the original sender of a message sent by other monoforum admins to the monoforum, on behalf of the channel associated to the monoforum.",
+      "params": {
+        "channel": "ID of the monoforum.",
+        "id": "ID of the message sent by a monoforum admin."
+      }
+    },
+    "channels.GetMessages": {
+      "desc": "Get channel/supergroup messages",
+      "params": {
+        "channel": "Channel/supergroup",
+        "id": "IDs of messages to get"
+      }
+    },
+    "channels.GetParticipant": {
+      "desc": "Get info about a channel/supergroup participant",
+      "params": {
+        "channel": "Channel/supergroup",
+        "participant": "Participant to get info about"
+      }
+    },
+    "channels.GetParticipants": {
+      "desc": "Get the participants of a supergroup/channel",
+      "params": {
+        "channel": "Channel",
+        "filter": "Which participant types to fetch",
+        "hash": "Hash",
+        "limit": "Limit",
+        "offset": "Offset"
+      }
+    },
+    "channels.GetSendAs": {
+      "desc": "Obtains a list of peers that can be used to send messages in a specific group",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "for_paid_reactions": "If set, fetches the list of peers that can be used to send paid reactions to messages of a specific peer.",
+        "peer": "The group where we intend to send messages"
+      }
+    },
+    "channels.InviteToChannel": {
+      "desc": "Invite users to a channel/supergroup",
+      "params": {
+        "channel": "Channel/supergroup",
+        "users": "Users to invite"
+      }
+    },
+    "channels.JoinChannel": {
+      "desc": "Join a channel/supergroup",
+      "params": {
+        "channel": "Channel/supergroup to join"
+      }
+    },
+    "channels.LeaveChannel": {
+      "desc": "Leave a channel/supergroup",
+      "params": {
+        "channel": "Channel/supergroup to leave"
+      }
+    },
+    "channels.ReadHistory": {
+      "desc": "Mark channel/supergroup history as read",
+      "params": {
+        "channel": "Channel/supergroup",
+        "max_id": "ID of message up to which messages should be marked as read"
+      }
+    },
+    "channels.ReadMessageContents": {
+      "desc": "Mark channel/supergroup message contents as read, emitting an updateChannelReadMessagesContents.",
+      "params": {
+        "channel": "Channel/supergroup",
+        "id": "IDs of messages whose contents should be marked as read"
+      }
+    },
+    "channels.ReorderPinnedForumTopics": {
+      "desc": "Reorder pinned forum topics",
+      "params": {
+        "channel": "Supergroup ID",
+        "flags": "Flags, see TL conditional fields",
+        "force": "If not set, the order of only the topics present both server-side and in order will be changed (i.e. mentioning topics not pinned server-side in order will not pin them, and not mentioning topics pinned server-side will not unpin them).  If set, the entire server-side pinned topic list will be replaced with order (i.e. mentioning topics not pinned server-side in order will pin them, and not mentioning topics pinned server-side will unpin them)",
+        "order": "Topic IDs \u00bb"
+      }
+    },
+    "channels.ReorderUsernames": {
+      "desc": "Reorder active usernames",
+      "params": {
+        "channel": "The supergroup or channel",
+        "order": "The new order for active usernames. All active usernames must be specified."
+      }
+    },
+    "channels.ReportAntiSpamFalsePositive": {
+      "desc": "Report a native antispam false positive",
+      "params": {
+        "channel": "Supergroup ID",
+        "msg_id": "Message ID that was mistakenly deleted by the native antispam system, taken from the admin log"
+      }
+    },
+    "channels.ReportSpam": {
+      "desc": "Reports some messages from a user in a supergroup as spam; requires administrator rights in the supergroup",
+      "params": {
+        "channel": "Supergroup",
+        "id": "IDs of spam messages",
+        "participant": "Participant whose messages should be reported"
+      }
+    },
+    "channels.RestrictSponsoredMessages": {
+      "desc": "Disable ads on the specified channel, for all users.",
+      "params": {
+        "channel": "The channel.",
+        "restricted": "Whether to disable or re-enable ads."
+      }
+    },
+    "channels.SearchPosts": {
+      "desc": "Globally search for posts from public channels \u00bb (including those we aren't a member of) containing either a specific hashtag, or a full text query.",
+      "params": {
+        "allow_paid_stars": "For full text post searches (query), allows payment of the specified amount of Stars for the search, see here \u00bb for more info on the full flow.",
+        "flags": "Flags, see TL conditional fields",
+        "hashtag": "The hashtag to search, without the # character.",
+        "limit": "Maximum number of results to return, see pagination",
+        "offset_id": "Offsets for pagination, for more info click here",
+        "offset_peer": "Offsets for pagination, for more info click here",
+        "offset_rate": "Initially 0, then set to the next_rate parameter of messages.messagesSlice, or if that is absent, the date of the last returned message.",
+        "query": "The full text query: each user has a limited amount of free full text search slots, after which payment is required, see here \u00bb for more info on the full flow."
+      }
+    },
+    "channels.SetBoostsToUnblockRestrictions": {
+      "desc": "Admins with ban_users admin rights \u00bb may allow users that apply a certain number of booosts \u00bb to the group to bypass slow mode \u00bb and other \u00bb supergroup restrictions, see here \u00bb for more info.",
+      "params": {
+        "boosts": "The number of required boosts (1-8, 0 to disable).",
+        "channel": "The supergroup."
+      }
+    },
+    "channels.SetDiscussionGroup": {
+      "desc": "Associate a group to a channel as discussion group for that channel",
+      "params": {
+        "broadcast": "Channel",
+        "group": "Discussion group to associate to the channel"
+      }
+    },
+    "channels.SetEmojiStickers": {
+      "desc": "Set a custom emoji stickerset for supergroups. Only usable after reaching at least the boost level \u00bb specified in the group_emoji_stickers_level_min \u00bb config parameter.",
+      "params": {
+        "channel": "The supergroup",
+        "stickerset": "The custom emoji stickerset to associate to the supergroup"
+      }
+    },
+    "channels.SetMainProfileTab": {
+      "desc": "Changes the main profile tab of a channel, see here \u00bb for more info.",
+      "params": {
+        "channel": "The channel.",
+        "tab": "The tab to set as main tab."
+      }
+    },
+    "channels.SetStickers": {
+      "desc": "Associate a stickerset to the supergroup",
+      "params": {
+        "channel": "Supergroup",
+        "stickerset": "The stickerset to associate"
+      }
+    },
+    "channels.ToggleAntiSpam": {
+      "desc": "Enable or disable the native antispam system.",
+      "params": {
+        "channel": "Supergroup ID. The specified supergroup must have at least telegram_antispam_group_size_min members to enable antispam functionality, as specified by the client configuration parameters.",
+        "enabled": "Enable or disable the native antispam system."
+      }
+    },
+    "channels.ToggleAutotranslation": {
+      "desc": "Toggle autotranslation in a channel, for all users: see here \u00bb for more info.",
+      "params": {
+        "channel": "The channel where to toggle autotranslation.",
+        "enabled": "Whether to enable or disable autotranslation."
+      }
+    },
+    "channels.ToggleForum": {
+      "desc": "Enable or disable forum functionality in a supergroup.",
+      "params": {
+        "channel": "Supergroup ID",
+        "enabled": "Enable or disable forum functionality",
+        "tabs": "If true enables the tabbed forum UI, otherwise enables the list-based forum UI."
+      }
+    },
+    "channels.ToggleJoinRequest": {
+      "desc": "Set whether all users should request admin approval to join the group \u00bb.",
+      "params": {
+        "channel": "Group",
+        "enabled": "Toggle"
+      }
+    },
+    "channels.ToggleJoinToSend": {
+      "desc": "Set whether all users should join a discussion group in order to comment on a post \u00bb",
+      "params": {
+        "channel": "Discussion group",
+        "enabled": "Toggle"
+      }
+    },
+    "channels.ToggleParticipantsHidden": {
+      "desc": "Hide or display the participants list in a supergroup.",
+      "params": {
+        "channel": "Supergroup ID",
+        "enabled": "If true, will hide the participants list; otherwise will unhide it."
+      }
+    },
+    "channels.TogglePreHistoryHidden": {
+      "desc": "Hide/unhide message history for new channel/supergroup users",
+      "params": {
+        "channel": "Channel/supergroup",
+        "enabled": "Hide/unhide"
+      }
+    },
+    "channels.ToggleSignatures": {
+      "desc": "Enable/disable message signatures in channels",
+      "params": {
+        "channel": "Channel",
+        "flags": "Flags, see TL conditional fields",
+        "profiles_enabled": "If set, messages from channel admins will link to their profiles, just like for group messages: can only be set if the signatures_enabled flag is set.",
+        "signatures_enabled": "If set, enables message signatures."
+      }
+    },
+    "channels.ToggleSlowMode": {
+      "desc": "Toggle supergroup slow mode: if enabled, users will only be able to send one message every seconds seconds",
+      "params": {
+        "channel": "The supergroup",
+        "seconds": "Users will only be able to send one message every seconds seconds, 0 to disable the limitation"
+      }
+    },
+    "channels.ToggleUsername": {
+      "desc": "Activate or deactivate a purchased fragment.com username associated to a supergroup or channel we own.",
+      "params": {
+        "active": "Whether to activate or deactivate the username",
+        "channel": "Supergroup or channel",
+        "username": "Username"
+      }
+    },
+    "channels.ToggleViewForumAsMessages": {
+      "desc": "Users may also choose to display messages from all topics of a forum as if they were sent to a normal group, using a \"View as messages\" setting in the local client: this setting only affects the current account, and is synced to other logged in sessions using this method.",
+      "params": {
+        "channel": "The forum",
+        "enabled": "The new value of the view_forum_as_messages flag."
+      }
+    },
+    "channels.UpdateColor": {
+      "desc": "Update the accent color and background custom emoji \u00bb of a channel.",
+      "params": {
+        "background_emoji_id": "Custom emoji ID used in the accent color pattern.",
+        "channel": "Channel whose accent color should be changed.",
+        "color": "ID of the accent color palette \u00bb to use (not RGB24, see here \u00bb for more info); if not set, the default palette is used.",
+        "flags": "Flags, see TL conditional fields",
+        "for_profile": "Whether to change the accent color emoji pattern of the profile page; otherwise, the accent color and emoji pattern of messages will be changed. Channels can change both message and profile palettes; supergroups can only change the profile palette, of course after reaching the appropriate boost level."
+      }
+    },
+    "channels.UpdateEmojiStatus": {
+      "desc": "Set an emoji status for a channel or supergroup.",
+      "params": {
+        "channel": "The channel/supergroup, must have at least channel_emoji_status_level_min/group_emoji_status_level_min boosts.",
+        "emoji_status": "Emoji status to set"
+      }
+    },
+    "channels.UpdatePaidMessagesPrice": {
+      "desc": "Enable or disable paid messages \u00bb in this supergroup or monoforum.",
+      "params": {
+        "broadcast_messages_allowed": "Only usable for channels, enables or disables the associated monoforum aka direct messages.",
+        "channel": "Pass the supergroup ID for supergroups and the ID of the channel to modify the setting in the associated monoforum.",
+        "flags": "Flags, see TL conditional fields",
+        "send_paid_messages_stars": "Specifies the required amount of Telegram Stars users must pay to send messages to the supergroup or monoforum."
+      }
+    },
+    "channels.UpdatePinnedForumTopic": {
+      "desc": "Pin or unpin forum topics",
+      "params": {
+        "channel": "Supergroup ID",
+        "pinned": "Whether to pin or unpin the topic",
+        "topic_id": "Forum topic ID"
+      }
+    },
+    "channels.UpdateUsername": {
+      "desc": "Change or remove the username of a supergroup/channel",
+      "params": {
+        "channel": "Channel",
+        "username": "New username, pass an empty string to remove the username"
+      }
+    },
+    "chatlists.CheckChatlistInvite": {
+      "desc": "Obtain information about a chat folder deep link \u00bb.",
+      "params": {
+        "slug": "slug obtained from the chat folder deep link \u00bb"
+      }
+    },
+    "chatlists.DeleteExportedInvite": {
+      "desc": "Delete a previously created chat folder deep link \u00bb.",
+      "params": {
+        "chatlist": "The related folder",
+        "slug": "slug obtained from the chat folder deep link \u00bb."
+      }
+    },
+    "chatlists.EditExportedInvite": {
+      "desc": "Edit a chat folder deep link \u00bb.",
+      "params": {
+        "chatlist": "Folder ID",
+        "flags": "Flags, see TL conditional fields",
+        "peers": "If set, changes the list of peers shared with the link",
+        "slug": "slug obtained from the chat folder deep link \u00bb.",
+        "title": "If set, sets a new name for the link"
+      }
+    },
+    "chatlists.ExportChatlistInvite": {
+      "desc": "Export a folder \u00bb, creating a chat folder deep link \u00bb.",
+      "params": {
+        "chatlist": "The folder to export",
+        "peers": "The list of channels, group and supergroups to share with the link. Basic groups will automatically be converted to supergroups when invoking the method.",
+        "title": "An optional name for the link"
+      }
+    },
+    "chatlists.GetChatlistUpdates": {
+      "desc": "Fetch new chats associated with an imported chat folder deep link \u00bb. Must be invoked at most every chatlist_update_period seconds (as per the related client configuration parameter \u00bb).",
+      "params": {
+        "chatlist": "The folder"
+      }
+    },
+    "chatlists.GetExportedInvites": {
+      "desc": "List all chat folder deep links \u00bb associated to a folder",
+      "params": {
+        "chatlist": "The folder"
+      }
+    },
+    "chatlists.GetLeaveChatlistSuggestions": {
+      "desc": "Returns identifiers of pinned or always included chats from a chat folder imported using a chat folder deep link \u00bb, which are suggested to be left when the chat folder is deleted.",
+      "params": {
+        "chatlist": "Folder ID"
+      }
+    },
+    "chatlists.HideChatlistUpdates": {
+      "desc": "Dismiss new pending peers recently added to a chat folder deep link \u00bb.",
+      "params": {
+        "chatlist": "The folder"
+      }
+    },
+    "chatlists.JoinChatlistInvite": {
+      "desc": "Import a chat folder deep link \u00bb, joining some or all the chats in the folder.",
+      "params": {
+        "peers": "List of new chats to join, fetched using chatlists.checkChatlistInvite and filtered as specified in the documentation \u00bb.",
+        "slug": "slug obtained from a chat folder deep link \u00bb."
+      }
+    },
+    "chatlists.JoinChatlistUpdates": {
+      "desc": "Join channels and supergroups recently added to a chat folder deep link \u00bb.",
+      "params": {
+        "chatlist": "The folder",
+        "peers": "List of new chats to join, fetched using chatlists.getChatlistUpdates and filtered as specified in the documentation \u00bb."
+      }
+    },
+    "chatlists.LeaveChatlist": {
+      "desc": "Delete a folder imported using a chat folder deep link \u00bb",
+      "params": {
+        "chatlist": "Folder ID",
+        "peers": "Also leave the specified channels and groups"
+      }
+    },
+    "contacts.AcceptContact": {
+      "desc": "If the add contact action bar is active, add that user as contact",
+      "params": {
+        "id": "The user to add as contact"
+      }
+    },
+    "contacts.AddContact": {
+      "desc": "Add an existing telegram user as contact.",
+      "params": {
+        "add_phone_privacy_exception": "Allow the other user to see our phone number?",
+        "first_name": "First name",
+        "flags": "Flags, see TL conditional fields",
+        "id": "Telegram ID of the other user",
+        "last_name": "Last name",
+        "phone": "User's phone number, may be omitted to simply add the user to the contact list, without a phone number."
+      }
+    },
+    "contacts.Block": {
+      "desc": "Adds a peer to a blocklist, see here \u00bb for more info.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "id": "Peer",
+        "my_stories_from": "Whether the peer should be added to the story blocklist; if not set, the peer will be added to the main blocklist, see here \u00bb for more info."
+      }
+    },
+    "contacts.BlockFromReplies": {
+      "desc": "Stop getting notifications about discussion replies of a certain user in @replies",
+      "params": {
+        "delete_history": "Whether to delete all @replies messages from this user as well",
+        "delete_message": "Whether to delete the specified message as well",
+        "flags": "Flags, see TL conditional fields",
+        "msg_id": "ID of the message in the @replies chat",
+        "report_spam": "Whether to also report this user for spam"
+      }
+    },
+    "contacts.DeleteByPhones": {
+      "desc": "Delete contacts by phone number",
+      "params": {
+        "phones": "Phone numbers"
+      }
+    },
+    "contacts.DeleteContacts": {
+      "desc": "Deletes several contacts from the list.",
+      "params": {
+        "id": "User ID list"
+      }
+    },
+    "contacts.EditCloseFriends": {
+      "desc": "Edit the close friends list, see here \u00bb for more info.",
+      "params": {
+        "id": "Full list of user IDs of close friends, see here for more info."
+      }
+    },
+    "contacts.ExportContactToken": {
+      "desc": "Generates a temporary profile link for the currently logged-in user.",
+      "params": {}
+    },
+    "contacts.GetBirthdays": {
+      "desc": "Fetch all users with birthdays that fall within +1/-1 days, relative to the current day: this method should be invoked by clients every 6-8 hours, and if the result is non-empty, it should be used to appropriately update locally cached birthday information in user.birthday.",
+      "params": {}
+    },
+    "contacts.GetBlocked": {
+      "desc": "Returns the list of blocked users.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "limit": "The number of list elements to be returned",
+        "my_stories_from": "Whether to fetch the story blocklist; if not set, will fetch the main blocklist. See here \u00bb for differences between the two.",
+        "offset": "The number of list elements to be skipped"
+      }
+    },
+    "contacts.GetContactIDs": {
+      "desc": "Get the telegram IDs of all contacts.\nReturns an array of Telegram user IDs for all contacts (0 if a contact does not have an associated Telegram account or have hidden their account using privacy settings).",
+      "params": {
+        "hash": "Hash used for caching, for more info click here"
+      }
+    },
+    "contacts.GetContacts": {
+      "desc": "Returns the current user's contact list.",
+      "params": {
+        "hash": "Hash used for caching, for more info click here.Note that the hash is computed using the usual algorithm, passing to the algorithm first the previously returned contacts.contacts.saved_count field, then max 100000 sorted user IDs from the contact list, including the ID of the currently logged in user if it is saved as a contact. Example: tdlib implementation."
+      }
+    },
+    "contacts.GetLocated": {
+      "desc": "Get users and geochats near you, see here \u00bb for more info.",
+      "params": {
+        "background": "While the geolocation of the current user is public, clients should update it in the background every half-an-hour or so, while setting this flag. Do this only if the new location is more than 1 KM away from the previous one, or if the previous location is unknown.",
+        "flags": "Flags, see TL conditional fields",
+        "geo_point": "Geolocation",
+        "self_expires": "If set, the geolocation of the current user will be public for the specified number of seconds; pass 0x7fffffff to disable expiry, 0 to make the current geolocation private; if the flag isn't set, no changes will be applied."
+      }
+    },
+    "contacts.GetSaved": {
+      "desc": "Get all contacts, requires a takeout session, see here \u00bb for more info.",
+      "params": {}
+    },
+    "contacts.GetSponsoredPeers": {
+      "desc": "Obtain a list of sponsored peer search results for a given query",
+      "params": {
+        "q": "The query"
+      }
+    },
+    "contacts.GetStatuses": {
+      "desc": "Use this method to obtain the online statuses of all contacts with an accessible Telegram account.",
+      "params": {}
+    },
+    "contacts.GetTopPeers": {
+      "desc": "Get most used peers",
+      "params": {
+        "bots_app": "Most frequently used Main Mini Bot Apps.",
+        "bots_inline": "Most used inline bots",
+        "bots_pm": "Most used bots",
+        "channels": "Most frequently visited channels",
+        "correspondents": "Users we've chatted most frequently with",
+        "flags": "Flags, see TL conditional fields",
+        "forward_chats": "Chats to which the users often forwards messages to",
+        "forward_users": "Users to which the users often forwards messages to",
+        "groups": "Often-opened groups and supergroups",
+        "hash": "Hash used for caching, for more info click here",
+        "limit": "Maximum number of results to return, see pagination",
+        "offset": "Offset for pagination",
+        "phone_calls": "Most frequently called users"
+      }
+    },
+    "contacts.ImportCard": {
+      "desc": "Returns general information on a user using his previously exported card as input.The app may use it to open a conversation without knowing the user's phone number.",
+      "params": {}
+    },
+    "contacts.ImportContactToken": {
+      "desc": "Obtain user info from a temporary profile link.",
+      "params": {
+        "token": "The token extracted from the temporary profile link."
+      }
+    },
+    "contacts.ImportContacts": {
+      "desc": "Imports contacts: saves a full list on the server, adds already registered contacts to the contact list, returns added contacts and their info.",
+      "params": {
+        "contacts": "List of contacts to import"
+      }
+    },
+    "contacts.ResetSaved": {
+      "desc": "Removes all contacts without an associated Telegram account.",
+      "params": {}
+    },
+    "contacts.ResetTopPeerRating": {
+      "desc": "Reset rating of top peer",
+      "params": {
+        "category": "Top peer category",
+        "peer": "Peer whose rating should be reset"
+      }
+    },
+    "contacts.ResolvePhone": {
+      "desc": "Resolve a phone number to get user info, if their privacy settings allow it.",
+      "params": {
+        "phone": "Phone number in international format, possibly obtained from a phone number deep link."
+      }
+    },
+    "contacts.ResolveUsername": {
+      "desc": "Resolve a @username to get peer info",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "referer": "Referrer ID from referral links \u00bb.",
+        "username": "@username to resolve"
+      }
+    },
+    "contacts.Search": {
+      "desc": "Returns users found by username substring.",
+      "params": {
+        "limit": "Maximum number of users to be returned",
+        "q": "Target substring"
+      }
+    },
+    "contacts.SetBlocked": {
+      "desc": "Replace the contents of an entire blocklist, see here for more info \u00bb.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "id": "Full content of the blocklist.",
+        "limit": "Maximum number of results to return, see pagination",
+        "my_stories_from": "Whether to edit the story blocklist; if not set, will edit the main blocklist. See here \u00bb for differences between the two."
+      }
+    },
+    "contacts.ToggleTopPeers": {
+      "desc": "Enable/disable top peers",
+      "params": {
+        "enabled": "Enable/disable"
+      }
+    },
+    "contacts.Unblock": {
+      "desc": "Deletes a peer from a blocklist, see here \u00bb for more info.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "id": "Peer",
+        "my_stories_from": "Whether the peer should be removed from the story blocklist; if not set, the peer will be removed from the main blocklist, see here \u00bb for more info."
+      }
+    },
+    "folders.DeleteFolder": {
+      "desc": "Delete a peer folder",
+      "params": {
+        "folder_id": "Peer folder ID, for more info click here"
+      }
+    },
+    "folders.EditPeerFolders": {
+      "desc": "Edit peers in peer folder",
+      "params": {
+        "folder_peers": "New peer list"
+      }
+    },
+    "fragment.GetCollectibleInfo": {
+      "desc": "Fetch information about a fragment collectible, see here \u00bb for more info on the full flow.",
+      "params": {
+        "collectible": "Collectible to fetch info about."
+      }
+    },
+    "help.AcceptTermsOfService": {
+      "desc": "Accept the new terms of service",
+      "params": {
+        "id": "ID of terms of service"
+      }
+    },
+    "help.DismissSuggestion": {
+      "desc": "Dismiss a suggestion, see here for more info \u00bb.",
+      "params": {
+        "peer": "In the case of pending suggestions in channels, the channel ID.",
+        "suggestion": "Suggestion, see here for more info \u00bb."
+      }
+    },
+    "help.EditUserInfo": {
+      "desc": "Internal use",
+      "params": {
+        "entities": "Message entities for styled text",
+        "message": "Message",
+        "user_id": "User"
+      }
+    },
+    "help.GetAppConfig": {
+      "desc": "Get app-specific configuration, see client configuration for more info on the result.",
+      "params": {
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "help.GetAppUpdate": {
+      "desc": "Returns information on update availability for the current application.",
+      "params": {
+        "source": "Source"
+      }
+    },
+    "help.GetCdnConfig": {
+      "desc": "Get configuration for CDN file downloads.",
+      "params": {}
+    },
+    "help.GetConfig": {
+      "desc": "Returns current configuration, including data center configuration.",
+      "params": {}
+    },
+    "help.GetCountriesList": {
+      "desc": "Get name, ISO code, localized name and phone codes/patterns of all available countries",
+      "params": {
+        "hash": "Hash used for caching, for more info click here.",
+        "lang_code": "Language code of the current user"
+      }
+    },
+    "help.GetDeepLinkInfo": {
+      "desc": "Get info about an unsupported deep link, see here for more info \u00bb.",
+      "params": {
+        "path": "Path component of a tg: link"
+      }
+    },
+    "help.GetInviteText": {
+      "desc": "Returns localized text of a text message with an invitation.",
+      "params": {}
+    },
+    "help.GetNearestDc": {
+      "desc": "Returns info on data center nearest to the user.",
+      "params": {}
+    },
+    "help.GetPassportConfig": {
+      "desc": "Get passport configuration",
+      "params": {
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "help.GetPeerColors": {
+      "desc": "Get the set of accent color palettes \u00bb that can be used for message accents.",
+      "params": {
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "help.GetPeerProfileColors": {
+      "desc": "Get the set of accent color palettes \u00bb that can be used in profile page backgrounds.",
+      "params": {
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "help.GetPremiumPromo": {
+      "desc": "Get Telegram Premium promotion information",
+      "params": {}
+    },
+    "help.GetPromoData": {
+      "desc": "Returns a set of useful suggestions and PSA/MTProxy sponsored peers, see here \u00bb for more info.",
+      "params": {}
+    },
+    "help.GetRecentMeUrls": {
+      "desc": "Get recently used t.me links.",
+      "params": {
+        "referer": "Referrer"
+      }
+    },
+    "help.GetSupport": {
+      "desc": "Returns the support user for the \"ask a question\" feature.",
+      "params": {}
+    },
+    "help.GetSupportName": {
+      "desc": "Get localized name of the telegram support user",
+      "params": {}
+    },
+    "help.GetTermsOfServiceUpdate": {
+      "desc": "Look for updates of telegram's terms of service",
+      "params": {}
+    },
+    "help.GetTimezonesList": {
+      "desc": "Returns timezone information that may be used elsewhere in the API, such as to set Telegram Business opening hours \u00bb.",
+      "params": {
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "help.GetUserInfo": {
+      "desc": "Can only be used by TSF members to obtain internal information.",
+      "params": {
+        "user_id": "User ID"
+      }
+    },
+    "help.HidePromoData": {
+      "desc": "Hide MTProxy/Public Service Announcement information",
+      "params": {
+        "peer": "Peer to hide"
+      }
+    },
+    "help.SaveAppLog": {
+      "desc": "Saves logs of application on the server.",
+      "params": {
+        "events": "List of input events"
+      }
+    },
+    "help.SetBotUpdatesStatus": {
+      "desc": "Informs the server about the number of pending bot updates if they haven't been processed for a long time; for bots only",
+      "params": {
+        "message": "Error message, if present",
+        "pending_updates_count": "Number of pending updates"
+      }
+    },
+    "langpack.GetDifference": {
+      "desc": "Get new strings in language pack",
+      "params": {
+        "from_version": "Previous localization pack version",
+        "lang_code": "Either an ISO 639-1 language code or a language pack name obtained from a language pack link.",
+        "lang_pack": "Platform identifier (i.e. android, tdesktop, etc)."
+      }
+    },
+    "langpack.GetLangPack": {
+      "desc": "Get localization pack strings",
+      "params": {
+        "lang_code": "Either an ISO 639-1 language code or a language pack name obtained from a language pack link.",
+        "lang_pack": "Platform identifier (i.e. android, tdesktop, etc)."
+      }
+    },
+    "langpack.GetLanguage": {
+      "desc": "Get information about a language in a localization pack",
+      "params": {
+        "lang_code": "Either an ISO 639-1 language code or a language pack name obtained from a language pack link.",
+        "lang_pack": "Platform identifier (i.e. android, tdesktop, etc)."
+      }
+    },
+    "langpack.GetLanguages": {
+      "desc": "Get information about all languages in a localization pack",
+      "params": {
+        "lang_pack": "Platform identifier (i.e. android, tdesktop, etc)."
+      }
+    },
+    "langpack.GetStrings": {
+      "desc": "Get strings from a language pack",
+      "params": {
+        "keys": "Strings to get",
+        "lang_code": "Either an ISO 639-1 language code or a language pack name obtained from a language pack link.",
+        "lang_pack": "Platform identifier (i.e. android, tdesktop, etc)."
+      }
+    },
+    "messages.AcceptEncryption": {
+      "desc": "Confirms creation of a secret chat",
+      "params": {
+        "g_b": "B = g ^ b mod p, see Wikipedia",
+        "key_fingerprint": "64-bit fingerprint of the received key",
+        "peer": "Secret chat ID"
+      }
+    },
+    "messages.AcceptUrlAuth": {
+      "desc": "Use this to accept a Seamless Telegram Login authorization request, for more info click here \u00bb",
+      "params": {
+        "button_id": "ID of the login button",
+        "flags": "Flags, see TL conditional fields",
+        "msg_id": "Message ID of the message with the login button",
+        "peer": "The location of the message",
+        "url": "URL used for link URL authorization, click here for more info \u00bb",
+        "write_allowed": "Set this flag to allow the bot to send messages to you (if requested)"
+      }
+    },
+    "messages.AddChatUser": {
+      "desc": "Adds a user to a chat and sends a service message on it.",
+      "params": {
+        "chat_id": "Chat ID",
+        "fwd_limit": "Number of last messages to be forwarded",
+        "user_id": "User ID to be added"
+      }
+    },
+    "messages.AppendTodoList": {
+      "desc": "Appends one or more items to a todo list \u00bb.",
+      "params": {
+        "list": "Items to append.",
+        "msg_id": "ID of the message with the todo list.",
+        "peer": "Peer where the todo list was posted."
+      }
+    },
+    "messages.CheckChatInvite": {
+      "desc": "Check the validity of a chat invite link and get basic info about it",
+      "params": {
+        "hash": "Invite hash from chat invite deep link \u00bb."
+      }
+    },
+    "messages.CheckHistoryImport": {
+      "desc": "Obtains information about a chat export file, generated by a foreign chat app, click here for more info about imported chats \u00bb.",
+      "params": {
+        "import_head": "Beginning of the message file; up to 100 lines."
+      }
+    },
+    "messages.CheckHistoryImportPeer": {
+      "desc": "Check whether chat history exported from another chat app can be imported into a specific Telegram chat, click here for more info \u00bb.",
+      "params": {
+        "peer": "The chat where we want to import history \u00bb."
+      }
+    },
+    "messages.CheckPaidAuth": {
+      "desc": "",
+      "params": {}
+    },
+    "messages.CheckQuickReplyShortcut": {
+      "desc": "Before offering the user the choice to add a message to a quick reply shortcut, to make sure that none of the limits specified here \u00bb were reached.",
+      "params": {
+        "shortcut": "Shorcut name (not ID!)."
+      }
+    },
+    "messages.ClearAllDrafts": {
+      "desc": "Clear all drafts.",
+      "params": {}
+    },
+    "messages.ClearRecentReactions": {
+      "desc": "Clear recently used message reactions",
+      "params": {}
+    },
+    "messages.ClearRecentStickers": {
+      "desc": "Clear recent stickers",
+      "params": {
+        "attached": "Set this flag to clear the list of stickers recently attached to photo or video files",
+        "flags": "Flags, see TL conditional fields"
+      }
+    },
+    "messages.ClickSponsoredMessage": {
+      "desc": "Informs the server that the user has interacted with a sponsored message in one of the ways listed here \u00bb.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "fullscreen": "The user expanded the video to full screen, and then clicked on it.",
+        "media": "The user clicked on the media",
+        "random_id": "The ad's unique ID."
+      }
+    },
+    "messages.CreateChat": {
+      "desc": "Creates a new chat.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "title": "Chat name",
+        "ttl_period": "Time-to-live of all messages that will be sent in the chat: once message.date+message.ttl_period === time(), the message will be deleted on the server, and must be deleted locally as well. You can use messages.setDefaultHistoryTTL to edit this value later.",
+        "users": "List of user IDs to be invited"
+      }
+    },
+    "messages.CreateForumTopic": {
+      "desc": "",
+      "params": {}
+    },
+    "messages.DeleteChat": {
+      "desc": "Delete a chat",
+      "params": {
+        "chat_id": "Chat ID"
+      }
+    },
+    "messages.DeleteChatUser": {
+      "desc": "Deletes a user from a chat and sends a service message on it.",
+      "params": {
+        "chat_id": "Chat ID",
+        "flags": "Flags, see TL conditional fields",
+        "revoke_history": "Remove the entire chat history of the specified user in this chat.",
+        "user_id": "User ID to be deleted"
+      }
+    },
+    "messages.DeleteExportedChatInvite": {
+      "desc": "Delete a chat invite",
+      "params": {
+        "link": "Invite link",
+        "peer": "Peer"
+      }
+    },
+    "messages.DeleteFactCheck": {
+      "desc": "Delete a fact-check from a message.",
+      "params": {
+        "msg_id": "Message ID",
+        "peer": "Peer where the message was sent."
+      }
+    },
+    "messages.DeleteHistory": {
+      "desc": "Deletes communication history.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "just_clear": "Just clear history for the current user, without actually removing messages for every chat user",
+        "max_date": "Delete all messages older than this UNIX timestamp",
+        "max_id": "Maximum ID of message to delete",
+        "min_date": "Delete all messages newer than this UNIX timestamp",
+        "peer": "User or chat, communication history of which will be deleted",
+        "revoke": "Whether to delete the message history for all chat participants"
+      }
+    },
+    "messages.DeleteMessages": {
+      "desc": "Deletes messages by their identifiers.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "id": "Message ID list",
+        "revoke": "Whether to delete messages for all participants of the chat"
+      }
+    },
+    "messages.DeletePhoneCallHistory": {
+      "desc": "Delete the entire phone call history.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "revoke": "Whether to remove phone call history for participants as well"
+      }
+    },
+    "messages.DeleteQuickReplyMessages": {
+      "desc": "Delete one or more messages from a quick reply shortcut. This will also emit an updateDeleteQuickReplyMessages update.",
+      "params": {
+        "id": "IDs of shortcut messages to delete.",
+        "shortcut_id": "Shortcut ID."
+      }
+    },
+    "messages.DeleteQuickReplyShortcut": {
+      "desc": "Completely delete a quick reply shortcut.\nThis will also emit an updateDeleteQuickReply update to other logged-in sessions (and no updateDeleteQuickReplyMessages updates, even if all the messages in the shortcuts are also deleted by this method).",
+      "params": {
+        "shortcut_id": "Shortcut ID"
+      }
+    },
+    "messages.DeleteRevokedExportedChatInvites": {
+      "desc": "Delete all revoked chat invites",
+      "params": {
+        "admin_id": "ID of the admin that originally generated the revoked chat invites",
+        "peer": "Chat"
+      }
+    },
+    "messages.DeleteSavedHistory": {
+      "desc": "Deletes messages from a monoforum topic \u00bb, or deletes messages forwarded from a specific peer to saved messages \u00bb.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "max_date": "Delete all messages older than this UNIX timestamp",
+        "max_id": "Maximum ID of message to delete",
+        "min_date": "Delete all messages newer than this UNIX timestamp",
+        "parent_peer": "If set, affects the messages of the passed monoforum topic \u00bb, otherwise affects saved messages \u00bb.",
+        "peer": "Peer, whose messages will be deleted from saved messages \u00bb, or the ID of the topic."
+      }
+    },
+    "messages.DeleteScheduledMessages": {
+      "desc": "Delete scheduled messages",
+      "params": {
+        "id": "Scheduled message IDs",
+        "peer": "Peer"
+      }
+    },
+    "messages.DeleteTopicHistory": {
+      "desc": "",
+      "params": {}
+    },
+    "messages.DiscardEncryption": {
+      "desc": "Cancels a request for creation and/or delete info on secret chat.",
+      "params": {
+        "chat_id": "Secret chat ID",
+        "delete_history": "Whether to delete the entire chat history for the other user as well",
+        "flags": "Flags, see TL conditional fields"
+      }
+    },
+    "messages.EditChatAbout": {
+      "desc": "Edit the description of a group/supergroup/channel.",
+      "params": {
+        "about": "The new description",
+        "peer": "The group/supergroup/channel."
+      }
+    },
+    "messages.EditChatAdmin": {
+      "desc": "Make a user admin in a basic group.",
+      "params": {
+        "chat_id": "The ID of the group",
+        "is_admin": "Whether to make them admin",
+        "user_id": "The user to make admin"
+      }
+    },
+    "messages.EditChatDefaultBannedRights": {
+      "desc": "Edit the default banned rights of a channel/supergroup/group.",
+      "params": {
+        "banned_rights": "The new global rights",
+        "peer": "The peer"
+      }
+    },
+    "messages.EditChatPhoto": {
+      "desc": "Changes chat photo and sends a service message on it",
+      "params": {
+        "chat_id": "Chat ID",
+        "photo": "Photo to be set"
+      }
+    },
+    "messages.EditChatTitle": {
+      "desc": "Changes chat name and sends a service message on it.",
+      "params": {
+        "chat_id": "Chat ID",
+        "title": "New chat name, different from the old one"
+      }
+    },
+    "messages.EditExportedChatInvite": {
+      "desc": "Edit an exported chat invite",
+      "params": {
+        "expire_date": "New expiration date",
+        "flags": "Flags, see TL conditional fields",
+        "link": "Invite link",
+        "peer": "Chat",
+        "request_needed": "Whether admin confirmation is required before admitting each separate user into the chat",
+        "revoked": "Whether to revoke the chat invite",
+        "title": "Description of the invite link, visible only to administrators",
+        "usage_limit": "Maximum number of users that can join using this link"
+      }
+    },
+    "messages.EditFactCheck": {
+      "desc": "Edit/create a fact-check on a message.",
+      "params": {
+        "msg_id": "Message ID",
+        "peer": "Peer where the message was sent",
+        "text": "Fact-check (maximum UTF-8 length specified in appConfig.factcheck_length_limit)."
+      }
+    },
+    "messages.EditForumTopic": {
+      "desc": "",
+      "params": {}
+    },
+    "messages.EditInlineBotMessage": {
+      "desc": "Edit an inline bot message",
+      "params": {
+        "entities": "Message entities for styled text",
+        "flags": "Flags, see TL conditional fields",
+        "id": "Sent inline message ID",
+        "invert_media": "If set, any eventual webpage preview will be shown on top of the message instead of at the bottom.",
+        "media": "Media",
+        "message": "Message",
+        "no_webpage": "Disable webpage preview",
+        "reply_markup": "Reply markup for inline keyboards"
+      }
+    },
+    "messages.EditMessage": {
+      "desc": "Edit message",
+      "params": {
+        "entities": "Message entities for styled text",
+        "flags": "Flags, see TL conditional fields",
+        "id": "ID of the message to edit",
+        "invert_media": "If set, any eventual webpage preview will be shown on top of the message instead of at the bottom.",
+        "media": "New attached media",
+        "message": "New message",
+        "no_webpage": "Disable webpage preview",
+        "peer": "Where was the message sent",
+        "quick_reply_shortcut_id": "If specified, edits a quick reply shortcut message, instead \u00bb.",
+        "reply_markup": "Reply markup for inline keyboards",
+        "schedule_date": "Scheduled message date for scheduled messages"
+      }
+    },
+    "messages.EditQuickReplyShortcut": {
+      "desc": "Rename a quick reply shortcut.\nThis will emit an updateQuickReplies update to other logged-in sessions.",
+      "params": {
+        "shortcut": "New shortcut name.",
+        "shortcut_id": "Shortcut ID."
+      }
+    },
+    "messages.ExportChatInvite": {
+      "desc": "Export an invite link for a chat",
+      "params": {
+        "expire_date": "Expiration date",
+        "flags": "Flags, see TL conditional fields",
+        "legacy_revoke_permanent": "Legacy flag, reproducing legacy behavior of this method: if set, revokes all previous links before creating a new one. Kept for bot API BC, should not be used by modern clients.",
+        "peer": "Chat",
+        "request_needed": "Whether admin confirmation is required before admitting each separate user into the chat",
+        "subscription_pricing": "For Telegram Star subscriptions \u00bb, contains the pricing of the subscription the user must activate to join the private channel.",
+        "title": "Description of the invite link, visible only to administrators",
+        "usage_limit": "Maximum number of users that can join using this link"
+      }
+    },
+    "messages.FaveSticker": {
+      "desc": "Mark or unmark a sticker as favorite",
+      "params": {
+        "id": "Sticker in question",
+        "unfave": "Whether to add or remove a sticker from favorites"
+      }
+    },
+    "messages.ForwardMessage": {
+      "desc": "Forwards single messages.",
+      "params": {
+        "id": "Forwarded message ID",
+        "peer": "User or chat where a message will be forwarded",
+        "random_id": "Unique client message ID required to prevent message resending"
+      }
+    },
+    "messages.ForwardMessages": {
+      "desc": "Forwards messages by their IDs.",
+      "params": {
+        "allow_paid_floodskip": "Bots only: if set, allows sending up to 1000 messages per second, ignoring broadcasting limits for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.",
+        "allow_paid_stars": "For paid messages \u00bb, specifies the amount of Telegram Stars the user has agreed to pay in order to send the message.",
+        "background": "Whether to send the message in background",
+        "drop_author": "Whether to forward messages without quoting the original author",
+        "drop_media_captions": "Whether to strip captions from media",
+        "flags": "Flags, see TL conditional fields",
+        "from_peer": "Source of messages",
+        "id": "IDs of messages",
+        "noforwards": "Only for bots, disallows further re-forwarding and saving of the messages, even if the destination chat doesn't have content protection enabled",
+        "quick_reply_shortcut": "Add the messages to the specified quick reply shortcut \u00bb, instead.",
+        "random_id": "Random ID to prevent resending of messages",
+        "reply_to": "Can only contain an inputReplyToMonoForum, to forward messages to a monoforum topic (mutually exclusive with top_msg_id).",
+        "schedule_date": "Scheduled message date for scheduled messages",
+        "send_as": "Forward the messages as the specified peer",
+        "silent": "Whether to send messages silently (no notification will be triggered on the destination clients)",
+        "suggested_post": "Used to suggest a post to a channel, see here \u00bb for more info on the full flow.",
+        "to_peer": "Destination peer",
+        "top_msg_id": "Destination forum topic",
+        "video_timestamp": "Start playing the video at the specified timestamp (seconds).",
+        "with_my_score": "When forwarding games, whether to include your score in the game"
+      }
+    },
+    "messages.GetAdminsWithInvites": {
+      "desc": "Get info about chat invites generated by admins.",
+      "params": {
+        "peer": "Chat"
+      }
+    },
+    "messages.GetAllChats": {
+      "desc": "Get all chats, channels and supergroups",
+      "params": {}
+    },
+    "messages.GetAllDrafts": {
+      "desc": "Return all message drafts.\nReturns all the latest updateDraftMessage updates related to all chats with drafts.",
+      "params": {}
+    },
+    "messages.GetAllStickers": {
+      "desc": "Get all installed stickers",
+      "params": {
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "messages.GetArchivedStickers": {
+      "desc": "Get all archived stickers",
+      "params": {
+        "emojis": "Get custom emoji stickers",
+        "flags": "Flags, see TL conditional fields",
+        "limit": "Maximum number of results to return, see pagination",
+        "masks": "Get mask stickers",
+        "offset_id": "Offsets for pagination, for more info click here"
+      }
+    },
+    "messages.GetAttachMenuBot": {
+      "desc": "Returns attachment menu entry for a bot mini app that can be launched from the attachment menu \u00bb",
+      "params": {
+        "bot": "Bot ID"
+      }
+    },
+    "messages.GetAttachMenuBots": {
+      "desc": "Returns installed attachment menu bot mini apps \u00bb",
+      "params": {
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "messages.GetAttachedStickers": {
+      "desc": "Get stickers attached to a photo or video",
+      "params": {
+        "media": "Stickered media"
+      }
+    },
+    "messages.GetAvailableEffects": {
+      "desc": "Fetch the full list of usable animated message effects \u00bb.",
+      "params": {
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "messages.GetAvailableReactions": {
+      "desc": "Obtain available message reactions \u00bb",
+      "params": {
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "messages.GetBotApp": {
+      "desc": "Obtain information about a direct link Mini App",
+      "params": {
+        "app": "Bot app information obtained from a Direct Mini App deep link \u00bb.",
+        "hash": "Hash used for caching, for more info click here"
+      }
+    },
+    "messages.GetBotCallbackAnswer": {
+      "desc": "Press an inline callback button and get a callback answer from the bot",
+      "params": {
+        "data": "Callback data",
+        "flags": "Flags, see TL conditional fields",
+        "game": "Whether this is a \"play game\" button",
+        "msg_id": "ID of the Message with the inline keyboard",
+        "password": "For buttons requiring you to verify your identity with your 2FA password, the SRP payload generated using SRP.",
+        "peer": "Where was the inline keyboard sent"
+      }
+    },
+    "messages.GetChatInviteImporters": {
+      "desc": "Get info about the users that joined the chat using a specific chat invite",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "limit": "Maximum number of results to return, see pagination",
+        "link": "Invite link",
+        "offset_date": "Offsets for pagination, for more info click here",
+        "offset_user": "User ID for pagination: if set, offset_date must also be set.",
+        "peer": "Chat",
+        "q": "Search for a user in the pending join requests \u00bb list: only available when the requested flag is set, cannot be used together with a specific link.",
+        "requested": "If set, only returns info about users with pending join requests \u00bb",
+        "subscription_expired": "Set this flag if the link is a Telegram Star subscription link \u00bb and only members with already expired subscription must be returned."
+      }
+    },
+    "messages.GetChats": {
+      "desc": "Returns chat basic info on their IDs.",
+      "params": {
+        "id": "List of chat IDs"
+      }
+    },
+    "messages.GetCommonChats": {
+      "desc": "Get chats in common with a user",
+      "params": {
+        "limit": "Maximum number of results to return, see pagination",
+        "max_id": "Maximum ID of chat to return (see pagination)",
+        "user_id": "User ID"
+      }
+    },
+    "messages.GetCustomEmojiDocuments": {
+      "desc": "Fetch custom emoji stickers \u00bb.",
+      "params": {
+        "document_id": "Custom emoji IDs from a messageEntityCustomEmoji."
+      }
+    },
+    "messages.GetDefaultHistoryTTL": {
+      "desc": "Gets the default value of the Time-To-Live setting, applied to all new chats.",
+      "params": {}
+    },
+    "messages.GetDefaultTagReactions": {
+      "desc": "Fetch a default recommended list of saved message tag reactions.",
+      "params": {
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "messages.GetDhConfig": {
+      "desc": "Returns configuration parameters for Diffie-Hellman key generation. Can also return a random sequence of bytes of required length.",
+      "params": {
+        "random_length": "Length of the required random sequence",
+        "version": "Value of the version parameter from messages.dhConfig, available at the client"
+      }
+    },
+    "messages.GetDialogFilters": {
+      "desc": "Get folders",
+      "params": {}
+    },
+    "messages.GetDialogUnreadMarks": {
+      "desc": "Get dialogs manually marked as unread",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "parent_peer": "Can be equal to the ID of a monoforum, to fetch monoforum topics manually marked as unread."
+      }
+    },
+    "messages.GetDialogs": {
+      "desc": "Returns the current user dialog list.",
+      "params": {
+        "exclude_pinned": "Exclude pinned dialogs",
+        "flags": "Flags, see TL conditional fields",
+        "folder_id": "Peer folder ID, for more info click here",
+        "hash": "Hash used for caching, for more info click here",
+        "limit": "Number of list elements to be returned",
+        "offset_date": "Offsets for pagination, for more info click here",
+        "offset_id": "Offsets for pagination, for more info click here (top_message ID used for pagination)",
+        "offset_peer": "Offset peer for pagination"
+      }
+    },
+    "messages.GetDiscussionMessage": {
+      "desc": "Get discussion message from the associated discussion group of a channel to show it on top of the comment section, without actually joining the group",
+      "params": {
+        "msg_id": "Message ID",
+        "peer": "Channel ID"
+      }
+    },
+    "messages.GetDocumentByHash": {
+      "desc": "Get a document by its SHA256 hash, mainly used for gifs",
+      "params": {
+        "mime_type": "Mime type",
+        "sha256": "SHA256 of file",
+        "size": "Size of the file in bytes"
+      }
+    },
+    "messages.GetEmojiGroups": {
+      "desc": "Represents a list of emoji categories.",
+      "params": {
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "messages.GetEmojiKeywords": {
+      "desc": "Get localized emoji keywords \u00bb.",
+      "params": {
+        "lang_code": "Language code"
+      }
+    },
+    "messages.GetEmojiKeywordsDifference": {
+      "desc": "Get changed emoji keywords \u00bb.",
+      "params": {
+        "from_version": "Previous stored emoji keyword list version",
+        "lang_code": "Language code"
+      }
+    },
+    "messages.GetEmojiKeywordsLanguages": {
+      "desc": "Obtain a list of related languages that must be used when fetching emoji keyword lists \u00bb.",
+      "params": {
+        "lang_codes": "The user's language codes"
+      }
+    },
+    "messages.GetEmojiProfilePhotoGroups": {
+      "desc": "Represents a list of emoji categories, to be used when selecting custom emojis to set as profile picture.",
+      "params": {
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "messages.GetEmojiStatusGroups": {
+      "desc": "Represents a list of emoji categories, to be used when selecting custom emojis to set as custom emoji status.",
+      "params": {
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "messages.GetEmojiStickerGroups": {
+      "desc": "Represents a list of emoji categories, to be used when choosing a sticker.",
+      "params": {
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "messages.GetEmojiStickers": {
+      "desc": "Gets the list of currently installed custom emoji stickersets.",
+      "params": {
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "messages.GetEmojiURL": {
+      "desc": "Returns an HTTP URL which can be used to automatically log in into translation platform and suggest new emoji keywords \u00bb. The URL will be valid for 30 seconds after generation.",
+      "params": {
+        "lang_code": "Language code for which the emoji keywords will be suggested"
+      }
+    },
+    "messages.GetExportedChatInvite": {
+      "desc": "Get info about a chat invite",
+      "params": {
+        "link": "Invite link",
+        "peer": "Chat"
+      }
+    },
+    "messages.GetExportedChatInvites": {
+      "desc": "Get info about the chat invites of a specific chat",
+      "params": {
+        "admin_id": "Whether to only fetch chat invites from this admin",
+        "flags": "Flags, see TL conditional fields",
+        "limit": "Maximum number of results to return, see pagination",
+        "offset_date": "Offsets for pagination, for more info click here",
+        "offset_link": "Offsets for pagination, for more info click here",
+        "peer": "Chat",
+        "revoked": "Whether to fetch revoked chat invites"
+      }
+    },
+    "messages.GetExtendedMedia": {
+      "desc": "Fetch updated information about paid media, see here \u00bb for the full flow.",
+      "params": {
+        "id": "IDs of currently visible messages containing paid media.",
+        "peer": "Peer with visible paid media messages."
+      }
+    },
+    "messages.GetFactCheck": {
+      "desc": "Fetch one or more factchecks, see here \u00bb for the full flow.",
+      "params": {
+        "msg_id": "Messages that have associated factCheck constructors with the need_check flag set.",
+        "peer": "Peer where the messages were sent."
+      }
+    },
+    "messages.GetFavedStickers": {
+      "desc": "Get faved stickers",
+      "params": {
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "messages.GetFeaturedEmojiStickers": {
+      "desc": "Gets featured custom emoji stickersets.",
+      "params": {
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "messages.GetFeaturedStickers": {
+      "desc": "Get featured stickers",
+      "params": {
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "messages.GetForumTopics": {
+      "desc": "",
+      "params": {}
+    },
+    "messages.GetForumTopicsByID": {
+      "desc": "",
+      "params": {}
+    },
+    "messages.GetFullChat": {
+      "desc": "Get full info about a basic group.",
+      "params": {
+        "chat_id": "Basic group ID."
+      }
+    },
+    "messages.GetGameHighScores": {
+      "desc": "Get highscores of a game",
+      "params": {
+        "id": "ID of message with game media attachment",
+        "peer": "Where was the game sent",
+        "user_id": "Get high scores made by a certain user"
+      }
+    },
+    "messages.GetHistory": {
+      "desc": "Returns the conversation history with one interlocutor / within a chat",
+      "params": {
+        "add_offset": "Number of list elements to be skipped, negative values are also accepted.",
+        "hash": "Result hash",
+        "limit": "Number of results to return",
+        "max_id": "If a positive value was transferred, the method will return only messages with IDs less than max_id",
+        "min_id": "If a positive value was transferred, the method will return only messages with IDs more than min_id",
+        "offset_date": "Only return messages sent before the specified date",
+        "offset_id": "Only return messages starting from the specified message ID",
+        "peer": "Target peer"
+      }
+    },
+    "messages.GetInlineBotResults": {
+      "desc": "Query an inline bot",
+      "params": {
+        "bot": "The bot to query",
+        "flags": "Flags, see TL conditional fields",
+        "geo_point": "The geolocation, if requested",
+        "offset": "The offset within the results, will be passed directly as-is to the bot.",
+        "peer": "The currently opened chat",
+        "query": "The query"
+      }
+    },
+    "messages.GetInlineGameHighScores": {
+      "desc": "Get highscores of a game sent using an inline bot",
+      "params": {
+        "id": "ID of inline message",
+        "user_id": "Get high scores of a certain user"
+      }
+    },
+    "messages.GetMaskStickers": {
+      "desc": "Get installed mask stickers",
+      "params": {
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "messages.GetMessageEditData": {
+      "desc": "Find out if a media message's caption can be edited",
+      "params": {
+        "id": "ID of message",
+        "peer": "Peer where the media was sent"
+      }
+    },
+    "messages.GetMessageReactionsList": {
+      "desc": "Get message reaction list, along with the sender of each reaction.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "id": "Message ID",
+        "limit": "Maximum number of results to return, see pagination",
+        "offset": "Offset for pagination (taken from the next_offset field of the returned messages.MessageReactionsList); empty in the first request.",
+        "peer": "Peer",
+        "reaction": "Get only reactions of this type"
+      }
+    },
+    "messages.GetMessageReadParticipants": {
+      "desc": "Get which users read a specific message: only available for groups and supergroups with less than chat_read_mark_size_threshold members, read receipts will be stored for chat_read_mark_expire_period seconds after the message was sent, see client configuration for more info \u00bb.",
+      "params": {
+        "msg_id": "Message ID",
+        "peer": "Dialog"
+      }
+    },
+    "messages.GetMessages": {
+      "desc": "Returns the list of messages by their IDs.",
+      "params": {
+        "id": "Message ID list"
+      }
+    },
+    "messages.GetMessagesReactions": {
+      "desc": "Get message reactions \u00bb",
+      "params": {
+        "id": "Message IDs",
+        "peer": "Peer"
+      }
+    },
+    "messages.GetMessagesViews": {
+      "desc": "Get and increase the view counter of a message sent or forwarded from a channel",
+      "params": {
+        "id": "ID of message",
+        "increment": "Whether to mark the message as viewed and increment the view counter",
+        "peer": "Peer where the message was found"
+      }
+    },
+    "messages.GetMyStickers": {
+      "desc": "Fetch all stickersets \u00bb owned by the current user.",
+      "params": {
+        "limit": "Maximum number of results to return, see pagination",
+        "offset_id": "Offsets for pagination, for more info click here"
+      }
+    },
+    "messages.GetOldFeaturedStickers": {
+      "desc": "Method for fetching previously featured stickers",
+      "params": {
+        "hash": "Hash used for caching, for more info click here.",
+        "limit": "Maximum number of results to return, see pagination",
+        "offset": "Offset"
+      }
+    },
+    "messages.GetOnlines": {
+      "desc": "Get count of online users in a chat",
+      "params": {
+        "peer": "The chat"
+      }
+    },
+    "messages.GetOutboxReadDate": {
+      "desc": "Get the exact read date of one of our messages, sent to a private chat with another user.",
+      "params": {
+        "msg_id": "The message ID.",
+        "peer": "The user to whom we sent the message."
+      }
+    },
+    "messages.GetPaidReactionPrivacy": {
+      "desc": "Fetches an updatePaidReactionPrivacy update with the current default paid reaction privacy, see here \u00bb for more info.",
+      "params": {}
+    },
+    "messages.GetPeerDialogs": {
+      "desc": "Get dialog info of specified peers",
+      "params": {
+        "peers": "Peers"
+      }
+    },
+    "messages.GetPeerSettings": {
+      "desc": "Get peer settings",
+      "params": {
+        "peer": "The peer"
+      }
+    },
+    "messages.GetPinnedDialogs": {
+      "desc": "Get pinned dialogs",
+      "params": {
+        "folder_id": "Peer folder ID, for more info click here"
+      }
+    },
+    "messages.GetPinnedSavedDialogs": {
+      "desc": "Get pinned saved dialogs, see here \u00bb for more info.",
+      "params": {}
+    },
+    "messages.GetPollResults": {
+      "desc": "Get poll results",
+      "params": {
+        "msg_id": "Message ID of poll message",
+        "peer": "Peer where the poll was found"
+      }
+    },
+    "messages.GetPollVotes": {
+      "desc": "Get poll results for non-anonymous polls",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "id": "Message ID",
+        "limit": "Number of results to return",
+        "offset": "Offset for results, taken from the next_offset field of messages.votesList, initially an empty string. Note: if no more results are available, the method call will return an empty next_offset; thus, avoid providing the next_offset returned in messages.votesList if it is empty, to avoid an infinite loop.",
+        "option": "Get only results for the specified poll option",
+        "peer": "Chat where the poll was sent"
+      }
+    },
+    "messages.GetPreparedInlineMessage": {
+      "desc": "Obtain a prepared inline message generated by a mini app: invoked when handling web_app_send_prepared_message events",
+      "params": {
+        "bot": "The bot that owns the mini app that emitted the web_app_send_prepared_message event",
+        "id": "The id from the web_app_send_prepared_message event"
+      }
+    },
+    "messages.GetQuickReplies": {
+      "desc": "Fetch basic info about all existing quick reply shortcuts.",
+      "params": {
+        "hash": "Hash for pagination, generated as specified here \u00bb (not the usual algorithm used for hash generation.)"
+      }
+    },
+    "messages.GetQuickReplyMessages": {
+      "desc": "Fetch (a subset or all) messages in a quick reply shortcut \u00bb.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "hash": "Hash for pagination, generated as specified here \u00bb (not the usual algorithm used for hash generation).",
+        "id": "IDs of the messages to fetch, if empty fetches all of them.",
+        "shortcut_id": "Quick reply shortcut ID."
+      }
+    },
+    "messages.GetRecentLocations": {
+      "desc": "Get live location history of a certain user",
+      "params": {
+        "hash": "Hash used for caching, for more info click here",
+        "limit": "Maximum number of results to return, see pagination",
+        "peer": "User"
+      }
+    },
+    "messages.GetRecentReactions": {
+      "desc": "Get recently used message reactions",
+      "params": {
+        "hash": "Hash used for caching, for more info click here.",
+        "limit": "Maximum number of results to return, see pagination"
+      }
+    },
+    "messages.GetRecentStickers": {
+      "desc": "Get recent stickers",
+      "params": {
+        "attached": "Get stickers recently attached to photo or video files",
+        "flags": "Flags, see TL conditional fields",
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "messages.GetReplies": {
+      "desc": "Get messages in a reply thread",
+      "params": {
+        "add_offset": "Offsets for pagination, for more info click here",
+        "hash": "Hash used for caching, for more info click here",
+        "limit": "Maximum number of results to return, see pagination",
+        "max_id": "If a positive value was transferred, the method will return only messages with ID smaller than max_id",
+        "min_id": "If a positive value was transferred, the method will return only messages with ID bigger than min_id",
+        "msg_id": "Message ID",
+        "offset_date": "Offsets for pagination, for more info click here",
+        "offset_id": "Offsets for pagination, for more info click here",
+        "peer": "Peer"
+      }
+    },
+    "messages.GetSavedDialogs": {
+      "desc": "Returns the current saved dialog list \u00bb or monoforum topic list \u00bb.",
+      "params": {
+        "exclude_pinned": "Exclude pinned dialogs",
+        "flags": "Flags, see TL conditional fields",
+        "hash": "Hash used for caching, for more info click here",
+        "limit": "Number of list elements to be returned",
+        "offset_date": "Offsets for pagination, for more info click here",
+        "offset_id": "Offsets for pagination, for more info click here (top_message ID used for pagination)",
+        "offset_peer": "Offset peer for pagination",
+        "parent_peer": "If set, fetches the topic list of the passed monoforum, otherwise fetches the saved dialog list."
+      }
+    },
+    "messages.GetSavedDialogsByID": {
+      "desc": "Obtain information about specific saved message dialogs \u00bb or monoforum topics \u00bb.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "ids": "IDs of dialogs (topics) to fetch.",
+        "parent_peer": "If set, fetches monoforum topics \u00bb, otherwise fetches saved message dialogs \u00bb."
+      }
+    },
+    "messages.GetSavedGifs": {
+      "desc": "Get saved GIFs.",
+      "params": {
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "messages.GetSavedHistory": {
+      "desc": "Fetch saved messages \u00bb forwarded from a specific peer, or fetch messages from a monoforum topic \u00bb.",
+      "params": {
+        "add_offset": "Number of list elements to be skipped, negative values are also accepted.",
+        "flags": "Flags, see TL conditional fields",
+        "hash": "Result hash",
+        "limit": "Number of results to return",
+        "max_id": "If a positive value was transferred, the method will return only messages with IDs less than max_id",
+        "min_id": "If a positive value was transferred, the method will return only messages with IDs more than min_id",
+        "offset_date": "Only return messages sent before the specified date",
+        "offset_id": "Only return messages starting from the specified message ID",
+        "parent_peer": "If set, fetches messages from the specified monoforum, otherwise fetches from saved messages.",
+        "peer": "Target peer (or topic)"
+      }
+    },
+    "messages.GetSavedReactionTags": {
+      "desc": "Fetch the full list of saved message tags created by the user.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "hash": "Hash used for caching, for more info click here.",
+        "peer": "If set, returns tags only used in the specified saved message dialog."
+      }
+    },
+    "messages.GetScheduledHistory": {
+      "desc": "Get scheduled messages",
+      "params": {
+        "hash": "Hash used for caching, for more info click here. To generate the hash, populate the ids array with the id, edit_date (0 if unedited) and date (in this order) of the previously returned messages (in order, i.e. ids = [id1, (edit_date1 ?? 0), date1, id2, (edit_date2 ?? 0), date2, ...]).",
+        "peer": "Peer"
+      }
+    },
+    "messages.GetScheduledMessages": {
+      "desc": "Get scheduled messages",
+      "params": {
+        "id": "IDs of scheduled messages",
+        "peer": "Peer"
+      }
+    },
+    "messages.GetSearchCounters": {
+      "desc": "Get the number of results that would be found by a messages.search call with the same parameters",
+      "params": {
+        "filters": "Search filters",
+        "flags": "Flags, see TL conditional fields",
+        "peer": "Peer where to search",
+        "saved_peer_id": "Search within the saved message dialog \u00bb with this ID.",
+        "top_msg_id": "If set, consider only messages within the specified forum topic"
+      }
+    },
+    "messages.GetSearchResultsCalendar": {
+      "desc": "Returns information about the next messages of the specified type in the chat split by days.",
+      "params": {
+        "filter": "Message filter, inputMessagesFilterEmpty, inputMessagesFilterMyMentions filters are not supported by this method.",
+        "flags": "Flags, see TL conditional fields",
+        "offset_date": "Offsets for pagination, for more info click here",
+        "offset_id": "Offsets for pagination, for more info click here",
+        "peer": "Peer where to search",
+        "saved_peer_id": "Search within the saved message dialog \u00bb with this ID."
+      }
+    },
+    "messages.GetSearchResultsPositions": {
+      "desc": "Returns sparse positions of messages of the specified type in the chat to be used for shared media scroll implementation.",
+      "params": {
+        "filter": "Message filter, inputMessagesFilterEmpty, inputMessagesFilterMyMentions filters are not supported by this method.",
+        "flags": "Flags, see TL conditional fields",
+        "limit": "Maximum number of results to return, see pagination",
+        "offset_id": "Offsets for pagination, for more info click here",
+        "peer": "Peer where to search",
+        "saved_peer_id": "Search within the saved message dialog \u00bb with this ID."
+      }
+    },
+    "messages.GetSplitRanges": {
+      "desc": "Get message ranges for saving the user's chat history",
+      "params": {}
+    },
+    "messages.GetSponsoredMessages": {
+      "desc": "Get a list of sponsored messages for a peer, see here \u00bb for more info.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "msg_id": "Must be set when fetching sponsored messages to show on channel videos \u00bb.",
+        "peer": "The currently open channel/bot."
+      }
+    },
+    "messages.GetStatsURL": {
+      "desc": "Returns URL with the chat statistics. Currently this method can be used only for channels",
+      "params": {
+        "dark": "Pass true if a URL with the dark theme must be returned",
+        "flags": "Flags, see TL conditional fields",
+        "params": "Parameters from tg://statsrefresh?params=****** link",
+        "peer": "Chat identifier"
+      }
+    },
+    "messages.GetStickerSet": {
+      "desc": "Get info about a stickerset",
+      "params": {
+        "hash": "Hash used for caching, for more info click here",
+        "stickerset": "Stickerset"
+      }
+    },
+    "messages.GetStickers": {
+      "desc": "Get stickers by emoji",
+      "params": {
+        "emoticon": "The emoji",
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "messages.GetSuggestedDialogFilters": {
+      "desc": "Get suggested folders",
+      "params": {}
+    },
+    "messages.GetTopReactions": {
+      "desc": "Got popular message reactions",
+      "params": {
+        "hash": "Hash used for caching, for more info click here.",
+        "limit": "Maximum number of results to return, see pagination"
+      }
+    },
+    "messages.GetUniqueGiftChatThemes": {
+      "desc": "",
+      "params": {}
+    },
+    "messages.GetUnreadMentions": {
+      "desc": "Get unread messages where we were mentioned",
+      "params": {
+        "add_offset": "Offsets for pagination, for more info click here",
+        "flags": "Flags, see TL conditional fields",
+        "limit": "Maximum number of results to return, see pagination",
+        "max_id": "Maximum message ID to return, see pagination",
+        "min_id": "Minimum message ID to return, see pagination",
+        "offset_id": "Offsets for pagination, for more info click here",
+        "peer": "Peer where to look for mentions",
+        "top_msg_id": "If set, considers only messages within the specified forum topic"
+      }
+    },
+    "messages.GetUnreadReactions": {
+      "desc": "Get unread reactions to messages you sent",
+      "params": {
+        "add_offset": "Offsets for pagination, for more info click here",
+        "flags": "Flags, see TL conditional fields",
+        "limit": "Maximum number of results to return, see pagination",
+        "max_id": "Only return reactions for messages up until this message ID",
+        "min_id": "Only return reactions for messages starting from this message ID",
+        "offset_id": "Offsets for pagination, for more info click here",
+        "peer": "Peer",
+        "saved_peer_id": "If set, must be equal to the ID of a monoforum topic: will affect that topic in the monoforum passed in peer.",
+        "top_msg_id": "If set, considers only reactions to messages within the specified forum topic"
+      }
+    },
+    "messages.GetWebPage": {
+      "desc": "Get instant view page",
+      "params": {
+        "hash": "Hash used for caching, for more info click here. Note: the usual hash generation algorithm cannot be used in this case, please re-use the webPage.hash field returned by a previous call to the method, or pass 0 if this is the first call or if the previous call did not return a webPage.",
+        "url": "URL of IV page to fetch"
+      }
+    },
+    "messages.GetWebPagePreview": {
+      "desc": "Get preview of webpage",
+      "params": {
+        "entities": "Message entities for styled text",
+        "flags": "Flags, see TL conditional fields",
+        "message": "Message from which to extract the preview"
+      }
+    },
+    "messages.GetWebViewResult": {
+      "desc": "",
+      "params": {}
+    },
+    "messages.HideAllChatJoinRequests": {
+      "desc": "Dismiss or approve all join requests related to a specific chat or channel.",
+      "params": {
+        "approved": "Whether to dismiss or approve all chat join requests \u00bb",
+        "flags": "Flags, see TL conditional fields",
+        "link": "Only dismiss or approve join requests \u00bb initiated using this invite link",
+        "peer": "The chat or channel"
+      }
+    },
+    "messages.HideChatJoinRequest": {
+      "desc": "Dismiss or approve a chat join request related to a specific chat or channel.",
+      "params": {
+        "approved": "Whether to dismiss or approve the chat join request \u00bb",
+        "flags": "Flags, see TL conditional fields",
+        "peer": "The chat or channel",
+        "user_id": "The user whose join request \u00bb should be dismissed or approved"
+      }
+    },
+    "messages.HidePeerSettingsBar": {
+      "desc": "Should be called after the user hides the report spam/add as contact bar of a new chat, effectively prevents the user from executing the actions specified in the action bar \u00bb.",
+      "params": {
+        "peer": "Peer"
+      }
+    },
+    "messages.ImportChatInvite": {
+      "desc": "Import a chat invite and join a private chat/supergroup/channel",
+      "params": {
+        "hash": "hash from a chat invite deep link"
+      }
+    },
+    "messages.InitHistoryImport": {
+      "desc": "Import chat history from a foreign chat app into a specific Telegram chat, click here for more info about imported chats \u00bb.",
+      "params": {
+        "file": "File with messages to import.",
+        "media_count": "Number of media files associated with the chat that will be uploaded using messages.uploadImportedMedia.",
+        "peer": "The Telegram chat where the history should be imported."
+      }
+    },
+    "messages.InstallStickerSet": {
+      "desc": "Install a stickerset",
+      "params": {
+        "archived": "Whether to archive stickerset",
+        "stickerset": "Stickerset to install"
+      }
+    },
+    "messages.MarkDialogUnread": {
+      "desc": "Manually mark dialog as unread",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "parent_peer": "If set, must be equal to the ID of a monoforum, and will affect the monoforum topic passed in peer.",
+        "peer": "Dialog",
+        "unread": "Mark as unread/read"
+      }
+    },
+    "messages.MigrateChat": {
+      "desc": "Turn a basic group into a supergroup",
+      "params": {
+        "chat_id": "Basic group to migrate"
+      }
+    },
+    "messages.ProlongWebView": {
+      "desc": "Indicate to the server (from the user side) that the user is still using a web app.",
+      "params": {
+        "bot": "Bot that owns the web app",
+        "flags": "Flags, see TL conditional fields",
+        "peer": "Dialog where the web app was opened.",
+        "query_id": "Web app interaction ID obtained from messages.requestWebView",
+        "reply_to": "If set, indicates that the inline message that will be sent by the bot on behalf of the user once the web app interaction is terminated should be sent in reply to the specified message or story.",
+        "send_as": "Open the web app as the specified peer",
+        "silent": "Whether the inline message that will be sent by the bot on behalf of the user once the web app interaction is terminated should be sent silently (no notifications for the receivers)."
+      }
+    },
+    "messages.RateTranscribedAudio": {
+      "desc": "Rate transcribed voice message",
+      "params": {
+        "good": "Whether the transcription was correct",
+        "msg_id": "Message ID",
+        "peer": "Peer where the voice message was sent",
+        "transcription_id": "Transcription ID"
+      }
+    },
+    "messages.ReadDiscussion": {
+      "desc": "Mark a thread as read",
+      "params": {
+        "msg_id": "ID of message that started the thread",
+        "peer": "Group ID",
+        "read_max_id": "ID up to which thread messages were read"
+      }
+    },
+    "messages.ReadEncryptedHistory": {
+      "desc": "Marks message history within a secret chat as read.",
+      "params": {
+        "max_date": "Maximum date value for received messages in history",
+        "peer": "Secret chat ID"
+      }
+    },
+    "messages.ReadFeaturedStickers": {
+      "desc": "Mark new featured stickers as read",
+      "params": {
+        "id": "IDs of stickersets to mark as read"
+      }
+    },
+    "messages.ReadHistory": {
+      "desc": "Marks message history as read.",
+      "params": {
+        "max_id": "If a positive value is passed, only messages with identifiers less or equal than the given one will be read",
+        "peer": "Target user or group"
+      }
+    },
+    "messages.ReadMentions": {
+      "desc": "Mark mentions as read",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "peer": "Dialog",
+        "top_msg_id": "Mark as read only mentions within the specified forum topic"
+      }
+    },
+    "messages.ReadMessageContents": {
+      "desc": "Notifies the sender about the recipient having listened a voice message or watched a video, emitting an updateReadMessagesContents.",
+      "params": {
+        "id": "Message ID list"
+      }
+    },
+    "messages.ReadReactions": {
+      "desc": "Mark message reactions \u00bb as read",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "peer": "Peer",
+        "saved_peer_id": "If set, must be equal to the ID of a monoforum topic: will affect that topic in the monoforum passed in peer.",
+        "top_msg_id": "Mark as read only reactions to messages within the specified forum topic"
+      }
+    },
+    "messages.ReadSavedHistory": {
+      "desc": "Mark messages as read in a monoforum topic \u00bb.",
+      "params": {
+        "max_id": "If a positive value is passed, only messages with identifiers less or equal than the given one will be read.",
+        "parent_peer": "ID of the monoforum group.",
+        "peer": "ID of the topic."
+      }
+    },
+    "messages.ReceivedMessages": {
+      "desc": "Confirms receipt of messages by a client, cancels PUSH-notification sending.",
+      "params": {
+        "max_id": "Maximum message ID available in a client."
+      }
+    },
+    "messages.ReceivedQueue": {
+      "desc": "Confirms receipt of messages in a secret chat by client, cancels push notifications.\nThe method returns a list of random_ids of messages for which push notifications were cancelled.",
+      "params": {
+        "max_qts": "Maximum qts value available at the client"
+      }
+    },
+    "messages.ReorderPinnedDialogs": {
+      "desc": "Reorder pinned dialogs",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "folder_id": "Peer folder ID, for more info click here",
+        "force": "If set, dialogs pinned server-side but not present in the order field will be unpinned.",
+        "order": "New dialog order"
+      }
+    },
+    "messages.ReorderPinnedForumTopics": {
+      "desc": "",
+      "params": {}
+    },
+    "messages.ReorderPinnedSavedDialogs": {
+      "desc": "Reorder pinned saved message dialogs \u00bb.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "force": "If set, dialogs pinned server-side but not present in the order field will be unpinned.",
+        "order": "New dialog order"
+      }
+    },
+    "messages.ReorderQuickReplies": {
+      "desc": "Reorder quick reply shortcuts.",
+      "params": {
+        "order": "IDs of all created quick reply shortcuts, in the desired order."
+      }
+    },
+    "messages.ReorderStickerSets": {
+      "desc": "Reorder installed stickersets",
+      "params": {
+        "emojis": "Reorder custom emoji stickersets",
+        "flags": "Flags, see TL conditional fields",
+        "masks": "Reorder mask stickersets",
+        "order": "New stickerset order by stickerset IDs"
+      }
+    },
+    "messages.Report": {
+      "desc": "Report a message in a chat for violation of telegram's Terms of Service",
+      "params": {
+        "id": "IDs of messages to report",
+        "message": "Comment for report moderation",
+        "option": "Menu option, intially empty",
+        "peer": "Peer"
+      }
+    },
+    "messages.ReportEncryptedSpam": {
+      "desc": "Report a secret chat for spam",
+      "params": {
+        "peer": "The secret chat to report"
+      }
+    },
+    "messages.ReportMessagesDelivery": {
+      "desc": "Used for Telegram Gateway verification messages \u00bb: indicate to the server that one or more messages were received by the client, if requested by the message.report_delivery_until_date flag or the equivalent flag in push notifications.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "id": "The IDs of the received messages.",
+        "peer": "The peer where the messages were received.",
+        "push": "Must be set if the messages were received from a push notification."
+      }
+    },
+    "messages.ReportReaction": {
+      "desc": "Report a message reaction",
+      "params": {
+        "id": "Message ID",
+        "peer": "Peer where the message was sent",
+        "reaction_peer": "Peer that sent the reaction"
+      }
+    },
+    "messages.ReportSpam": {
+      "desc": "Report a new incoming chat for spam, if the peer settings of the chat allow us to do that",
+      "params": {
+        "peer": "Peer to report"
+      }
+    },
+    "messages.ReportSponsoredMessage": {
+      "desc": "Report a sponsored message \u00bb, see here \u00bb for more info on the full flow.",
+      "params": {
+        "option": "Chosen report option, initially an empty string, see here \u00bb for more info on the full flow.",
+        "random_id": "The ad's unique ID."
+      }
+    },
+    "messages.RequestAppWebView": {
+      "desc": "Open a bot mini app from a direct Mini App deep link, sending over user information after user confirmation.",
+      "params": {
+        "app": "The app obtained by invoking messages.getBotApp as specified in the direct Mini App deep link docs.",
+        "compact": "If set, requests to open the mini app in compact mode (as opposed to normal or fullscreen mode). Must be set if the mode parameter of the direct Mini App deep link is equal to compact.",
+        "flags": "Flags, see TL conditional fields",
+        "fullscreen": "If set, requests to open the mini app in fullscreen mode (as opposed to compact or normal mode). Must be set if the mode parameter of the direct Mini App deep link is equal to fullscreen.",
+        "peer": "If the client has clicked on the link in a Telegram chat, pass the chat's peer information; otherwise pass the bot's peer information, instead.",
+        "platform": "Short name of the application; 0-64 English letters, digits, and underscores",
+        "start_param": "If the startapp query string parameter is present in the direct Mini App deep link, pass it to start_param.",
+        "theme_params": "Theme parameters \u00bb",
+        "write_allowed": "Set this flag if the bot is asking permission to send messages to the user as specified in the direct Mini App deep link docs, and the user agreed."
+      }
+    },
+    "messages.RequestEncryption": {
+      "desc": "Sends a request to start a secret chat to the user.",
+      "params": {
+        "g_a": "A = g ^ a mod p, see Wikipedia",
+        "random_id": "Unique client request ID required to prevent resending. This also doubles as the chat ID.",
+        "user_id": "User ID"
+      }
+    },
+    "messages.RequestMainWebView": {
+      "desc": "Open a Main Mini App.",
+      "params": {
+        "bot": "Bot that owns the main mini app.",
+        "compact": "If set, requests to open the mini app in compact mode (as opposed to normal or fullscreen mode). Must be set if the mode parameter of the Main Mini App link is equal to compact.",
+        "flags": "Flags, see TL conditional fields",
+        "fullscreen": "If set, requests to open the mini app in fullscreen mode (as opposed to compact or normal mode). Must be set if the mode parameter of the Main Mini App link is equal to fullscreen.",
+        "peer": "Currently open chat, may be inputPeerEmpty if no chat is currently open.",
+        "platform": "Short name of the application; 0-64 English letters, digits, and underscores",
+        "start_param": "Start parameter, if opening from a Main Mini App link \u00bb.",
+        "theme_params": "Theme parameters \u00bb"
+      }
+    },
+    "messages.RequestSimpleWebView": {
+      "desc": "Open a bot mini app.",
+      "params": {
+        "bot": "Bot that owns the mini app",
+        "compact": "Deprecated.",
+        "flags": "Flags, see TL conditional fields",
+        "from_side_menu": "Set this flag if opening the Mini App from the installed side menu entry \u00bb.",
+        "from_switch_webview": "Whether the webapp was opened by clicking on the switch_webview button shown on top of the inline results list returned by messages.getInlineBotResults.",
+        "fullscreen": "Requests to open the app in fullscreen mode.",
+        "platform": "Short name of the application; 0-64 English letters, digits, and underscores",
+        "start_param": "Deprecated.",
+        "theme_params": "Theme parameters \u00bb",
+        "url": "Web app URL, if opening from a keyboard button or inline result"
+      }
+    },
+    "messages.RequestUrlAuth": {
+      "desc": "Get more info about a Seamless Telegram Login authorization request, for more info click here \u00bb",
+      "params": {
+        "button_id": "The ID of the button with the authorization request",
+        "flags": "Flags, see TL conditional fields",
+        "msg_id": "The message",
+        "peer": "Peer where the message is located",
+        "url": "URL used for link URL authorization, click here for more info \u00bb"
+      }
+    },
+    "messages.RequestWebView": {
+      "desc": "Open a bot mini app, sending over user information after user confirmation.",
+      "params": {
+        "bot": "Bot that owns the web app",
+        "compact": "If set, requests to open the mini app in compact mode (as opposed to normal or fullscreen mode). Must be set if the mode parameter of the attachment menu deep link is equal to compact.",
+        "flags": "Flags, see TL conditional fields",
+        "from_bot_menu": "Whether the webview was opened by clicking on the bot's menu button \u00bb.",
+        "fullscreen": "If set, requests to open the mini app in fullscreen mode (as opposed to normal or compact mode). Must be set if the mode parameter of the attachment menu deep link is equal to fullscreen.",
+        "peer": "Dialog where the web app is being opened, and where the resulting message will be sent (see the docs for more info \u00bb).",
+        "platform": "Short name of the application; 0-64 English letters, digits, and underscores",
+        "reply_to": "If set, indicates that the inline message that will be sent by the bot on behalf of the user once the web app interaction is terminated should be sent in reply to the specified message or story.",
+        "send_as": "Open the web app as the specified peer, sending the resulting the message as the specified peer.",
+        "silent": "Whether the inline message that will be sent by the bot on behalf of the user once the web app interaction is terminated should be sent silently (no notifications for the receivers).",
+        "start_param": "If the web app was opened from the attachment menu using a attachment menu deep link, start_param should contain the data from the startattach parameter.",
+        "theme_params": "Theme parameters \u00bb",
+        "url": "Web app URL"
+      }
+    },
+    "messages.SaveDefaultSendAs": {
+      "desc": "Change the default peer that should be used when sending messages, reactions, poll votes to a specific group",
+      "params": {
+        "peer": "Group",
+        "send_as": "The default peer that should be used when sending messages to the group"
+      }
+    },
+    "messages.SaveDraft": {
+      "desc": "Save a message draft associated to a chat.",
+      "params": {
+        "effect": "Specifies a message effect \u00bb to use for the message.",
+        "entities": "Message entities for styled text",
+        "flags": "Flags, see TL conditional fields",
+        "invert_media": "If set, any eventual webpage preview will be shown on top of the message instead of at the bottom.",
+        "media": "Attached media",
+        "message": "The draft",
+        "no_webpage": "Disable generation of the webpage preview",
+        "peer": "Destination of the message that should be sent",
+        "reply_to": "If set, indicates that the message should be sent in reply to the specified message or story.",
+        "suggested_post": "Used to suggest a post to a channel, see here \u00bb for more info on the full flow."
+      }
+    },
+    "messages.SaveGif": {
+      "desc": "Add GIF to saved gifs list",
+      "params": {
+        "id": "GIF to save",
+        "unsave": "Whether to remove GIF from saved gifs list"
+      }
+    },
+    "messages.SavePreparedInlineMessage": {
+      "desc": "Save a prepared inline message, to be shared by the user of the mini app using a web_app_send_prepared_message event",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "peer_types": "Types of chats where this message can be sent",
+        "result": "The message",
+        "user_id": "The user to whom the web_app_send_prepared_message event event will be sent"
+      }
+    },
+    "messages.SaveRecentSticker": {
+      "desc": "Add/remove sticker from recent stickers list",
+      "params": {
+        "attached": "Whether to add/remove stickers recently attached to photo or video files",
+        "flags": "Flags, see TL conditional fields",
+        "id": "Sticker",
+        "unsave": "Whether to save or unsave the sticker"
+      }
+    },
+    "messages.Search": {
+      "desc": "Search for messages.",
+      "params": {
+        "add_offset": "Additional offset",
+        "filter": "Filter to return only specified message types",
+        "flags": "Flags, see TL conditional fields",
+        "from_id": "Only return messages sent by the specified user ID",
+        "hash": "Hash",
+        "limit": "Number of results to return, can be 0 to only return the message counter.",
+        "max_date": "If a positive value was transferred, only messages with a sending date smaller than the transferred one will be returned",
+        "max_id": "Maximum message ID to return",
+        "min_date": "If a positive value was transferred, only messages with a sending date bigger than the transferred one will be returned",
+        "min_id": "Minimum message ID to return",
+        "offset_id": "Only return messages starting from the specified message ID",
+        "peer": "User or chat, histories with which are searched, or (inputPeerEmpty) constructor to search in all private chats and normal groups (not channels) \u00bb. Use messages.searchGlobal to search globally in all chats, groups, supergroups and channels.",
+        "q": "Text search request",
+        "saved_peer_id": "Search within the saved message dialog \u00bb with this ID.",
+        "saved_reaction": "You may search for saved messages tagged \u00bb with one or more reactions using this flag.",
+        "top_msg_id": "Thread ID"
+      }
+    },
+    "messages.SearchCustomEmoji": {
+      "desc": "Look for custom emojis associated to a UTF8 emoji",
+      "params": {
+        "emoticon": "The emoji",
+        "hash": "Hash used for caching, for more info click here."
+      }
+    },
+    "messages.SearchEmojiStickerSets": {
+      "desc": "Search for custom emoji stickersets \u00bb",
+      "params": {
+        "exclude_featured": "Exclude featured stickersets from results",
+        "flags": "Flags, see TL conditional fields",
+        "hash": "Hash used for caching, for more info click here.",
+        "q": "Query string"
+      }
+    },
+    "messages.SearchGlobal": {
+      "desc": "Search for messages and peers globally",
+      "params": {
+        "broadcasts_only": "If set, only returns results from channels (used in the global channel search tab \u00bb).",
+        "filter": "Global search filter",
+        "flags": "Flags, see TL conditional fields",
+        "folder_id": "Peer folder ID, for more info click here",
+        "groups_only": "Whether to search only in groups",
+        "limit": "Offsets for pagination, for more info click here",
+        "max_date": "If a positive value was transferred, the method will return only messages with date smaller than max_date",
+        "min_date": "If a positive value was specified, the method will return only messages with date bigger than min_date",
+        "offset_id": "Offsets for pagination, for more info click here",
+        "offset_peer": "Offsets for pagination, for more info click here",
+        "offset_rate": "Initially 0, then set to the next_rate parameter of messages.messagesSlice, or if that is absent, the date of the last returned message.",
+        "q": "Query",
+        "users_only": "Whether to search only in private chats"
+      }
+    },
+    "messages.SearchSentMedia": {
+      "desc": "View and search recently sent media.\nThis method does not support pagination.",
+      "params": {
+        "filter": "Message filter",
+        "limit": "Maximum number of results to return (max 100).",
+        "q": "Optional search query"
+      }
+    },
+    "messages.SearchStickerSets": {
+      "desc": "Search for stickersets",
+      "params": {
+        "exclude_featured": "Exclude featured stickersets from results",
+        "flags": "Flags, see TL conditional fields",
+        "hash": "Hash used for caching, for more info click here.",
+        "q": "Query string"
+      }
+    },
+    "messages.SearchStickers": {
+      "desc": "Search for stickers using AI-powered keyword search",
+      "params": {
+        "emojis": "If set, returns custom emoji stickers",
+        "emoticon": "Space-separated list of emojis to search for",
+        "flags": "Flags, see TL conditional fields",
+        "hash": "Hash used for caching, for more info click here. The hash may be generated locally by using the ids of the returned or stored sticker documents.",
+        "lang_code": "List of possible IETF language tags of the user's input language; may be empty if unknown",
+        "limit": "Maximum number of results to return, see pagination",
+        "offset": "Offset for pagination",
+        "q": "The search term"
+      }
+    },
+    "messages.SendBotRequestedPeer": {
+      "desc": "Send one or more chosen peers, as requested by a keyboardButtonRequestPeer button.",
+      "params": {
+        "button_id": "The button_id field from the keyboardButtonRequestPeer constructor.",
+        "msg_id": "ID of the message that contained the reply keyboard with the keyboardButtonRequestPeer button.",
+        "peer": "The bot that sent the keyboardButtonRequestPeer button.",
+        "requested_peers": "The chosen peers."
+      }
+    },
+    "messages.SendEncrypted": {
+      "desc": "Sends a text message to a secret chat.",
+      "params": {
+        "data": "TL-serialization of DecryptedMessage type, encrypted with a key that was created during chat initialization",
+        "flags": "Flags, see TL conditional fields",
+        "peer": "Secret chat ID",
+        "random_id": "Unique client message ID, necessary to avoid message resending",
+        "silent": "Send encrypted message without a notification"
+      }
+    },
+    "messages.SendEncryptedFile": {
+      "desc": "Sends a message with a file attachment to a secret chat",
+      "params": {
+        "data": "TL-serialization of DecryptedMessage type, encrypted with a key generated during chat initialization",
+        "file": "File attachment for the secret chat",
+        "flags": "Flags, see TL conditional fields",
+        "peer": "Secret chat ID",
+        "random_id": "Unique client message ID necessary to prevent message resending",
+        "silent": "Whether to send the file without triggering a notification"
+      }
+    },
+    "messages.SendEncryptedService": {
+      "desc": "Sends a service message to a secret chat.",
+      "params": {
+        "data": "TL-serialization of  DecryptedMessage type, encrypted with a key generated during chat initialization",
+        "peer": "Secret chat ID",
+        "random_id": "Unique client message ID required to prevent message resending"
+      }
+    },
+    "messages.SendGroupCallEncryptedMessage": {
+      "desc": "",
+      "params": {}
+    },
+    "messages.SendGroupCallMessage": {
+      "desc": "",
+      "params": {}
+    },
+    "messages.SendInlineBotResult": {
+      "desc": "Send a result obtained using messages.getInlineBotResults.",
+      "params": {
+        "allow_paid_stars": "For paid messages \u00bb, specifies the amount of Telegram Stars the user has agreed to pay in order to send the message.",
+        "background": "Whether to send the message in background",
+        "clear_draft": "Whether to clear the draft",
+        "flags": "Flags, see TL conditional fields",
+        "hide_via": "Whether to hide the via @botname in the resulting message (only for bot usernames encountered in the config)",
+        "id": "Result ID from messages.getInlineBotResults",
+        "peer": "Destination",
+        "query_id": "Query ID from messages.getInlineBotResults",
+        "quick_reply_shortcut": "Add the message to the specified quick reply shortcut \u00bb, instead.",
+        "random_id": "Random ID to avoid resending the same query",
+        "reply_to": "If set, indicates that the message should be sent in reply to the specified message or story.",
+        "schedule_date": "Scheduled message date for scheduled messages",
+        "send_as": "Send this message as the specified peer",
+        "silent": "Whether to send the message silently (no notification will be triggered on the other client)"
+      }
+    },
+    "messages.SendMedia": {
+      "desc": "Send a media",
+      "params": {
+        "allow_paid_floodskip": "Bots only: if set, allows sending up to 1000 messages per second, ignoring broadcasting limits for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.",
+        "allow_paid_stars": "For paid messages \u00bb, specifies the amount of Telegram Stars the user has agreed to pay in order to send the message.",
+        "background": "Send message in background",
+        "clear_draft": "Clear the draft",
+        "effect": "Specifies a message effect \u00bb to use for the message.",
+        "entities": "Message entities for styled text",
+        "flags": "Flags, see TL conditional fields",
+        "invert_media": "If set, any eventual webpage preview will be shown on top of the message instead of at the bottom.",
+        "media": "Attached media",
+        "message": "Caption",
+        "noforwards": "Only for bots, disallows forwarding and saving of the messages, even if the destination chat doesn't have content protection enabled",
+        "peer": "Destination",
+        "quick_reply_shortcut": "Add the message to the specified quick reply shortcut \u00bb, instead.",
+        "random_id": "Random ID to avoid resending the same message",
+        "reply_markup": "Reply markup for bot keyboards",
+        "reply_to": "If set, indicates that the message should be sent in reply to the specified message or story.",
+        "schedule_date": "Scheduled message date for scheduled messages",
+        "send_as": "Send this message as the specified peer",
+        "silent": "Send message silently (no notification should be triggered)",
+        "suggested_post": "Used to suggest a post to a channel, see here \u00bb for more info on the full flow.",
+        "update_stickersets_order": "Whether to move used stickersets to top, see here for more info on this flag \u00bb"
+      }
+    },
+    "messages.SendMessage": {
+      "desc": "Sends a message to a chat",
+      "params": {
+        "allow_paid_floodskip": "Bots only: if set, allows sending up to 1000 messages per second, ignoring broadcasting limits for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.",
+        "allow_paid_stars": "For paid messages \u00bb, specifies the amount of Telegram Stars the user has agreed to pay in order to send the message.",
+        "background": "Send this message as background message",
+        "clear_draft": "Clear the draft field",
+        "effect": "Specifies a message effect \u00bb to use for the message.",
+        "entities": "Message entities for sending styled text",
+        "flags": "Flags, see TL conditional fields",
+        "invert_media": "If set, any eventual webpage preview will be shown on top of the message instead of at the bottom.",
+        "message": "The message",
+        "no_webpage": "Set this flag to disable generation of the webpage preview",
+        "noforwards": "Only for bots, disallows forwarding and saving of the messages, even if the destination chat doesn't have content protection enabled",
+        "peer": "The destination where the message will be sent",
+        "quick_reply_shortcut": "Add the message to the specified quick reply shortcut \u00bb, instead.",
+        "random_id": "Unique client message ID required to prevent message resending",
+        "reply_markup": "Reply markup for sending bot buttons",
+        "reply_to": "If set, indicates that the message should be sent in reply to the specified message or story. Also used to quote other messages.",
+        "schedule_date": "Scheduled message date for scheduled messages",
+        "send_as": "Send this message as the specified peer",
+        "silent": "Send this message silently (no notifications for the receivers)",
+        "suggested_post": "Used to suggest a post to a channel, see here \u00bb for more info on the full flow.",
+        "update_stickersets_order": "Whether to move used stickersets to top, see here for more info on this flag \u00bb"
+      }
+    },
+    "messages.SendMultiMedia": {
+      "desc": "Send an album or grouped media",
+      "params": {
+        "allow_paid_floodskip": "Bots only: if set, allows sending up to 1000 messages per second, ignoring broadcasting limits for a fee of 0.1 Telegram Stars per message. The relevant Stars will be withdrawn from the bot's balance.",
+        "allow_paid_stars": "For paid messages \u00bb, specifies the amount of Telegram Stars the user has agreed to pay in order to send the message.",
+        "background": "Send in background?",
+        "clear_draft": "Whether to clear drafts",
+        "effect": "Specifies a message effect \u00bb to use for the message.",
+        "flags": "Flags, see TL conditional fields",
+        "invert_media": "If set, any eventual webpage preview will be shown on top of the message instead of at the bottom.",
+        "multi_media": "The medias to send: note that they must be separately uploaded using messages.uploadMedia first, using raw inputMediaUploaded* constructors is not supported.",
+        "noforwards": "Only for bots, disallows forwarding and saving of the messages, even if the destination chat doesn't have content protection enabled",
+        "peer": "The destination chat",
+        "quick_reply_shortcut": "Add the message to the specified quick reply shortcut \u00bb, instead.",
+        "reply_to": "If set, indicates that the message should be sent in reply to the specified message or story.",
+        "schedule_date": "Scheduled message date for scheduled messages",
+        "send_as": "Send this message as the specified peer",
+        "silent": "Whether to send the album silently (no notification triggered)",
+        "update_stickersets_order": "Whether to move used stickersets to top, see here for more info on this flag \u00bb"
+      }
+    },
+    "messages.SendPaidReaction": {
+      "desc": "Sends one or more paid Telegram Star reactions \u00bb, transferring Telegram Stars \u00bb to a channel's balance.",
+      "params": {
+        "count": "The number of stars to send (each will increment the reaction counter by one).",
+        "flags": "Flags, see TL conditional fields",
+        "msg_id": "The message to react to",
+        "peer": "The channel",
+        "private": "Each post with star reactions has a leaderboard with the top senders, but users can opt out of appearing there if they prefer more privacy. Not populating this field will use the default reaction privacy, stored on the server and synced to clients using updatePaidReactionPrivacy (see here for more info).",
+        "random_id": "Unique client message ID required to prevent message resending. Note: this argument must be composed of a 64-bit integer where the lower 32 bits are random, and the higher 32 bits are equal to the current unixtime, i.e. uint64_t random_id = (time() << 32) | ((uint64_t)random_uint32_t()): this differs from the random_id format of all other methods in the API, which just take 64 random bits."
+      }
+    },
+    "messages.SendQuickReplyMessages": {
+      "desc": "Send a quick reply shortcut \u00bb.",
+      "params": {
+        "id": "Specify a subset of messages from the shortcut to send; if empty, defaults to all of them.",
+        "peer": "The peer where to send the shortcut (users only, for now).",
+        "random_id": "Unique client IDs required to prevent message resending, one for each message we're sending, may be empty (but not recommended).",
+        "shortcut_id": "The ID of the quick reply shortcut to send."
+      }
+    },
+    "messages.SendReaction": {
+      "desc": "React to message.",
+      "params": {
+        "add_to_recent": "Whether to add this reaction to the recent reactions list \u00bb.",
+        "big": "Whether a bigger and longer reaction should be shown",
+        "flags": "Flags, see TL conditional fields",
+        "msg_id": "Message ID to react to",
+        "peer": "Peer",
+        "reaction": "A list of reactions (doesn't accept reactionPaid constructors, use messages.sendPaidReaction to send paid reactions, instead)."
+      }
+    },
+    "messages.SendScheduledMessages": {
+      "desc": "Send scheduled messages right away",
+      "params": {
+        "id": "Scheduled message IDs",
+        "peer": "Peer"
+      }
+    },
+    "messages.SendScreenshotNotification": {
+      "desc": "Notify the other user in a private chat that a screenshot of the chat was taken",
+      "params": {
+        "peer": "Other user",
+        "random_id": "Random ID to avoid message resending",
+        "reply_to": "Indicates the message that was screenshotted (the specified message ID can also be 0 to avoid indicating any specific message)."
+      }
+    },
+    "messages.SendVote": {
+      "desc": "Vote in a poll",
+      "params": {
+        "msg_id": "The message ID of the poll",
+        "options": "The options that were chosen",
+        "peer": "The chat where the poll was sent"
+      }
+    },
+    "messages.SendWebViewData": {
+      "desc": "Used by the user to relay data from an opened reply keyboard bot mini app to the bot that owns it.",
+      "params": {
+        "bot": "Bot that owns the web app",
+        "button_text": "Text of the keyboardButtonSimpleWebView that was pressed to open the web app.",
+        "data": "Data to relay to the bot, obtained from a web_app_data_send JS event.",
+        "random_id": "Unique client message ID to prevent duplicate sending of the same event"
+      }
+    },
+    "messages.SendWebViewResultMessage": {
+      "desc": "Terminate webview interaction started with messages.requestWebView, sending the specified message to the chat on behalf of the user.",
+      "params": {
+        "bot_query_id": "Webview interaction ID obtained from messages.requestWebView",
+        "result": "Message to send"
+      }
+    },
+    "messages.SetBotCallbackAnswer": {
+      "desc": "Set the callback answer to a user button press (bots only)",
+      "params": {
+        "alert": "Whether to show the message as a popup instead of a toast notification",
+        "cache_time": "Cache validity",
+        "flags": "Flags, see TL conditional fields",
+        "message": "Popup to show",
+        "query_id": "Query ID",
+        "url": "URL to open"
+      }
+    },
+    "messages.SetBotPrecheckoutResults": {
+      "desc": "Once the user has confirmed their payment and shipping details, the bot receives an updateBotPrecheckoutQuery update.\nUse this method to respond to such pre-checkout queries.\nNote: Telegram must receive an answer within 10 seconds after the pre-checkout query was sent.",
+      "params": {
+        "error": "Required if the success isn't set. Error message in human readable form that explains the reason for failure to proceed with the checkout (e.g. \"Sorry, somebody just bought the last of our amazing black T-shirts while you were busy filling out your payment details. Please choose a different color or garment!\"). Telegram will display this message to the user.",
+        "flags": "Flags, see TL conditional fields",
+        "query_id": "Unique identifier for the query to be answered",
+        "success": "Set this flag if everything is alright (goods are available, etc.) and the bot is ready to proceed with the order, otherwise do not set it, and set the error field, instead"
+      }
+    },
+    "messages.SetBotShippingResults": {
+      "desc": "If you sent an invoice requesting a shipping address and the parameter is_flexible was specified, the bot will receive an updateBotShippingQuery update. Use this method to reply to shipping queries.",
+      "params": {
+        "error": "Error message in human readable form that explains why it is impossible to complete the order (e.g. \"Sorry, delivery to your desired address is unavailable\"). Telegram will display this message to the user.",
+        "flags": "Flags, see TL conditional fields",
+        "query_id": "Unique identifier for the query to be answered",
+        "shipping_options": "A vector of available shipping options."
+      }
+    },
+    "messages.SetChatAvailableReactions": {
+      "desc": "Change the set of message reactions \u00bb that can be used in a certain group, supergroup or channel",
+      "params": {
+        "available_reactions": "Allowed reaction emojis",
+        "flags": "Flags, see TL conditional fields",
+        "paid_enabled": "If this flag is set and a Bool is passed, the method will enable or disable paid message reactions \u00bb. If this flag is not set, the previously stored setting will not be changed.",
+        "peer": "Group where to apply changes",
+        "reactions_limit": "This flag may be used to impose a custom limit of unique reactions (i.e. a customizable version of appConfig.reactions_uniq_max); this field and the other info set by the method will then be available to users in channelFull and chatFull. If this flag is not set, the previously configured reactions_limit will not be altered."
+      }
+    },
+    "messages.SetChatTheme": {
+      "desc": "Change the chat theme of a certain chat, see here \u00bb for more info.",
+      "params": {
+        "peer": "Private chat where to change theme",
+        "theme": "The theme to set."
+      }
+    },
+    "messages.SetChatWallPaper": {
+      "desc": "Set a custom wallpaper \u00bb in a specific private chat with another user.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "for_both": "Only for Premium users, sets the specified wallpaper for both users of the chat, without requiring confirmation from the other user.",
+        "id": "If the wallpaper was obtained from a messageActionSetChatWallPaper service message, must contain the ID of that message.",
+        "peer": "The private chat where the wallpaper will be set",
+        "revert": "If we don't like the new wallpaper the other user of the chat has chosen for us using the for_both flag, we can re-set our previous wallpaper just on our side using this flag.",
+        "settings": "Wallpaper settings, obtained as described in the wallpaper documentation \u00bb or from messageActionSetChatWallPaper.wallpaper.settings.",
+        "wallpaper": "The wallpaper \u00bb, obtained as described in the wallpaper documentation \u00bb; must not be provided when installing a wallpaper obtained from a messageActionSetChatWallPaper service message (id must be provided, instead)."
+      }
+    },
+    "messages.SetDefaultHistoryTTL": {
+      "desc": "Changes the default value of the Time-To-Live setting, applied to all new chats.",
+      "params": {
+        "period": "The new default Time-To-Live of all messages sent in new chats, in seconds."
+      }
+    },
+    "messages.SetDefaultReaction": {
+      "desc": "Change default emoji reaction to use in the quick reaction menu: the value is synced across devices and can be fetched using help.getConfig, reactions_default field.",
+      "params": {
+        "reaction": "New emoji reaction"
+      }
+    },
+    "messages.SetEncryptedTyping": {
+      "desc": "Send typing event by the current user to a secret chat.",
+      "params": {
+        "peer": "Secret chat ID",
+        "typing": "Typing.Possible values:(boolTrue), if the user started typing and more than 5 seconds have passed since the last request(boolFalse), if the user stopped typing"
+      }
+    },
+    "messages.SetGameScore": {
+      "desc": "Use this method to set the score of the specified user in a game sent as a normal message (bots only).",
+      "params": {
+        "edit_message": "Set this flag if the game message should be automatically edited to include the current scoreboard",
+        "flags": "Flags, see TL conditional fields",
+        "force": "Set this flag if the high score is allowed to decrease. This can be useful when fixing mistakes or banning cheaters",
+        "id": "Identifier of the sent message",
+        "peer": "Unique identifier of target chat",
+        "score": "New score",
+        "user_id": "User identifier"
+      }
+    },
+    "messages.SetHistoryTTL": {
+      "desc": "Set maximum Time-To-Live of all messages in the specified chat",
+      "params": {
+        "peer": "The dialog",
+        "period": "Automatically delete all messages sent in the chat after this many seconds"
+      }
+    },
+    "messages.SetInlineBotResults": {
+      "desc": "Answer an inline query, for bots only",
+      "params": {
+        "cache_time": "The maximum amount of time in seconds that the result of the inline query may be cached on the server. Defaults to 300.",
+        "flags": "Flags, see TL conditional fields",
+        "gallery": "Set this flag if the results are composed of media files",
+        "next_offset": "Pass the offset that a client should send in the next query with the same text to receive more results. Pass an empty string if there are no more results or if you don't support pagination. Offset length can't exceed 64 bytes.",
+        "private": "Set this flag if results may be cached on the server side only for the user that sent the query. By default, results may be returned to any user who sends the same query",
+        "query_id": "Unique identifier for the answered query",
+        "results": "Vector of results for the inline query",
+        "switch_pm": "If passed, clients will display a button on top of the remaining inline result list with the specified text, that switches the user to a private chat with the bot and sends the bot a start message with a certain parameter.",
+        "switch_webview": "If passed, clients will display a button on top of the remaining inline result list with the specified text, that switches the user to the specified inline mode mini app."
+      }
+    },
+    "messages.SetInlineGameScore": {
+      "desc": "Use this method to set the score of the specified user in a game sent as an inline message (bots only).",
+      "params": {
+        "edit_message": "Set this flag if the game message should be automatically edited to include the current scoreboard",
+        "flags": "Flags, see TL conditional fields",
+        "force": "Set this flag if the high score is allowed to decrease. This can be useful when fixing mistakes or banning cheaters",
+        "id": "ID of the inline message",
+        "score": "New score",
+        "user_id": "User identifier"
+      }
+    },
+    "messages.SetTyping": {
+      "desc": "Sends a current user typing event (see SendMessageAction for all event types) to a conversation partner or group.",
+      "params": {
+        "action": "Type of action",
+        "flags": "Flags, see TL conditional fields",
+        "peer": "Target user or group",
+        "top_msg_id": "Topic ID"
+      }
+    },
+    "messages.SetWebViewResult": {
+      "desc": "",
+      "params": {}
+    },
+    "messages.StartBot": {
+      "desc": "Start a conversation with a bot using a deep linking parameter",
+      "params": {
+        "bot": "The bot",
+        "peer": "The chat where to start the bot, can be the bot's private chat or a group",
+        "random_id": "Random ID to avoid resending the same message",
+        "start_param": "Deep linking parameter"
+      }
+    },
+    "messages.StartHistoryImport": {
+      "desc": "Complete the history import process, importing all messages into the chat.\nTo be called only after initializing the import with messages.initHistoryImport and uploading all files using messages.uploadImportedMedia.",
+      "params": {
+        "import_id": "Identifier of a history import session, returned by messages.initHistoryImport.",
+        "peer": "The Telegram chat where the messages should be imported, click here for more info \u00bb"
+      }
+    },
+    "messages.ToggleBotInAttachMenu": {
+      "desc": "Enable or disable web bot attachment menu \u00bb",
+      "params": {
+        "bot": "Bot ID",
+        "enabled": "Toggle",
+        "flags": "Flags, see TL conditional fields",
+        "write_allowed": "Whether the user authorizes the bot to write messages to them, if requested by attachMenuBot.request_write_access"
+      }
+    },
+    "messages.ToggleDialogFilterTags": {
+      "desc": "Enable or disable folder tags \u00bb.",
+      "params": {
+        "enabled": "Enable or disable folder tags."
+      }
+    },
+    "messages.ToggleDialogPin": {
+      "desc": "Pin/unpin a dialog",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "peer": "The dialog to pin",
+        "pinned": "Whether to pin or unpin the dialog"
+      }
+    },
+    "messages.ToggleGroupCallSettings": {
+      "desc": "",
+      "params": {}
+    },
+    "messages.ToggleNoForwards": {
+      "desc": "Enable or disable content protection on a channel or chat",
+      "params": {
+        "enabled": "Enable or disable content protection",
+        "peer": "The chat or channel"
+      }
+    },
+    "messages.TogglePaidReactionPrivacy": {
+      "desc": "Changes the privacy of already sent paid reactions on a specific message.",
+      "params": {
+        "msg_id": "The ID of the message to which we sent the paid reactions",
+        "peer": "The channel",
+        "private": "If true, makes the current anonymous in the top sender leaderboard for this message; otherwise, does the opposite."
+      }
+    },
+    "messages.TogglePeerTranslations": {
+      "desc": "Show or hide the real-time chat translation popup for a certain chat",
+      "params": {
+        "disabled": "Whether to disable or enable the real-time chat translation popup",
+        "flags": "Flags, see TL conditional fields",
+        "peer": "The peer"
+      }
+    },
+    "messages.ToggleSavedDialogPin": {
+      "desc": "Pin or unpin a saved message dialog \u00bb.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "peer": "The dialog to pin",
+        "pinned": "Whether to pin or unpin the dialog"
+      }
+    },
+    "messages.ToggleStickerSets": {
+      "desc": "Apply changes to multiple stickersets",
+      "params": {
+        "archive": "Archive the specified stickersets",
+        "flags": "Flags, see TL conditional fields",
+        "stickersets": "Stickersets to act upon",
+        "unarchive": "Unarchive the specified stickersets",
+        "uninstall": "Uninstall the specified stickersets"
+      }
+    },
+    "messages.ToggleSuggestedPostApproval": {
+      "desc": "Approve or reject a suggested post \u00bb.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "msg_id": "ID of the suggestion message.",
+        "peer": "Both for users and channels, must contain the ID of the direct messages monoforum \u00bb (for channels, the topic ID is extracted automatically from the msg_id).",
+        "reject": "Reject the suggested post.",
+        "reject_comment": "Optional comment for rejections (can only be used if reject is set).",
+        "schedule_date": "Custom scheduling date."
+      }
+    },
+    "messages.ToggleTodoCompleted": {
+      "desc": "Mark one or more items of a todo list \u00bb as completed or not completed.",
+      "params": {
+        "completed": "Items to mark as completed.",
+        "incompleted": "Items to mark as not completed.",
+        "msg_id": "ID of the message with the todo list.",
+        "peer": "Peer where the todo list was posted."
+      }
+    },
+    "messages.TranscribeAudio": {
+      "desc": "Transcribe voice message",
+      "params": {
+        "msg_id": "Voice message ID",
+        "peer": "Peer ID where the voice message was sent"
+      }
+    },
+    "messages.TranslateText": {
+      "desc": "Translate a given text.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "id": "A list of message IDs to translate",
+        "peer": "If the text is a chat message, the peer ID",
+        "text": "A list of styled messages to translate",
+        "to_lang": "Two-letter ISO 639-1 language code of the language to which the message is translated"
+      }
+    },
+    "messages.UninstallStickerSet": {
+      "desc": "Uninstall a stickerset",
+      "params": {
+        "stickerset": "The stickerset to uninstall"
+      }
+    },
+    "messages.UnpinAllMessages": {
+      "desc": "Unpin all pinned messages",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "peer": "Chat where to unpin",
+        "saved_peer_id": "If set, must be equal to the ID of a monoforum topic, and will unpin all messages pinned in the passed monoforum topic.",
+        "top_msg_id": "Forum topic where to unpin"
+      }
+    },
+    "messages.UpdateColor": {
+      "desc": "",
+      "params": {}
+    },
+    "messages.UpdateContactNote": {
+      "desc": "",
+      "params": {}
+    },
+    "messages.UpdateDialogFilter": {
+      "desc": "Update folder",
+      "params": {
+        "filter": "Folder info",
+        "flags": "Flags, see TL conditional fields",
+        "id": "Folder ID"
+      }
+    },
+    "messages.UpdateDialogFiltersOrder": {
+      "desc": "Reorder folders",
+      "params": {
+        "order": "New folder order"
+      }
+    },
+    "messages.UpdatePinnedForumTopic": {
+      "desc": "",
+      "params": {}
+    },
+    "messages.UpdatePinnedMessage": {
+      "desc": "Pin a message",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "id": "The message to pin or unpin",
+        "peer": "The peer where to pin the message",
+        "pm_oneside": "Whether the message should only be pinned on the local side of a one-to-one chat",
+        "silent": "Pin the message silently, without triggering a notification",
+        "unpin": "Whether the message should unpinned or pinned"
+      }
+    },
+    "messages.UpdateSavedReactionTag": {
+      "desc": "Update the description of a saved message tag \u00bb.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "reaction": "Reaction associated to the tag",
+        "title": "Tag description, max 12 UTF-8 characters; to remove the description call the method without setting this flag."
+      }
+    },
+    "messages.UploadEncryptedFile": {
+      "desc": "Upload encrypted file and associate it to a secret chat (without actually sending it to the chat).",
+      "params": {
+        "file": "The file",
+        "peer": "The secret chat to associate the file to"
+      }
+    },
+    "messages.UploadImportedMedia": {
+      "desc": "Upload a media file associated with an imported chat, click here for more info \u00bb.",
+      "params": {
+        "file_name": "File name",
+        "import_id": "Identifier of a history import session, returned by messages.initHistoryImport",
+        "media": "Media metadata",
+        "peer": "The Telegram chat where the media will be imported"
+      }
+    },
+    "messages.UploadMedia": {
+      "desc": "Upload a file and associate it to a chat (without actually sending it to the chat)",
+      "params": {
+        "business_connection_id": "Whether the media will be used only in the specified business connection \u00bb, and not directly by the bot.",
+        "flags": "Flags, see TL conditional fields",
+        "media": "File uploaded in chunks as described in files \u00bb",
+        "peer": "The chat, can be inputPeerEmpty for bots and inputPeerSelf for users."
+      }
+    },
+    "messages.ViewSponsoredMessage": {
+      "desc": "Mark a specific sponsored message \u00bb as read",
+      "params": {
+        "random_id": "The ad's unique ID."
+      }
+    },
+    "payments.ApplyGiftCode": {
+      "desc": "Apply a Telegram Premium giftcode \u00bb",
+      "params": {
+        "slug": "The code to apply"
+      }
+    },
+    "payments.AssignAppStoreTransaction": {
+      "desc": "Informs server about a purchase made through the App Store: for official applications only.",
+      "params": {
+        "purpose": "Payment purpose",
+        "receipt": "Receipt"
+      }
+    },
+    "payments.AssignPlayMarketTransaction": {
+      "desc": "Informs server about a purchase made through the Play Store: for official applications only.",
+      "params": {
+        "purpose": "Payment purpose",
+        "receipt": "Receipt"
+      }
+    },
+    "payments.BotCancelStarsSubscription": {
+      "desc": "Cancel a bot subscription",
+      "params": {
+        "charge_id": "The provider_charge_id from the messageActionPaymentSentMe service message sent to the bot for the first subscription payment.",
+        "flags": "Flags, see TL conditional fields",
+        "restore": "If not set, disables autorenewal of the subscriptions, and prevents the user from reactivating the subscription once the current period expires: a subscription cancelled by the bot will have the starsSubscription.bot_canceled flag set.  The bot can can partially undo this operation by setting this flag: this will allow the user to reactivate the subscription.",
+        "user_id": "The ID of the user whose subscription should be (un)cancelled"
+      }
+    },
+    "payments.CanPurchaseStore": {
+      "desc": "Checks whether a purchase is possible. Must be called before in-store purchase, official apps only.",
+      "params": {
+        "purpose": "Payment purpose."
+      }
+    },
+    "payments.ChangeStarsSubscription": {
+      "desc": "Activate or deactivate a Telegram Star subscription \u00bb.",
+      "params": {
+        "canceled": "Whether to cancel or reactivate the subscription.",
+        "flags": "Flags, see TL conditional fields",
+        "peer": "Always pass inputPeerSelf.",
+        "subscription_id": "ID of the subscription."
+      }
+    },
+    "payments.CheckCanSendGift": {
+      "desc": "Check if the specified gift \u00bb can be sent.",
+      "params": {
+        "gift_id": "Gift ID."
+      }
+    },
+    "payments.CheckGiftCode": {
+      "desc": "Obtain information about a Telegram Premium giftcode \u00bb",
+      "params": {
+        "slug": "The giftcode to check"
+      }
+    },
+    "payments.ClearSavedInfo": {
+      "desc": "Clear saved payment information",
+      "params": {
+        "credentials": "Remove saved payment credentials",
+        "flags": "Flags, see TL conditional fields",
+        "info": "Clear the last order settings saved by the user"
+      }
+    },
+    "payments.ConnectStarRefBot": {
+      "desc": "Join a bot's affiliate program, becoming an affiliate \u00bb",
+      "params": {
+        "bot": "The bot that offers the affiliate program",
+        "peer": "The peer that will become the affiliate: star commissions will be transferred to this peer's star balance."
+      }
+    },
+    "payments.ConvertStarGift": {
+      "desc": "Convert a received gift \u00bb into Telegram Stars: this will permanently destroy the gift, converting it into starGift.convert_stars Telegram Stars, added to the user's balance.",
+      "params": {
+        "stargift": "The gift to convert."
+      }
+    },
+    "payments.CreateStarGiftCollection": {
+      "desc": "Create a star gift collection \u00bb.",
+      "params": {
+        "peer": "Peer where to create the collection.",
+        "stargift": "Gifts added to the collection.",
+        "title": "Title of the collection."
+      }
+    },
+    "payments.DeleteStarGiftCollection": {
+      "desc": "Delete a star gift collection \u00bb.",
+      "params": {
+        "collection_id": "ID of the collection.",
+        "peer": "Peer that owns the collection."
+      }
+    },
+    "payments.EditConnectedStarRefBot": {
+      "desc": "Leave a bot's affiliate program \u00bb",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "link": "The affiliate link to revoke",
+        "peer": "The peer that was affiliated",
+        "revoked": "If set, leaves the bot's affiliate program"
+      }
+    },
+    "payments.ExportInvoice": {
+      "desc": "Generate an invoice deep link",
+      "params": {
+        "invoice_media": "Invoice"
+      }
+    },
+    "payments.FulfillStarsSubscription": {
+      "desc": "Re-join a private channel associated to an active Telegram Star subscription \u00bb.",
+      "params": {
+        "peer": "Always pass inputPeerSelf.",
+        "subscription_id": "ID of the subscription."
+      }
+    },
+    "payments.GetBankCardData": {
+      "desc": "Get info about a credit card",
+      "params": {
+        "number": "Credit card number"
+      }
+    },
+    "payments.GetConnectedStarRefBot": {
+      "desc": "Fetch info about a specific bot affiliation \u00bb",
+      "params": {
+        "bot": "The bot that offers the affiliate program",
+        "peer": "The affiliated peer"
+      }
+    },
+    "payments.GetConnectedStarRefBots": {
+      "desc": "Fetch all affiliations we have created for a certain peer",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "limit": "Maximum number of results to return, see pagination",
+        "offset_date": "If set, returns only results older than the specified unixtime",
+        "offset_link": "Offset for pagination, taken from the last returned connectedBotStarRef.url (initially empty)",
+        "peer": "The affiliated peer"
+      }
+    },
+    "payments.GetGiveawayInfo": {
+      "desc": "Obtain information about a Telegram Premium giveaway \u00bb.",
+      "params": {
+        "msg_id": "Message ID of the messageActionGiveawayLaunch service message",
+        "peer": "The peer where the giveaway was posted."
+      }
+    },
+    "payments.GetPaymentForm": {
+      "desc": "Get a payment form",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "invoice": "Invoice",
+        "theme_params": "Theme parameters \u00bb"
+      }
+    },
+    "payments.GetPaymentReceipt": {
+      "desc": "Get payment receipt",
+      "params": {
+        "msg_id": "Message ID of receipt",
+        "peer": "The peer where the payment receipt was sent"
+      }
+    },
+    "payments.GetPremiumGiftCodeOptions": {
+      "desc": "Obtain a list of Telegram Premium giveaway/gift code \u00bb options.",
+      "params": {
+        "boost_peer": "The channel that will start the giveaway",
+        "flags": "Flags, see TL conditional fields"
+      }
+    },
+    "payments.GetResaleStarGifts": {
+      "desc": "Get collectible gifts of a specific type currently on resale, see here \u00bb for more info.",
+      "params": {
+        "attributes": "Optionally filter gifts with the specified attributes. If no attributes of a specific type are specified, all attributes of that type are allowed.",
+        "attributes_hash": "If a previous call to the method was made and payments.resaleStarGifts.attributes_hash was set, pass it here to avoid returning any results if they haven't changed. Otherwise, set this flag and pass 0 to return payments.resaleStarGifts.attributes_hash and payments.resaleStarGifts.attributes, these two fields will not be set if this flag is not set.",
+        "flags": "Flags, see TL conditional fields",
+        "gift_id": "Mandatory identifier of the base gift from which the collectible gift was upgraded.",
+        "limit": "Maximum number of results to return, see pagination",
+        "offset": "Offset for pagination. If not equal to an empty string, payments.resaleStarGifts.counters will not be set to avoid returning the counters every time a new page is fetched.",
+        "sort_by_num": "Sort gifts by number (ascending).",
+        "sort_by_price": "Sort gifts by price (ascending)."
+      }
+    },
+    "payments.GetSavedInfo": {
+      "desc": "Get saved payment information",
+      "params": {}
+    },
+    "payments.GetSavedStarGift": {
+      "desc": "Fetch info about specific gifts owned by a peer we control.",
+      "params": {
+        "stargift": "List of gifts to fetch info about."
+      }
+    },
+    "payments.GetSavedStarGifts": {
+      "desc": "Fetch the full list of gifts owned by a peer.",
+      "params": {
+        "collection_id": "Only returns gifts within the specified collection \u00bb.",
+        "exclude_saved": "Exclude gifts pinned on the profile.",
+        "exclude_unique": "Exclude collectible gifts \u00bb.",
+        "exclude_unlimited": "Exclude gifts that do not have the starGift.limited flag set.",
+        "exclude_unsaved": "Exclude gifts not pinned on the profile.",
+        "exclude_unupgradable": "Exclude gifts that cannot be upgraded to collectible gifts \u00bb.",
+        "exclude_upgradable": "Exclude gifts that can be upgraded to collectible gifts \u00bb.",
+        "flags": "Flags, see TL conditional fields",
+        "limit": "Maximum number of results to return, see pagination",
+        "offset": "Offset for pagination.",
+        "peer": "Fetch only gifts owned by the specified peer, such as: a user, with peer=inputPeerUser; a channel, with peer=inputPeerChannel; a connected business user (when executing the method as a bot, over the business connection), with peer=inputPeerUser.",
+        "sort_by_value": "If set, sorts the gifts by price instead of reception date."
+      }
+    },
+    "payments.GetStarGiftCollections": {
+      "desc": "Fetches all star gift collections \u00bb of a peer.",
+      "params": {
+        "hash": "Hash (generated as specified here \u00bb) using the starGiftCollection.hash field (not the collection_id field) of all collections returned by a previous method call, to avoid refetching the result if it hasn't changed.",
+        "peer": "The peer."
+      }
+    },
+    "payments.GetStarGiftUpgradePreview": {
+      "desc": "Obtain a preview of the possible attributes (chosen randomly) a gift \u00bb can receive after upgrading it to a collectible gift \u00bb, see here \u00bb for more info.",
+      "params": {
+        "gift_id": "The gift to upgrade."
+      }
+    },
+    "payments.GetStarGiftWithdrawalUrl": {
+      "desc": "Convert a collectible gift \u00bb to an NFT on the TON blockchain.",
+      "params": {
+        "password": "The current user's 2FA password, passed as specified here \u00bb.",
+        "stargift": "The collectible gift to export."
+      }
+    },
+    "payments.GetStarGifts": {
+      "desc": "Get a list of available gifts, see here \u00bb for more info.",
+      "params": {
+        "hash": "Hash used for caching, for more info click here.The hash may be generated locally by using the ids of the returned or stored sticker starGifts."
+      }
+    },
+    "payments.GetStarsGiftOptions": {
+      "desc": "Obtain a list of Telegram Stars gift options \u00bb as starsGiftOption constructors.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "user_id": "Receiver of the gift (optional)."
+      }
+    },
+    "payments.GetStarsGiveawayOptions": {
+      "desc": "Fetch a list of star giveaway options \u00bb.",
+      "params": {}
+    },
+    "payments.GetStarsRevenueAdsAccountUrl": {
+      "desc": "Returns a URL for a Telegram Ad platform account that can be used to set up advertisements for channel/bot in peer, paid using the Telegram Stars owned by the specified peer, see here \u00bb for more info.",
+      "params": {
+        "peer": "Channel or bot that owns the stars."
+      }
+    },
+    "payments.GetStarsRevenueStats": {
+      "desc": "Get Telegram Star revenue statistics \u00bb.",
+      "params": {
+        "dark": "Whether to enable dark theme for graph colors",
+        "flags": "Flags, see TL conditional fields",
+        "peer": "Get statistics for the specified bot, channel or ourselves (inputPeerSelf).",
+        "ton": "If set, fetches channel/bot ad revenue statistics in TON."
+      }
+    },
+    "payments.GetStarsRevenueWithdrawalUrl": {
+      "desc": "Withdraw funds from a channel or bot's star balance \u00bb.",
+      "params": {
+        "amount": "The amount of stars or nanotons to withdraw.",
+        "flags": "Flags, see TL conditional fields",
+        "password": "2FA password, see here \u00bb for more info.",
+        "peer": "Channel or bot from which to withdraw funds.",
+        "ton": "If set, withdraws channel/ad revenue in TON."
+      }
+    },
+    "payments.GetStarsStatus": {
+      "desc": "Get the current Telegram Stars balance of the current account (with peer=inputPeerSelf), or the stars balance of the bot specified in peer.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "peer": "Peer of which to get the balance.",
+        "ton": "If set, returns the channel/ad revenue balance in nanotons."
+      }
+    },
+    "payments.GetStarsSubscriptions": {
+      "desc": "Obtain a list of active, expired or cancelled Telegram Star subscriptions \u00bb.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "missing_balance": "Whether to return only subscriptions expired due to an excessively low Telegram Star balance.",
+        "offset": "Offset for pagination, taken from payments.starsStatus.subscriptions_next_offset.",
+        "peer": "Always pass inputPeerSelf."
+      }
+    },
+    "payments.GetStarsTopupOptions": {
+      "desc": "Obtain a list of Telegram Stars topup options \u00bb as starsTopupOption constructors.",
+      "params": {}
+    },
+    "payments.GetStarsTransactions": {
+      "desc": "Fetch Telegram Stars transactions.",
+      "params": {
+        "ascending": "Return transactions in ascending order by date (instead of descending order by date).",
+        "flags": "Flags, see TL conditional fields",
+        "inbound": "If set, fetches only incoming transactions.",
+        "limit": "Maximum number of results to return, see pagination",
+        "offset": "Offset for pagination, obtained from the returned next_offset, initially an empty string \u00bb.",
+        "outbound": "If set, fetches only outgoing transactions.",
+        "peer": "Fetch the transaction history of the peer (inputPeerSelf or a bot we own).",
+        "subscription_id": "If set, fetches only transactions for the specified Telegram Star subscription \u00bb.",
+        "ton": "If set, returns the channel/ad revenue transactions in nanotons, instead."
+      }
+    },
+    "payments.GetStarsTransactionsByID": {
+      "desc": "Obtain info about Telegram Star transactions \u00bb using specific transaction IDs.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "id": "Transaction IDs.",
+        "peer": "Channel or bot.",
+        "ton": "If set, returns channel/bot ad revenue transactions in nanotons."
+      }
+    },
+    "payments.GetSuggestedStarRefBots": {
+      "desc": "Obtain a list of suggested mini apps with available affiliate programs",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "limit": "Maximum number of results to return, see pagination",
+        "offset": "Offset for pagination, taken from payments.suggestedStarRefBots.next_offset, initially empty.",
+        "order_by_date": "If set, orders results by the creation date of the affiliate program",
+        "order_by_revenue": "If set, orders results by the expected revenue",
+        "peer": "The peer that will become the affiliate: star commissions will be transferred to this peer's star balance."
+      }
+    },
+    "payments.GetUniqueStarGift": {
+      "desc": "Obtain info about a collectible gift \u00bb using a slug obtained from a collectible gift link \u00bb.",
+      "params": {
+        "slug": "The slug."
+      }
+    },
+    "payments.GetUniqueStarGiftValueInfo": {
+      "desc": "Get information about the value of a collectible gift \u00bb.",
+      "params": {
+        "slug": "slug from a starGiftUnique."
+      }
+    },
+    "payments.LaunchPrepaidGiveaway": {
+      "desc": "Launch a prepaid giveaway \u00bb.",
+      "params": {
+        "giveaway_id": "The prepaid giveaway ID.",
+        "peer": "The peer where to launch the giveaway.",
+        "purpose": "Giveway parameters"
+      }
+    },
+    "payments.RefundStarsCharge": {
+      "desc": "Refund a Telegram Stars transaction, see here \u00bb for more info.",
+      "params": {
+        "charge_id": "Transaction ID.",
+        "user_id": "User to refund."
+      }
+    },
+    "payments.ReorderStarGiftCollections": {
+      "desc": "Reorder the star gift collections \u00bb on an owned peer's profile.",
+      "params": {
+        "order": "New collection order.",
+        "peer": "The owned peer."
+      }
+    },
+    "payments.RequestRecurringPayment": {
+      "desc": "{schema}",
+      "params": {
+        "invoice_media": "",
+        "recurring_init_charge": "",
+        "user_id": ""
+      }
+    },
+    "payments.SaveStarGift": {
+      "desc": "Display or remove a received gift \u00bb from our profile.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "stargift": "The gift to display or remove.",
+        "unsave": "If set, hides the gift from our profile."
+      }
+    },
+    "payments.SendPaymentForm": {
+      "desc": "Send compiled payment form",
+      "params": {
+        "credentials": "Payment credentials",
+        "flags": "Flags, see TL conditional fields",
+        "form_id": "Form ID",
+        "invoice": "Invoice",
+        "requested_info_id": "ID of saved and validated order info",
+        "shipping_option_id": "Chosen shipping option ID",
+        "tip_amount": "Tip, in the smallest units of the currency (integer, not float/double). For example, for a price of US$ 1.45 pass amount = 145. See the exp parameter in currencies.json, it shows the number of digits past the decimal point for each currency (2 for the majority of currencies)."
+      }
+    },
+    "payments.SendStarsForm": {
+      "desc": "Make a payment using Telegram Stars, see here \u00bb for more info.",
+      "params": {
+        "form_id": "Payment form ID",
+        "invoice": "Invoice"
+      }
+    },
+    "payments.ToggleChatStarGiftNotifications": {
+      "desc": "Enables or disables the reception of notifications every time a gift \u00bb is received by the specified channel, can only be invoked by admins with post_messages admin rights.",
+      "params": {
+        "enabled": "Whether to enable or disable reception of notifications in the form of messageActionStarGiftUnique and messageActionStarGift service messages from the channel.",
+        "flags": "Flags, see TL conditional fields",
+        "peer": "The channel for which to receive or not receive notifications."
+      }
+    },
+    "payments.ToggleStarGiftsPinnedToTop": {
+      "desc": "Pins a received gift on top of the profile of the user or owned channels by using payments.toggleStarGiftsPinnedToTop.",
+      "params": {
+        "peer": "The peer where to pin the gift.",
+        "stargift": "The gift to pin."
+      }
+    },
+    "payments.TransferStarGift": {
+      "desc": "Transfer a collectible gift to another user or channel: can only be used if transfer is free (i.e. messageActionStarGiftUnique.transfer_stars is not set); see here \u00bb for more info on the full flow (including the different flow to use in case the transfer isn't free).",
+      "params": {
+        "stargift": "The gift to transfer.",
+        "to_id": "Destination peer."
+      }
+    },
+    "payments.UpdateStarGiftCollection": {
+      "desc": "Add or remove gifts from a star gift collection \u00bb, or rename the collection.",
+      "params": {
+        "add_stargift": "Can contain a list of gifts to add to the collection.",
+        "collection_id": "Collection ID.",
+        "delete_stargift": "Can contain a list of gifts to remove from the collection.",
+        "flags": "Flags, see TL conditional fields",
+        "order": "Can contain the new gift order.",
+        "peer": "Peer that owns the collection.",
+        "title": "Title of the collection, to rename the collection."
+      }
+    },
+    "payments.UpdateStarGiftPrice": {
+      "desc": "A collectible gift we own \u00bb can be put up for sale on the gift marketplace \u00bb with this method, see here \u00bb for more info.",
+      "params": {
+        "resell_amount": "Resale price of the gift.",
+        "stargift": "The gift to resell."
+      }
+    },
+    "payments.UpgradeStarGift": {
+      "desc": "Upgrade a gift to a collectible gift: can only be used if the upgrade was already paid by the gift sender; see here \u00bb for more info on the full flow (including the different flow to use in case the upgrade was not paid by the gift sender).",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "keep_original_details": "Set this flag to keep the original gift text, sender and receiver in the upgraded gift as a starGiftAttributeOriginalDetails attribute.",
+        "stargift": "The gift to upgrade"
+      }
+    },
+    "payments.ValidateRequestedInfo": {
+      "desc": "Submit requested order information for validation",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "info": "Requested order information",
+        "invoice": "Invoice",
+        "save": "Save order information to re-use it for future orders"
+      }
+    },
+    "phone.AcceptCall": {
+      "desc": "Accept incoming call",
+      "params": {
+        "g_b": "Parameter for E2E encryption key exchange \u00bb",
+        "peer": "The call to accept",
+        "protocol": "Phone call settings"
+      }
+    },
+    "phone.CheckGroupCall": {
+      "desc": "Check whether the group call Server Forwarding Unit is currently receiving the streams with the specified WebRTC source IDs.\nReturns an intersection of the source IDs specified in sources, and the source IDs currently being forwarded by the SFU.",
+      "params": {
+        "call": "Group call",
+        "sources": "Source IDs"
+      }
+    },
+    "phone.ConfirmCall": {
+      "desc": "Complete phone call E2E encryption key exchange \u00bb",
+      "params": {
+        "g_a": "Parameter for E2E encryption key exchange \u00bb",
+        "key_fingerprint": "Key fingerprint",
+        "peer": "The phone call",
+        "protocol": "Phone call settings"
+      }
+    },
+    "phone.CreateConferenceCall": {
+      "desc": "Create and optionally join a new conference call.",
+      "params": {
+        "block": "Initial blockchain block (can only be used if join is set).",
+        "flags": "Flags, see TL conditional fields",
+        "join": "If set, also join the call, otherwise just create the call link.",
+        "muted": "If set, mute our microphone when joining the call (can only be used if join is set).",
+        "params": "Parameters from tgcalls (can only be used if join is set).",
+        "public_key": "Public key (can only be used if join is set).",
+        "random_id": "Unique client message ID required to prevent creation of duplicate group calls.",
+        "video_stopped": "If set, our video stream is disabled (can only be used if join is set)."
+      }
+    },
+    "phone.CreateGroupCall": {
+      "desc": "Create a group call or livestream",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "peer": "Associate the group call or livestream to the provided group/supergroup/channel",
+        "random_id": "Unique client message ID required to prevent creation of duplicate group calls",
+        "rtmp_stream": "Whether RTMP stream support should be enabled: only the group/supergroup/channel owner can use this flag.",
+        "schedule_date": "For scheduled group call or livestreams, the absolute date when the group call will start",
+        "title": "Call title"
+      }
+    },
+    "phone.DeclineConferenceCallInvite": {
+      "desc": "Declines a conference call invite.",
+      "params": {
+        "msg_id": "The ID of the messageActionConferenceCall to decline."
+      }
+    },
+    "phone.DeleteConferenceCallParticipants": {
+      "desc": "Remove participants from a conference call.",
+      "params": {
+        "block": "The block containing an appropriate e2e.chain.changeSetGroupState event",
+        "call": "The conference call.",
+        "flags": "Flags, see TL conditional fields",
+        "ids": "IDs of users to remove.",
+        "kick": "Whether this is a forced removal of active members in a conference call.",
+        "only_left": "Whether this is a removal of members that already left the conference call."
+      }
+    },
+    "phone.DiscardCall": {
+      "desc": "Refuse or end running call",
+      "params": {
+        "connection_id": "Preferred libtgvoip relay ID",
+        "duration": "Call duration",
+        "flags": "Flags, see TL conditional fields",
+        "peer": "The phone call",
+        "reason": "Why was the call discarded",
+        "video": "Whether this is a video call"
+      }
+    },
+    "phone.DiscardGroupCall": {
+      "desc": "Terminate a group call",
+      "params": {
+        "call": "The group call to terminate"
+      }
+    },
+    "phone.EditGroupCallParticipant": {
+      "desc": "Edit information about a given group call participant",
+      "params": {
+        "call": "The group call",
+        "flags": "Flags, see TL conditional fields",
+        "muted": "Whether to mute or unmute the specified participant",
+        "participant": "The group call participant (can also be the user itself)",
+        "presentation_paused": "Pause or resume the screen sharing stream",
+        "raise_hand": "Raise or lower hand",
+        "video_paused": "Pause or resume the video stream",
+        "video_stopped": "Start or stop the video stream",
+        "volume": "New volume"
+      }
+    },
+    "phone.EditGroupCallTitle": {
+      "desc": "Edit the title of a group call or livestream",
+      "params": {
+        "call": "Group call",
+        "title": "New title"
+      }
+    },
+    "phone.ExportGroupCallInvite": {
+      "desc": "Get an invite link for a group call or livestream",
+      "params": {
+        "call": "The group call",
+        "can_self_unmute": "For livestreams or muted group chats, if set, users that join using this link will be able to speak without explicitly requesting permission by (for example by raising their hand).",
+        "flags": "Flags, see TL conditional fields"
+      }
+    },
+    "phone.GetCallConfig": {
+      "desc": "Get phone call configuration to be passed to libtgvoip's shared config",
+      "params": {}
+    },
+    "phone.GetGroupCall": {
+      "desc": "Get info about a group call",
+      "params": {
+        "call": "The group call",
+        "limit": "Maximum number of results to return, see pagination"
+      }
+    },
+    "phone.GetGroupCallChainBlocks": {
+      "desc": "Fetch the blocks of a conference blockchain \u00bb.",
+      "params": {
+        "call": "The conference.",
+        "limit": "Maximum number of blocks to return in this call, see pagination",
+        "offset": "Offset for pagination.",
+        "sub_chain_id": "Subchain ID."
+      }
+    },
+    "phone.GetGroupCallJoinAs": {
+      "desc": "Get a list of peers that can be used to join a group call, presenting yourself as a specific user/channel.",
+      "params": {
+        "peer": "The dialog whose group call or livestream we're trying to join"
+      }
+    },
+    "phone.GetGroupCallStreamChannels": {
+      "desc": "Get info about RTMP streams in a group call or livestream.\nThis method should be invoked to the same group/channel-related DC used for downloading livestream chunks.\nAs usual, the media DC is preferred, if available.",
+      "params": {
+        "call": "Group call or livestream"
+      }
+    },
+    "phone.GetGroupCallStreamRtmpUrl": {
+      "desc": "Get RTMP URL and stream key for RTMP livestreams. Can be used even before creating the actual RTMP livestream with phone.createGroupCall (the rtmp_stream flag must be set).",
+      "params": {
+        "peer": "Peer to livestream into",
+        "revoke": "Whether to revoke the previous stream key or simply return the existing one"
+      }
+    },
+    "phone.GetGroupParticipants": {
+      "desc": "Get group call participants",
+      "params": {
+        "call": "Group call",
+        "ids": "If specified, will fetch group participant info about the specified peers",
+        "limit": "Maximum number of results to return, see pagination",
+        "offset": "Offset for results, taken from the next_offset field of phone.groupParticipants, initially an empty string. Note: if no more results are available, the method call will return an empty next_offset; thus, avoid providing the next_offset returned in phone.groupParticipants if it is empty, to avoid an infinite loop.",
+        "sources": "If specified, will fetch group participant info about the specified WebRTC source IDs"
+      }
+    },
+    "phone.InviteConferenceCallParticipant": {
+      "desc": "Invite a user to a conference call.",
+      "params": {
+        "call": "The conference call.",
+        "flags": "Flags, see TL conditional fields",
+        "user_id": "The user to invite.",
+        "video": "Invite the user to also turn on their video feed."
+      }
+    },
+    "phone.InviteToGroupCall": {
+      "desc": "Invite a set of users to a group call.",
+      "params": {
+        "call": "The group call",
+        "users": "The users to invite."
+      }
+    },
+    "phone.JoinGroupCall": {
+      "desc": "Join a group call",
+      "params": {
+        "block": "The block containing an appropriate e2e.chain.changeSetGroupState event.",
+        "call": "The group call",
+        "flags": "Flags, see TL conditional fields",
+        "invite_hash": "The invitation hash from the invite link \u00bb, if provided allows speaking in a livestream or muted group chat.",
+        "join_as": "Join the group call, presenting yourself as the specified user/channel",
+        "muted": "If set, the user will be muted by default upon joining.",
+        "params": "WebRTC parameters",
+        "public_key": "For conference calls, your public key.",
+        "video_stopped": "If set, the user's video will be disabled by default upon joining."
+      }
+    },
+    "phone.JoinGroupCallPresentation": {
+      "desc": "Start screen sharing in a call",
+      "params": {
+        "call": "The group call",
+        "params": "WebRTC parameters"
+      }
+    },
+    "phone.LeaveGroupCall": {
+      "desc": "Leave a group call",
+      "params": {
+        "call": "The group call",
+        "source": "Your source ID"
+      }
+    },
+    "phone.LeaveGroupCallPresentation": {
+      "desc": "Stop screen sharing in a group call",
+      "params": {
+        "call": "The group call"
+      }
+    },
+    "phone.ReceivedCall": {
+      "desc": "Optional: notify the server that the user is currently busy in a call: this will automatically refuse all incoming phone calls until the current phone call is ended.",
+      "params": {
+        "peer": "The phone call we're currently in"
+      }
+    },
+    "phone.RequestCall": {
+      "desc": "Start a telegram phone call",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "g_a_hash": "Parameter for E2E encryption key exchange \u00bb",
+        "protocol": "Phone call settings",
+        "random_id": "Random ID to avoid resending the same object",
+        "user_id": "Destination of the phone call",
+        "video": "Whether to start a video call"
+      }
+    },
+    "phone.SaveCallDebug": {
+      "desc": "Send phone call debug data to server",
+      "params": {
+        "debug": "Debug statistics obtained from libtgvoip",
+        "peer": "Phone call"
+      }
+    },
+    "phone.SaveCallLog": {
+      "desc": "Save phone call debug information",
+      "params": {
+        "file": "Logs",
+        "peer": "Phone call"
+      }
+    },
+    "phone.SaveDefaultGroupCallJoinAs": {
+      "desc": "Set the default peer that will be used to join a group call in a specific dialog.",
+      "params": {
+        "join_as": "The default peer that will be used to join group calls in this dialog, presenting yourself as a specific user/channel.",
+        "peer": "The dialog"
+      }
+    },
+    "phone.SendConferenceCallBroadcast": {
+      "desc": "Broadcast a blockchain block to all members of a conference call, see here \u00bb for more info.",
+      "params": {
+        "block": "The block to broadcast.",
+        "call": "The conference where to broadcast the block."
+      }
+    },
+    "phone.SendSignalingData": {
+      "desc": "Send VoIP signaling data",
+      "params": {
+        "data": "Signaling payload",
+        "peer": "Phone call"
+      }
+    },
+    "phone.SetCallRating": {
+      "desc": "Rate a call, returns info about the rating message sent to the official VoIP bot.",
+      "params": {
+        "comment": "An additional comment",
+        "flags": "Flags, see TL conditional fields",
+        "peer": "The call to rate",
+        "rating": "Rating in 1-5 stars",
+        "user_initiative": "Whether the user decided on their own initiative to rate the call"
+      }
+    },
+    "phone.StartScheduledGroupCall": {
+      "desc": "Start a scheduled group call.",
+      "params": {
+        "call": "The scheduled group call"
+      }
+    },
+    "phone.ToggleGroupCallRecord": {
+      "desc": "Start or stop recording a group call: the recorded audio and video streams will be automatically sent to Saved messages (the chat with ourselves).",
+      "params": {
+        "call": "The group call or livestream",
+        "flags": "Flags, see TL conditional fields",
+        "start": "Whether to start or stop recording",
+        "title": "Recording title",
+        "video": "Whether to also record video streams",
+        "video_portrait": "If video stream recording is enabled, whether to record in portrait or landscape mode"
+      }
+    },
+    "phone.ToggleGroupCallSettings": {
+      "desc": "Change group call settings",
+      "params": {
+        "call": "Group call",
+        "flags": "Flags, see TL conditional fields",
+        "join_muted": "Whether all users will that join this group call are muted by default upon joining the group call",
+        "reset_invite_hash": "Invalidate existing invite links"
+      }
+    },
+    "phone.ToggleGroupCallStartSubscription": {
+      "desc": "Subscribe or unsubscribe to a scheduled group call",
+      "params": {
+        "call": "Scheduled group call",
+        "subscribed": "Enable or disable subscription"
+      }
+    },
+    "photos.DeletePhotos": {
+      "desc": "Deletes profile photos. The method returns a list of successfully deleted photo IDs.",
+      "params": {
+        "id": "Input photos to delete"
+      }
+    },
+    "photos.GetUserPhotos": {
+      "desc": "Returns the list of user photos.",
+      "params": {
+        "limit": "Number of list elements to be returned",
+        "max_id": "If a positive value was transferred, the method will return only photos with IDs less than the set one. This parameter is often useful when refetching file references \u00bb, as in conjuction with limit=1 and offset=-1 the photo object with the id specified in max_id can be fetched.",
+        "offset": "Number of list elements to be skipped",
+        "user_id": "User ID"
+      }
+    },
+    "photos.UpdateProfilePhoto": {
+      "desc": "Installs a previously uploaded photo as a profile photo.",
+      "params": {
+        "bot": "Can contain info of a bot we own, to change the profile photo of that bot, instead of the current user.",
+        "fallback": "If set, the chosen profile photo will be shown to users that can't display your main profile photo due to your privacy settings.",
+        "flags": "Flags, see TL conditional fields",
+        "id": "Input photo"
+      }
+    },
+    "photos.UploadContactProfilePhoto": {
+      "desc": "Upload a custom profile picture for a contact, or suggest a new profile picture to a contact.",
+      "params": {
+        "file": "Profile photo",
+        "flags": "Flags, see TL conditional fields",
+        "save": "If set, removes a previously set personal profile picture (does not affect suggested profile pictures, to remove them simply delete the messageActionSuggestProfilePhoto service message with messages.deleteMessages).",
+        "suggest": "If set, will send a messageActionSuggestProfilePhoto service message to user_id, suggesting them to use the specified profile picture; otherwise, will set a personal profile picture for the user (only visible to the current user).",
+        "user_id": "The contact",
+        "video": "Animated profile picture video",
+        "video_emoji_markup": "Animated sticker profile picture, must contain either a videoSizeEmojiMarkup or a videoSizeStickerMarkup constructor.",
+        "video_start_ts": "Floating point UNIX timestamp in seconds, indicating the frame of the video/sticker that should be used as static preview; can only be used if video or video_emoji_markup is set."
+      }
+    },
+    "photos.UploadProfilePhoto": {
+      "desc": "Updates current user profile photo.",
+      "params": {
+        "bot": "Can contain info of a bot we own, to change the profile photo of that bot, instead of the current user.",
+        "fallback": "If set, the chosen profile photo will be shown to users that can't display your main profile photo due to your privacy settings.",
+        "file": "Profile photo",
+        "flags": "Flags, see TL conditional fields",
+        "video": "Animated profile picture video",
+        "video_emoji_markup": "Animated sticker profile picture, must contain either a videoSizeEmojiMarkup or a videoSizeStickerMarkup constructor.",
+        "video_start_ts": "Floating point UNIX timestamp in seconds, indicating the frame of the video/sticker that should be used as static preview; can only be used if video or video_emoji_markup is set."
+      }
+    },
+    "premium.ApplyBoost": {
+      "desc": "Apply one or more boosts \u00bb to a peer.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "peer": "The peer to boost.",
+        "slots": "Which boost slots to assign to this peer."
+      }
+    },
+    "premium.GetBoostsList": {
+      "desc": "Obtains info about the boosts that were applied to a certain channel or supergroup (admins only)",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "gifts": "Whether to return only info about boosts received from gift codes and giveaways created by the channel/supergroup \u00bb",
+        "limit": "Maximum number of results to return, see pagination",
+        "offset": "Offset for pagination, obtained from premium.boostsList.next_offset",
+        "peer": "The channel/supergroup"
+      }
+    },
+    "premium.GetBoostsStatus": {
+      "desc": "Gets the current number of boosts of a channel/supergroup.",
+      "params": {
+        "peer": "The peer."
+      }
+    },
+    "premium.GetMyBoosts": {
+      "desc": "Obtain which peers are we currently boosting, and how many boost slots we have left.",
+      "params": {}
+    },
+    "premium.GetUserBoosts": {
+      "desc": "Returns the lists of boost that were applied to a channel/supergroup by a specific user (admins only)",
+      "params": {
+        "peer": "The channel/supergroup",
+        "user_id": "The user"
+      }
+    },
+    "smsjobs.FinishJob": {
+      "desc": "Finish an SMS job (official clients only).",
+      "params": {
+        "error": "If failed, the error.",
+        "flags": "Flags, see TL conditional fields",
+        "job_id": "Job ID."
+      }
+    },
+    "smsjobs.GetSmsJob": {
+      "desc": "Get info about an SMS job (official clients only).",
+      "params": {
+        "job_id": "Job ID"
+      }
+    },
+    "smsjobs.GetStatus": {
+      "desc": "Get SMS jobs status (official clients only).",
+      "params": {}
+    },
+    "smsjobs.IsEligibleToJoin": {
+      "desc": "Check if we can process SMS jobs (official clients only).",
+      "params": {}
+    },
+    "smsjobs.Join": {
+      "desc": "Enable SMS jobs (official clients only).",
+      "params": {}
+    },
+    "smsjobs.Leave": {
+      "desc": "Disable SMS jobs (official clients only).",
+      "params": {}
+    },
+    "smsjobs.UpdateSettings": {
+      "desc": "Update SMS job settings (official clients only).",
+      "params": {
+        "allow_international": "Allow international numbers?",
+        "flags": "Flags, see TL conditional fields"
+      }
+    },
+    "stats.GetBroadcastStats": {
+      "desc": "Get channel statistics",
+      "params": {
+        "channel": "The channel",
+        "dark": "Whether to enable dark theme for graph colors",
+        "flags": "Flags, see TL conditional fields"
+      }
+    },
+    "stats.GetMegagroupStats": {
+      "desc": "Get supergroup statistics",
+      "params": {
+        "channel": "Supergroup ID",
+        "dark": "Whether to enable dark theme for graph colors",
+        "flags": "Flags, see TL conditional fields"
+      }
+    },
+    "stats.GetMessagePublicForwards": {
+      "desc": "Obtains a list of messages, indicating to which other public channels was a channel message forwarded.\nWill return a list of messages with peer_id equal to the public channel to which this message was forwarded.",
+      "params": {
+        "channel": "Source channel",
+        "limit": "Maximum number of results to return, see pagination",
+        "msg_id": "Source message ID",
+        "offset": "Offset for pagination, empty string on first call, then use the next_offset field of the returned constructor (if present, otherwise no more results are available)."
+      }
+    },
+    "stats.GetMessageStats": {
+      "desc": "Get message statistics",
+      "params": {
+        "channel": "Channel ID",
+        "dark": "Whether to enable dark theme for graph colors",
+        "flags": "Flags, see TL conditional fields",
+        "msg_id": "Message ID"
+      }
+    },
+    "stats.GetStoryPublicForwards": {
+      "desc": "Obtain forwards of a story as a message to public chats and reposts by public channels.",
+      "params": {
+        "id": "Story ID",
+        "limit": "Maximum number of results to return, see pagination",
+        "offset": "Offset for pagination, from stats.PublicForwards.next_offset.",
+        "peer": "Peer where the story was originally posted"
+      }
+    },
+    "stats.GetStoryStats": {
+      "desc": "Get statistics for a certain story.",
+      "params": {
+        "dark": "Whether to enable the dark theme for graph colors",
+        "flags": "Flags, see TL conditional fields",
+        "id": "Story ID",
+        "peer": "The peer that posted the story"
+      }
+    },
+    "stats.LoadAsyncGraph": {
+      "desc": "Load channel statistics graph asynchronously",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "token": "Graph token from statsGraphAsync constructor",
+        "x": "Zoom value, if required"
+      }
+    },
+    "stickers.AddStickerToSet": {
+      "desc": "Add a sticker to a stickerset. The sticker set must have been created by the current user/bot.",
+      "params": {
+        "sticker": "The sticker",
+        "stickerset": "The stickerset"
+      }
+    },
+    "stickers.ChangeSticker": {
+      "desc": "Update the keywords, emojis or mask coordinates of a sticker.",
+      "params": {
+        "emoji": "If set, updates the emoji list associated to the sticker",
+        "flags": "Flags, see TL conditional fields",
+        "keywords": "If set, updates the sticker keywords (separated by commas). Can't be provided for mask stickers.",
+        "mask_coords": "If set, updates the mask coordinates",
+        "sticker": "The sticker"
+      }
+    },
+    "stickers.ChangeStickerPosition": {
+      "desc": "Changes the absolute position of a sticker in the set to which it belongs. The sticker set must have been created by the current user/bot.",
+      "params": {
+        "position": "The new position of the sticker, zero-based",
+        "sticker": "The sticker"
+      }
+    },
+    "stickers.CheckShortName": {
+      "desc": "Check whether the given short name is available",
+      "params": {
+        "short_name": "Short name"
+      }
+    },
+    "stickers.CreateStickerSet": {
+      "desc": "Create a stickerset.",
+      "params": {
+        "emojis": "Whether this is a custom emoji stickerset.",
+        "flags": "Flags, see TL conditional fields",
+        "masks": "Whether this is a mask stickerset",
+        "short_name": "Short name of sticker set, to be used in sticker deep links \u00bb. Can contain only english letters, digits and underscores. Must begin with a letter, can't contain consecutive underscores and, if called by a bot, must end in \"_by_\".  is case insensitive. 1-64 characters.",
+        "software": "Used when importing stickers using the sticker import SDKs, specifies the name of the software that created the stickers",
+        "stickers": "Stickers",
+        "text_color": "Whether the color of TGS custom emojis contained in this set should be changed to the text color when used in messages, the accent color if used as emoji status, white on chat photos, or another appropriate color based on context. For custom emoji stickersets only.",
+        "thumb": "Thumbnail",
+        "title": "Stickerset name, 1-64 chars",
+        "user_id": "Stickerset owner"
+      }
+    },
+    "stickers.DeleteStickerSet": {
+      "desc": "Deletes a stickerset we created.",
+      "params": {
+        "stickerset": "Stickerset to delete"
+      }
+    },
+    "stickers.RemoveStickerFromSet": {
+      "desc": "Remove a sticker from the set where it belongs. The sticker set must have been created by the current user/bot.",
+      "params": {
+        "sticker": "The sticker to remove"
+      }
+    },
+    "stickers.RenameStickerSet": {
+      "desc": "Renames a stickerset.",
+      "params": {
+        "stickerset": "Stickerset to rename",
+        "title": "New stickerset title"
+      }
+    },
+    "stickers.ReplaceSticker": {
+      "desc": "Replace a sticker in a stickerset \u00bb.",
+      "params": {
+        "new_sticker": "New sticker.",
+        "sticker": "Old sticker document."
+      }
+    },
+    "stickers.SetStickerSetThumb": {
+      "desc": "Set stickerset thumbnail",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "stickerset": "Stickerset",
+        "thumb": "Thumbnail (only for normal stickersets, not custom emoji stickersets).",
+        "thumb_document_id": "Only for custom emoji stickersets, ID of a custom emoji present in the set to use as thumbnail; pass 0 to fallback to the first custom emoji of the set."
+      }
+    },
+    "stickers.SuggestShortName": {
+      "desc": "Suggests a short name for a given stickerpack name",
+      "params": {
+        "title": "Sticker pack name"
+      }
+    },
+    "stories.ActivateStealthMode": {
+      "desc": "Activates stories stealth mode, see here \u00bb for more info.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "future": "Whether to hide future story views for the next stories_stealth_future_period seconds \u00bb, as specified by the client configuration.",
+        "past": "Whether to erase views from any stories opened in the past stories_stealth_past_period seconds \u00bb, as specified by the client configuration."
+      }
+    },
+    "stories.CanSendStory": {
+      "desc": "Check whether we can post stories as the specified peer.",
+      "params": {
+        "peer": "The peer from which we wish to post stories."
+      }
+    },
+    "stories.CreateAlbum": {
+      "desc": "Creates a story album.",
+      "params": {
+        "peer": "The owned peer where to create the album.",
+        "stories": "Stories to add to the album.",
+        "title": "Album name."
+      }
+    },
+    "stories.DeleteAlbum": {
+      "desc": "Delete a story album.",
+      "params": {
+        "album_id": "ID of the album to delete.",
+        "peer": "Owned peer where the album is located."
+      }
+    },
+    "stories.DeleteStories": {
+      "desc": "Deletes some posted stories.",
+      "params": {
+        "id": "IDs of stories to delete.",
+        "peer": "Channel/user from where to delete stories."
+      }
+    },
+    "stories.EditStory": {
+      "desc": "Edit an uploaded story",
+      "params": {
+        "caption": "If specified, replaces the story caption.",
+        "entities": "Message entities for styled text in the caption, if allowed by the stories_entities client configuration parameter \u00bb.",
+        "flags": "Flags, see TL conditional fields",
+        "id": "ID of story to edit.",
+        "media": "If specified, replaces the story media.",
+        "media_areas": "Media areas associated to the story, see here \u00bb for more info.",
+        "peer": "Peer where the story was posted.",
+        "privacy_rules": "If specified, alters the privacy settings \u00bb of the story, changing who can or can't view the story."
+      }
+    },
+    "stories.ExportStoryLink": {
+      "desc": "Generate a story deep link for a specific story",
+      "params": {
+        "id": "Story ID",
+        "peer": "Peer where the story was posted"
+      }
+    },
+    "stories.GetAlbumStories": {
+      "desc": "Get stories in a story album \u00bb.",
+      "params": {
+        "album_id": "ID of the album.",
+        "limit": "Maximum number of results to return, see pagination",
+        "offset": "Offset for pagination.",
+        "peer": "Peer where the album is posted."
+      }
+    },
+    "stories.GetAlbums": {
+      "desc": "Get story albums created by a peer.",
+      "params": {
+        "hash": "The hash from a previously returned stories.albums, to avoid returning any results if they haven't changed.",
+        "peer": "The peer."
+      }
+    },
+    "stories.GetAllReadPeerStories": {
+      "desc": "Obtain the latest read story ID for all peers when first logging in, returned as a list of updateReadStories updates, see here \u00bb for more info.",
+      "params": {}
+    },
+    "stories.GetAllStories": {
+      "desc": "Fetch the List of active (or active and hidden) stories, see here \u00bb for more info on watching stories.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "hidden": "If set, fetches the hidden active story list, otherwise fetches the active story list, see here \u00bb for more info on the full flow.",
+        "next": "If next and state are both set, uses the passed state to paginate to the next results; if neither state nor next are set, fetches the initial page; if state is set and next is not set, check for changes in the active/hidden peerset, see here \u00bb for more info on the full flow.",
+        "state": "If next and state are both set, uses the passed state to paginate to the next results; if neither state nor next are set, fetches the initial page; if state is set and next is not set, check for changes in the active/hidden peerset, see here \u00bb for more info on the full flow."
+      }
+    },
+    "stories.GetChatsToSend": {
+      "desc": "Obtain a list of channels where the user can post stories",
+      "params": {}
+    },
+    "stories.GetPeerMaxIDs": {
+      "desc": "Get the IDs of the maximum read stories for a set of peers.",
+      "params": {
+        "id": "Peers"
+      }
+    },
+    "stories.GetPeerStories": {
+      "desc": "Fetch the full active story list of a specific peer.",
+      "params": {
+        "peer": "Peer whose stories should be fetched"
+      }
+    },
+    "stories.GetPinnedStories": {
+      "desc": "Fetch the stories pinned on a peer's profile.",
+      "params": {
+        "limit": "Maximum number of results to return, see pagination",
+        "offset_id": "Offsets for pagination, for more info click here",
+        "peer": "Peer whose pinned stories should be fetched"
+      }
+    },
+    "stories.GetStoriesArchive": {
+      "desc": "Fetch the story archive \u00bb of a peer we control.",
+      "params": {
+        "limit": "Maximum number of results to return, see pagination",
+        "offset_id": "Offsets for pagination, for more info click here",
+        "peer": "Peer whose archived stories should be fetched"
+      }
+    },
+    "stories.GetStoriesByID": {
+      "desc": "Obtain full info about a set of stories by their IDs.",
+      "params": {
+        "id": "Story IDs",
+        "peer": "Peer where the stories were posted"
+      }
+    },
+    "stories.GetStoriesViews": {
+      "desc": "Obtain info about the view count, forward count, reactions and recent viewers of one or more stories.",
+      "params": {
+        "id": "Story IDs",
+        "peer": "Peer whose stories should be fetched"
+      }
+    },
+    "stories.GetStoryReactionsList": {
+      "desc": "Get the reaction and interaction list of a story posted to a channel, along with the sender of each reaction.",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "forwards_first": "If set, returns forwards and reposts first, then reactions, then other views; otherwise returns interactions sorted just by interaction date.",
+        "id": "Story ID",
+        "limit": "Maximum number of results to return, see pagination",
+        "offset": "Offset for pagination (taken from the next_offset field of the returned stories.StoryReactionsList); empty in the first request.",
+        "peer": "Channel",
+        "reaction": "Get only reactions of this type"
+      }
+    },
+    "stories.GetStoryViewsList": {
+      "desc": "Obtain the list of users that have viewed a specific story we posted",
+      "params": {
+        "flags": "Flags, see TL conditional fields",
+        "forwards_first": "If set, returns forwards and reposts first, then reactions, then other views; otherwise returns interactions sorted just by interaction date.",
+        "id": "Story ID",
+        "just_contacts": "Whether to only fetch view reaction/views made by our contacts",
+        "limit": "Maximum number of results to return, see pagination",
+        "offset": "Offset for pagination, obtained from stories.storyViewsList.next_offset",
+        "peer": "Peer where the story was posted",
+        "q": "Search for specific peers",
+        "reactions_first": "Whether to return storyView info about users that reacted to the story (i.e. if set, the server will first sort results by view date as usual, and then also additionally sort the list by putting storyViews with an associated reaction first in the list). Ignored if forwards_first is set."
+      }
+    },
+    "stories.IncrementStoryViews": {
+      "desc": "Increment the view counter of one or more stories.",
+      "params": {
+        "id": "IDs of the stories (maximum 200 at a time).",
+        "peer": "Peer where the stories were posted."
+      }
+    },
+    "stories.ReadStories": {
+      "desc": "Mark all stories up to a certain ID as read, for a given peer; will emit an updateReadStories update to all logged-in sessions.",
+      "params": {
+        "max_id": "Mark all stories up to and including this ID as read",
+        "peer": "The peer whose stories should be marked as read."
+      }
+    },
+    "stories.ReorderAlbums": {
+      "desc": "Reorder story albums on a profile \u00bb.",
+      "params": {
+        "order": "New order of the albums.",
+        "peer": "Peer where the albums are located."
+      }
+    },
+    "stories.Report": {
+      "desc": "Report a story.",
+      "params": {
+        "id": "IDs of the stories to report.",
+        "message": "Comment for report moderation",
+        "option": "Menu option, intially empty",
+        "peer": "The peer that uploaded the story."
+      }
+    },
+    "stories.SearchPosts": {
+      "desc": "Globally search for stories using a hashtag or a location media area, see here \u00bb for more info on the full flow.",
+      "params": {
+        "area": "A mediaAreaGeoPoint or a mediaAreaVenue.  Note mediaAreaGeoPoint areas may be searched only if they have an associated address.",
+        "flags": "Flags, see TL conditional fields",
+        "hashtag": "Hashtag (without the #)",
+        "limit": "Maximum number of results to return, see pagination",
+        "offset": "Offset for pagination: initially an empty string, then the next_offset from the previously returned stories.foundStories.",
+        "peer": "If set, returns only stories posted by this peer."
+      }
+    },
+    "stories.SendReaction": {
+      "desc": "React to a story.",
+      "params": {
+        "add_to_recent": "Whether to add this reaction to the recent reactions list \u00bb.",
+        "flags": "Flags, see TL conditional fields",
+        "peer": "The peer that sent the story",
+        "reaction": "Reaction",
+        "story_id": "ID of the story to react to"
+      }
+    },
+    "stories.SendStory": {
+      "desc": "Uploads a Telegram Story.",
+      "params": {
+        "albums": "If set, adds the story to the specified albums.",
+        "caption": "Story caption.",
+        "entities": "Message entities for styled text, if allowed by the stories_entities client configuration parameter \u00bb.",
+        "flags": "Flags, see TL conditional fields",
+        "fwd_from_id": "If set, indicates that this story is a repost of story with ID fwd_from_story posted by the peer in fwd_from_id.",
+        "fwd_from_story": "If set, indicates that this story is a repost of story with ID fwd_from_story posted by the peer in fwd_from_id.",
+        "fwd_modified": "Set this flag when reposting stories with fwd_from_id+fwd_from_id, if the media was modified before reposting.",
+        "media": "The story media.",
+        "media_areas": "Media areas associated to the story, see here \u00bb for more info.",
+        "noforwards": "If set, disables forwards, screenshots, and downloads.",
+        "peer": "The peer to send the story as.",
+        "period": "Period after which the story is moved to archive (and to the profile if pinned is set), in seconds; must be one of 6 * 3600, 12 * 3600, 86400, or 2 * 86400 for Telegram Premium users, and 86400 otherwise.",
+        "pinned": "Whether to add the story to the profile automatically upon expiration. If not set, the story will only be added to the archive, see here \u00bb for more info.",
+        "privacy_rules": "Privacy rules for the story, indicating who can or can't view the story.",
+        "random_id": "Unique client message ID required to prevent message resending."
+      }
+    },
+    "stories.ToggleAllStoriesHidden": {
+      "desc": "Hide the active stories of a specific peer, preventing them from being displayed on the action bar on the homescreen.",
+      "params": {
+        "hidden": "Whether to hide or unhide all active stories of the peer"
+      }
+    },
+    "stories.TogglePeerStoriesHidden": {
+      "desc": "Hide the active stories of a user, preventing them from being displayed on the action bar on the homescreen, see here \u00bb for more info.",
+      "params": {
+        "hidden": "Whether to hide or unhide stories.",
+        "peer": "Peer whose stories should be (un)hidden."
+      }
+    },
+    "stories.TogglePinned": {
+      "desc": "Pin or unpin one or more stories",
+      "params": {
+        "id": "IDs of stories to pin or unpin",
+        "peer": "Peer where to pin or unpin stories",
+        "pinned": "Whether to pin or unpin the stories"
+      }
+    },
+    "stories.TogglePinnedToTop": {
+      "desc": "Pin some stories to the top of the profile, see here \u00bb for more info.",
+      "params": {
+        "id": "IDs of the stories to pin (max stories_pinned_to_top_count_max).",
+        "peer": "Peer where to pin stories."
+      }
+    },
+    "stories.UpdateAlbum": {
+      "desc": "Rename a story albums \u00bb, or add, delete or reorder stories in it.",
+      "params": {
+        "add_stories": "If set, adds the specified stories to the album.",
+        "album_id": "Album ID.",
+        "delete_stories": "If set, deletes the specified stories from the album.",
+        "flags": "Flags, see TL conditional fields",
+        "order": "If set, reorders the stories in the album by their IDs.",
+        "peer": "Peer where the album is posted.",
+        "title": "New album title."
+      }
+    },
+    "updates.GetChannelDifference": {
+      "desc": "Returns the difference between the current state of updates of a certain channel and transmitted.",
+      "params": {
+        "channel": "The channel",
+        "filter": "Messsage filter",
+        "flags": "Flags, see TL conditional fields",
+        "force": "Set to true to skip some possibly unneeded updates and reduce server-side load",
+        "limit": "How many updates to fetch, max 100000Ordinary (non-bot) users are supposed to pass 10-100",
+        "pts": "Persistent timestamp (see updates)"
+      }
+    },
+    "updates.GetDifference": {
+      "desc": "Get new updates.",
+      "params": {
+        "date": "date, see updates.",
+        "flags": "Flags, see TL conditional fields",
+        "pts": "PTS, see updates.",
+        "pts_limit": "PTS limit",
+        "pts_total_limit": "For fast updating: if provided and pts + pts_total_limit < remote pts, updates.differenceTooLong will be returned.Simply tells the server to not return the difference if it is bigger than pts_total_limitIf the remote pts is too big (> ~4000000), this field will default to 1000000",
+        "qts": "QTS, see updates.",
+        "qts_limit": "QTS limit"
+      }
+    },
+    "updates.GetState": {
+      "desc": "Returns a current state of updates.",
+      "params": {}
+    },
+    "upload.GetCdnFile": {
+      "desc": "Download a CDN file.",
+      "params": {
+        "file_token": "File token",
+        "limit": "Length of chunk to download",
+        "offset": "Offset of chunk to download"
+      }
+    },
+    "upload.GetCdnFileHashes": {
+      "desc": "Get SHA256 hashes for verifying downloaded CDN files",
+      "params": {
+        "file_token": "File",
+        "offset": "Offset from which to start getting hashes"
+      }
+    },
+    "upload.GetFile": {
+      "desc": "Returns content of a whole file or its part.",
+      "params": {
+        "cdn_supported": "Whether the current client supports CDN downloads",
+        "flags": "Flags, see TL conditional fields",
+        "limit": "Number of bytes to be returned",
+        "location": "File location",
+        "offset": "Number of bytes to be skipped",
+        "precise": "Disable some checks on limit and offset values, useful for example to stream videos by keyframes"
+      }
+    },
+    "upload.GetFileHashes": {
+      "desc": "Get SHA256 hashes for verifying downloaded files",
+      "params": {
+        "location": "File",
+        "offset": "Offset from which to get file hashes"
+      }
+    },
+    "upload.GetWebFile": {
+      "desc": "Returns content of a web file, by proxying the request through telegram, see the webfile docs for more info.",
+      "params": {
+        "limit": "Number of bytes to be returned",
+        "location": "The file to download",
+        "offset": "Number of bytes to be skipped"
+      }
+    },
+    "upload.ReuploadCdnFile": {
+      "desc": "Request a reupload of a certain file to a CDN DC.",
+      "params": {
+        "file_token": "File token",
+        "request_token": "Request token"
+      }
+    },
+    "upload.SaveBigFilePart": {
+      "desc": "Saves a part of a large file (over 10 MB in size) to be later passed to one of the methods.",
+      "params": {
+        "bytes": "Binary data, part contents",
+        "file_id": "Random file id, created by the client",
+        "file_part": "Part sequence number",
+        "file_total_parts": "Total number of parts"
+      }
+    },
+    "upload.SaveFilePart": {
+      "desc": "Saves a part of file for further sending to one of the methods.",
+      "params": {
+        "bytes": "Binary data, content of a part",
+        "file_id": "Random file identifier created by the client",
+        "file_part": "Numerical order of a part"
+      }
+    },
+    "users.GetFullUser": {
+      "desc": "Returns extended user info by ID.",
+      "params": {
+        "id": "User ID"
+      }
+    },
+    "users.GetRequirementsToContact": {
+      "desc": "Check whether we can write to the specified users, used to implement bulk checks for Premium-only messages \u00bb and paid messages \u00bb.",
+      "params": {
+        "id": "Users to check."
+      }
+    },
+    "users.GetSavedMusic": {
+      "desc": "Get songs pinned to the user's profile, see here \u00bb for more info.",
+      "params": {
+        "hash": "Hash \u00bb of the IDs of previously added songs, to avoid returning any result if there was no change.",
+        "id": "The ID of the user.",
+        "limit": "Maximum number of results to return, see pagination",
+        "offset": "Offset for pagination."
+      }
+    },
+    "users.GetSavedMusicByID": {
+      "desc": "Check if the passed songs are still pinned to the user's profile, or refresh the file references of songs pinned on a user's profile see here \u00bb for more info.",
+      "params": {
+        "documents": "The songs (here, file_reference can be empty to refresh file references).",
+        "id": "The ID of the user."
+      }
+    },
+    "users.GetUsers": {
+      "desc": "Returns basic user info according to their identifiers.",
+      "params": {
+        "id": "List of user identifiers"
+      }
+    },
+    "users.SetSecureValueErrors": {
+      "desc": "Notify the user that the sent passport data contains some errors The user will not be able to re-submit their Passport data to you until the errors are fixed (the contents of the field for which you returned the error must change).",
+      "params": {
+        "errors": "Errors",
+        "id": "The user"
+      }
+    },
+    "users.SuggestBirthday": {
+      "desc": "",
+      "params": {}
+    }
+  },
+  "type": {
+    "AccountDaysTTL": {
+      "desc": "Time-to-live of current account"
+    },
+    "AttachMenuBot": {
+      "desc": "Represents a bot mini app that can be launched from the attachment menu \u00bb"
+    },
+    "AttachMenuBotIcon": {
+      "desc": "Represents an attachment menu icon for bot mini apps \u00bb"
+    },
+    "AttachMenuBotIconColor": {
+      "desc": "Represents an attachment menu icon color for bot mini apps \u00bb"
+    },
+    "AttachMenuBots": {
+      "desc": "Represents a list of bot mini apps that can be launched from the attachment menu \u00bb"
+    },
+    "AttachMenuBotsBot": {
+      "desc": "Represents a bot mini app that can be launched from the attachment menu \u00bb"
+    },
+    "AttachMenuPeerType": {
+      "desc": "Indicates a supported peer type for a bot mini app attachment menu"
+    },
+    "Authorization": {
+      "desc": "Represents a logged-in session"
+    },
+    "AutoDownloadSettings": {
+      "desc": "Media autodownload settings"
+    },
+    "AutoSaveException": {
+      "desc": "Peer-specific autosave settings"
+    },
+    "AutoSaveSettings": {
+      "desc": "Media autosave settings"
+    },
+    "AvailableEffect": {
+      "desc": "Describes a message effect \u00bb."
+    },
+    "AvailableReaction": {
+      "desc": "Animations associated with a message reaction"
+    },
+    "BankCardOpenUrl": {
+      "desc": "Credit card info URL provided by the bank"
+    },
+    "BaseTheme": {
+      "desc": "Basic theme settings"
+    },
+    "Birthday": {
+      "desc": "Birthday information for a user."
+    },
+    "Bool": {
+      "desc": "Boolean type."
+    },
+    "Boost": {
+      "desc": "Info about one or more boosts applied by a specific user."
+    },
+    "BotApp": {
+      "desc": "Contains information about a direct link Mini App."
+    },
+    "BotAppSettings": {
+      "desc": "Mini app \u00bb settings"
+    },
+    "BotBusinessConnection": {
+      "desc": "Contains info about a bot business connection."
+    },
+    "BotCommand": {
+      "desc": "Describes a bot command that can be used in a chat"
+    },
+    "BotCommandScope": {
+      "desc": "Represents a scope where the bot commands, specified using bots.setBotCommands will be valid."
+    },
+    "BotInfo": {
+      "desc": "Info about bots (available bot commands, etc)"
+    },
+    "BotInlineMessage": {
+      "desc": "Inline message"
+    },
+    "BotInlineResult": {
+      "desc": "Results of an inline query"
+    },
+    "BotMenuButton": {
+      "desc": "Indicates the action to execute when pressing the in-UI menu button for bots"
+    },
+    "BotPreviewMedia": {
+      "desc": "Represents a Main Mini App preview media, see here \u00bb for more info."
+    },
+    "BotVerification": {
+      "desc": "Describes a bot verification icon \u00bb."
+    },
+    "BotVerifierSettings": {
+      "desc": "Info about the current verifier bot \u00bb."
+    },
+    "BusinessAwayMessage": {
+      "desc": "Describes a Telegram Business away message, automatically sent to users writing to us when we're offline, during closing hours, while we're on vacation, or in some other custom time period when we cannot immediately answer to the user."
+    },
+    "BusinessAwayMessageSchedule": {
+      "desc": "Specifies when should the Telegram Business away messages be sent."
+    },
+    "BusinessBotRecipients": {
+      "desc": "Specifies the private chats that a connected business bot \u00bb may receive messages and interact with."
+    },
+    "BusinessBotRights": {
+      "desc": "Business bot rights."
+    },
+    "BusinessChatLink": {
+      "desc": "Contains info about a business chat deep link \u00bb created by the current account."
+    },
+    "BusinessGreetingMessage": {
+      "desc": "Describes a Telegram Business greeting, automatically sent to new users writing to us in private for the first time, or after a certain inactivity period."
+    },
+    "BusinessIntro": {
+      "desc": "Telegram Business introduction \u00bb."
+    },
+    "BusinessLocation": {
+      "desc": "Represents the location of a Telegram Business \u00bb."
+    },
+    "BusinessRecipients": {
+      "desc": "Specifies the chats that can receive Telegram Business away \u00bb and greeting \u00bb messages."
+    },
+    "BusinessWeeklyOpen": {
+      "desc": "A time interval, indicating the opening hours of a Telegram Business."
+    },
+    "BusinessWorkHours": {
+      "desc": "Specifies a set of Telegram Business opening hours."
+    },
+    "CdnConfig": {
+      "desc": "Configuration for CDN file downloads."
+    },
+    "CdnPublicKey": {
+      "desc": "Public key to use only during handshakes to CDN DCs."
+    },
+    "ChannelAdminLogEvent": {
+      "desc": "An event in a channel admin log"
+    },
+    "ChannelAdminLogEventAction": {
+      "desc": "Channel admin log event"
+    },
+    "ChannelAdminLogEventsFilter": {
+      "desc": "Filter for fetching events in the channel admin log"
+    },
+    "ChannelLocation": {
+      "desc": "Geographical location of supergroup (geogroups)"
+    },
+    "ChannelMessagesFilter": {
+      "desc": "Filter for fetching only certain types of channel messages"
+    },
+    "ChannelParticipant": {
+      "desc": "Channel participant"
+    },
+    "ChannelParticipantsFilter": {
+      "desc": "Filter for fetching channel participants"
+    },
+    "Chat": {
+      "desc": "Object defines a group."
+    },
+    "ChatAdminRights": {
+      "desc": "Represents the rights of an admin in a channel/supergroup."
+    },
+    "ChatAdminWithInvites": {
+      "desc": "Info about chat invites generated by admins."
+    },
+    "ChatBannedRights": {
+      "desc": "Represents the rights of a normal user in a supergroup/channel/chat."
+    },
+    "ChatFull": {
+      "desc": "Full info about a channel, supergroup, gigagroup or basic group."
+    },
+    "ChatInvite": {
+      "desc": "Chat invite"
+    },
+    "ChatInviteImporter": {
+      "desc": "When and which user joined the chat using a chat invite"
+    },
+    "ChatOnlines": {
+      "desc": "Number of online users in a chat"
+    },
+    "ChatParticipant": {
+      "desc": "Details of a group member."
+    },
+    "ChatParticipants": {
+      "desc": "Object contains info on group members."
+    },
+    "ChatPhoto": {
+      "desc": "Object defines a group profile photo."
+    },
+    "ChatReactions": {
+      "desc": "Available chat reactions"
+    },
+    "ChatTheme": {
+      "desc": "A chat theme"
+    },
+    "ChatThemes": {
+      "desc": ""
+    },
+    "CodeSettings": {
+      "desc": "Settings for the code type to send"
+    },
+    "Config": {
+      "desc": "Object contains info on API configuring parameters."
+    },
+    "ConnectedBot": {
+      "desc": "Contains info about a connected business bot \u00bb."
+    },
+    "ConnectedBotStarRef": {
+      "desc": "Info about an active affiliate program we have with a Mini App"
+    },
+    "Contact": {
+      "desc": "A contact of the current user."
+    },
+    "ContactBirthday": {
+      "desc": "Birthday information of a contact."
+    },
+    "ContactStatus": {
+      "desc": "Contact status: online / offline."
+    },
+    "DataJSON": {
+      "desc": "Represent a JSON-encoded object"
+    },
+    "DcOption": {
+      "desc": "Information for connection to data center."
+    },
+    "DefaultHistoryTTL": {
+      "desc": "Contains info about the default value of the Time-To-Live setting, applied to all new chats."
+    },
+    "Dialog": {
+      "desc": "Chat info."
+    },
+    "DialogFilter": {
+      "desc": "Dialog filter (folder \u00bb)"
+    },
+    "DialogFilterSuggested": {
+      "desc": "Suggested dialog filters (folder \u00bb)"
+    },
+    "DialogPeer": {
+      "desc": "Peer, or all peers in a folder"
+    },
+    "DisallowedGiftsSettings": {
+      "desc": "Disallow the reception of specific gift types."
+    },
+    "Document": {
+      "desc": "A document."
+    },
+    "DocumentAttribute": {
+      "desc": "Various possible attributes of a document (used to define if it's a sticker, a GIF, a video, a mask sticker, an image, an audio, and so on)"
+    },
+    "DraftMessage": {
+      "desc": "Represents a message draft."
+    },
+    "EmailVerification": {
+      "desc": "Email verification code or token"
+    },
+    "EmailVerifyPurpose": {
+      "desc": "Email verification purpose"
+    },
+    "EmojiGroup": {
+      "desc": "Represents an emoji category."
+    },
+    "EmojiKeyword": {
+      "desc": "Emoji keyword"
+    },
+    "EmojiKeywordsDifference": {
+      "desc": "New emoji keywords"
+    },
+    "EmojiLanguage": {
+      "desc": "Emoji language"
+    },
+    "EmojiList": {
+      "desc": "Represents a list of custom emojis."
+    },
+    "EmojiStatus": {
+      "desc": "Emoji status"
+    },
+    "EmojiURL": {
+      "desc": "Emoji URL"
+    },
+    "EncryptedChat": {
+      "desc": "Object contains info on an encrypted chat."
+    },
+    "EncryptedFile": {
+      "desc": "Seta an encrypted file."
+    },
+    "EncryptedMessage": {
+      "desc": "Object contains encrypted message."
+    },
+    "ExportedChatInvite": {
+      "desc": "Exported chat invite"
+    },
+    "ExportedChatlistInvite": {
+      "desc": "An exported chat folder deep link \u00bb."
+    },
+    "ExportedContactToken": {
+      "desc": "Describes a temporary profile link."
+    },
+    "ExportedMessageLink": {
+      "desc": "HTTP link and embed info of channel message"
+    },
+    "ExportedStoryLink": {
+      "desc": "Represents a story deep link"
+    },
+    "FactCheck": {
+      "desc": "Represents a fact-check \u00bb created by an independent fact-checker."
+    },
+    "FileHash": {
+      "desc": "Hash of an uploaded file, to be checked for validity after download"
+    },
+    "Folder": {
+      "desc": "A folder"
+    },
+    "FolderPeer": {
+      "desc": "Peer associated to folder"
+    },
+    "ForumTopic": {
+      "desc": "Contains information about a forum topic"
+    },
+    "FoundStory": {
+      "desc": "A story found using global story search \u00bb."
+    },
+    "Game": {
+      "desc": "Indicates an already sent game"
+    },
+    "GeoPoint": {
+      "desc": "Object defines a GeoPoint."
+    },
+    "GeoPointAddress": {
+      "desc": "Address optionally associated to a geoPoint."
+    },
+    "GlobalPrivacySettings": {
+      "desc": "Global privacy settings"
+    },
+    "GroupCall": {
+      "desc": "A group call"
+    },
+    "GroupCallParticipant": {
+      "desc": "Info about a group call participant"
+    },
+    "GroupCallParticipantVideo": {
+      "desc": "Info about a video stream"
+    },
+    "GroupCallParticipantVideoSourceGroup": {
+      "desc": "Describes a group of video synchronization source identifiers"
+    },
+    "GroupCallStreamChannel": {
+      "desc": "Info about an RTMP stream in a group call or livestream"
+    },
+    "HighScore": {
+      "desc": "Game high score"
+    },
+    "ImportedContact": {
+      "desc": "Object contains info on a successfully imported contact."
+    },
+    "InlineBotSwitchPM": {
+      "desc": "The bot requested the user to message them in private"
+    },
+    "InlineBotWebView": {
+      "desc": "Specifies an inline mode mini app button, shown on top of the inline query results list."
+    },
+    "InlineQueryPeerType": {
+      "desc": "Inline query peer type."
+    },
+    "InputAppEvent": {
+      "desc": "Object contains info about an event that occurred in the application."
+    },
+    "InputBotApp": {
+      "desc": "Used to fetch information about a direct link Mini App"
+    },
+    "InputBotInlineMessage": {
+      "desc": "Represents a sent inline message from the perspective of a bot"
+    },
+    "InputBotInlineMessageID": {
+      "desc": "Represents a sent inline message from the perspective of a bot"
+    },
+    "InputBotInlineResult": {
+      "desc": "Inline bot result"
+    },
+    "InputBusinessAwayMessage": {
+      "desc": "Describes a Telegram Business away message, automatically sent to users writing to us when we're offline, during closing hours, while we're on vacation, or in some other custom time period when we cannot immediately answer to the user."
+    },
+    "InputBusinessBotRecipients": {
+      "desc": "Specifies the private chats that a connected business bot \u00bb may interact with."
+    },
+    "InputBusinessChatLink": {
+      "desc": "Contains info about a business chat deep link \u00bb to be created by the current account."
+    },
+    "InputBusinessGreetingMessage": {
+      "desc": "Describes a Telegram Business greeting, automatically sent to new users writing to us in private for the first time, or after a certain inactivity period."
+    },
+    "InputBusinessIntro": {
+      "desc": "Telegram Business introduction \u00bb."
+    },
+    "InputBusinessRecipients": {
+      "desc": "Specifies the chats that can receive Telegram Business away \u00bb and greeting \u00bb messages."
+    },
+    "InputChannel": {
+      "desc": "Represents a channel"
+    },
+    "InputChatPhoto": {
+      "desc": "Defines a new group profile photo."
+    },
+    "InputChatTheme": {
+      "desc": "Specifies a chat theme \u00bb."
+    },
+    "InputChatlist": {
+      "desc": "Represents a folder"
+    },
+    "InputCheckPasswordSRP": {
+      "desc": "Constructors for checking the validity of a 2FA SRP password."
+    },
+    "InputClientProxy": {
+      "desc": "Info about an MTProxy used to connect."
+    },
+    "InputCollectible": {
+      "desc": "Represents a Fragment collectible \u00bb."
+    },
+    "InputContact": {
+      "desc": "Object defines a contact from the user's phone book."
+    },
+    "InputDialogPeer": {
+      "desc": "Peer, or all peers in a certain folder"
+    },
+    "InputDocument": {
+      "desc": "Defines a document for subsequent interaction."
+    },
+    "InputEncryptedChat": {
+      "desc": "Object sets an encrypted chat ID."
+    },
+    "InputEncryptedFile": {
+      "desc": "Object sets encrypted file for attachment"
+    },
+    "InputFile": {
+      "desc": "Defines a file uploaded by the client."
+    },
+    "InputFileLocation": {
+      "desc": "Defines the location of a file for download."
+    },
+    "InputFolderPeer": {
+      "desc": "Peer in a folder"
+    },
+    "InputGame": {
+      "desc": "A game to send"
+    },
+    "InputGeoPoint": {
+      "desc": "Defines a GeoPoint."
+    },
+    "InputGroupCall": {
+      "desc": "Indicates a group call"
+    },
+    "InputInvoice": {
+      "desc": "An invoice"
+    },
+    "InputMedia": {
+      "desc": "Defines media content of a message."
+    },
+    "InputMessage": {
+      "desc": "A message"
+    },
+    "InputNotifyPeer": {
+      "desc": "Object defines the set of users and/or groups that generate notifications."
+    },
+    "InputPaymentCredentials": {
+      "desc": "Payment credentials"
+    },
+    "InputPeer": {
+      "desc": "Peer"
+    },
+    "InputPeerNotifySettings": {
+      "desc": "Notifications settings."
+    },
+    "InputPhoneCall": {
+      "desc": "Phone call"
+    },
+    "InputPhoto": {
+      "desc": "Defines a photo for further interaction."
+    },
+    "InputPrivacyKey": {
+      "desc": "Privacy keys together with privacy rules \u00bb indicate what can or can't someone do and are specified by a PrivacyKey constructor, and its input counterpart InputPrivacyKey."
+    },
+    "InputPrivacyRule": {
+      "desc": "Privacy rules indicate who can or can't do something and are specified by a PrivacyRule, and its input counterpart InputPrivacyRule."
+    },
+    "InputQuickReplyShortcut": {
+      "desc": "Represents a quick reply shortcut \u00bb."
+    },
+    "InputReplyTo": {
+      "desc": "Contains info about a message or story to reply to."
+    },
+    "InputSavedStarGift": {
+      "desc": "Points to a gift \u00bb."
+    },
+    "InputSecureFile": {
+      "desc": "Secure passport file, for more info see the passport docs \u00bb"
+    },
+    "InputSecureValue": {
+      "desc": "Secure value, for more info see the passport docs \u00bb"
+    },
+    "InputSingleMedia": {
+      "desc": "A single media in an album or grouped media sent with messages.sendMultiMedia."
+    },
+    "InputStarsTransaction": {
+      "desc": "Used to fetch info about a Telegram Star transaction \u00bb."
+    },
+    "InputStickerSet": {
+      "desc": "Represents a stickerset"
+    },
+    "InputStickerSetItem": {
+      "desc": "Sticker"
+    },
+    "InputStickeredMedia": {
+      "desc": "Represents a media with attached stickers"
+    },
+    "InputStorePaymentPurpose": {
+      "desc": "Info about a Telegram Premium purchase"
+    },
+    "InputTheme": {
+      "desc": "Cloud theme"
+    },
+    "InputThemeSettings": {
+      "desc": "Theme settings"
+    },
+    "InputUser": {
+      "desc": "Defines a user for subsequent interaction."
+    },
+    "InputWallPaper": {
+      "desc": "Wallpaper"
+    },
+    "InputWebDocument": {
+      "desc": "Specifies a document that will have to be downloaded from the URL by the telegram servers"
+    },
+    "InputWebFileLocation": {
+      "desc": "Location of remote file"
+    },
+    "Invoice": {
+      "desc": "Invoice"
+    },
+    "JSONObjectValue": {
+      "desc": "JSON key: value pair"
+    },
+    "JSONValue": {
+      "desc": "JSON value"
+    },
+    "KeyboardButton": {
+      "desc": "Bot or inline keyboard buttons"
+    },
+    "KeyboardButtonRow": {
+      "desc": "Bot or inline keyboard rows"
+    },
+    "LabeledPrice": {
+      "desc": "Labeled pricetag"
+    },
+    "LangPackDifference": {
+      "desc": "Language pack changes"
+    },
+    "LangPackLanguage": {
+      "desc": "Language pack language"
+    },
+    "LangPackString": {
+      "desc": "Language pack string"
+    },
+    "MaskCoords": {
+      "desc": "Mask coordinates (if this is a mask sticker, attached to a photo)"
+    },
+    "MediaArea": {
+      "desc": "Represents a story media area \u00bb"
+    },
+    "MediaAreaCoordinates": {
+      "desc": "Coordinates and size of a clickable rectangular area on top of a story."
+    },
+    "Message": {
+      "desc": "Object describing a message."
+    },
+    "MessageAction": {
+      "desc": "Object describing actions connected to a service message."
+    },
+    "MessageEntity": {
+      "desc": "Message entities, representing styled text in a message"
+    },
+    "MessageExtendedMedia": {
+      "desc": "Paid media, see here \u00bb for more info."
+    },
+    "MessageFwdHeader": {
+      "desc": "Info about a forwarded message"
+    },
+    "MessageMedia": {
+      "desc": "Media"
+    },
+    "MessagePeerReaction": {
+      "desc": "How a certain peer reacted to the message"
+    },
+    "MessagePeerVote": {
+      "desc": "How a user voted in a poll"
+    },
+    "MessageRange": {
+      "desc": "Indicates a range of chat messages"
+    },
+    "MessageReactions": {
+      "desc": "Message reactions \u00bb"
+    },
+    "MessageReactor": {
+      "desc": "Info about a user in the paid Star reactions leaderboard for a message."
+    },
+    "MessageReplies": {
+      "desc": "Info about post comments (for channels) or message replies (for groups)"
+    },
+    "MessageReplyHeader": {
+      "desc": "Reply information"
+    },
+    "MessageReportOption": {
+      "desc": "Report menu option"
+    },
+    "MessageViews": {
+      "desc": "View, forward counter + info about replies of a specific message"
+    },
+    "MessagesFilter": {
+      "desc": "Object describes message filter."
+    },
+    "MissingInvitee": {
+      "desc": "Info about why a specific user could not be invited \u00bb."
+    },
+    "MyBoost": {
+      "desc": "Contains information about a single boost slot \u00bb."
+    },
+    "NearestDc": {
+      "desc": "Object contains info on nearest data center."
+    },
+    "NotificationSound": {
+      "desc": "Represents a notification sound"
+    },
+    "NotifyPeer": {
+      "desc": "Object defines the set of users and/or groups that generate notifications."
+    },
+    "OutboxReadDate": {
+      "desc": "Exact read date of a private message we sent to another user."
+    },
+    "Page": {
+      "desc": "Instant view page"
+    },
+    "PageBlock": {
+      "desc": "Represents an instant view page element"
+    },
+    "PageCaption": {
+      "desc": "Page caption"
+    },
+    "PageListItem": {
+      "desc": "Item in block list"
+    },
+    "PageListOrderedItem": {
+      "desc": "Represents an instant view ordered list"
+    },
+    "PageRelatedArticle": {
+      "desc": "Related articles"
+    },
+    "PageTableCell": {
+      "desc": "Represents a table in an instant view table"
+    },
+    "PageTableRow": {
+      "desc": "Table row"
+    },
+    "PaidReactionPrivacy": {
+      "desc": "Paid reaction privacy settings \u00bb"
+    },
+    "PasswordKdfAlgo": {
+      "desc": "Key derivation function to use when generating the password hash for SRP two-factor authorization"
+    },
+    "PaymentCharge": {
+      "desc": "Charged payment"
+    },
+    "PaymentFormMethod": {
+      "desc": "Represents a payment method"
+    },
+    "PaymentRequestedInfo": {
+      "desc": "Requested payment info"
+    },
+    "PaymentSavedCredentials": {
+      "desc": "Saved payment credentials"
+    },
+    "Peer": {
+      "desc": "Identifier of a private chat, basic group, group or channel (see here \u00bb for more info)."
+    },
+    "PeerBlocked": {
+      "desc": "Info about a blocked user"
+    },
+    "PeerColor": {
+      "desc": "Represents a color palette \u00bb."
+    },
+    "PeerLocated": {
+      "desc": "Geolocated peer"
+    },
+    "PeerNotifySettings": {
+      "desc": "Notification settings."
+    },
+    "PeerSettings": {
+      "desc": "List of actions that are possible when interacting with this user, to be shown as suggested actions in the chat bar"
+    },
+    "PeerStories": {
+      "desc": "Stories associated to a peer"
+    },
+    "PendingSuggestion": {
+      "desc": "Represents a custom pending suggestion \u00bb."
+    },
+    "PhoneCall": {
+      "desc": "Phone call"
+    },
+    "PhoneCallDiscardReason": {
+      "desc": "Why was the phone call discarded?"
+    },
+    "PhoneCallProtocol": {
+      "desc": "Phone call protocol"
+    },
+    "PhoneConnection": {
+      "desc": "Phone call connection"
+    },
+    "Photo": {
+      "desc": "Object describes a photo."
+    },
+    "PhotoSize": {
+      "desc": "Location of a certain size of a picture"
+    },
+    "Poll": {
+      "desc": "Indicates a poll message"
+    },
+    "PollAnswer": {
+      "desc": "Indicates a possible answer to a poll."
+    },
+    "PollAnswerVoters": {
+      "desc": "How users voted on a certain poll answer"
+    },
+    "PollResults": {
+      "desc": "Results of poll"
+    },
+    "PopularContact": {
+      "desc": "Popular contact"
+    },
+    "PostAddress": {
+      "desc": "Shipping address"
+    },
+    "PostInteractionCounters": {
+      "desc": "Interaction counters"
+    },
+    "PremiumGiftCodeOption": {
+      "desc": "Giveaway option."
+    },
+    "PremiumGiftOption": {
+      "desc": "Telegram Premium gift option"
+    },
+    "PremiumSubscriptionOption": {
+      "desc": "Telegram Premium subscription option"
+    },
+    "PrepaidGiveaway": {
+      "desc": "Contains info about a prepaid giveaway \u00bb."
+    },
+    "PrivacyKey": {
+      "desc": "Privacy keys together with privacy rules \u00bb indicate what can or can't someone do and are specified by a PrivacyKey constructor, and its input counterpart InputPrivacyKey."
+    },
+    "PrivacyRule": {
+      "desc": "Privacy rules together with privacy keys indicate what can or can't someone do and are specified by a PrivacyRule constructor, and its input counterpart InputPrivacyRule."
+    },
+    "ProfileTab": {
+      "desc": "Represents a tab of a profile page \u00bb."
+    },
+    "PublicForward": {
+      "desc": "Contains info about the forwards of a story as a message to public chats and reposts by public channels."
+    },
+    "QuickReply": {
+      "desc": "A quick reply shortcut."
+    },
+    "Reaction": {
+      "desc": "Message reaction"
+    },
+    "ReactionCount": {
+      "desc": "Number of users that reacted with a certain emoji"
+    },
+    "ReactionNotificationsFrom": {
+      "desc": "Reaction notification settings"
+    },
+    "ReactionsNotifySettings": {
+      "desc": "Reaction notification settings, see here \u00bb for more info."
+    },
+    "ReadParticipantDate": {
+      "desc": "Contains info about when a certain participant has read a message"
+    },
+    "ReceivedNotifyMessage": {
+      "desc": "Confirmation of message receipt"
+    },
+    "RecentMeUrl": {
+      "desc": "Recent t.me urls"
+    },
+    "ReplyMarkup": {
+      "desc": "Reply markup for bot and inline keyboards"
+    },
+    "ReportReason": {
+      "desc": "Report reason"
+    },
+    "ReportResult": {
+      "desc": "Represents a report menu or result"
+    },
+    "RequestPeerType": {
+      "desc": "Filtering criteria to use for the peer selection list shown to the user."
+    },
+    "RequestedPeer": {
+      "desc": "Info about a peer, shared by a user with the currently logged in bot using messages.sendBotRequestedPeer."
+    },
+    "RequirementToContact": {
+      "desc": "Specifies a requirement that must be satisfied in order to contact a user."
+    },
+    "RestrictionReason": {
+      "desc": "Restriction reason"
+    },
+    "RichText": {
+      "desc": "Rich text"
+    },
+    "SavedContact": {
+      "desc": "Saved contact"
+    },
+    "SavedDialog": {
+      "desc": "Represents a saved message dialog \u00bb."
+    },
+    "SavedReactionTag": {
+      "desc": "Info about a saved message reaction tag \u00bb."
+    },
+    "SavedStarGift": {
+      "desc": "Represents a gift owned by a peer."
+    },
+    "SearchPostsFlood": {
+      "desc": "Indicates if the specified global post search \u00bb requires payment."
+    },
+    "SearchResultsCalendarPeriod": {
+      "desc": "Information about found messages sent on a specific day, used to split the messages in messages.searchResultsCalendar constructors by days."
+    },
+    "SearchResultsPosition": {
+      "desc": "Information about a message in a specific position"
+    },
+    "SecureCredentialsEncrypted": {
+      "desc": "Encrypted secure credentials"
+    },
+    "SecureData": {
+      "desc": "Secure passport data, for more info see the passport docs \u00bb"
+    },
+    "SecureFile": {
+      "desc": "Secure passport file, for more info see the passport docs \u00bb"
+    },
+    "SecurePasswordKdfAlgo": {
+      "desc": "KDF algorithm to use for computing telegram passport hash"
+    },
+    "SecurePlainData": {
+      "desc": "Plaintext verified passport data."
+    },
+    "SecureRequiredType": {
+      "desc": "Required secure file type"
+    },
+    "SecureSecretSettings": {
+      "desc": "Telegram passport settings"
+    },
+    "SecureValue": {
+      "desc": "Secure Telegram Passport value"
+    },
+    "SecureValueError": {
+      "desc": "Secure value error"
+    },
+    "SecureValueHash": {
+      "desc": "Secure value hash"
+    },
+    "SecureValueType": {
+      "desc": "Secure value type"
+    },
+    "SendAsPeer": {
+      "desc": "Indicates a peer that can be used to send messages"
+    },
+    "SendMessageAction": {
+      "desc": "User actions. Use this to provide users with detailed info about their chat partner's actions: typing or sending attachments of all kinds."
+    },
+    "ShippingOption": {
+      "desc": "Shipping options"
+    },
+    "SmsJob": {
+      "desc": "Info about an SMS job."
+    },
+    "SponsoredMessage": {
+      "desc": "A sponsored message"
+    },
+    "SponsoredMessageReportOption": {
+      "desc": "A report option for a sponsored message \u00bb."
+    },
+    "SponsoredPeer": {
+      "desc": "A sponsored peer."
+    },
+    "StarGift": {
+      "desc": "Represents a star gift, see here \u00bb for more info."
+    },
+    "StarGiftAttribute": {
+      "desc": "An attribute of a collectible gift \u00bb."
+    },
+    "StarGiftAttributeCounter": {
+      "desc": "Indicates the total number of gifts that have the specified attribute."
+    },
+    "StarGiftAttributeId": {
+      "desc": "Represents the identifier of a collectible gift attribute."
+    },
+    "StarGiftCollection": {
+      "desc": "Represents a star gift collection \u00bb."
+    },
+    "StarGiftUpgradePreview": {
+      "desc": ""
+    },
+    "StarGiftUpgradePrice": {
+      "desc": ""
+    },
+    "StarRefProgram": {
+      "desc": "Indo about an affiliate program offered by a bot"
+    },
+    "StarsAmount": {
+      "desc": "Describes a real (i.e. possibly decimal) amount of Telegram Stars."
+    },
+    "StarsGiftOption": {
+      "desc": "Telegram Stars gift option."
+    },
+    "StarsGiveawayOption": {
+      "desc": "Contains info about a Telegram Star giveaway option."
+    },
+    "StarsGiveawayWinnersOption": {
+      "desc": "Represents a possible option for the number of winners in a star giveaway"
+    },
+    "StarsRating": {
+      "desc": "Represents the profile's star rating, see here \u00bb for more info."
+    },
+    "StarsRevenueStatus": {
+      "desc": "Describes Telegram Star revenue balances \u00bb."
+    },
+    "StarsSubscription": {
+      "desc": "Represents a Telegram Star subscription \u00bb."
+    },
+    "StarsSubscriptionPricing": {
+      "desc": "Pricing of a Telegram Star subscription \u00bb."
+    },
+    "StarsTopupOption": {
+      "desc": "Telegram Stars topup option."
+    },
+    "StarsTransaction": {
+      "desc": "Represents a Telegram Stars transaction \u00bb."
+    },
+    "StarsTransactionPeer": {
+      "desc": "Source of an incoming Telegram Star transaction, or its recipient for outgoing Telegram Star transactions."
+    },
+    "StatsAbsValueAndPrev": {
+      "desc": "Channel statistics value pair"
+    },
+    "StatsDateRangeDays": {
+      "desc": "Channel statistics date range"
+    },
+    "StatsGraph": {
+      "desc": "Channel statistics graph"
+    },
+    "StatsGroupTopAdmin": {
+      "desc": "Most active admin in a supergroup"
+    },
+    "StatsGroupTopInviter": {
+      "desc": "Most active inviter in a supergroup"
+    },
+    "StatsGroupTopPoster": {
+      "desc": "Most active user in a supergroup"
+    },
+    "StatsPercentValue": {
+      "desc": "Channel statistics percentage"
+    },
+    "StatsURL": {
+      "desc": "URL with chat statistics"
+    },
+    "StickerKeyword": {
+      "desc": "Keywords for a certain sticker"
+    },
+    "StickerPack": {
+      "desc": "Stickerpack"
+    },
+    "StickerSet": {
+      "desc": "Represents a stickerset (stickerpack)"
+    },
+    "StickerSetCovered": {
+      "desc": "Stickerset preview"
+    },
+    "StoriesStealthMode": {
+      "desc": "Story stealth mode status"
+    },
+    "StoryAlbum": {
+      "desc": "Represents a story album \u00bb."
+    },
+    "StoryFwdHeader": {
+      "desc": "Contains info about the original poster of a reposted story."
+    },
+    "StoryItem": {
+      "desc": "Represents a Telegram Story"
+    },
+    "StoryReaction": {
+      "desc": "How a certain peer reacted to or interacted with a story"
+    },
+    "StoryView": {
+      "desc": "Story view date and reaction information"
+    },
+    "StoryViews": {
+      "desc": "Aggregated view and reaction information of a story"
+    },
+    "SuggestedPost": {
+      "desc": "Contains info about a suggested post \u00bb."
+    },
+    "TextWithEntities": {
+      "desc": "Styled text with message entities"
+    },
+    "Theme": {
+      "desc": "Cloud theme"
+    },
+    "ThemeSettings": {
+      "desc": "Theme settings"
+    },
+    "Timezone": {
+      "desc": "Timezone information."
+    },
+    "TodoCompletion": {
+      "desc": "A completed todo list \u00bb item."
+    },
+    "TodoItem": {
+      "desc": "An item of a todo list \u00bb."
+    },
+    "TodoList": {
+      "desc": "Represents a todo list \u00bb."
+    },
+    "TopPeer": {
+      "desc": "Top peer"
+    },
+    "TopPeerCategory": {
+      "desc": "Top peer category"
+    },
+    "TopPeerCategoryPeers": {
+      "desc": "Top peers by top peer category"
+    },
+    "Update": {
+      "desc": "Object contains info on events occurred."
+    },
+    "Updates": {
+      "desc": "Object which is perceived by the client without a call on its part when an event occurs."
+    },
+    "UrlAuthResult": {
+      "desc": "URL authorization result"
+    },
+    "User": {
+      "desc": "Object defines a user."
+    },
+    "UserFull": {
+      "desc": "Object contains extended user info."
+    },
+    "UserProfilePhoto": {
+      "desc": "Object contains info on the user's profile photo."
+    },
+    "UserStatus": {
+      "desc": "User online status"
+    },
+    "Username": {
+      "desc": "Contains information about a username"
+    },
+    "VideoSize": {
+      "desc": "Represents an animated video thumbnail"
+    },
+    "WallPaper": {
+      "desc": "Object contains info on a wallpaper."
+    },
+    "WallPaperSettings": {
+      "desc": "Wallpaper rendering information."
+    },
+    "WebAuthorization": {
+      "desc": "Web authorization"
+    },
+    "WebDocument": {
+      "desc": "Remote document"
+    },
+    "WebPage": {
+      "desc": "Instant View webpage preview"
+    },
+    "WebPageAttribute": {
+      "desc": "Webpage attributes"
+    },
+    "WebViewMessageSent": {
+      "desc": "Contains information about an inline message sent by a Web App on behalf of a user."
+    },
+    "WebViewResult": {
+      "desc": "Contains the webview URL with appropriate theme and user info parameters added"
+    },
+    "X": {
+      "desc": "Represents the return type of the wrapped method."
+    },
+    "account.AuthorizationForm": {
+      "desc": "Authorization form"
+    },
+    "account.Authorizations": {
+      "desc": "Logged-in sessions"
+    },
+    "account.AutoDownloadSettings": {
+      "desc": "Media autodownload settings"
+    },
+    "account.AutoSaveSettings": {
+      "desc": "Contains media autosave settings"
+    },
+    "account.BusinessChatLinks": {
+      "desc": "Contains info about business chat deep links \u00bb created by the current account."
+    },
+    "account.ChatThemes": {
+      "desc": "Available chat themes"
+    },
+    "account.ConnectedBots": {
+      "desc": "Info about currently connected business bots."
+    },
+    "account.ContentSettings": {
+      "desc": "Sensitive content settings"
+    },
+    "account.EmailVerified": {
+      "desc": "Email verification status"
+    },
+    "account.EmojiStatuses": {
+      "desc": "A list of emoji statuses"
+    },
+    "account.PaidMessagesRevenue": {
+      "desc": "Total number of non-refunded Telegram Stars a user has spent on sending us messages either directly or through a channel, see here \u00bb for more info on paid messages."
+    },
+    "account.Password": {
+      "desc": "Configuration for two-factor authorization"
+    },
+    "account.PasswordInputSettings": {
+      "desc": "Constructor for setting up a new 2FA SRP password"
+    },
+    "account.PasswordSettings": {
+      "desc": "Private info associated to the password info (recovery email, telegram passport info & so on)"
+    },
+    "account.PrivacyRules": {
+      "desc": "Privacy rules"
+    },
+    "account.ResetPasswordResult": {
+      "desc": "Result of an account.resetPassword request."
+    },
+    "account.ResolvedBusinessChatLinks": {
+      "desc": "Contains info about a single resolved business chat deep link \u00bb."
+    },
+    "account.SavedMusicIds": {
+      "desc": "List of IDs of songs (document.ids) currently pinned on our profile, see here \u00bb for more info."
+    },
+    "account.SavedRingtone": {
+      "desc": "Contains information about a saved notification sound"
+    },
+    "account.SavedRingtones": {
+      "desc": "Contains a list of saved notification sounds"
+    },
+    "account.SentEmailCode": {
+      "desc": "The email code that was sent"
+    },
+    "account.Takeout": {
+      "desc": "Takeout info"
+    },
+    "account.Themes": {
+      "desc": "Installed themes"
+    },
+    "account.TmpPassword": {
+      "desc": "Temporary password"
+    },
+    "account.WallPapers": {
+      "desc": "Wallpapers"
+    },
+    "account.WebAuthorizations": {
+      "desc": "Web authorizations"
+    },
+    "auth.Authorization": {
+      "desc": "Object contains info on user authorization."
+    },
+    "auth.CodeType": {
+      "desc": "Type of verification code that will be sent next if you call the resendCode method"
+    },
+    "auth.ExportedAuthorization": {
+      "desc": "Exported authorization"
+    },
+    "auth.LoggedOut": {
+      "desc": "Future auth token \u00bb to be used on subsequent authorizations"
+    },
+    "auth.LoginToken": {
+      "desc": "Login token (for QR code login)"
+    },
+    "auth.PasswordRecovery": {
+      "desc": "Recovery info of a 2FA password, only for accounts with a recovery email configured."
+    },
+    "auth.SentCode": {
+      "desc": "Contains info on a confirmation code message sent via SMS, phone call or Telegram."
+    },
+    "auth.SentCodeType": {
+      "desc": "Type of the verification code that was sent"
+    },
+    "bots.BotInfo": {
+      "desc": "Localized name, about text and description of a bot."
+    },
+    "bots.PopularAppBots": {
+      "desc": "Popular Main Mini Apps, to be used in the apps tab of global search \u00bb."
+    },
+    "bots.PreviewInfo": {
+      "desc": "Contains info about Main Mini App previews, see here \u00bb for more info."
+    },
+    "channels.AdminLogResults": {
+      "desc": "Admin log events"
+    },
+    "channels.ChannelParticipant": {
+      "desc": "Channel participant"
+    },
+    "channels.ChannelParticipants": {
+      "desc": "Channel/supergroup participants"
+    },
+    "channels.SendAsPeers": {
+      "desc": "A list of peers that can be used to send messages in a specific group"
+    },
+    "channels.SponsoredMessageReportResult": {
+      "desc": "Status of the method call used to report a sponsored message \u00bb."
+    },
+    "chatlists.ChatlistInvite": {
+      "desc": "Info about a chat folder deep link \u00bb."
+    },
+    "chatlists.ChatlistUpdates": {
+      "desc": "Updated info about a chat folder deep link \u00bb."
+    },
+    "chatlists.ExportedChatlistInvite": {
+      "desc": "Exported chat folder deep link \u00bb."
+    },
+    "chatlists.ExportedInvites": {
+      "desc": "A list of exported chat folder deep links \u00bb."
+    },
+    "contacts.Blocked": {
+      "desc": "Info on users from the current user's black list."
+    },
+    "contacts.ContactBirthdays": {
+      "desc": "Birthday information of our contacts."
+    },
+    "contacts.Contacts": {
+      "desc": "Info on the current user's contact list."
+    },
+    "contacts.Found": {
+      "desc": "Object contains info on users found by name substring and auxiliary data."
+    },
+    "contacts.ImportedContacts": {
+      "desc": "Object contains info on successfully imported contacts."
+    },
+    "contacts.ResolvedPeer": {
+      "desc": "Peer returned after resolving a @username"
+    },
+    "contacts.SponsoredPeers": {
+      "desc": "A list of sponsored peers."
+    },
+    "contacts.TopPeers": {
+      "desc": "Top peers"
+    },
+    "fragment.CollectibleInfo": {
+      "desc": "Info about a fragment collectible."
+    },
+    "help.AppConfig": {
+      "desc": "Contains various client configuration parameters"
+    },
+    "help.AppUpdate": {
+      "desc": "Contains info on app update availability."
+    },
+    "help.CountriesList": {
+      "desc": "Name, ISO code, localized name and phone codes/patterns of all available countries"
+    },
+    "help.Country": {
+      "desc": "Name, ISO code, localized name and phone codes/patterns of a specific country"
+    },
+    "help.CountryCode": {
+      "desc": "Country code and phone number pattern of a specific country"
+    },
+    "help.DeepLinkInfo": {
+      "desc": "Contains information about an unsupported deep link \u00bb"
+    },
+    "help.InviteText": {
+      "desc": "Object contains info on the text of a message with an invitation."
+    },
+    "help.PassportConfig": {
+      "desc": "Telegram passport configuration"
+    },
+    "help.PeerColorOption": {
+      "desc": "Contains info about a color palette \u00bb."
+    },
+    "help.PeerColorSet": {
+      "desc": "Contains info about a color palette \u00bb."
+    },
+    "help.PeerColors": {
+      "desc": "Contains info about multiple color palettes \u00bb."
+    },
+    "help.PremiumPromo": {
+      "desc": "Telegram Premium promotion information"
+    },
+    "help.PromoData": {
+      "desc": "Info about pinned MTProxy or Public Service Announcement peers."
+    },
+    "help.RecentMeUrls": {
+      "desc": "Recent t.me URLs"
+    },
+    "help.Support": {
+      "desc": "Info about the support user, relevant to the current user."
+    },
+    "help.SupportName": {
+      "desc": "Get localized name for support user"
+    },
+    "help.TermsOfService": {
+      "desc": "Contains info about the latest telegram Terms Of Service."
+    },
+    "help.TermsOfServiceUpdate": {
+      "desc": "Update of Telegram's terms of service"
+    },
+    "help.TimezonesList": {
+      "desc": "Timezone information that may be used elsewhere in the API, such as to set Telegram Business opening hours \u00bb."
+    },
+    "help.UserInfo": {
+      "desc": "User info"
+    },
+    "int": {
+      "desc": "A basic bare type, the values of which correspond to single-element sequences, i.e. numbers from -2^31 to 2^31-1 which in this case represent themselves."
+    },
+    "long": {
+      "desc": "A basic bare type, elements of which correspond to two-element sequences, representing 64-bit signed numbers (little-endian)."
+    },
+    "messages.AffectedFoundMessages": {
+      "desc": "Messages found and affected by changes"
+    },
+    "messages.AffectedHistory": {
+      "desc": "Object contains info on affected part of communication history with the user or in a chat."
+    },
+    "messages.AffectedMessages": {
+      "desc": "Messages affected by changes"
+    },
+    "messages.AllStickers": {
+      "desc": "All stickers"
+    },
+    "messages.ArchivedStickers": {
+      "desc": "Archived stickers"
+    },
+    "messages.AvailableEffects": {
+      "desc": "Full list of usable animated message effects \u00bb."
+    },
+    "messages.AvailableReactions": {
+      "desc": "Animations and metadata associated with message reactions \u00bb"
+    },
+    "messages.BotApp": {
+      "desc": "Contains information about a direct link Mini App"
+    },
+    "messages.BotCallbackAnswer": {
+      "desc": "Callback answer of bot"
+    },
+    "messages.BotPreparedInlineMessage": {
+      "desc": "Represents a prepared inline message saved by a bot, to be sent to the user via a web app \u00bb"
+    },
+    "messages.BotResults": {
+      "desc": "Result of a query to an inline bot"
+    },
+    "messages.ChatAdminsWithInvites": {
+      "desc": "Info about chat invites generated by admins."
+    },
+    "messages.ChatFull": {
+      "desc": "Full info about a channel, supergroup, gigagroup or basic group."
+    },
+    "messages.ChatInviteImporters": {
+      "desc": "List of users that imported a chat invitation link."
+    },
+    "messages.Chats": {
+      "desc": "Object contains list of chats with auxiliary data."
+    },
+    "messages.CheckedHistoryImportPeer": {
+      "desc": "Contains a confirmation text to be shown to the user, upon importing chat history, click here for more info \u00bb."
+    },
+    "messages.DhConfig": {
+      "desc": "Contains Diffie-Hellman key generation protocol parameters."
+    },
+    "messages.DialogFilters": {
+      "desc": "Folder information"
+    },
+    "messages.Dialogs": {
+      "desc": "Object contains a list of chats with messages and auxiliary data."
+    },
+    "messages.DiscussionMessage": {
+      "desc": "Info about a message thread"
+    },
+    "messages.EmojiGroups": {
+      "desc": "Represents a list of emoji categories."
+    },
+    "messages.ExportedChatInvite": {
+      "desc": "Contains info about a chat invite, and eventually a pointer to the newest chat invite."
+    },
+    "messages.ExportedChatInvites": {
+      "desc": "Info about chat invites exported by a certain admin."
+    },
+    "messages.FavedStickers": {
+      "desc": "Favorited stickers"
+    },
+    "messages.FeaturedStickers": {
+      "desc": "Featured stickers"
+    },
+    "messages.ForumTopics": {
+      "desc": "Contains information about multiple forum topics"
+    },
+    "messages.FoundStickerSets": {
+      "desc": "Found stickersets"
+    },
+    "messages.FoundStickers": {
+      "desc": "Found stickers"
+    },
+    "messages.HighScores": {
+      "desc": "High scores (in games)"
+    },
+    "messages.HistoryImport": {
+      "desc": "Identifier of a history import session, click here for more info \u00bb."
+    },
+    "messages.HistoryImportParsed": {
+      "desc": "Contains information about a chat export file, generated by a foreign chat app."
+    },
+    "messages.InactiveChats": {
+      "desc": "Inactive chat list"
+    },
+    "messages.InvitedUsers": {
+      "desc": "Contains info about successfully or unsuccessfully invited \u00bb users."
+    },
+    "messages.MessageEditData": {
+      "desc": "Message edit data for media"
+    },
+    "messages.MessageEmpty": {
+      "desc": ""
+    },
+    "messages.MessageReactionsList": {
+      "desc": "List of peers that reacted to a specific message"
+    },
+    "messages.MessageViews": {
+      "desc": "View, forward counter + info about replies"
+    },
+    "messages.Messages": {
+      "desc": "Object contains information on list of messages with auxiliary data."
+    },
+    "messages.MyStickers": {
+      "desc": "The list of stickersets owned by the current account \u00bb."
+    },
+    "messages.PeerDialogs": {
+      "desc": "List of dialogs"
+    },
+    "messages.PeerSettings": {
+      "desc": "Peer settings"
+    },
+    "messages.PreparedInlineMessage": {
+      "desc": "Represents a prepared inline message received via a bot's mini app, that can be sent to some chats \u00bb"
+    },
+    "messages.QuickReplies": {
+      "desc": "Info about quick reply shortcuts \u00bb."
+    },
+    "messages.Reactions": {
+      "desc": "A set of message reactions"
+    },
+    "messages.RecentStickers": {
+      "desc": "Recent stickers"
+    },
+    "messages.SavedDialogs": {
+      "desc": "Represents some saved message dialogs \u00bb."
+    },
+    "messages.SavedGifs": {
+      "desc": "Saved GIFs"
+    },
+    "messages.SavedReactionTags": {
+      "desc": "List of reaction tag \u00bb names assigned by the user."
+    },
+    "messages.SearchCounter": {
+      "desc": "Number of results that would be returned by a search"
+    },
+    "messages.SearchResultsCalendar": {
+      "desc": "Information about found messages sent on a specific day"
+    },
+    "messages.SearchResultsPositions": {
+      "desc": "Information about sparse positions of messages"
+    },
+    "messages.SentEncryptedMessage": {
+      "desc": "Contains info on message sent to an encrypted chat."
+    },
+    "messages.SponsoredMessages": {
+      "desc": "A set of sponsored messages associated with a channel"
+    },
+    "messages.StickerSet": {
+      "desc": "Stickerset"
+    },
+    "messages.StickerSetInstallResult": {
+      "desc": "Result of stickerset installation process"
+    },
+    "messages.Stickers": {
+      "desc": "Stickers"
+    },
+    "messages.TranscribedAudio": {
+      "desc": "Transcribed text from a voice message"
+    },
+    "messages.TranslatedText": {
+      "desc": "Translated text with entities."
+    },
+    "messages.VotesList": {
+      "desc": "How users voted in a poll"
+    },
+    "messages.WebPage": {
+      "desc": "Contains an instant view webpage."
+    },
+    "messages.WebPagePreview": {
+      "desc": "Represents a webpage preview."
+    },
+    "messages.WebViewResult": {
+      "desc": ""
+    },
+    "payments.BankCardData": {
+      "desc": "Credit card info, provided by the card's bank(s)"
+    },
+    "payments.CheckCanSendGiftResult": {
+      "desc": "Specifies if a gift can or cannot be sent."
+    },
+    "payments.CheckedGiftCode": {
+      "desc": "Info about a Telegram Premium Giftcode."
+    },
+    "payments.ConnectedStarRefBots": {
+      "desc": "Active affiliations"
+    },
+    "payments.ExportedInvoice": {
+      "desc": "Exported invoice"
+    },
+    "payments.GiveawayInfo": {
+      "desc": "Info about a Telegram Premium Giveaway."
+    },
+    "payments.PaymentForm": {
+      "desc": "Payment form"
+    },
+    "payments.PaymentReceipt": {
+      "desc": "Payment receipt"
+    },
+    "payments.PaymentResult": {
+      "desc": "Payment result"
+    },
+    "payments.ResaleStarGifts": {
+      "desc": "List of gifts currently on resale \u00bb."
+    },
+    "payments.SavedInfo": {
+      "desc": "Saved payment info"
+    },
+    "payments.SavedStarGifts": {
+      "desc": "Represents a list of gifts."
+    },
+    "payments.StarGiftCollections": {
+      "desc": "Represents a list of star gift collections \u00bb."
+    },
+    "payments.StarGiftUpgradePreview": {
+      "desc": "A preview of the possible attributes (chosen randomly) a gift \u00bb can receive after upgrading it to a collectible gift \u00bb, see here \u00bb for more info."
+    },
+    "payments.StarGiftWithdrawalUrl": {
+      "desc": "A URL that can be used to import the exported NFT on Fragment."
+    },
+    "payments.StarGifts": {
+      "desc": "Available gifts \u00bb."
+    },
+    "payments.StarsRevenueAdsAccountUrl": {
+      "desc": "Contains a URL leading to a page where the user will be able to place ads for the channel/bot, paying using Telegram Stars."
+    },
+    "payments.StarsRevenueStats": {
+      "desc": "Star revenue statistics, see here \u00bb for more info."
+    },
+    "payments.StarsRevenueWithdrawalUrl": {
+      "desc": "Contains the URL to use to withdraw Telegram Star revenue."
+    },
+    "payments.StarsStatus": {
+      "desc": "Info about the current Telegram Star subscriptions, balance and transaction history \u00bb."
+    },
+    "payments.SuggestedStarRefBots": {
+      "desc": "A list of suggested mini apps with available affiliate programs"
+    },
+    "payments.UniqueStarGift": {
+      "desc": "Represents a collectible gift \u00bb."
+    },
+    "payments.UniqueStarGiftValueInfo": {
+      "desc": "Information about the value of a collectible gift \u00bb."
+    },
+    "payments.ValidatedRequestedInfo": {
+      "desc": "Validated requested info"
+    },
+    "phone.ExportedGroupCallInvite": {
+      "desc": "An exported group call invitation."
+    },
+    "phone.GroupCall": {
+      "desc": "Contains info about a group call, and partial info about its participants."
+    },
+    "phone.GroupCallStreamChannels": {
+      "desc": "Info about RTMP streams in a group call or livestream"
+    },
+    "phone.GroupCallStreamRtmpUrl": {
+      "desc": "RTMP URL and stream key to be used in streaming software"
+    },
+    "phone.GroupParticipants": {
+      "desc": "Info about the participants of a group call or livestream"
+    },
+    "phone.JoinAsPeers": {
+      "desc": "A list of peers that can be used to join a group call, presenting yourself as a specific user/channel."
+    },
+    "phone.PhoneCall": {
+      "desc": "Phone call"
+    },
+    "photos.Photo": {
+      "desc": "Photo with auxiliary data."
+    },
+    "photos.Photos": {
+      "desc": "Object contains list of photos with auxiliary data."
+    },
+    "premium.BoostsList": {
+      "desc": "List of boosts that were applied to a peer by multiple users."
+    },
+    "premium.BoostsStatus": {
+      "desc": "Contains info about the current boost status of a peer."
+    },
+    "premium.MyBoosts": {
+      "desc": "A list of peers we are currently boosting, and how many boost slots we have left."
+    },
+    "smsjobs.EligibilityToJoin": {
+      "desc": "SMS jobs eligibility"
+    },
+    "smsjobs.Status": {
+      "desc": "Status"
+    },
+    "stats.BroadcastStats": {
+      "desc": "Channel statistics"
+    },
+    "stats.MegagroupStats": {
+      "desc": "Supergroup statistics"
+    },
+    "stats.MessageStats": {
+      "desc": "Message statistics"
+    },
+    "stats.PublicForwards": {
+      "desc": "Contains info about the forwards of a story as a message to public chats and reposts by public channels."
+    },
+    "stats.StoryStats": {
+      "desc": "Contains statistics about a story."
+    },
+    "stickers.SuggestedShortName": {
+      "desc": "A suggested short name for the specified stickerpack"
+    },
+    "storage.FileType": {
+      "desc": "Object describes the file type."
+    },
+    "stories.Albums": {
+      "desc": "Represents a list of story albums \u00bb."
+    },
+    "stories.AllStories": {
+      "desc": "Full list of active (or active and hidden) stories."
+    },
+    "stories.CanSendStoryCount": {
+      "desc": "Contains the number of available active story slots (equal to the value of the story_expiring_limit_* client configuration parameter minus the number of currently active stories)."
+    },
+    "stories.FoundStories": {
+      "desc": "Stories found using global story search \u00bb."
+    },
+    "stories.PeerStories": {
+      "desc": "Active story list of a specific peer."
+    },
+    "stories.Stories": {
+      "desc": "List of stories"
+    },
+    "stories.StoryReactionsList": {
+      "desc": "List of peers that reacted to a specific story"
+    },
+    "stories.StoryViews": {
+      "desc": "Reaction and view counters for a list of stories"
+    },
+    "stories.StoryViewsList": {
+      "desc": "Reaction and view counters for a story"
+    },
+    "updates.ChannelDifference": {
+      "desc": "Contains the difference (new messages) between our local channel state and the remote state"
+    },
+    "updates.Difference": {
+      "desc": "Occurred changes."
+    },
+    "updates.State": {
+      "desc": "Object contains info on state for further updates."
+    },
+    "upload.CdnFile": {
+      "desc": "Represents the download status of a CDN file"
+    },
+    "upload.File": {
+      "desc": "Contains info on file."
+    },
+    "upload.WebFile": {
+      "desc": "Remote file"
+    },
+    "users.SavedMusic": {
+      "desc": "List of songs (document.ids) currently pinned on a user's profile, see here \u00bb for more info."
+    },
+    "users.UserFull": {
+      "desc": "Full user information, with attached context peers for reactions"
+    },
+    "users.Users": {
+      "desc": "Describes a list of users (or bots)."
+    }
+  }
+}
\ No newline at end of file
diff --git a/compiler/api/source/main_api.tl b/compiler/api/source/main_api.tl
index d096b0e1..e31022ec 100644
--- a/compiler/api/source/main_api.tl
+++ b/compiler/api/source/main_api.tl
@@ -1,6 +1,6 @@
 // https://github.com/telegramdesktop/tdesktop/blob/dev/Telegram/SourceFiles/mtproto/scheme/api.tl
 // https://github.com/telegramdesktop/tdesktop/blob/dev/Telegram/SourceFiles/mtproto/scheme/layer.tl
-// https://github.com/TGScheme/TgSchemeLayers/blob/main/main_api.tl
+// https://github.com/TGScheme/Schema/blob/main/main_api.tl
 
 ///////////////////////////////
 ///////// Main application API
@@ -8,7 +8,7 @@
 
 
 // This file is auto-generated by TLExtractor
-// Copyright (C) 2024 Laky-64
+// Copyright (C) 2025 Laky-64
 
 ---types---
 
@@ -47,11 +47,11 @@ inputMediaUploadedPhoto#1e287d04 flags:# spoiler:flags.2?true file:InputFile sti
 inputMediaPhoto#b3ba0635 flags:# spoiler:flags.1?true id:InputPhoto ttl_seconds:flags.0?int = InputMedia;
 inputMediaGeoPoint#f9c44144 geo_point:InputGeoPoint = InputMedia;
 inputMediaContact#f8ab7dfb phone_number:string first_name:string last_name:string vcard:string = InputMedia;
-inputMediaUploadedDocument#5b38c6c1 flags:# nosound_video:flags.3?true force_file:flags.4?true spoiler:flags.5?true file:InputFile thumb:flags.2?InputFile mime_type:string attributes:Vector stickers:flags.0?Vector ttl_seconds:flags.1?int = InputMedia;
-inputMediaDocument#33473058 flags:# spoiler:flags.2?true id:InputDocument ttl_seconds:flags.0?int query:flags.1?string = InputMedia;
+inputMediaUploadedDocument#37c9330 flags:# nosound_video:flags.3?true force_file:flags.4?true spoiler:flags.5?true file:InputFile thumb:flags.2?InputFile mime_type:string attributes:Vector stickers:flags.0?Vector video_cover:flags.6?InputPhoto video_timestamp:flags.7?int ttl_seconds:flags.1?int = InputMedia;
+inputMediaDocument#a8763ab5 flags:# spoiler:flags.2?true id:InputDocument video_cover:flags.3?InputPhoto video_timestamp:flags.4?int ttl_seconds:flags.0?int query:flags.1?string = InputMedia;
 inputMediaVenue#c13d1c11 geo_point:InputGeoPoint title:string address:string provider:string venue_id:string venue_type:string = InputMedia;
 inputMediaPhotoExternal#e5bbfe1a flags:# spoiler:flags.1?true url:string ttl_seconds:flags.0?int = InputMedia;
-inputMediaDocumentExternal#fb52dc99 flags:# spoiler:flags.1?true url:string ttl_seconds:flags.0?int = InputMedia;
+inputMediaDocumentExternal#779600f9 flags:# spoiler:flags.1?true url:string ttl_seconds:flags.0?int video_cover:flags.2?InputPhoto video_timestamp:flags.3?int = InputMedia;
 inputMediaGame#d33f43f3 id:InputGame = InputMedia;
 inputMediaInvoice#405fef0d flags:# title:string description:string photo:flags.0?InputWebDocument invoice:Invoice payload:bytes provider:flags.3?string provider_data:DataJSON start_param:flags.1?string extended_media:flags.2?InputMedia = InputMedia;
 inputMediaGeoLive#971fa843 flags:# stopped:flags.0?true geo_point:InputGeoPoint heading:flags.2?int period:flags.1?int proximity_notification_radius:flags.3?int = InputMedia;
@@ -60,6 +60,7 @@ inputMediaDice#e66fbf7b emoticon:string = InputMedia;
 inputMediaStory#89fdd778 peer:InputPeer id:int = InputMedia;
 inputMediaWebPage#c21b8849 flags:# force_large_media:flags.0?true force_small_media:flags.1?true optional:flags.2?true url:string = InputMedia;
 inputMediaPaidMedia#c4103386 flags:# stars_amount:long extended_media:Vector payload:flags.0?string = InputMedia;
+inputMediaTodo#9fc55fde todo:TodoList = InputMedia;
 
 inputChatPhotoEmpty#1ca48f57 = InputChatPhoto;
 inputChatUploadedPhoto#bdcdaec0 flags:# file:flags.0?InputFile video:flags.1?InputFile video_start_ts:flags.2?double video_emoji_markup:flags.3?VideoSize = InputChatPhoto;
@@ -98,7 +99,7 @@ storage.fileMp4#b3cea0e4 = storage.FileType;
 storage.fileWebp#1081464c = storage.FileType;
 
 userEmpty#d3bc4b7a id:long = User;
-user#83314fca flags:# self:flags.10?true contact:flags.11?true mutual_contact:flags.12?true deleted:flags.13?true bot:flags.14?true bot_chat_history:flags.15?true bot_nochats:flags.16?true verified:flags.17?true restricted:flags.18?true min:flags.20?true bot_inline_geo:flags.21?true support:flags.23?true scam:flags.24?true apply_min_photo:flags.25?true fake:flags.26?true bot_attach_menu:flags.27?true premium:flags.28?true attach_menu_enabled:flags.29?true flags2:# bot_can_edit:flags2.1?true close_friend:flags2.2?true stories_hidden:flags2.3?true stories_unavailable:flags2.4?true contact_require_premium:flags2.10?true bot_business:flags2.11?true bot_has_main_app:flags2.13?true id:long access_hash:flags.0?long first_name:flags.1?string last_name:flags.2?string username:flags.3?string phone:flags.4?string photo:flags.5?UserProfilePhoto status:flags.6?UserStatus bot_info_version:flags.14?int restriction_reason:flags.18?Vector bot_inline_placeholder:flags.19?string lang_code:flags.22?string emoji_status:flags.30?EmojiStatus usernames:flags2.0?Vector stories_max_id:flags2.5?int color:flags2.8?PeerColor profile_color:flags2.9?PeerColor bot_active_users:flags2.12?int = User;
+user#20b1422 flags:# self:flags.10?true contact:flags.11?true mutual_contact:flags.12?true deleted:flags.13?true bot:flags.14?true bot_chat_history:flags.15?true bot_nochats:flags.16?true verified:flags.17?true restricted:flags.18?true min:flags.20?true bot_inline_geo:flags.21?true support:flags.23?true scam:flags.24?true apply_min_photo:flags.25?true fake:flags.26?true bot_attach_menu:flags.27?true premium:flags.28?true attach_menu_enabled:flags.29?true flags2:# bot_can_edit:flags2.1?true close_friend:flags2.2?true stories_hidden:flags2.3?true stories_unavailable:flags2.4?true contact_require_premium:flags2.10?true bot_business:flags2.11?true bot_has_main_app:flags2.13?true bot_forum_view:flags2.16?true id:long access_hash:flags.0?long first_name:flags.1?string last_name:flags.2?string username:flags.3?string phone:flags.4?string photo:flags.5?UserProfilePhoto status:flags.6?UserStatus bot_info_version:flags.14?int restriction_reason:flags.18?Vector bot_inline_placeholder:flags.19?string lang_code:flags.22?string emoji_status:flags.30?EmojiStatus usernames:flags2.0?Vector stories_max_id:flags2.5?int color:flags2.8?PeerColor profile_color:flags2.9?PeerColor bot_active_users:flags2.12?int bot_verification_icon:flags2.14?long send_paid_messages_stars:flags2.15?long = User;
 
 userProfilePhotoEmpty#4f11bae1 = UserProfilePhoto;
 userProfilePhoto#82d1f706 flags:# has_video:flags.0?true personal:flags.2?true photo_id:long stripped_thumb:flags.1?bytes dc_id:int = UserProfilePhoto;
@@ -109,15 +110,16 @@ userStatusOffline#8c703f was_online:int = UserStatus;
 userStatusRecently#7b197dc8 flags:# by_me:flags.0?true = UserStatus;
 userStatusLastWeek#541a1d1a flags:# by_me:flags.0?true = UserStatus;
 userStatusLastMonth#65899777 flags:# by_me:flags.0?true = UserStatus;
+userStatusHidden#cf7d64b1 = UserStatus;
 
 chatEmpty#29562865 id:long = Chat;
-chat#41cbf256 flags:# creator:flags.0?true left:flags.2?true deactivated:flags.5?true call_active:flags.23?true call_not_empty:flags.24?true noforwards:flags.25?true id:long title:string photo:ChatPhoto participants_count:int date:int version:int migrated_to:flags.6?InputChannel admin_rights:flags.14?ChatAdminRights default_banned_rights:flags.18?ChatBannedRights = Chat;
+chat#41cbf256 flags:# creator:flags.0?true kicked:flags.1?true left:flags.2?true deactivated:flags.5?true call_active:flags.23?true call_not_empty:flags.24?true noforwards:flags.25?true id:long title:string photo:ChatPhoto participants_count:int date:int version:int migrated_to:flags.6?InputChannel admin_rights:flags.14?ChatAdminRights default_banned_rights:flags.18?ChatBannedRights = Chat;
 chatForbidden#6592a1a7 id:long title:string = Chat;
-channel#fe4478bd flags:# creator:flags.0?true left:flags.2?true broadcast:flags.5?true verified:flags.7?true megagroup:flags.8?true restricted:flags.9?true signatures:flags.11?true min:flags.12?true scam:flags.19?true has_link:flags.20?true has_geo:flags.21?true slowmode_enabled:flags.22?true call_active:flags.23?true call_not_empty:flags.24?true fake:flags.25?true gigagroup:flags.26?true noforwards:flags.27?true join_to_send:flags.28?true join_request:flags.29?true forum:flags.30?true flags2:# stories_hidden:flags2.1?true stories_hidden_min:flags2.2?true stories_unavailable:flags2.3?true signature_profiles:flags2.12?true id:long access_hash:flags.13?long title:string username:flags.6?string photo:ChatPhoto date:int restriction_reason:flags.9?Vector admin_rights:flags.14?ChatAdminRights banned_rights:flags.15?ChatBannedRights default_banned_rights:flags.18?ChatBannedRights participants_count:flags.17?int usernames:flags2.0?Vector stories_max_id:flags2.4?int color:flags2.7?PeerColor profile_color:flags2.8?PeerColor emoji_status:flags2.9?EmojiStatus level:flags2.10?int subscription_until_date:flags2.11?int = Chat;
+channel#fe685355 flags:# creator:flags.0?true left:flags.2?true broadcast:flags.5?true verified:flags.7?true megagroup:flags.8?true restricted:flags.9?true signatures:flags.11?true min:flags.12?true scam:flags.19?true has_link:flags.20?true has_geo:flags.21?true slowmode_enabled:flags.22?true call_active:flags.23?true call_not_empty:flags.24?true fake:flags.25?true gigagroup:flags.26?true noforwards:flags.27?true join_to_send:flags.28?true join_request:flags.29?true forum:flags.30?true flags2:# stories_hidden:flags2.1?true stories_hidden_min:flags2.2?true stories_unavailable:flags2.3?true signature_profiles:flags2.12?true autotranslation:flags2.15?true broadcast_messages_allowed:flags2.16?true monoforum:flags2.17?true forum_tabs:flags2.19?true id:long access_hash:flags.13?long title:string username:flags.6?string photo:ChatPhoto date:int restriction_reason:flags.9?Vector admin_rights:flags.14?ChatAdminRights banned_rights:flags.15?ChatBannedRights default_banned_rights:flags.18?ChatBannedRights participants_count:flags.17?int usernames:flags2.0?Vector stories_max_id:flags2.4?int color:flags2.7?PeerColor profile_color:flags2.8?PeerColor emoji_status:flags2.9?EmojiStatus level:flags2.10?int subscription_until_date:flags2.11?int bot_verification_icon:flags2.13?long send_paid_messages_stars:flags2.14?long linked_monoforum_id:flags2.18?long = Chat;
 channelForbidden#17d493d5 flags:# broadcast:flags.5?true megagroup:flags.8?true id:long access_hash:long title:string until_date:flags.16?int = Chat;
 
 chatFull#2633421b flags:# can_set_username:flags.7?true has_scheduled:flags.8?true translations_disabled:flags.19?true id:long about:string participants:ChatParticipants chat_photo:flags.2?Photo notify_settings:PeerNotifySettings exported_invite:flags.13?ExportedChatInvite bot_info:flags.3?Vector pinned_msg_id:flags.6?int folder_id:flags.11?int call:flags.12?InputGroupCall ttl_period:flags.14?int groupcall_default_join_as:flags.15?Peer theme_emoticon:flags.16?string requests_pending:flags.17?int recent_requesters:flags.17?Vector available_reactions:flags.18?ChatReactions reactions_limit:flags.20?int = ChatFull;
-channelFull#bbab348d flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true can_set_location:flags.16?true has_scheduled:flags.19?true can_view_stats:flags.20?true blocked:flags.22?true flags2:# can_delete_channel:flags2.0?true antispam:flags2.1?true participants_hidden:flags2.2?true translations_disabled:flags2.3?true stories_pinned_available:flags2.5?true view_forum_as_messages:flags2.6?true restricted_sponsored:flags2.11?true can_view_revenue:flags2.12?true paid_media_allowed:flags2.14?true can_view_stars_revenue:flags2.15?true paid_reactions_available:flags2.16?true id:long about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int online_count:flags.13?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:flags.23?ExportedChatInvite bot_info:Vector migrated_from_chat_id:flags.4?long migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int folder_id:flags.11?int linked_chat_id:flags.14?long location:flags.15?ChannelLocation slowmode_seconds:flags.17?int slowmode_next_send_date:flags.18?int stats_dc:flags.12?int pts:int call:flags.21?InputGroupCall ttl_period:flags.24?int pending_suggestions:flags.25?Vector groupcall_default_join_as:flags.26?Peer theme_emoticon:flags.27?string requests_pending:flags.28?int recent_requesters:flags.28?Vector default_send_as:flags.29?Peer available_reactions:flags.30?ChatReactions reactions_limit:flags2.13?int stories:flags2.4?PeerStories wallpaper:flags2.7?WallPaper boosts_applied:flags2.8?int boosts_unrestrict:flags2.9?int emojiset:flags2.10?StickerSet = ChatFull;
+channelFull#e4e0b29d flags:# can_view_participants:flags.3?true can_set_username:flags.6?true can_set_stickers:flags.7?true hidden_prehistory:flags.10?true can_set_location:flags.16?true has_scheduled:flags.19?true can_view_stats:flags.20?true blocked:flags.22?true flags2:# can_delete_channel:flags2.0?true antispam:flags2.1?true participants_hidden:flags2.2?true translations_disabled:flags2.3?true stories_pinned_available:flags2.5?true view_forum_as_messages:flags2.6?true restricted_sponsored:flags2.11?true can_view_revenue:flags2.12?true paid_media_allowed:flags2.14?true can_view_stars_revenue:flags2.15?true paid_reactions_available:flags2.16?true stargifts_available:flags2.19?true paid_messages_available:flags2.20?true id:long about:string participants_count:flags.0?int admins_count:flags.1?int kicked_count:flags.2?int banned_count:flags.2?int online_count:flags.13?int read_inbox_max_id:int read_outbox_max_id:int unread_count:int chat_photo:Photo notify_settings:PeerNotifySettings exported_invite:flags.23?ExportedChatInvite bot_info:Vector migrated_from_chat_id:flags.4?long migrated_from_max_id:flags.4?int pinned_msg_id:flags.5?int stickerset:flags.8?StickerSet available_min_id:flags.9?int folder_id:flags.11?int linked_chat_id:flags.14?long location:flags.15?ChannelLocation slowmode_seconds:flags.17?int slowmode_next_send_date:flags.18?int stats_dc:flags.12?int pts:int call:flags.21?InputGroupCall ttl_period:flags.24?int pending_suggestions:flags.25?Vector groupcall_default_join_as:flags.26?Peer theme_emoticon:flags.27?string requests_pending:flags.28?int recent_requesters:flags.28?Vector default_send_as:flags.29?Peer available_reactions:flags.30?ChatReactions reactions_limit:flags2.13?int stories:flags2.4?PeerStories wallpaper:flags2.7?WallPaper boosts_applied:flags2.8?int boosts_unrestrict:flags2.9?int emojiset:flags2.10?StickerSet bot_verification:flags2.17?BotVerification stargifts_count:flags2.18?int send_paid_messages_stars:flags2.21?long main_tab:flags2.22?ProfileTab = ChatFull;
 
 chatParticipant#c02d4007 user_id:long inviter_id:long date:int = ChatParticipant;
 chatParticipantCreator#e46bcee4 user_id:long = ChatParticipant;
@@ -130,15 +132,15 @@ chatPhotoEmpty#37c1011c = ChatPhoto;
 chatPhoto#1c6e1c11 flags:# has_video:flags.0?true photo_id:long stripped_thumb:flags.1?bytes dc_id:int = ChatPhoto;
 
 messageEmpty#90a6ca84 flags:# id:int peer_id:flags.0?Peer = Message;
-message#94345242 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true from_scheduled:flags.18?true legacy:flags.19?true edit_hide:flags.21?true pinned:flags.24?true noforwards:flags.26?true invert_media:flags.27?true flags2:# offline:flags2.1?true id:int from_id:flags.8?Peer from_boosts_applied:flags.29?int peer_id:Peer saved_peer_id:flags.28?Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?long via_business_bot_id:flags2.0?long reply_to:flags.3?MessageReplyHeader date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector views:flags.10?int forwards:flags.10?int replies:flags.23?MessageReplies edit_date:flags.15?int post_author:flags.16?string grouped_id:flags.17?long reactions:flags.20?MessageReactions restriction_reason:flags.22?Vector ttl_period:flags.25?int quick_reply_shortcut_id:flags.30?int effect:flags2.2?long factcheck:flags2.3?FactCheck = Message;
-messageService#2b085862 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true legacy:flags.19?true id:int from_id:flags.8?Peer peer_id:Peer reply_to:flags.3?MessageReplyHeader date:int action:MessageAction ttl_period:flags.25?int = Message;
+message#9815cec8 flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true silent:flags.13?true post:flags.14?true from_scheduled:flags.18?true legacy:flags.19?true edit_hide:flags.21?true pinned:flags.24?true noforwards:flags.26?true invert_media:flags.27?true flags2:# offline:flags2.1?true video_processing_pending:flags2.4?true paid_suggested_post_stars:flags2.8?true paid_suggested_post_ton:flags2.9?true id:int from_id:flags.8?Peer from_boosts_applied:flags.29?int peer_id:Peer saved_peer_id:flags.28?Peer fwd_from:flags.2?MessageFwdHeader via_bot_id:flags.11?long via_business_bot_id:flags2.0?long reply_to:flags.3?MessageReplyHeader date:int message:string media:flags.9?MessageMedia reply_markup:flags.6?ReplyMarkup entities:flags.7?Vector views:flags.10?int forwards:flags.10?int replies:flags.23?MessageReplies edit_date:flags.15?int post_author:flags.16?string grouped_id:flags.17?long reactions:flags.20?MessageReactions restriction_reason:flags.22?Vector ttl_period:flags.25?int quick_reply_shortcut_id:flags.30?int effect:flags2.2?long factcheck:flags2.3?FactCheck report_delivery_until_date:flags2.5?int paid_message_stars:flags2.6?long suggested_post:flags2.7?SuggestedPost = Message;
+messageService#7a800e0a flags:# out:flags.1?true mentioned:flags.4?true media_unread:flags.5?true reactions_are_possible:flags.9?true silent:flags.13?true post:flags.14?true legacy:flags.19?true id:int from_id:flags.8?Peer peer_id:Peer saved_peer_id:flags.28?Peer reply_to:flags.3?MessageReplyHeader date:int action:MessageAction reactions:flags.20?MessageReactions ttl_period:flags.25?int = Message;
 
 messageMediaEmpty#3ded6320 = MessageMedia;
 messageMediaPhoto#695150d7 flags:# spoiler:flags.3?true photo:flags.0?Photo ttl_seconds:flags.2?int = MessageMedia;
 messageMediaGeo#56e0d474 geo:GeoPoint = MessageMedia;
 messageMediaContact#70322949 phone_number:string first_name:string last_name:string vcard:string user_id:long = MessageMedia;
 messageMediaUnsupported#9f84f49e = MessageMedia;
-messageMediaDocument#4cf4d72d flags:# nopremium:flags.3?true spoiler:flags.4?true video:flags.6?true round:flags.7?true voice:flags.8?true document:flags.0?Document alt_document:flags.5?Document ttl_seconds:flags.2?int = MessageMedia;
+messageMediaDocument#52d8ccd9 flags:# nopremium:flags.3?true spoiler:flags.4?true video:flags.6?true round:flags.7?true voice:flags.8?true document:flags.0?Document alt_documents:flags.5?Vector video_cover:flags.9?Photo video_timestamp:flags.10?int ttl_seconds:flags.2?int = MessageMedia;
 messageMediaWebPage#ddf10c3b flags:# force_large_media:flags.0?true force_small_media:flags.1?true manual:flags.3?true safe:flags.4?true webpage:WebPage = MessageMedia;
 messageMediaVenue#2ec0533f geo:GeoPoint title:string address:string provider:string venue_id:string venue_type:string = MessageMedia;
 messageMediaGame#fdb19008 game:Game = MessageMedia;
@@ -150,6 +152,7 @@ messageMediaStory#68cb6283 flags:# via_mention:flags.1?true peer:Peer id:int sto
 messageMediaGiveaway#aa073beb flags:# only_new_subscribers:flags.0?true winners_are_visible:flags.2?true channels:Vector countries_iso2:flags.1?Vector prize_description:flags.3?string quantity:int months:flags.4?int stars:flags.5?long until_date:int = MessageMedia;
 messageMediaGiveawayResults#ceaa3ea1 flags:# only_new_subscribers:flags.0?true refunded:flags.2?true channel_id:long additional_peers_count:flags.3?int launch_msg_id:int winners_count:int unclaimed_count:int winners:Vector months:flags.4?int stars:flags.5?long prize_description:flags.1?string until_date:int = MessageMedia;
 messageMediaPaidMedia#a8852491 stars_amount:long extended_media:Vector = MessageMedia;
+messageMediaToDo#8a53b014 flags:# todo:TodoList completions:flags.0?Vector = MessageMedia;
 
 messageActionEmpty#b6aef7b0 = MessageAction;
 messageActionChatCreate#bd47cbad title:string users:Vector = MessageAction;
@@ -165,8 +168,8 @@ messageActionChannelMigrateFrom#ea3948e9 title:string chat_id:long = MessageActi
 messageActionPinMessage#94bd38ed = MessageAction;
 messageActionHistoryClear#9fbab604 = MessageAction;
 messageActionGameScore#92a72876 game_id:long score:int = MessageAction;
-messageActionPaymentSentMe#8f31b327 flags:# recurring_init:flags.2?true recurring_used:flags.3?true currency:string total_amount:long payload:bytes info:flags.0?PaymentRequestedInfo shipping_option_id:flags.1?string charge:PaymentCharge = MessageAction;
-messageActionPaymentSent#96163f56 flags:# recurring_init:flags.2?true recurring_used:flags.3?true currency:string total_amount:long invoice_slug:flags.0?string = MessageAction;
+messageActionPaymentSentMe#ffa00ccc flags:# recurring_init:flags.2?true recurring_used:flags.3?true currency:string total_amount:long payload:bytes info:flags.0?PaymentRequestedInfo shipping_option_id:flags.1?string charge:PaymentCharge subscription_until_date:flags.4?int = MessageAction;
+messageActionPaymentSent#c624b16e flags:# recurring_init:flags.2?true recurring_used:flags.3?true currency:string total_amount:long invoice_slug:flags.0?string subscription_until_date:flags.4?int = MessageAction;
 messageActionPhoneCall#80e11a7f flags:# video:flags.2?true call_id:long reason:flags.0?PhoneCallDiscardReason duration:flags.1?int = MessageAction;
 messageActionScreenshotTaken#4792929b = MessageAction;
 messageActionCustomAction#fae69f56 message:string = MessageAction;
@@ -179,17 +182,17 @@ messageActionGroupCall#7a0d7f42 flags:# call:InputGroupCall duration:flags.0?int
 messageActionInviteToGroupCall#502f92f7 call:InputGroupCall users:Vector = MessageAction;
 messageActionSetMessagesTTL#3c134d7b flags:# period:int auto_setting_from:flags.0?long = MessageAction;
 messageActionGroupCallScheduled#b3a07661 call:InputGroupCall schedule_date:int = MessageAction;
-messageActionSetChatTheme#aa786345 emoticon:string = MessageAction;
+messageActionSetChatTheme#b91bbd3a theme:ChatTheme = MessageAction;
 messageActionChatJoinedByRequest#ebbca3cb = MessageAction;
 messageActionWebViewDataSentMe#47dd8079 text:string data:string = MessageAction;
 messageActionWebViewDataSent#b4c38cb5 text:string = MessageAction;
-messageActionGiftPremium#c83d6aec flags:# currency:string amount:long months:int crypto_currency:flags.0?string crypto_amount:flags.0?long = MessageAction;
-messageActionTopicCreate#d999256 flags:# title:string icon_color:int icon_emoji_id:flags.0?long = MessageAction;
+messageActionGiftPremium#6c6274fa flags:# currency:string amount:long months:int crypto_currency:flags.0?string crypto_amount:flags.0?long message:flags.1?TextWithEntities = MessageAction;
+messageActionTopicCreate#d999256 flags:# title_missing:flags.1?true title:string icon_color:int icon_emoji_id:flags.0?long = MessageAction;
 messageActionTopicEdit#c0944820 flags:# title:flags.0?string icon_emoji_id:flags.1?long closed:flags.2?Bool hidden:flags.3?Bool = MessageAction;
 messageActionSuggestProfilePhoto#57de635e photo:Photo = MessageAction;
 messageActionRequestedPeer#31518e9b button_id:int peers:Vector = MessageAction;
 messageActionSetChatWallPaper#5060a3f4 flags:# same:flags.0?true for_both:flags.1?true wallpaper:WallPaper = MessageAction;
-messageActionGiftCode#678c2e09 flags:# via_giveaway:flags.0?true unclaimed:flags.2?true boost_peer:flags.1?Peer months:int slug:string currency:flags.2?string amount:flags.2?long crypto_currency:flags.3?string crypto_amount:flags.3?long = MessageAction;
+messageActionGiftCode#56d03994 flags:# via_giveaway:flags.0?true unclaimed:flags.5?true boost_peer:flags.1?Peer months:int slug:string currency:flags.2?string amount:flags.2?long crypto_currency:flags.3?string crypto_amount:flags.3?long message:flags.4?TextWithEntities = MessageAction;
 messageActionGiveawayLaunch#a80f51e4 flags:# stars:flags.0?long = MessageAction;
 messageActionGiveawayResults#87e2f155 flags:# stars:flags.0?true winners_count:int unclaimed_count:int = MessageAction;
 messageActionBoostApply#cc02aa6d boosts:int = MessageAction;
@@ -197,6 +200,24 @@ messageActionRequestedPeerSentMe#93b31848 button_id:int peers:Vector = MessageAction;
+messageActionTodoCompletions#cc7c5c89 completed:Vector incompleted:Vector = MessageAction;
+messageActionTodoAppendTasks#c7edbc83 list:Vector = MessageAction;
+messageActionSuggestedPostApproval#ee7a1596 flags:# rejected:flags.0?true balance_too_low:flags.1?true reject_comment:flags.2?string schedule_date:flags.3?int price:flags.4?StarsAmount = MessageAction;
+messageActionSuggestedPostSuccess#95ddcf69 price:StarsAmount = MessageAction;
+messageActionSuggestedPostRefund#69f916f8 flags:# payer_initiated:flags.0?true = MessageAction;
+messageActionGiftTon#a8a3c699 flags:# currency:string amount:long crypto_currency:string crypto_amount:long transaction_id:flags.0?string = MessageAction;
+messageActionPhoneNumberRequest#1baa035 = MessageAction;
+messageActionSuggestBirthday#2c8f2a25 birthday:Birthday = MessageAction;
+messageActionUserJoined#55555550 = MessageAction;
+messageActionUserUpdatedPhoto#55555551 new_user_photo:UserProfilePhoto = MessageAction;
+messageActionTTLChange#55555552 ttl:int = MessageAction;
+messageActionCreatedBroadcastList#55555557 = MessageAction;
+messageActionLoginUnknownLocation#555555f5 title:string address:string = MessageAction;
 
 dialog#d58a08c6 flags:# pinned:flags.2?true unread_mark:flags.3?true view_forum_as_messages:flags.6?true peer:Peer top_message:int read_inbox_max_id:int read_outbox_max_id:int unread_count:int unread_mentions_count:int unread_reactions_count:int notify_settings:PeerNotifySettings pts:flags.0?int draft:flags.1?DraftMessage folder_id:flags.4?int ttl_period:flags.5?int = Dialog;
 dialogFolder#71bd134c flags:# pinned:flags.2?true folder:Folder peer:Peer top_message:int unread_muted_peers_count:int unread_unmuted_peers_count:int unread_muted_messages_count:int unread_unmuted_messages_count:int = Dialog;
@@ -216,6 +237,7 @@ geoPoint#b2a2f663 flags:# long:double lat:double access_hash:long accuracy_radiu
 
 auth.sentCode#5e002502 flags:# type:auth.SentCodeType phone_code_hash:string next_type:flags.1?auth.CodeType timeout:flags.2?int = auth.SentCode;
 auth.sentCodeSuccess#2390fe44 authorization:auth.Authorization = auth.SentCode;
+auth.sentCodePaymentRequired#e0955a3c store_product:string phone_code_hash:string support_email_address:string support_email_subject:string currency:string amount:long = auth.SentCode;
 
 auth.authorization#2ea2c0d4 flags:# setup_password_required:flags.1?true otherwise_relogin_days:flags.1?int tmp_sessions:flags.0?int future_auth_token:flags.2?bytes user:User = auth.Authorization;
 auth.authorizationSignUpRequired#44747e9a flags:# terms_of_service:flags.0?help.TermsOfService = auth.Authorization;
@@ -232,7 +254,7 @@ inputPeerNotifySettings#cacb6ae2 flags:# show_previews:flags.0?Bool silent:flags
 
 peerNotifySettings#99622c0c flags:# show_previews:flags.0?Bool silent:flags.1?Bool mute_until:flags.2?int ios_sound:flags.3?NotificationSound android_sound:flags.4?NotificationSound other_sound:flags.5?NotificationSound stories_muted:flags.6?Bool stories_hide_sender:flags.7?Bool stories_ios_sound:flags.8?NotificationSound stories_android_sound:flags.9?NotificationSound stories_other_sound:flags.10?NotificationSound = PeerNotifySettings;
 
-peerSettings#acd66c5e flags:# report_spam:flags.0?true add_contact:flags.1?true block_contact:flags.2?true share_contact:flags.3?true need_contacts_exception:flags.4?true report_geo:flags.5?true autoarchived:flags.7?true invite_members:flags.8?true request_chat_broadcast:flags.10?true business_bot_paused:flags.11?true business_bot_can_reply:flags.12?true geo_distance:flags.6?int request_chat_title:flags.9?string request_chat_date:flags.9?int business_bot_id:flags.13?long business_bot_manage_url:flags.13?string = PeerSettings;
+peerSettings#f47741f7 flags:# report_spam:flags.0?true add_contact:flags.1?true block_contact:flags.2?true share_contact:flags.3?true need_contacts_exception:flags.4?true report_geo:flags.5?true autoarchived:flags.7?true invite_members:flags.8?true request_chat_broadcast:flags.10?true business_bot_paused:flags.11?true business_bot_can_reply:flags.12?true geo_distance:flags.6?int request_chat_title:flags.9?string request_chat_date:flags.9?int business_bot_id:flags.13?long business_bot_manage_url:flags.13?string charge_paid_message_stars:flags.14?long registration_month:flags.15?string phone_country:flags.16?string name_change_date:flags.17?int photo_change_date:flags.18?int = PeerSettings;
 
 wallPaper#a437c3ed id:long flags:# creator:flags.0?true default:flags.1?true pattern:flags.3?true dark:flags.4?true access_hash:long slug:string document:Document settings:flags.2?WallPaperSettings = WallPaper;
 wallPaperNoFile#e0804116 id:long flags:# default:flags.1?true dark:flags.4?true settings:flags.2?WallPaperSettings = WallPaper;
@@ -248,7 +270,7 @@ inputReportReasonFake#f5ddd6e7 = ReportReason;
 inputReportReasonIllegalDrugs#a8eb2be = ReportReason;
 inputReportReasonPersonalDetails#9ec7863d = ReportReason;
 
-userFull#cc997720 flags:# blocked:flags.0?true phone_calls_available:flags.4?true phone_calls_private:flags.5?true can_pin_message:flags.7?true has_scheduled:flags.12?true video_calls_available:flags.13?true voice_messages_forbidden:flags.20?true translations_disabled:flags.23?true stories_pinned_available:flags.26?true blocked_my_stories_from:flags.27?true wallpaper_overridden:flags.28?true contact_require_premium:flags.29?true read_dates_private:flags.30?true flags2:# sponsored_enabled:flags2.7?true id:long about:flags.1?string settings:PeerSettings personal_photo:flags.21?Photo profile_photo:flags.2?Photo fallback_photo:flags.22?Photo notify_settings:PeerNotifySettings bot_info:flags.3?BotInfo pinned_msg_id:flags.6?int common_chats_count:int folder_id:flags.11?int ttl_period:flags.14?int theme_emoticon:flags.15?string private_forward_name:flags.16?string bot_group_admin_rights:flags.17?ChatAdminRights bot_broadcast_admin_rights:flags.18?ChatAdminRights premium_gifts:flags.19?Vector wallpaper:flags.24?WallPaper stories:flags.25?PeerStories business_work_hours:flags2.0?BusinessWorkHours business_location:flags2.1?BusinessLocation business_greeting_message:flags2.2?BusinessGreetingMessage business_away_message:flags2.3?BusinessAwayMessage business_intro:flags2.4?BusinessIntro birthday:flags2.5?Birthday personal_channel_id:flags2.6?long personal_channel_message:flags2.6?int = UserFull;
+userFull#a02bc13e flags:# blocked:flags.0?true phone_calls_available:flags.4?true phone_calls_private:flags.5?true can_pin_message:flags.7?true has_scheduled:flags.12?true video_calls_available:flags.13?true voice_messages_forbidden:flags.20?true translations_disabled:flags.23?true stories_pinned_available:flags.26?true blocked_my_stories_from:flags.27?true wallpaper_overridden:flags.28?true contact_require_premium:flags.29?true read_dates_private:flags.30?true flags2:# sponsored_enabled:flags2.7?true can_view_revenue:flags2.9?true bot_can_manage_emoji_status:flags2.10?true display_gifts_button:flags2.16?true id:long about:flags.1?string settings:PeerSettings personal_photo:flags.21?Photo profile_photo:flags.2?Photo fallback_photo:flags.22?Photo notify_settings:PeerNotifySettings bot_info:flags.3?BotInfo pinned_msg_id:flags.6?int common_chats_count:int folder_id:flags.11?int ttl_period:flags.14?int theme:flags.15?ChatTheme private_forward_name:flags.16?string bot_group_admin_rights:flags.17?ChatAdminRights bot_broadcast_admin_rights:flags.18?ChatAdminRights wallpaper:flags.24?WallPaper stories:flags.25?PeerStories business_work_hours:flags2.0?BusinessWorkHours business_location:flags2.1?BusinessLocation business_greeting_message:flags2.2?BusinessGreetingMessage business_away_message:flags2.3?BusinessAwayMessage business_intro:flags2.4?BusinessIntro birthday:flags2.5?Birthday personal_channel_id:flags2.6?long personal_channel_message:flags2.6?int stargifts_count:flags2.8?int starref_program:flags2.11?StarRefProgram bot_verification:flags2.12?BotVerification send_paid_messages_stars:flags2.14?long disallowed_stargifts:flags2.15?DisallowedGiftsSettings stars_rating:flags2.17?StarsRating stars_my_pending_rating:flags2.18?StarsRating stars_my_pending_rating_date:flags2.18?int main_tab:flags2.20?ProfileTab saved_music:flags2.21?Document note:flags2.22?TextWithEntities = UserFull;
 
 contact#145ade0b user_id:long mutual:Bool = Contact;
 
@@ -268,8 +290,8 @@ messages.dialogs#15ba6c40 dialogs:Vector messages:Vector chats:
 messages.dialogsSlice#71e094f3 count:int dialogs:Vector messages:Vector chats:Vector users:Vector = messages.Dialogs;
 messages.dialogsNotModified#f0e3e596 count:int = messages.Dialogs;
 
-messages.messages#8c718e87 messages:Vector chats:Vector users:Vector = messages.Messages;
-messages.messagesSlice#3a54685e flags:# inexact:flags.1?true count:int next_rate:flags.0?int offset_id_offset:flags.2?int messages:Vector chats:Vector users:Vector = messages.Messages;
+messages.messages#1d73e7ea messages:Vector topics:Vector chats:Vector users:Vector = messages.Messages;
+messages.messagesSlice#5f206716 flags:# inexact:flags.1?true count:int next_rate:flags.0?int offset_id_offset:flags.2?int search_flood:flags.3?SearchPostsFlood messages:Vector topics:Vector chats:Vector users:Vector = messages.Messages;
 messages.channelMessages#c776ba4e flags:# inexact:flags.1?true pts:int count:int offset_id_offset:flags.2?int messages:Vector topics:Vector chats:Vector users:Vector = messages.Messages;
 messages.messagesNotModified#74535f21 count:int = messages.Messages;
 
@@ -297,11 +319,12 @@ inputMessagesFilterMyMentions#c1f8e69a = MessagesFilter;
 inputMessagesFilterGeo#e7026d0d = MessagesFilter;
 inputMessagesFilterContacts#e062db83 = MessagesFilter;
 inputMessagesFilterPinned#1bb00451 = MessagesFilter;
+inputMessagesFilterPhotoVideoDocuments#d95e73bb = MessagesFilter;
 
 updateNewMessage#1f2b0afd message:Message pts:int pts_count:int = Update;
 updateMessageID#4e90bfd6 id:int random_id:long = Update;
 updateDeleteMessages#a20db0e5 messages:Vector pts:int pts_count:int = Update;
-updateUserTyping#c01e857f user_id:long action:SendMessageAction = Update;
+updateUserTyping#2a17bf5c flags:# user_id:long top_msg_id:flags.0?int action:SendMessageAction = Update;
 updateChatUserTyping#83487af0 chat_id:long from_id:Peer action:SendMessageAction = Update;
 updateChatParticipants#7761198 participants:ChatParticipants = Update;
 updateUserStatus#e5bdf8de user_id:long status:UserStatus = Update;
@@ -318,7 +341,7 @@ updateNotifySettings#bec268ef peer:NotifyPeer notify_settings:PeerNotifySettings
 updateServiceNotification#ebe46819 flags:# popup:flags.0?true invert_media:flags.2?true inbox_date:flags.1?int type:string message:string media:MessageMedia entities:Vector = Update;
 updatePrivacy#ee3b272a key:PrivacyKey rules:Vector = Update;
 updateUserPhone#5492a13 user_id:long phone:string = Update;
-updateReadHistoryInbox#9c974fdf flags:# folder_id:flags.0?int peer:Peer max_id:int still_unread_count:int pts:int pts_count:int = Update;
+updateReadHistoryInbox#9e84bc99 flags:# folder_id:flags.0?int peer:Peer top_msg_id:flags.1?int max_id:int still_unread_count:int pts:int pts_count:int = Update;
 updateReadHistoryOutbox#2f2f21bf peer:Peer max_id:int pts:int pts_count:int = Update;
 updateWebPage#7f891213 webpage:WebPage pts:int pts_count:int = Update;
 updateReadMessagesContents#f8227181 flags:# messages:Vector pts:int pts_count:int date:flags.0?int = Update;
@@ -340,7 +363,7 @@ updateBotCallbackQuery#b9cfc48d flags:# query_id:long user_id:long peer:Peer msg
 updateEditMessage#e40370a3 message:Message pts:int pts_count:int = Update;
 updateInlineBotCallbackQuery#691e9052 flags:# query_id:long user_id:long msg_id:InputBotInlineMessageID chat_instance:long data:flags.0?bytes game_short_name:flags.1?string = Update;
 updateReadChannelOutbox#b75f99a9 channel_id:long max_id:int = Update;
-updateDraftMessage#1b49ec6d flags:# peer:Peer top_msg_id:flags.0?int draft:DraftMessage = Update;
+updateDraftMessage#edfc111e flags:# peer:Peer top_msg_id:flags.0?int saved_peer_id:flags.1?Peer draft:DraftMessage = Update;
 updateReadFeaturedStickers#571d2742 = Update;
 updateRecentStickers#9a422c20 = Update;
 updateConfig#a229dd06 = Update;
@@ -356,17 +379,17 @@ updatePhoneCall#ab0f6b1e phone_call:PhoneCall = Update;
 updateLangPackTooLong#46560264 lang_code:string = Update;
 updateLangPack#56022f4d difference:LangPackDifference = Update;
 updateFavedStickers#e511996d = Update;
-updateChannelReadMessagesContents#ea29055d flags:# channel_id:long top_msg_id:flags.0?int messages:Vector = Update;
+updateChannelReadMessagesContents#25f324f7 flags:# channel_id:long top_msg_id:flags.0?int saved_peer_id:flags.1?Peer messages:Vector = Update;
 updateContactsReset#7084a7be = Update;
 updateChannelAvailableMessages#b23fc698 channel_id:long available_min_id:int = Update;
-updateDialogUnreadMark#e16459c3 flags:# unread:flags.0?true peer:DialogPeer = Update;
+updateDialogUnreadMark#b658f23e flags:# unread:flags.0?true peer:DialogPeer saved_peer_id:flags.1?Peer = Update;
 updateMessagePoll#aca1657b flags:# poll_id:long poll:flags.0?Poll results:PollResults = Update;
 updateChatDefaultBannedRights#54c01850 peer:Peer default_banned_rights:ChatBannedRights version:int = Update;
 updateFolderPeers#19360dc0 folder_peers:Vector pts:int pts_count:int = Update;
 updatePeerSettings#6a7e7366 peer:Peer settings:PeerSettings = Update;
 updatePeerLocated#b4afcfb0 peers:Vector = Update;
 updateNewScheduledMessage#39a51dfb message:Message = Update;
-updateDeleteScheduledMessages#90866cee peer:Peer messages:Vector = Update;
+updateDeleteScheduledMessages#f2a71983 flags:# peer:Peer messages:Vector sent_messages:flags.0?Vector = Update;
 updateTheme#8216fba3 theme:Theme = Update;
 updateGeoLiveViewed#871fb939 peer:Peer msg_id:int = Update;
 updateLoginToken#564fe691 = Update;
@@ -384,7 +407,7 @@ updatePinnedMessages#ed85eab5 flags:# pinned:flags.0?true peer:Peer messages:Vec
 updatePinnedChannelMessages#5bb98608 flags:# pinned:flags.0?true channel_id:long messages:Vector pts:int pts_count:int = Update;
 updateChat#f89a6a4e chat_id:long = Update;
 updateGroupCallParticipants#f2ebdb4e call:InputGroupCall participants:Vector version:int = Update;
-updateGroupCall#14b24500 chat_id:long call:GroupCall = Update;
+updateGroupCall#97d64341 flags:# chat_id:flags.0?long call:GroupCall = Update;
 updatePeerHistoryTTL#bb9bb9a5 flags:# peer:Peer ttl_period:flags.0?int = Update;
 updateChatParticipant#d087663a flags:# chat_id:long date:int actor_id:long user_id:long prev_participant:flags.0?ChatParticipant new_participant:flags.1?ChatParticipant invite:flags.2?ExportedChatInvite qts:int = Update;
 updateChannelParticipant#985d3abb flags:# via_chatlist:flags.3?true channel_id:long date:int actor_id:long user_id:long prev_participant:flags.0?ChannelParticipant new_participant:flags.1?ChannelParticipant invite:flags.2?ExportedChatInvite qts:int = Update;
@@ -393,7 +416,7 @@ updateGroupCallConnection#b783982 flags:# presentation:flags.0?true params:DataJ
 updateBotCommands#4d712f2e peer:Peer bot_id:long commands:Vector = Update;
 updatePendingJoinRequests#7063c3db peer:Peer requests_pending:int recent_requesters:Vector = Update;
 updateBotChatInviteRequester#11dfa986 peer:Peer date:int user_id:long about:string invite:ExportedChatInvite qts:int = Update;
-updateMessageReactions#5e1b3cb8 flags:# peer:Peer msg_id:int top_msg_id:flags.0?int reactions:MessageReactions = Update;
+updateMessageReactions#1e297bfa flags:# peer:Peer msg_id:int top_msg_id:flags.0?int saved_peer_id:flags.1?Peer reactions:MessageReactions = Update;
 updateAttachMenuBots#17b7a20b = Update;
 updateWebViewResultSent#1592b79d query_id:long = Update;
 updateBotMenuButton#14b85813 bot_id:long button:BotMenuButton = Update;
@@ -433,12 +456,22 @@ updateBotNewBusinessMessage#9ddb347c flags:# connection_id:string message:Messag
 updateBotEditBusinessMessage#7df587c flags:# connection_id:string message:Message reply_to_message:flags.0?Message qts:int = Update;
 updateBotDeleteBusinessMessage#a02a982e connection_id:string peer:Peer messages:Vector qts:int = Update;
 updateNewStoryReaction#1824e40b story_id:int peer:Peer reaction:Reaction = Update;
-updateBroadcastRevenueTransactions#dfd961f5 peer:Peer balances:BroadcastRevenueBalances = Update;
-updateStarsBalance#fb85198 balance:long = Update;
+updateStarsBalance#4e80a379 balance:StarsAmount = Update;
 updateBusinessBotCallbackQuery#1ea2fda7 flags:# query_id:long user_id:long connection_id:string message:Message reply_to_message:flags.2?Message chat_instance:long data:flags.0?bytes = Update;
 updateStarsRevenueStatus#a584b019 peer:Peer status:StarsRevenueStatus = Update;
 updateBotPurchasedPaidMedia#283bd312 user_id:long payload:string qts:int = Update;
-updatePaidReactionPrivacy#51ca7aec private:Bool = Update;
+updatePaidReactionPrivacy#8b725fce private:PaidReactionPrivacy = Update;
+updateSentPhoneCode#504aa18f sent_code:auth.SentCode = Update;
+updateGroupCallChainBlocks#a477288f call:InputGroupCall sub_chain_id:int blocks:Vector next_offset:int = Update;
+updateReadMonoForumInbox#77b0e372 channel_id:long saved_peer_id:Peer read_max_id:int = Update;
+updateReadMonoForumOutbox#a4a79376 channel_id:long saved_peer_id:Peer read_max_id:int = Update;
+updateMonoForumNoPaidException#9f812b08 flags:# exception:flags.0?true channel_id:long saved_peer_id:Peer = Update;
+updatePinnedForumTopic#683b2c52 flags:# pinned:flags.0?int peer:Peer topic_id:int = Update;
+updateGroupCallMessage#78c314e0 call:InputGroupCall from_id:Peer random_id:long message:TextWithEntities = Update;
+updateTranscribeAudio#88617090 flags:# final:flags.0?true transcription_id:long text:string = Update;
+updateBotSubscriptionExpire#a8ae3eb1 user_id:long payload:string until_date:int qts:int = Update;
+updateGroupCallEncryptedMessage#c957a766 call:InputGroupCall from_id:Peer encrypted_message:bytes = Update;
+updatePinnedForumTopics#def143d0 flags:# peer:Peer order:flags.0?Vector = Update;
 
 updates.state#a56c2a3e pts:int qts:int date:int seq:int unread_count:int = updates.State;
 
@@ -531,6 +564,7 @@ sendMessageHistoryImportAction#dbda9246 progress:int = SendMessageAction;
 sendMessageChooseStickerAction#b05ac6b1 = SendMessageAction;
 sendMessageEmojiInteraction#25972bcb emoticon:string msg_id:int interaction:DataJSON = SendMessageAction;
 sendMessageEmojiInteractionSeen#b665902e emoticon:string = SendMessageAction;
+sendMessageTextDraftAction#376d975c random_id:long text:TextWithEntities = SendMessageAction;
 
 contacts.found#b3134d9d my_results:Vector results:Vector chats:Vector users:Vector = contacts.Found;
 
@@ -545,6 +579,8 @@ inputPrivacyKeyAddedByPhone#d1219bdd = InputPrivacyKey;
 inputPrivacyKeyVoiceMessages#aee69d68 = InputPrivacyKey;
 inputPrivacyKeyAbout#3823cc40 = InputPrivacyKey;
 inputPrivacyKeyBirthday#d65a11cc = InputPrivacyKey;
+inputPrivacyKeyStarGiftsAutoSave#e1732341 = InputPrivacyKey;
+inputPrivacyKeyNoPaidMessages#bdc597b4 = InputPrivacyKey;
 
 privacyKeyStatusTimestamp#bc2eab30 = PrivacyKey;
 privacyKeyChatInvite#500e6dfa = PrivacyKey;
@@ -557,6 +593,8 @@ privacyKeyAddedByPhone#42ffd42b = PrivacyKey;
 privacyKeyVoiceMessages#697f414 = PrivacyKey;
 privacyKeyAbout#a486b761 = PrivacyKey;
 privacyKeyBirthday#2000a518 = PrivacyKey;
+privacyKeyStarGiftsAutoSave#2ca4fdf8 = PrivacyKey;
+privacyKeyNoPaidMessages#17d348d2 = PrivacyKey;
 
 inputPrivacyValueAllowContacts#d09e07b = InputPrivacyRule;
 inputPrivacyValueAllowAll#184b35ce = InputPrivacyRule;
@@ -568,6 +606,8 @@ inputPrivacyValueAllowChatParticipants#840649cf chats:Vector = InputPrivac
 inputPrivacyValueDisallowChatParticipants#e94f0f86 chats:Vector = InputPrivacyRule;
 inputPrivacyValueAllowCloseFriends#2f453e49 = InputPrivacyRule;
 inputPrivacyValueAllowPremium#77cdc9f1 = InputPrivacyRule;
+inputPrivacyValueAllowBots#5a4fcce5 = InputPrivacyRule;
+inputPrivacyValueDisallowBots#c4e57915 = InputPrivacyRule;
 
 privacyValueAllowContacts#fffe1bac = PrivacyRule;
 privacyValueAllowAll#65427b82 = PrivacyRule;
@@ -579,6 +619,8 @@ privacyValueAllowChatParticipants#6b134e8e chats:Vector = PrivacyRule;
 privacyValueDisallowChatParticipants#41c87565 chats:Vector = PrivacyRule;
 privacyValueAllowCloseFriends#f7e8d89b = PrivacyRule;
 privacyValueAllowPremium#ece9814b = PrivacyRule;
+privacyValueAllowBots#21461b5d = PrivacyRule;
+privacyValueDisallowBots#f6a5f82f = PrivacyRule;
 
 account.privacyRules#50a04e45 rules:Vector chats:Vector users:Vector = account.PrivacyRules;
 
@@ -587,7 +629,7 @@ accountDaysTTL#b8d0afdf days:int = AccountDaysTTL;
 documentAttributeImageSize#6c37c15c w:int h:int = DocumentAttribute;
 documentAttributeAnimated#11b58939 = DocumentAttribute;
 documentAttributeSticker#6319d612 flags:# mask:flags.1?true alt:string stickerset:InputStickerSet mask_coords:flags.0?MaskCoords = DocumentAttribute;
-documentAttributeVideo#17399fad flags:# round_message:flags.0?true supports_streaming:flags.1?true nosound:flags.3?true duration:double w:int h:int preload_prefix_size:flags.2?int video_start_ts:flags.4?double = DocumentAttribute;
+documentAttributeVideo#43c57c48 flags:# round_message:flags.0?true supports_streaming:flags.1?true nosound:flags.3?true duration:double w:int h:int preload_prefix_size:flags.2?int video_start_ts:flags.4?double video_codec:flags.5?string = DocumentAttribute;
 documentAttributeAudio#9852f9c6 flags:# voice:flags.10?true duration:int title:flags.0?string performer:flags.1?string waveform:flags.2?bytes = DocumentAttribute;
 documentAttributeFilename#15590068 file_name:string = DocumentAttribute;
 documentAttributeHasStickers#9801d2f7 = DocumentAttribute;
@@ -605,8 +647,9 @@ messages.affectedMessages#84d19185 pts:int pts_count:int = messages.AffectedMess
 
 webPageEmpty#211a1788 flags:# id:long url:flags.0?string = WebPage;
 webPagePending#b0d13e47 flags:# id:long url:flags.0?string date:int = WebPage;
-webPage#e89c45b2 flags:# has_large_media:flags.13?true id:long url:string display_url:string hash:int type:flags.0?string site_name:flags.1?string title:flags.2?string description:flags.3?string photo:flags.4?Photo embed_url:flags.5?string embed_type:flags.5?string embed_width:flags.6?int embed_height:flags.6?int duration:flags.7?int author:flags.8?string document:flags.9?Document cached_page:flags.10?Page attributes:flags.12?Vector = WebPage;
+webPage#e89c45b2 flags:# has_large_media:flags.13?true video_cover_photo:flags.14?true id:long url:string display_url:string hash:int type:flags.0?string site_name:flags.1?string title:flags.2?string description:flags.3?string photo:flags.4?Photo embed_url:flags.5?string embed_type:flags.5?string embed_width:flags.6?int embed_height:flags.6?int duration:flags.7?int author:flags.8?string document:flags.9?Document cached_page:flags.10?Page attributes:flags.12?Vector = WebPage;
 webPageNotModified#7311ca11 flags:# cached_page_views:flags.0?int = WebPage;
+webPageUrlPending#d41a5167 url:string = WebPage;
 
 authorization#ad01d61d flags:# current:flags.0?true official_app:flags.1?true password_pending:flags.2?true encrypted_requests_disabled:flags.3?true call_requests_disabled:flags.4?true unconfirmed:flags.5?true hash:long device_model:string platform:string system_version:string api_id:int app_name:string app_version:string date_created:int date_active:int ip:string country:string region:string = Authorization;
 
@@ -626,7 +669,7 @@ chatInviteExported#a22cbd96 flags:# revoked:flags.0?true permanent:flags.5?true
 chatInvitePublicJoinRequests#ed107ab7 = ExportedChatInvite;
 
 chatInviteAlready#5a686d7c chat:Chat = ChatInvite;
-chatInvite#fe65389d flags:# channel:flags.0?true broadcast:flags.1?true public:flags.2?true megagroup:flags.3?true request_needed:flags.6?true verified:flags.7?true scam:flags.8?true fake:flags.9?true can_refulfill_subscription:flags.11?true title:string about:flags.5?string photo:Photo participants_count:int participants:flags.4?Vector color:int subscription_pricing:flags.10?StarsSubscriptionPricing subscription_form_id:flags.12?long = ChatInvite;
+chatInvite#5c9d3702 flags:# channel:flags.0?true broadcast:flags.1?true public:flags.2?true megagroup:flags.3?true request_needed:flags.6?true verified:flags.7?true scam:flags.8?true fake:flags.9?true can_refulfill_subscription:flags.11?true title:string about:flags.5?string photo:Photo participants_count:int participants:flags.4?Vector color:int subscription_pricing:flags.10?StarsSubscriptionPricing subscription_form_id:flags.12?long bot_verification:flags.13?BotVerification = ChatInvite;
 chatInvitePeek#61695cb0 chat:Chat expires:int = ChatInvite;
 
 inputStickerSetEmpty#ffb62b95 = InputStickerSet;
@@ -640,6 +683,7 @@ inputStickerSetEmojiGenericAnimations#4c4d4ce = InputStickerSet;
 inputStickerSetEmojiDefaultStatuses#29d0f5ee = InputStickerSet;
 inputStickerSetEmojiDefaultTopicIcons#44c1f8e9 = InputStickerSet;
 inputStickerSetEmojiChannelDefaultStatuses#49748553 = InputStickerSet;
+inputStickerSetTonGifts#1cf671a0 = InputStickerSet;
 
 stickerSet#2dd14edc flags:# archived:flags.1?true official:flags.2?true masks:flags.3?true emojis:flags.7?true text_color:flags.9?true channel_emoji_status:flags.10?true creator:flags.11?true installed_date:flags.0?int id:long access_hash:long title:string short_name:string thumbs:flags.4?Vector thumb_dc_id:flags.4?int thumb_version:flags.4?int thumb_document_id:flags.8?long count:int hash:int = StickerSet;
 
@@ -648,7 +692,7 @@ messages.stickerSetNotModified#d3f924eb = messages.StickerSet;
 
 botCommand#c27ac8c7 command:string description:string = BotCommand;
 
-botInfo#82437e74 flags:# has_preview_medias:flags.6?true user_id:flags.0?long description:flags.1?string description_photo:flags.4?Photo description_document:flags.5?Document commands:flags.2?Vector menu_button:flags.3?BotMenuButton privacy_policy_url:flags.7?string = BotInfo;
+botInfo#4d8a0299 flags:# has_preview_medias:flags.6?true user_id:flags.0?long description:flags.1?string description_photo:flags.4?Photo description_document:flags.5?Document commands:flags.2?Vector menu_button:flags.3?BotMenuButton privacy_policy_url:flags.7?string app_settings:flags.8?BotAppSettings verifier_settings:flags.9?BotVerifierSettings = BotInfo;
 
 keyboardButton#a2fa4880 text:string = KeyboardButton;
 keyboardButtonUrl#258aff05 text:string url:string = KeyboardButton;
@@ -667,6 +711,7 @@ keyboardButtonWebView#13767230 text:string url:string = KeyboardButton;
 keyboardButtonSimpleWebView#a0c0505c text:string url:string = KeyboardButton;
 keyboardButtonRequestPeer#53d7bfd8 text:string button_id:int peer_type:RequestPeerType max_quantity:int = KeyboardButton;
 inputKeyboardButtonRequestPeer#c9662d05 flags:# name_requested:flags.0?true username_requested:flags.1?true photo_requested:flags.2?true text:string button_id:int peer_type:RequestPeerType max_quantity:int = KeyboardButton;
+keyboardButtonCopy#75d2698e text:string copy_text:string = KeyboardButton;
 
 keyboardButtonRow#77608b83 buttons:Vector = KeyboardButtonRow;
 
@@ -817,7 +862,7 @@ contacts.topPeers#70b772a8 categories:Vector chats:Vector<
 contacts.topPeersDisabled#b52c939d = contacts.TopPeers;
 
 draftMessageEmpty#1b0c841a flags:# date:flags.0?int = DraftMessage;
-draftMessage#2d65321f flags:# no_webpage:flags.1?true invert_media:flags.6?true reply_to:flags.4?InputReplyTo message:string entities:flags.3?Vector media:flags.5?InputMedia date:int effect:flags.7?long = DraftMessage;
+draftMessage#96eaa5eb flags:# no_webpage:flags.1?true invert_media:flags.6?true reply_to:flags.4?InputReplyTo message:string entities:flags.3?Vector media:flags.5?InputMedia date:int effect:flags.7?long suggested_post:flags.8?SuggestedPost = DraftMessage;
 
 messages.featuredStickersNotModified#c6dc0c66 count:int = messages.FeaturedStickers;
 messages.featuredStickers#be382906 flags:# premium:flags.0?true hash:long count:int sets:Vector unread:Vector = messages.FeaturedStickers;
@@ -900,12 +945,13 @@ phoneCallDiscardReasonMissed#85e42301 = PhoneCallDiscardReason;
 phoneCallDiscardReasonDisconnect#e095c1a0 = PhoneCallDiscardReason;
 phoneCallDiscardReasonHangup#57adc690 = PhoneCallDiscardReason;
 phoneCallDiscardReasonBusy#faf7e8c9 = PhoneCallDiscardReason;
+phoneCallDiscardReasonMigrateConferenceCall#9fbbf1f7 slug:string = PhoneCallDiscardReason;
 
 dataJSON#7d748d04 data:string = DataJSON;
 
 labeledPrice#cb296bf8 label:string amount:long = LabeledPrice;
 
-invoice#5db95a15 flags:# test:flags.0?true name_requested:flags.1?true phone_requested:flags.2?true email_requested:flags.3?true shipping_address_requested:flags.4?true flexible:flags.5?true phone_to_provider:flags.6?true email_to_provider:flags.7?true recurring:flags.9?true currency:string prices:Vector max_tip_amount:flags.8?long suggested_tip_amounts:flags.8?Vector terms_url:flags.10?string = Invoice;
+invoice#49ee584 flags:# test:flags.0?true name_requested:flags.1?true phone_requested:flags.2?true email_requested:flags.3?true shipping_address_requested:flags.4?true flexible:flags.5?true phone_to_provider:flags.6?true email_to_provider:flags.7?true recurring:flags.9?true currency:string prices:Vector max_tip_amount:flags.8?long suggested_tip_amounts:flags.8?Vector terms_url:flags.10?string subscription_period:flags.11?int = Invoice;
 
 paymentCharge#ea02c27e id:string provider_charge_id:string = PaymentCharge;
 
@@ -927,7 +973,8 @@ inputWebFileAudioAlbumThumbLocation#f46fe924 flags:# small:flags.2?true document
 upload.webFile#21e753bc size:int mime_type:string file_type:storage.FileType mtime:int bytes:bytes = upload.WebFile;
 
 payments.paymentForm#a0058751 flags:# can_save_credentials:flags.2?true password_missing:flags.3?true form_id:long bot_id:long title:string description:string photo:flags.5?WebDocument invoice:Invoice provider_id:long url:string native_provider:flags.4?string native_params:flags.4?DataJSON additional_methods:flags.6?Vector saved_info:flags.0?PaymentRequestedInfo saved_credentials:flags.1?Vector users:Vector = payments.PaymentForm;
-payments.paymentFormStars#7bf6b15c flags:# form_id:long bot_id:long title:string description:string photo:flags.5?WebDocument invoice:Invoice users:Vector = payments.PaymentForm;
+payments.paymentFormStars#7bf6b15c flags:# can_save_credentials:flags.2?true form_id:long password_missing:flags.3?true bot_id:long title:string description:string photo:flags.5?WebDocument invoice:Invoice users:Vector = payments.PaymentForm;
+payments.paymentFormStarGift#b425cfe1 form_id:long invoice:Invoice = payments.PaymentForm;
 
 payments.validatedRequestedInfo#d1451883 flags:# id:flags.0?string shipping_options:flags.1?Vector = payments.ValidatedRequestedInfo;
 
@@ -956,7 +1003,7 @@ phoneCallEmpty#5366c915 id:long = PhoneCall;
 phoneCallWaiting#c5226f17 flags:# video:flags.6?true id:long access_hash:long date:int admin_id:long participant_id:long protocol:PhoneCallProtocol receive_date:flags.0?int = PhoneCall;
 phoneCallRequested#14b0ed0c flags:# video:flags.6?true id:long access_hash:long date:int admin_id:long participant_id:long g_a_hash:bytes protocol:PhoneCallProtocol = PhoneCall;
 phoneCallAccepted#3660c311 flags:# video:flags.6?true id:long access_hash:long date:int admin_id:long participant_id:long g_b:bytes protocol:PhoneCallProtocol = PhoneCall;
-phoneCall#30535af5 flags:# p2p_allowed:flags.5?true video:flags.6?true id:long access_hash:long date:int admin_id:long participant_id:long g_a_or_b:bytes key_fingerprint:long protocol:PhoneCallProtocol connections:Vector start_date:int custom_parameters:flags.7?DataJSON = PhoneCall;
+phoneCall#30535af5 flags:# p2p_allowed:flags.5?true video:flags.6?true conference_supported:flags.8?true id:long access_hash:long date:int admin_id:long participant_id:long g_a_or_b:bytes key_fingerprint:long protocol:PhoneCallProtocol connections:Vector start_date:int custom_parameters:flags.7?DataJSON = PhoneCall;
 phoneCallDiscarded#50ca4de1 flags:# need_rating:flags.2?true need_debug:flags.3?true video:flags.6?true id:long reason:flags.0?PhoneCallDiscardReason duration:flags.1?int = PhoneCall;
 
 phoneConnection#9cc123c7 flags:# tcp:flags.0?true id:long ip:string ipv6:string port:int peer_tag:bytes = PhoneConnection;
@@ -1031,6 +1078,8 @@ channelAdminLogEventActionChangeEmojiStatus#3ea9feb1 prev_value:EmojiStatus new_
 channelAdminLogEventActionChangeEmojiStickerSet#46d840ab prev_stickerset:InputStickerSet new_stickerset:InputStickerSet = ChannelAdminLogEventAction;
 channelAdminLogEventActionToggleSignatureProfiles#60a79c79 new_value:Bool = ChannelAdminLogEventAction;
 channelAdminLogEventActionParticipantSubExtend#64642db3 prev_participant:ChannelParticipant new_participant:ChannelParticipant = ChannelAdminLogEventAction;
+channelAdminLogEventActionToggleAutotranslation#c517f77e new_value:Bool = ChannelAdminLogEventAction;
+channelAdminLogEventActionChangeTheme#fe69018d prev_value:string new_value:string = ChannelAdminLogEventAction;
 
 channelAdminLogEvent#1fad68cd id:long date:int user_id:long action:ChannelAdminLogEventAction = ChannelAdminLogEvent;
 
@@ -1194,7 +1243,7 @@ chatOnlines#f041e250 onlines:int = ChatOnlines;
 
 statsURL#47a971e0 url:string = StatsURL;
 
-chatAdminRights#5fb224d5 flags:# change_info:flags.0?true post_messages:flags.1?true edit_messages:flags.2?true delete_messages:flags.3?true ban_users:flags.4?true invite_users:flags.5?true pin_messages:flags.7?true add_admins:flags.9?true anonymous:flags.10?true manage_call:flags.11?true other:flags.12?true manage_topics:flags.13?true post_stories:flags.14?true edit_stories:flags.15?true delete_stories:flags.16?true = ChatAdminRights;
+chatAdminRights#5fb224d5 flags:# change_info:flags.0?true post_messages:flags.1?true edit_messages:flags.2?true delete_messages:flags.3?true ban_users:flags.4?true invite_users:flags.5?true pin_messages:flags.7?true add_admins:flags.9?true anonymous:flags.10?true manage_call:flags.11?true other:flags.12?true manage_topics:flags.13?true post_stories:flags.14?true edit_stories:flags.15?true delete_stories:flags.16?true manage_direct_messages:flags.17?true = ChatAdminRights;
 
 chatBannedRights#9f120418 flags:# view_messages:flags.0?true send_messages:flags.1?true send_media:flags.2?true send_stickers:flags.3?true send_gifs:flags.4?true send_games:flags.5?true send_inline:flags.6?true embed_links:flags.7?true send_polls:flags.8?true change_info:flags.10?true invite_users:flags.15?true pin_messages:flags.17?true manage_topics:flags.18?true send_photos:flags.19?true send_videos:flags.20?true send_roundvideos:flags.21?true send_audios:flags.22?true send_voices:flags.23?true send_docs:flags.24?true send_plain:flags.25?true until_date:int = ChatBannedRights;
 
@@ -1271,6 +1320,8 @@ themeSettings#fa58b6d4 flags:# message_colors_animated:flags.2?true base_theme:B
 webPageAttributeTheme#54b56617 flags:# documents:flags.0?Vector settings:flags.1?ThemeSettings = WebPageAttribute;
 webPageAttributeStory#2e94c3e7 flags:# peer:Peer id:int story:flags.0?StoryItem = WebPageAttribute;
 webPageAttributeStickerSet#50cc03d3 flags:# emojis:flags.0?true text_color:flags.1?true stickers:Vector = WebPageAttribute;
+webPageAttributeUniqueStarGift#cf6f6db8 gift:StarGift = WebPageAttribute;
+webPageAttributeStarGiftCollection#31cad303 icons:Vector = WebPageAttribute;
 
 messages.votesList#4899484e flags:# count:int votes:Vector chats:Vector users:Vector next_offset:flags.0?string = messages.VotesList;
 
@@ -1278,9 +1329,9 @@ bankCardOpenUrl#f568028a url:string name:string = BankCardOpenUrl;
 
 payments.bankCardData#3e24e573 title:string open_urls:Vector = payments.BankCardData;
 
-dialogFilter#5fb5523b flags:# contacts:flags.0?true non_contacts:flags.1?true groups:flags.2?true broadcasts:flags.3?true bots:flags.4?true exclude_muted:flags.11?true exclude_read:flags.12?true exclude_archived:flags.13?true id:int title:string emoticon:flags.25?string color:flags.27?int pinned_peers:Vector include_peers:Vector exclude_peers:Vector = DialogFilter;
+dialogFilter#aa472651 flags:# contacts:flags.0?true non_contacts:flags.1?true groups:flags.2?true broadcasts:flags.3?true bots:flags.4?true exclude_muted:flags.11?true exclude_read:flags.12?true exclude_archived:flags.13?true title_noanimate:flags.28?true id:int title:TextWithEntities emoticon:flags.25?string color:flags.27?int pinned_peers:Vector include_peers:Vector exclude_peers:Vector = DialogFilter;
 dialogFilterDefault#363293ae = DialogFilter;
-dialogFilterChatlist#9fe28ea4 flags:# has_my_invites:flags.26?true id:int title:string emoticon:flags.25?string color:flags.27?int pinned_peers:Vector include_peers:Vector = DialogFilter;
+dialogFilterChatlist#96537bd7 flags:# has_my_invites:flags.26?true title_noanimate:flags.28?true id:int title:TextWithEntities emoticon:flags.25?string color:flags.27?int pinned_peers:Vector include_peers:Vector = DialogFilter;
 
 dialogFilterSuggested#77744d4a filter:DialogFilter description:string = DialogFilterSuggested;
 
@@ -1297,7 +1348,7 @@ statsGraph#8ea464b6 flags:# json:DataJSON zoom_token:flags.0?string = StatsGraph
 stats.broadcastStats#396ca5fc period:StatsDateRangeDays followers:StatsAbsValueAndPrev views_per_post:StatsAbsValueAndPrev shares_per_post:StatsAbsValueAndPrev reactions_per_post:StatsAbsValueAndPrev views_per_story:StatsAbsValueAndPrev shares_per_story:StatsAbsValueAndPrev reactions_per_story:StatsAbsValueAndPrev enabled_notifications:StatsPercentValue growth_graph:StatsGraph followers_graph:StatsGraph mute_graph:StatsGraph top_hours_graph:StatsGraph interactions_graph:StatsGraph iv_interactions_graph:StatsGraph views_by_source_graph:StatsGraph new_followers_by_source_graph:StatsGraph languages_graph:StatsGraph reactions_by_emotion_graph:StatsGraph story_interactions_graph:StatsGraph story_reactions_by_emotion_graph:StatsGraph recent_posts_interactions:Vector = stats.BroadcastStats;
 
 help.promoDataEmpty#98f6ac75 expires:int = help.PromoData;
-help.promoData#8c39793f flags:# proxy:flags.0?true expires:int peer:Peer chats:Vector users:Vector psa_type:flags.1?string psa_message:flags.2?string = help.PromoData;
+help.promoData#8a4d87a flags:# proxy:flags.0?true expires:int peer:flags.3?Peer psa_type:flags.1?string psa_message:flags.2?string pending_suggestions:Vector dismissed_suggestions:Vector custom_pending_suggestion:flags.4?PendingSuggestion chats:Vector users:Vector = help.PromoData;
 
 videoSize#de33b094 flags:# type:string w:int h:int size:int video_start_ts:flags.0?double = VideoSize;
 videoSizeEmojiMarkup#f85c413c emoji_id:long background_colors:Vector = VideoSize;
@@ -1311,7 +1362,7 @@ statsGroupTopInviter#535f779d user_id:long invitations:int = StatsGroupTopInvite
 
 stats.megagroupStats#ef7ff916 period:StatsDateRangeDays members:StatsAbsValueAndPrev messages:StatsAbsValueAndPrev viewers:StatsAbsValueAndPrev posters:StatsAbsValueAndPrev growth_graph:StatsGraph members_graph:StatsGraph new_members_by_source_graph:StatsGraph languages_graph:StatsGraph messages_graph:StatsGraph actions_graph:StatsGraph top_hours_graph:StatsGraph weekdays_graph:StatsGraph top_posters:Vector top_admins:Vector top_inviters:Vector users:Vector = stats.MegagroupStats;
 
-globalPrivacySettings#734c4ccb flags:# archive_and_mute_new_noncontact_peers:flags.0?true keep_archived_unmuted:flags.1?true keep_archived_folders:flags.2?true hide_read_marks:flags.3?true new_noncontact_peers_require_premium:flags.4?true = GlobalPrivacySettings;
+globalPrivacySettings#fe41b34f flags:# archive_and_mute_new_noncontact_peers:flags.0?true keep_archived_unmuted:flags.1?true keep_archived_folders:flags.2?true hide_read_marks:flags.3?true new_noncontact_peers_require_premium:flags.4?true display_gifts_button:flags.7?true noncontact_peers_paid_stars:flags.5?long disallowed_gifts:flags.6?DisallowedGiftsSettings = GlobalPrivacySettings;
 
 help.countryCode#4203c5ef flags:# country_code:string prefixes:flags.0?Vector patterns:flags.1?Vector = help.CountryCode;
 
@@ -1326,7 +1377,7 @@ messages.messageViews#b6c4f543 views:Vector chats:Vector use
 
 messages.discussionMessage#a6341782 flags:# messages:Vector max_id:flags.0?int read_inbox_max_id:flags.1?int read_outbox_max_id:flags.2?int unread_count:int chats:Vector users:Vector = messages.DiscussionMessage;
 
-messageReplyHeader#afbc09db flags:# reply_to_scheduled:flags.2?true forum_topic:flags.3?true quote:flags.9?true reply_to_msg_id:flags.4?int reply_to_peer_id:flags.0?Peer reply_from:flags.5?MessageFwdHeader reply_media:flags.8?MessageMedia reply_to_top_id:flags.1?int quote_text:flags.6?string quote_entities:flags.7?Vector quote_offset:flags.10?int = MessageReplyHeader;
+messageReplyHeader#6917560b flags:# reply_to_scheduled:flags.2?true forum_topic:flags.3?true quote:flags.9?true reply_to_msg_id:flags.4?int reply_to_peer_id:flags.0?Peer reply_from:flags.5?MessageFwdHeader reply_media:flags.8?MessageMedia reply_to_top_id:flags.1?int quote_text:flags.6?string quote_entities:flags.7?Vector quote_offset:flags.10?int todo_item_id:flags.11?int = MessageReplyHeader;
 messageReplyStoryHeader#e5af939 peer:Peer story_id:int = MessageReplyHeader;
 
 messageReplies#83d60fc2 flags:# comments:flags.0?true replies:int replies_pts:int recent_repliers:flags.1?Vector channel_id:flags.0?long max_id:flags.2?int read_max_id:flags.3?int = MessageReplies;
@@ -1336,9 +1387,11 @@ peerBlocked#e8fd8014 peer_id:Peer date:int = PeerBlocked;
 stats.messageStats#7fe91c14 views_graph:StatsGraph reactions_by_emotion_graph:StatsGraph = stats.MessageStats;
 
 groupCallDiscarded#7780bcb4 id:long access_hash:long duration:int = GroupCall;
-groupCall#d597650c flags:# join_muted:flags.1?true can_change_join_muted:flags.2?true join_date_asc:flags.6?true schedule_start_subscribed:flags.8?true can_start_video:flags.9?true record_video_active:flags.11?true rtmp_stream:flags.12?true listeners_hidden:flags.13?true id:long access_hash:long participants_count:int title:flags.3?string stream_dc_id:flags.4?int record_start_date:flags.5?int schedule_date:flags.7?int unmuted_video_count:flags.10?int unmuted_video_limit:int version:int = GroupCall;
+groupCall#553b0ba1 flags:# join_muted:flags.1?true can_change_join_muted:flags.2?true join_date_asc:flags.6?true schedule_start_subscribed:flags.8?true can_start_video:flags.9?true record_video_active:flags.11?true rtmp_stream:flags.12?true listeners_hidden:flags.13?true conference:flags.14?true creator:flags.15?true messages_enabled:flags.17?true can_change_messages_enabled:flags.18?true min:flags.19?true id:long access_hash:long participants_count:int title:flags.3?string stream_dc_id:flags.4?int record_start_date:flags.5?int schedule_date:flags.7?int unmuted_video_count:flags.10?int unmuted_video_limit:int version:int invite_link:flags.16?string = GroupCall;
 
 inputGroupCall#d8aa840f id:long access_hash:long = InputGroupCall;
+inputGroupCallSlug#fe06823f slug:string = InputGroupCall;
+inputGroupCallInviteMessage#8c10603f msg_id:int = InputGroupCall;
 
 groupCallParticipant#eba636fe flags:# muted:flags.0?true left:flags.1?true can_self_unmute:flags.2?true just_joined:flags.4?true versioned:flags.5?true min:flags.8?true muted_by_you:flags.9?true volume_by_admin:flags.10?true self:flags.12?true video_joined:flags.15?true peer:Peer date:int active_date:flags.3?int source:int volume:flags.7?int about:flags.11?string raise_hand_rating:flags.13?long video:flags.6?GroupCallParticipantVideo presentation:flags.14?GroupCallParticipantVideo = GroupCallParticipant;
 
@@ -1396,9 +1449,15 @@ account.resetPasswordFailedWait#e3779861 retry_date:int = account.ResetPasswordR
 account.resetPasswordRequestedWait#e9effc7d until_date:int = account.ResetPasswordResult;
 account.resetPasswordOk#e926d63e = account.ResetPasswordResult;
 
-sponsoredMessage#4d93a990 flags:# recommended:flags.5?true can_report:flags.12?true random_id:bytes url:string title:string message:string entities:flags.1?Vector photo:flags.6?Photo media:flags.14?MessageMedia color:flags.13?PeerColor button_text:string sponsor_info:flags.7?string additional_info:flags.8?string = SponsoredMessage;
+chatTheme#c3dffc04 emoticon:string = ChatTheme;
+chatThemeUniqueGift#3458f9c8 gift:StarGift theme_settings:Vector = ChatTheme;
 
-messages.sponsoredMessages#c9ee1d87 flags:# posts_between:flags.0?int messages:Vector chats:Vector users:Vector = messages.SponsoredMessages;
+account.chatThemes#16484857 flags:# hash:long themes:Vector chats:Vector users:Vector next_offset:flags.0?int = account.ChatThemes;
+account.chatThemesNotModified#e011e1c4 = account.ChatThemes;
+
+sponsoredMessage#7dbf8673 flags:# recommended:flags.5?true can_report:flags.12?true random_id:bytes url:string title:string message:string entities:flags.1?Vector photo:flags.6?Photo media:flags.14?MessageMedia color:flags.13?PeerColor button_text:string sponsor_info:flags.7?string additional_info:flags.8?string min_display_duration:flags.15?int max_display_duration:flags.15?int = SponsoredMessage;
+
+messages.sponsoredMessages#ffda656d flags:# posts_between:flags.0?int start_delay:flags.1?int between_delay:flags.2?int messages:Vector chats:Vector users:Vector = messages.SponsoredMessages;
 messages.sponsoredMessagesEmpty#1839490f = messages.SponsoredMessages;
 
 searchResultsCalendarPeriod#c9b0539f date:int min_msg_id:int max_msg_id:int count:int = SearchResultsCalendarPeriod;
@@ -1447,7 +1506,7 @@ attachMenuBots#3c4301c0 hash:long bots:Vector users:Vector
 
 attachMenuBotsBot#93bf667f bot:AttachMenuBot users:Vector = AttachMenuBotsBot;
 
-webViewResultUrl#4d22ff98 flags:# fullsize:flags.1?true query_id:flags.0?long url:string = WebViewResult;
+webViewResultUrl#4d22ff98 flags:# fullsize:flags.1?true fullscreen:flags.2?true query_id:flags.0?long url:string = WebViewResult;
 
 webViewMessageSent#c94511c flags:# msg_id:flags.0?InputBotInlineMessageID = WebViewMessageSent;
 
@@ -1477,6 +1536,15 @@ inputInvoiceSlug#c326caef slug:string = InputInvoice;
 inputInvoicePremiumGiftCode#98986c0d purpose:InputStorePaymentPurpose option:PremiumGiftCodeOption = InputInvoice;
 inputInvoiceStars#65f00ce3 purpose:InputStorePaymentPurpose = InputInvoice;
 inputInvoiceChatInviteSubscription#34e793f1 hash:string = InputInvoice;
+inputInvoiceStarGift#e8625e92 flags:# hide_name:flags.0?true include_upgrade:flags.2?true peer:InputPeer gift_id:long message:flags.1?TextWithEntities = InputInvoice;
+inputInvoiceStarGiftUpgrade#4d818d5d flags:# keep_original_details:flags.0?true stargift:InputSavedStarGift = InputInvoice;
+inputInvoiceStarGiftTransfer#4a5f5bd9 stargift:InputSavedStarGift to_id:InputPeer = InputInvoice;
+inputInvoicePremiumGiftStars#dabab2ef flags:# user_id:InputUser months:int message:flags.0?TextWithEntities = InputInvoice;
+inputInvoiceBusinessBotTransferStars#f4997e42 bot:InputUser stars:long = InputInvoice;
+inputInvoiceStarGiftResale#c39f5324 flags:# ton:flags.0?true slug:string to_id:InputPeer = InputInvoice;
+inputInvoiceStarGiftPrepaidUpgrade#9a0b48b8 peer:InputPeer hash:string = InputInvoice;
+inputInvoicePremiumAuthCode#3e77f614 purpose:InputStorePaymentPurpose = InputInvoice;
+inputInvoiceStarGiftDropOriginalDetails#923d8d1 stargift:InputSavedStarGift = InputInvoice;
 
 payments.exportedInvoice#aed0cbd9 url:string = payments.ExportedInvoice;
 
@@ -1486,19 +1554,19 @@ help.premiumPromo#5334759c status_text:string status_entities:Vector boost_peer:flags.0?InputPeer currency:string amount:long = InputStorePaymentPurpose;
+inputStorePaymentPremiumGiftCode#fb790393 flags:# users:Vector boost_peer:flags.0?InputPeer currency:string amount:long message:flags.1?TextWithEntities = InputStorePaymentPurpose;
 inputStorePaymentPremiumGiveaway#160544ca flags:# only_new_subscribers:flags.0?true winners_are_visible:flags.3?true boost_peer:InputPeer additional_peers:flags.1?Vector countries_iso2:flags.2?Vector prize_description:flags.4?string random_id:long until_date:int currency:string amount:long = InputStorePaymentPurpose;
-inputStorePaymentStarsTopup#dddd0f56 stars:long currency:string amount:long = InputStorePaymentPurpose;
+inputStorePaymentStarsTopup#f9a2a6cb flags:# stars:long currency:string amount:long spend_purpose_peer:flags.0?InputPeer = InputStorePaymentPurpose;
 inputStorePaymentStarsGift#1d741ef7 user_id:InputUser stars:long currency:string amount:long = InputStorePaymentPurpose;
 inputStorePaymentStarsGiveaway#751f08fa flags:# only_new_subscribers:flags.0?true winners_are_visible:flags.3?true stars:long boost_peer:InputPeer additional_peers:flags.1?Vector countries_iso2:flags.2?Vector prize_description:flags.4?string random_id:long until_date:int currency:string amount:long users:int = InputStorePaymentPurpose;
-
-premiumGiftOption#74c34319 flags:# months:int currency:string amount:long bot_url:string store_product:flags.0?string = PremiumGiftOption;
+inputStorePaymentAuthCode#9bb2636d flags:# restore:flags.0?true phone_number:string phone_code_hash:string currency:string amount:long = InputStorePaymentPurpose;
 
 paymentFormMethod#88f8f21b url:string title:string = PaymentFormMethod;
 
 emojiStatusEmpty#2de11aae = EmojiStatus;
-emojiStatus#929b619d document_id:long = EmojiStatus;
-emojiStatusUntil#fa30a8c7 document_id:long until:int = EmojiStatus;
+emojiStatus#e7ff068a flags:# document_id:long until:flags.0?int = EmojiStatus;
+emojiStatusCollectible#7184603b flags:# collectible_id:long document_id:long title:string slug:string pattern_document_id:long center_color:int edge_color:int pattern_color:int text_color:int until:flags.0?int = EmojiStatus;
+inputEmojiStatusCollectible#7141dbf flags:# collectible_id:long until:flags.0?int = EmojiStatus;
 
 account.emojiStatusesNotModified#d08ce645 = account.EmojiStatuses;
 account.emojiStatuses#90c467d1 hash:long statuses:Vector = account.EmojiStatuses;
@@ -1538,7 +1606,7 @@ stickerKeyword#fcfeb29c document_id:long keyword:Vector = StickerKeyword
 username#b4073647 flags:# editable:flags.0?true active:flags.1?true username:string = Username;
 
 forumTopicDeleted#23f109b id:int = ForumTopic;
-forumTopic#71701da9 flags:# my:flags.1?true closed:flags.2?true pinned:flags.3?true short:flags.5?true hidden:flags.6?true id:int date:int title:string icon_color:int icon_emoji_id:flags.0?long top_message:int read_inbox_max_id:int read_outbox_max_id:int unread_count:int unread_mentions_count:int unread_reactions_count:int from_id:Peer notify_settings:PeerNotifySettings draft:flags.4?DraftMessage = ForumTopic;
+forumTopic#cdff0eca flags:# my:flags.1?true closed:flags.2?true pinned:flags.3?true short:flags.5?true hidden:flags.6?true title_missing:flags.7?true id:int date:int peer:Peer title:string icon_color:int icon_emoji_id:flags.0?long top_message:int read_inbox_max_id:int read_outbox_max_id:int unread_count:int unread_mentions_count:int unread_reactions_count:int from_id:Peer notify_settings:PeerNotifySettings draft:flags.4?DraftMessage = ForumTopic;
 
 messages.forumTopics#367617d3 flags:# order_by_create_date:flags.0?true count:int topics:Vector messages:Vector chats:Vector users:Vector pts:int = messages.ForumTopics;
 
@@ -1547,8 +1615,8 @@ defaultHistoryTTL#43b46b20 period:int = DefaultHistoryTTL;
 exportedContactToken#41bf109b url:string expires:int = ExportedContactToken;
 
 requestPeerTypeUser#5f3b8a00 flags:# bot:flags.0?Bool premium:flags.1?Bool = RequestPeerType;
-requestPeerTypeChat#c9f06e1b flags:# creator:flags.0?true bot_participant:flags.5?true has_username:flags.3?Bool forum:flags.4?Bool user_admin_rights:flags.1?ChatAdminRights bot_admin_rights:flags.2?ChatAdminRights = RequestPeerType;
-requestPeerTypeBroadcast#339bef6c flags:# creator:flags.0?true has_username:flags.3?Bool user_admin_rights:flags.1?ChatAdminRights bot_admin_rights:flags.2?ChatAdminRights = RequestPeerType;
+requestPeerTypeChat#c9f06e1b flags:# creator:flags.0?true user_admin_rights:flags.1?ChatAdminRights bot_participant:flags.5?true bot_admin_rights:flags.2?ChatAdminRights has_username:flags.3?Bool forum:flags.4?Bool = RequestPeerType;
+requestPeerTypeBroadcast#339bef6c flags:# creator:flags.0?true user_admin_rights:flags.1?ChatAdminRights has_username:flags.3?Bool bot_admin_rights:flags.2?ChatAdminRights = RequestPeerType;
 
 emojiListNotModified#481eadfa = EmojiList;
 emojiList#7a1e11d1 hash:long document_id:Vector = EmojiList;
@@ -1587,14 +1655,14 @@ readParticipantDate#4a4ff172 user_id:long date:int = ReadParticipantDate;
 
 inputChatlistDialogFilter#f3e0da33 filter_id:int = InputChatlist;
 
-exportedChatlistInvite#c5181ac flags:# title:string url:string peers:Vector = ExportedChatlistInvite;
+exportedChatlistInvite#c5181ac flags:# revoked:flags.0?true title:string url:string peers:Vector = ExportedChatlistInvite;
 
 chatlists.exportedChatlistInvite#10e6e3a6 filter:DialogFilter invite:ExportedChatlistInvite = chatlists.ExportedChatlistInvite;
 
 chatlists.exportedInvites#10ab6dc7 invites:Vector chats:Vector users:Vector = chatlists.ExportedInvites;
 
 chatlists.chatlistInviteAlready#fa87f659 filter_id:int missing_peers:Vector already_peers:Vector chats:Vector users:Vector = chatlists.ChatlistInvite;
-chatlists.chatlistInvite#1dcd839d flags:# title:string emoticon:flags.0?string peers:Vector chats:Vector users:Vector = chatlists.ChatlistInvite;
+chatlists.chatlistInvite#f10ece2f flags:# title_noanimate:flags.1?true title:TextWithEntities emoticon:flags.0?string peers:Vector chats:Vector users:Vector = chatlists.ChatlistInvite;
 
 chatlists.chatlistUpdates#93bd878d missing_peers:Vector chats:Vector users:Vector = chatlists.ChatlistUpdates;
 
@@ -1608,7 +1676,7 @@ storyViews#8d595cd6 flags:# has_viewers:flags.1?true views_count:int forwards_co
 
 storyItemDeleted#51e6ee4f id:int = StoryItem;
 storyItemSkipped#ffadc913 flags:# close_friends:flags.8?true id:int date:int expire_date:int = StoryItem;
-storyItem#79b26a24 flags:# pinned:flags.5?true public:flags.7?true close_friends:flags.8?true min:flags.9?true noforwards:flags.10?true edited:flags.11?true contacts:flags.12?true selected_contacts:flags.13?true out:flags.16?true id:int date:int from_id:flags.18?Peer fwd_from:flags.17?StoryFwdHeader expire_date:int caption:flags.0?string entities:flags.1?Vector media:MessageMedia media_areas:flags.14?Vector privacy:flags.2?Vector views:flags.3?StoryViews sent_reaction:flags.15?Reaction = StoryItem;
+storyItem#edf164f1 flags:# pinned:flags.5?true public:flags.7?true close_friends:flags.8?true min:flags.9?true noforwards:flags.10?true edited:flags.11?true contacts:flags.12?true selected_contacts:flags.13?true out:flags.16?true id:int date:int from_id:flags.18?Peer fwd_from:flags.17?StoryFwdHeader expire_date:int caption:flags.0?string entities:flags.1?Vector media:MessageMedia media_areas:flags.14?Vector privacy:flags.2?Vector views:flags.3?StoryViews sent_reaction:flags.15?Reaction albums:flags.19?Vector = StoryItem;
 
 stories.allStoriesNotModified#1158fe3e flags:# state:string stealth_mode:StoriesStealthMode = stories.AllStories;
 stories.allStories#6efc5e81 flags:# has_more:flags.0?true count:int state:string peer_stories:Vector chats:Vector users:Vector stealth_mode:StoriesStealthMode = stories.AllStories;
@@ -1623,8 +1691,9 @@ stories.storyViewsList#59d78fc5 flags:# count:int views_count:int forwards_count
 
 stories.storyViews#de9eed1d views:Vector users:Vector = stories.StoryViews;
 
-inputReplyToMessage#22c0f6d5 flags:# reply_to_msg_id:int top_msg_id:flags.0?int reply_to_peer_id:flags.1?InputPeer quote_text:flags.2?string quote_entities:flags.3?Vector quote_offset:flags.4?int = InputReplyTo;
+inputReplyToMessage#869fbe10 flags:# reply_to_msg_id:int top_msg_id:flags.0?int reply_to_peer_id:flags.1?InputPeer quote_text:flags.2?string quote_entities:flags.3?Vector quote_offset:flags.4?int monoforum_peer_id:flags.5?InputPeer todo_item_id:flags.6?int = InputReplyTo;
 inputReplyToStory#5881323a peer:InputPeer story_id:int = InputReplyTo;
+inputReplyToMonoForum#69d66c45 monoforum_peer_id:InputPeer = InputReplyTo;
 
 exportedStoryLink#3fc9053b link:string = ExportedStoryLink;
 
@@ -1640,6 +1709,7 @@ mediaAreaChannelPost#770416af coordinates:MediaAreaCoordinates channel_id:long m
 inputMediaAreaChannelPost#2271f2bf coordinates:MediaAreaCoordinates channel:InputChannel msg_id:int = MediaArea;
 mediaAreaUrl#37381085 coordinates:MediaAreaCoordinates url:string = MediaArea;
 mediaAreaWeather#49a6549c coordinates:MediaAreaCoordinates emoji:string temperature_c:double color:int = MediaArea;
+mediaAreaStarGift#5787686d coordinates:MediaAreaCoordinates slug:string = MediaArea;
 
 peerStories#9a35e999 flags:# peer:Peer max_read_id:flags.0?int stories:Vector = PeerStories;
 
@@ -1680,6 +1750,8 @@ publicForwardStory#edf3add0 peer:Peer story:StoryItem = PublicForward;
 stats.publicForwards#93037e20 flags:# count:int forwards:Vector next_offset:flags.0?string chats:Vector users:Vector = stats.PublicForwards;
 
 peerColor#b54b5acf flags:# color:flags.0?int background_emoji_id:flags.1?long = PeerColor;
+inputPeerColorCollectible#b8ea86a9 collectible_id:long = PeerColor;
+peerColorCollectible#b9c0639a flags:# collectible_id:long gift_emoji_id:long background_emoji_id:long accent_color:int colors:Vector dark_accent_color:flags.0?int dark_colors:flags.1?Vector = PeerColor;
 
 help.peerColorSet#26219a58 colors:Vector = help.PeerColorSet;
 help.peerColorProfileSet#767d61eb palette_colors:Vector bg_colors:Vector story_colors:Vector = help.PeerColorSet;
@@ -1696,6 +1768,7 @@ storyReactionPublicRepost#cfcd0f13 peer_id:Peer story:StoryItem = StoryReaction;
 stories.storyReactionsList#aa5f789c flags:# count:int reactions:Vector chats:Vector users:Vector next_offset:flags.0?string = stories.StoryReactionsList;
 
 savedDialog#bd87cb6c flags:# pinned:flags.2?true peer:Peer top_message:int = SavedDialog;
+monoForumDialog#64407ea7 flags:# unread_mark:flags.3?true nopaid_messages_exception:flags.4?true peer:Peer top_message:int read_inbox_max_id:int read_outbox_max_id:int unread_count:int unread_reactions_count:int draft:flags.1?DraftMessage = SavedDialog;
 
 messages.savedDialogs#f83ae221 dialogs:Vector messages:Vector chats:Vector users:Vector = messages.SavedDialogs;
 messages.savedDialogsSlice#44ba9dd9 count:int dialogs:Vector messages:Vector chats:Vector users:Vector = messages.SavedDialogs;
@@ -1749,7 +1822,7 @@ inputQuickReplyShortcutId#1190cf1 shortcut_id:int = InputQuickReplyShortcut;
 messages.quickReplies#c68d6695 quick_replies:Vector messages:Vector chats:Vector users:Vector = messages.QuickReplies;
 messages.quickRepliesNotModified#5f91eb5b = messages.QuickReplies;
 
-connectedBot#bd068601 flags:# can_reply:flags.0?true bot_id:long recipients:BusinessBotRecipients = ConnectedBot;
+connectedBot#cd64636c flags:# bot_id:long recipients:BusinessBotRecipients rights:BusinessBotRights = ConnectedBot;
 
 account.connectedBots#17d7f87b connected_bots:Vector users:Vector = account.ConnectedBots;
 
@@ -1757,7 +1830,7 @@ messages.dialogFilters#2ad93719 flags:# tags_enabled:flags.0?true filters:Vector
 
 birthday#6c8e1e06 flags:# day:int month:int year:flags.0?int = Birthday;
 
-botBusinessConnection#896433b4 flags:# can_reply:flags.0?true disabled:flags.1?true connection_id:string user_id:long dc_id:int date:int = BotBusinessConnection;
+botBusinessConnection#8f34b2f5 flags:# disabled:flags.1?true connection_id:string user_id:long dc_id:int date:int rights:flags.2?BusinessBotRights = BotBusinessConnection;
 
 inputBusinessIntro#9c469cd flags:# title:string description:string sticker:flags.0?InputDocument = InputBusinessIntro;
 
@@ -1800,23 +1873,11 @@ channels.sponsoredMessageReportResultChooseOption#846f9e42 title:string options:
 channels.sponsoredMessageReportResultAdsHidden#3e3bcf2f = channels.SponsoredMessageReportResult;
 channels.sponsoredMessageReportResultReported#ad798849 = channels.SponsoredMessageReportResult;
 
-stats.broadcastRevenueStats#5407e297 top_hours_graph:StatsGraph revenue_graph:StatsGraph balances:BroadcastRevenueBalances usd_rate:double = stats.BroadcastRevenueStats;
-
-stats.broadcastRevenueWithdrawalUrl#ec659737 url:string = stats.BroadcastRevenueWithdrawalUrl;
-
-broadcastRevenueTransactionProceeds#557e2cc4 amount:long from_date:int to_date:int = BroadcastRevenueTransaction;
-broadcastRevenueTransactionWithdrawal#5a590978 flags:# pending:flags.0?true failed:flags.2?true amount:long date:int provider:string transaction_date:flags.1?int transaction_url:flags.1?string = BroadcastRevenueTransaction;
-broadcastRevenueTransactionRefund#42d30d2e amount:long date:int provider:string = BroadcastRevenueTransaction;
-
-stats.broadcastRevenueTransactions#87158466 count:int transactions:Vector = stats.BroadcastRevenueTransactions;
-
 reactionNotificationsFromContacts#bac3a61a = ReactionNotificationsFrom;
 reactionNotificationsFromAll#4b9e22a0 = ReactionNotificationsFrom;
 
 reactionsNotifySettings#56e34970 flags:# messages_notify_from:flags.0?ReactionNotificationsFrom stories_notify_from:flags.1?ReactionNotificationsFrom sound:NotificationSound show_previews:Bool = ReactionsNotifySettings;
 
-broadcastRevenueBalances#c3ff71e7 flags:# withdrawal_enabled:flags.0?true current_balance:long available_balance:long overall_revenue:long = BroadcastRevenueBalances;
-
 availableEffect#93c3e27e flags:# premium_required:flags.2?true id:long emoticon:string static_icon_id:flags.0?long effect_sticker_id:long effect_animation_id:flags.1?long = AvailableEffect;
 
 messages.availableEffectsNotModified#d1ed9a5b = messages.AvailableEffects;
@@ -1831,12 +1892,13 @@ starsTransactionPeerPremiumBot#250dbaf8 = StarsTransactionPeer;
 starsTransactionPeerFragment#e92fd902 = StarsTransactionPeer;
 starsTransactionPeer#d80da15d peer:Peer = StarsTransactionPeer;
 starsTransactionPeerAds#60682812 = StarsTransactionPeer;
+starsTransactionPeerAPI#f9677aad = StarsTransactionPeer;
 
 starsTopupOption#bd915c0 flags:# extended:flags.1?true stars:long store_product:flags.0?string currency:string amount:long = StarsTopupOption;
 
-starsTransaction#ee7522d5 flags:# refund:flags.3?true pending:flags.4?true failed:flags.6?true gift:flags.10?true reaction:flags.11?true id:string stars:long date:int peer:StarsTransactionPeer title:flags.0?string description:flags.1?string photo:flags.2?WebDocument transaction_date:flags.5?int transaction_url:flags.5?string bot_payload:flags.7?bytes msg_id:flags.8?int extended_media:flags.9?Vector subscription_period:flags.12?int giveaway_post_id:flags.13?int = StarsTransaction;
+starsTransaction#13659eb0 flags:# refund:flags.3?true pending:flags.4?true failed:flags.6?true gift:flags.10?true reaction:flags.11?true subscription:flags.12?true stargift_upgrade:flags.18?true floodskip:flags.15?true business_transfer:flags.21?true stargift_resale:flags.22?true paid_message:flags.19?true posts_search:flags.24?true premium_gift:flags.20?true stargift_prepaid_upgrade:flags.25?true stargift_drop_original_details:flags.26?true id:string amount:StarsAmount date:int peer:StarsTransactionPeer title:flags.0?string description:flags.1?string photo:flags.2?WebDocument transaction_date:flags.5?int transaction_url:flags.5?string bot_payload:flags.7?bytes msg_id:flags.8?int extended_media:flags.9?Vector subscription_period:flags.12?int giveaway_post_id:flags.13?int stargift:flags.14?StarGift floodskip_number:flags.15?int starref_commission_permille:flags.16?int starref_peer:flags.17?Peer starref_amount:flags.17?StarsAmount paid_messages:flags.19?int premium_gift_months:flags.20?int ads_proceeds_from_date:flags.23?int ads_proceeds_to_date:flags.23?int = StarsTransaction;
 
-payments.starsStatus#bbfa316c flags:# balance:long subscriptions:flags.1?Vector subscriptions_next_offset:flags.2?string subscriptions_missing_balance:flags.4?long history:flags.3?Vector next_offset:flags.0?string chats:Vector users:Vector = payments.StarsStatus;
+payments.starsStatus#6c9ce8ed flags:# balance:StarsAmount subscriptions:flags.1?Vector subscriptions_next_offset:flags.2?string subscriptions_missing_balance:flags.4?long history:flags.3?Vector next_offset:flags.0?string chats:Vector users:Vector = payments.StarsStatus;
 
 foundStory#e87acbc0 peer:Peer story:StoryItem = FoundStory;
 
@@ -1844,9 +1906,9 @@ stories.foundStories#e2de7737 flags:# count:int stories:Vector next_
 
 geoPointAddress#de4c5d93 flags:# country_iso2:string state:flags.0?string city:flags.1?string street:flags.2?string = GeoPointAddress;
 
-starsRevenueStatus#79342946 flags:# withdrawal_enabled:flags.0?true current_balance:long available_balance:long overall_revenue:long next_withdrawal_at:flags.1?int = StarsRevenueStatus;
+starsRevenueStatus#febe5491 flags:# withdrawal_enabled:flags.0?true current_balance:StarsAmount available_balance:StarsAmount overall_revenue:StarsAmount next_withdrawal_at:flags.1?int = StarsRevenueStatus;
 
-payments.starsRevenueStats#c92bb73b revenue_graph:StatsGraph status:StarsRevenueStatus usd_rate:double = payments.StarsRevenueStats;
+payments.starsRevenueStats#6c207376 flags:# top_hours_graph:flags.0?StatsGraph revenue_graph:StatsGraph status:StarsRevenueStatus usd_rate:double = payments.StarsRevenueStats;
 
 payments.starsRevenueWithdrawalUrl#1dab80b7 url:string = payments.StarsRevenueWithdrawalUrl;
 
@@ -1864,7 +1926,7 @@ bots.previewInfo#ca71d64 media:Vector lang_codes:Vector
 
 starsSubscriptionPricing#5416d58 period:int amount:long = StarsSubscriptionPricing;
 
-starsSubscription#538ecf18 flags:# canceled:flags.0?true can_refulfill:flags.1?true missing_balance:flags.2?true id:string peer:Peer until_date:int pricing:StarsSubscriptionPricing chat_invite_hash:flags.3?string = StarsSubscription;
+starsSubscription#2e6eab1a flags:# canceled:flags.0?true can_refulfill:flags.1?true missing_balance:flags.2?true bot_canceled:flags.7?true id:string peer:Peer until_date:int pricing:StarsSubscriptionPricing chat_invite_hash:flags.3?string title:flags.4?string photo:flags.5?WebDocument invoice_slug:flags.6?string = StarsSubscription;
 
 messageReactor#4ba3a95a flags:# top:flags.0?true my:flags.1?true anonymous:flags.2?true peer_id:flags.3?Peer count:int = MessageReactor;
 
@@ -1872,6 +1934,155 @@ starsGiveawayOption#94ce852a flags:# extended:flags.0?true default:flags.1?true
 
 starsGiveawayWinnersOption#54236209 flags:# default:flags.0?true users:int per_user_stars:long = StarsGiveawayWinnersOption;
 
+starGift#80ac53c3 flags:# limited:flags.0?true sold_out:flags.1?true birthday:flags.2?true can_upgrade:flags.3?true require_premium:flags.7?true limited_per_user:flags.8?true peer_color_available:flags.10?true id:long sticker:Document stars:long availability_remains:flags.0?int availability_total:flags.0?int availability_resale:flags.4?long convert_stars:long first_sale_date:flags.1?int last_sale_date:flags.1?int upgrade_stars:flags.3?long resell_min_stars:flags.4?long title:flags.5?string released_by:flags.6?Peer per_user_total:flags.8?int per_user_remains:flags.8?int locked_until_date:flags.9?int = StarGift;
+starGiftUnique#b0bf741b flags:# require_premium:flags.6?true resale_ton_only:flags.7?true theme_available:flags.9?true id:long gift_id:long title:string slug:string num:int owner_id:flags.0?Peer owner_name:flags.1?string owner_address:flags.2?string attributes:Vector availability_issued:int availability_total:int gift_address:flags.3?string resell_amount:flags.4?Vector released_by:flags.5?Peer value_amount:flags.8?long value_currency:flags.8?string theme_peer:flags.10?Peer peer_color:flags.11?PeerColor host_id:flags.12?Peer = StarGift;
+
+payments.starGiftsNotModified#a388a368 = payments.StarGifts;
+payments.starGifts#2ed82995 hash:int gifts:Vector chats:Vector users:Vector = payments.StarGifts;
+
+messageReportOption#7903e3d9 text:string option:bytes = MessageReportOption;
+
+reportResultChooseOption#f0e4e0b6 title:string options:Vector = ReportResult;
+reportResultAddComment#6f09ac31 flags:# optional:flags.0?true option:bytes = ReportResult;
+reportResultReported#8db33c4b = ReportResult;
+
+messages.botPreparedInlineMessage#8ecf0511 id:string expire_date:int = messages.BotPreparedInlineMessage;
+
+messages.preparedInlineMessage#ff57708d query_id:long result:BotInlineResult peer_types:Vector cache_time:int users:Vector = messages.PreparedInlineMessage;
+
+botAppSettings#c99b1950 flags:# placeholder_path:flags.0?bytes background_color:flags.1?int background_dark_color:flags.2?int header_color:flags.3?int header_dark_color:flags.4?int = BotAppSettings;
+
+starRefProgram#dd0c66f2 flags:# bot_id:long commission_permille:int duration_months:flags.0?int end_date:flags.1?int daily_revenue_per_user:flags.2?StarsAmount = StarRefProgram;
+
+connectedBotStarRef#19a13f71 flags:# revoked:flags.1?true url:string date:int bot_id:long commission_permille:int duration_months:flags.0?int participants:long revenue:long = ConnectedBotStarRef;
+
+payments.connectedStarRefBots#98d5ea1d count:int connected_bots:Vector users:Vector = payments.ConnectedStarRefBots;
+
+payments.suggestedStarRefBots#b4d5d859 flags:# count:int suggested_bots:Vector users:Vector next_offset:flags.0?string = payments.SuggestedStarRefBots;
+
+starsAmount#bbb6b4a3 amount:long nanos:int = StarsAmount;
+starsTonAmount#74aee3e0 amount:long = StarsAmount;
+
+messages.foundStickersNotModified#6010c534 flags:# next_offset:flags.0?int = messages.FoundStickers;
+messages.foundStickers#82c9e290 flags:# next_offset:flags.0?int hash:long stickers:Vector = messages.FoundStickers;
+
+botVerifierSettings#b0cd6617 flags:# can_modify_custom_description:flags.1?true icon:long company:string custom_description:flags.0?string = BotVerifierSettings;
+
+botVerification#f93cd45c bot_id:long icon:long description:string = BotVerification;
+
+starGiftAttributeModel#39d99013 name:string document:Document rarity_permille:int = StarGiftAttribute;
+starGiftAttributePattern#13acff19 name:string document:Document rarity_permille:int = StarGiftAttribute;
+starGiftAttributeBackdrop#d93d859c name:string backdrop_id:int center_color:int edge_color:int pattern_color:int text_color:int rarity_permille:int = StarGiftAttribute;
+starGiftAttributeOriginalDetails#e0bff26c flags:# sender_id:flags.0?Peer recipient_id:Peer date:int message:flags.1?TextWithEntities = StarGiftAttribute;
+
+payments.starGiftUpgradePreview#167bd90b sample_attributes:Vector = payments.StarGiftUpgradePreview;
+
+users.users#62d706b8 users:Vector = users.Users;
+users.usersSlice#315a4974 count:int users:Vector = users.Users;
+
+payments.uniqueStarGift#416c56e8 gift:StarGift chats:Vector users:Vector = payments.UniqueStarGift;
+
+messages.webPagePreview#8c9a88ac media:MessageMedia chats:Vector users:Vector = messages.WebPagePreview;
+
+savedStarGift#8983a452 flags:# name_hidden:flags.0?true unsaved:flags.5?true refunded:flags.9?true can_upgrade:flags.10?true pinned_to_top:flags.12?true upgrade_separate:flags.17?true from_id:flags.1?Peer date:int gift:StarGift message:flags.2?TextWithEntities msg_id:flags.3?int saved_id:flags.11?long convert_stars:flags.4?long upgrade_stars:flags.6?long can_export_at:flags.7?int transfer_stars:flags.8?long can_transfer_at:flags.13?int can_resell_at:flags.14?int collection_id:flags.15?Vector prepaid_upgrade_hash:flags.16?string drop_original_details_stars:flags.18?long = SavedStarGift;
+
+payments.savedStarGifts#95f389b1 flags:# count:int chat_notifications_enabled:flags.1?Bool gifts:Vector next_offset:flags.0?string chats:Vector users:Vector = payments.SavedStarGifts;
+
+inputSavedStarGiftUser#69279795 msg_id:int = InputSavedStarGift;
+inputSavedStarGiftChat#f101aa7f peer:InputPeer saved_id:long = InputSavedStarGift;
+inputSavedStarGiftSlug#2085c238 slug:string = InputSavedStarGift;
+
+payments.starGiftWithdrawalUrl#84aa3a9c url:string = payments.StarGiftWithdrawalUrl;
+
+paidReactionPrivacyDefault#206ad49e = PaidReactionPrivacy;
+paidReactionPrivacyAnonymous#1f0c1ad9 = PaidReactionPrivacy;
+paidReactionPrivacyPeer#dc6cfcf0 peer:InputPeer = PaidReactionPrivacy;
+
+account.paidMessagesRevenue#1e109708 stars_amount:long = account.PaidMessagesRevenue;
+
+requirementToContactEmpty#50a9839 = RequirementToContact;
+requirementToContactPremium#e581e4e9 = RequirementToContact;
+requirementToContactPaidMessages#b4f67e93 stars_amount:long = RequirementToContact;
+
+businessBotRights#a0624cf7 flags:# reply:flags.0?true read_messages:flags.1?true delete_sent_messages:flags.2?true delete_received_messages:flags.3?true edit_name:flags.4?true edit_bio:flags.5?true edit_profile_photo:flags.6?true edit_username:flags.7?true view_gifts:flags.8?true sell_gifts:flags.9?true change_gift_settings:flags.10?true transfer_and_upgrade_gifts:flags.11?true transfer_stars:flags.12?true manage_stories:flags.13?true = BusinessBotRights;
+
+disallowedGiftsSettings#71f276c4 flags:# disallow_unlimited_stargifts:flags.0?true disallow_limited_stargifts:flags.1?true disallow_unique_stargifts:flags.2?true disallow_premium_gifts:flags.3?true = DisallowedGiftsSettings;
+
+sponsoredPeer#c69708d3 flags:# random_id:bytes peer:Peer sponsor_info:flags.0?string additional_info:flags.1?string = SponsoredPeer;
+
+contacts.sponsoredPeersEmpty#ea32b4b1 = contacts.SponsoredPeers;
+contacts.sponsoredPeers#eb032884 peers:Vector chats:Vector users:Vector = contacts.SponsoredPeers;
+
+starGiftAttributeIdModel#48aaae3c document_id:long = StarGiftAttributeId;
+starGiftAttributeIdPattern#4a162433 document_id:long = StarGiftAttributeId;
+starGiftAttributeIdBackdrop#1f01c757 backdrop_id:int = StarGiftAttributeId;
+
+starGiftAttributeCounter#2eb1b658 attribute:StarGiftAttributeId count:int = StarGiftAttributeCounter;
+
+payments.resaleStarGifts#947a12df flags:# count:int gifts:Vector next_offset:flags.0?string attributes:flags.1?Vector attributes_hash:flags.1?long chats:Vector counters:flags.2?Vector users:Vector = payments.ResaleStarGifts;
+
+stories.canSendStoryCount#c387c04e count_remains:int = stories.CanSendStoryCount;
+
+pendingSuggestion#e7e82e12 suggestion:string title:TextWithEntities description:TextWithEntities url:string = PendingSuggestion;
+
+todoItem#cba9a52f id:int title:TextWithEntities = TodoItem;
+
+todoList#49b92a26 flags:# others_can_append:flags.0?true others_can_complete:flags.1?true title:TextWithEntities list:Vector = TodoList;
+
+todoCompletion#4cc120b7 id:int completed_by:long date:int = TodoCompletion;
+
+suggestedPost#e8e37e5 flags:# accepted:flags.1?true rejected:flags.2?true price:flags.3?StarsAmount schedule_date:flags.0?int = SuggestedPost;
+
+starsRating#1b0e4f07 flags:# level:int current_level_stars:long stars:long next_level_stars:flags.0?long = StarsRating;
+
+starGiftCollection#9d6b13b0 flags:# collection_id:int title:string icon:flags.0?Document gifts_count:int hash:long = StarGiftCollection;
+
+payments.starGiftCollectionsNotModified#a0ba4f17 = payments.StarGiftCollections;
+payments.starGiftCollections#8a2932f3 collections:Vector = payments.StarGiftCollections;
+
+storyAlbum#9325705a flags:# album_id:int title:string icon_photo:flags.0?Photo icon_video:flags.1?Document = StoryAlbum;
+
+stories.albumsNotModified#564edaeb = stories.Albums;
+stories.albums#c3987a3a hash:long albums:Vector = stories.Albums;
+
+searchPostsFlood#3e0b5b6a flags:# query_is_free:flags.0?true total_daily:int remains:int wait_till:flags.1?int stars_amount:long = SearchPostsFlood;
+
+payments.uniqueStarGiftValueInfo#512fe446 flags:# last_sale_on_fragment:flags.1?true value_is_average:flags.6?true currency:string value:long initial_sale_date:int initial_sale_stars:long initial_sale_price:long last_sale_date:flags.0?int last_sale_price:flags.0?long floor_price:flags.2?long average_price:flags.3?long listed_count:flags.4?int fragment_listed_count:flags.5?int fragment_listed_url:flags.5?string = payments.UniqueStarGiftValueInfo;
+
+profileTabPosts#b98cd696 = ProfileTab;
+profileTabGifts#4d4bd46a = ProfileTab;
+profileTabMedia#72c64955 = ProfileTab;
+profileTabFiles#ab339c00 = ProfileTab;
+profileTabMusic#9f27d26e = ProfileTab;
+profileTabVoice#e477092e = ProfileTab;
+profileTabLinks#d3656499 = ProfileTab;
+profileTabGifs#a2c0f695 = ProfileTab;
+
+users.savedMusicNotModified#e3878aa4 count:int = users.SavedMusic;
+users.savedMusic#34a2f297 count:int documents:Vector = users.SavedMusic;
+
+account.savedMusicIdsNotModified#4fc81d6e = account.SavedMusicIds;
+account.savedMusicIds#998d6636 ids:Vector = account.SavedMusicIds;
+
+payments.checkCanSendGiftResultOk#374fa7ad = payments.CheckCanSendGiftResult;
+payments.checkCanSendGiftResultFail#d5e58274 reason:TextWithEntities = payments.CheckCanSendGiftResult;
+
+inputChatThemeEmpty#83268483 = InputChatTheme;
+inputChatTheme#c93de95c emoticon:string = InputChatTheme;
+inputChatThemeUniqueGift#87e5dfe4 slug:string = InputChatTheme;
+
+starGiftUpgradePreview#3de1dfed sample_attributes:Vector prices:Vector next_prices:Vector = StarGiftUpgradePreview;
+
+messages.messageEmpty#3f4e0648 = messages.MessageEmpty;
+
+premiumGiftOption#79c059f7 flags:# months:int currency:string amount:long bot_url:flags.1?string store_product:flags.0?string = PremiumGiftOption;
+
+starGiftUpgradePrice#99ea331d date:int upgrade_stars:long = StarGiftUpgradePrice;
+
+messages.webViewResult#aadf159b result:BotInlineResult users:Vector = messages.WebViewResult;
+
+chatThemes#be098173 flags:# hash:long themes:Vector chats:Vector users:Vector next_offset:flags.0?string = ChatThemes;
+
 ---functions---
 
 invokeAfterMsg#cb9f372d {X:Type} msg_id:long query:!X = X;
@@ -1883,7 +2094,8 @@ invokeWithMessagesRange#365275f2 {X:Type} range:MessageRange query:!X = X;
 invokeWithTakeout#aca9fd2e {X:Type} takeout_id:long query:!X = X;
 invokeWithBusinessConnection#dd289f8e {X:Type} connection_id:string query:!X = X;
 invokeWithGooglePlayIntegrity#1df92984 {X:Type} nonce:string token:string query:!X = X;
-invokeWithApnsSecret#0dae54f8 {X:Type} nonce:string secret:string query:!X = X;
+invokeWithApnsSecret#dae54f8 {X:Type} nonce:string secret:string query:!X = X;
+invokeWithReCaptcha#adbb0f94 {X:Type} token:string query:!X = X;
 
 auth.sendCode#a677244f phone_number:string api_id:int api_hash:string settings:CodeSettings = auth.SentCode;
 auth.signUp#aac7b717 flags:# no_joined_notifications:flags.0?true phone_number:string phone_code_hash:string first_name:string last_name:string = auth.Authorization;
@@ -2005,7 +2217,7 @@ account.updateBusinessWorkHours#4b00e066 flags:# business_work_hours:flags.0?Bus
 account.updateBusinessLocation#9e6b131a flags:# geo_point:flags.1?InputGeoPoint address:flags.0?string = Bool;
 account.updateBusinessGreetingMessage#66cdafc4 flags:# message:flags.0?InputBusinessGreetingMessage = Bool;
 account.updateBusinessAwayMessage#a26a7fa5 flags:# message:flags.0?InputBusinessAwayMessage = Bool;
-account.updateConnectedBot#43d8521d flags:# can_reply:flags.0?true deleted:flags.1?true bot:InputUser recipients:InputBusinessBotRecipients = Updates;
+account.updateConnectedBot#66a08c7e flags:# deleted:flags.1?true rights:flags.0?BusinessBotRights bot:InputUser recipients:InputBusinessBotRecipients = Updates;
 account.getConnectedBots#4ea4c80f = account.ConnectedBots;
 account.getBotBusinessConnection#76a86270 connection_id:string = Updates;
 account.updateBusinessIntro#a614d034 flags:# intro:flags.0?InputBusinessIntro = Bool;
@@ -2021,11 +2233,21 @@ account.updatePersonalChannel#d94305e0 channel:InputChannel = Bool;
 account.toggleSponsoredMessages#b9d9a38d enabled:Bool = Bool;
 account.getReactionsNotifySettings#6dd654c = ReactionsNotifySettings;
 account.setReactionsNotifySettings#316ce548 settings:ReactionsNotifySettings = ReactionsNotifySettings;
+account.getCollectibleEmojiStatuses#2e7b4543 hash:long = account.EmojiStatuses;
+account.getPaidMessagesRevenue#19ba4a67 flags:# parent_peer:flags.0?InputPeer user_id:InputUser = account.PaidMessagesRevenue;
+account.toggleNoPaidMessagesException#fe2eda76 flags:# refund_charged:flags.0?true require_payment:flags.2?true parent_peer:flags.1?InputPeer user_id:InputUser = Bool;
+account.setMainProfileTab#5dee78b0 tab:ProfileTab = Bool;
+account.saveMusic#b26732a9 flags:# unsave:flags.0?true id:InputDocument after_id:flags.1?InputDocument = Bool;
+account.getSavedMusicIds#e09d5faf hash:long = account.SavedMusicIds;
+account.getUniqueGiftChatThemes#fe74ef9f offset:int limit:int hash:long = account.ChatThemes;
 
 users.getUsers#d91a548 id:Vector = Vector;
 users.getFullUser#b60f5918 id:InputUser = users.UserFull;
 users.setSecureValueErrors#90c894b5 id:InputUser errors:Vector = Bool;
-users.getIsPremiumRequiredToContact#a622aa10 id:Vector = Vector;
+users.getRequirementsToContact#d89a83a3 id:Vector = Vector;
+users.getSavedMusic#788d7fe3 id:InputUser offset:int limit:int hash:long = users.SavedMusic;
+users.getSavedMusicByID#7573a4e9 id:InputUser documents:Vector = users.SavedMusic;
+users.suggestBirthday#fc533372 id:InputUser birthday:Birthday = Updates;
 
 contacts.getContactIDs#7adc669d hash:long = Vector;
 contacts.getStatuses#c4a353ee = Vector;
@@ -2037,13 +2259,13 @@ contacts.block#2e2e8734 flags:# my_stories_from:flags.0?true id:InputPeer = Bool
 contacts.unblock#b550d328 flags:# my_stories_from:flags.0?true id:InputPeer = Bool;
 contacts.getBlocked#9a868f80 flags:# my_stories_from:flags.0?true offset:int limit:int = contacts.Blocked;
 contacts.search#11f812d8 q:string limit:int = contacts.Found;
-contacts.resolveUsername#f93ccba3 username:string = contacts.ResolvedPeer;
+contacts.resolveUsername#725afbbc flags:# username:string referer:flags.0?string = contacts.ResolvedPeer;
 contacts.getTopPeers#973478b6 flags:# correspondents:flags.0?true bots_pm:flags.1?true bots_inline:flags.2?true phone_calls:flags.3?true forward_users:flags.4?true forward_chats:flags.5?true groups:flags.10?true channels:flags.15?true bots_app:flags.16?true offset:int limit:int hash:long = contacts.TopPeers;
 contacts.resetTopPeerRating#1ae373ac category:TopPeerCategory peer:InputPeer = Bool;
 contacts.resetSaved#879537f1 = Bool;
 contacts.getSaved#82f1e39f = Vector;
 contacts.toggleTopPeers#8514bdda enabled:Bool = Bool;
-contacts.addContact#e8f463d0 flags:# add_phone_privacy_exception:flags.0?true id:InputUser first_name:string last_name:string phone:string = Updates;
+contacts.addContact#d9ba2e54 flags:# add_phone_privacy_exception:flags.0?true id:InputUser first_name:string last_name:string phone:string note:flags.1?TextWithEntities = Updates;
 contacts.acceptContact#f831a20f id:InputUser = Updates;
 contacts.getLocated#d348bc44 flags:# background:flags.1?true geo_point:InputGeoPoint self_expires:flags.0?int = Updates;
 contacts.blockFromReplies#29a8962c flags:# delete_message:flags.0?true delete_history:flags.1?true report_spam:flags.2?true msg_id:int = Updates;
@@ -2053,6 +2275,8 @@ contacts.importContactToken#13005788 token:string = User;
 contacts.editCloseFriends#ba6705f0 id:Vector = Bool;
 contacts.setBlocked#94c65c76 flags:# my_stories_from:flags.0?true id:Vector limit:int = Bool;
 contacts.getBirthdays#daeda864 = contacts.ContactBirthdays;
+contacts.getSponsoredPeers#b6c8c393 q:string = contacts.SponsoredPeers;
+contacts.importCard#4fe196fe export_card:Vector = User;
 
 messages.getMessages#63c66506 id:Vector = messages.Messages;
 messages.getDialogs#a0f4cb4f flags:# exclude_pinned:flags.0?true folder_id:flags.1?int offset_date:int offset_id:int offset_peer:InputPeer limit:int hash:long = messages.Dialogs;
@@ -2063,12 +2287,12 @@ messages.deleteHistory#b08f922a flags:# just_clear:flags.0?true revoke:flags.1?t
 messages.deleteMessages#e58e95d2 flags:# revoke:flags.0?true id:Vector = messages.AffectedMessages;
 messages.receivedMessages#5a954c0 max_id:int = Vector;
 messages.setTyping#58943ee2 flags:# peer:InputPeer top_msg_id:flags.0?int action:SendMessageAction = Bool;
-messages.sendMessage#983f9745 flags:# no_webpage:flags.1?true silent:flags.5?true background:flags.6?true clear_draft:flags.7?true noforwards:flags.14?true update_stickersets_order:flags.15?true invert_media:flags.16?true peer:InputPeer reply_to:flags.0?InputReplyTo message:string random_id:long reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector schedule_date:flags.10?int send_as:flags.13?InputPeer quick_reply_shortcut:flags.17?InputQuickReplyShortcut effect:flags.18?long = Updates;
-messages.sendMedia#7852834e flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true noforwards:flags.14?true update_stickersets_order:flags.15?true invert_media:flags.16?true peer:InputPeer reply_to:flags.0?InputReplyTo media:InputMedia message:string random_id:long reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector schedule_date:flags.10?int send_as:flags.13?InputPeer quick_reply_shortcut:flags.17?InputQuickReplyShortcut effect:flags.18?long = Updates;
-messages.forwardMessages#d5039208 flags:# silent:flags.5?true background:flags.6?true with_my_score:flags.8?true drop_author:flags.11?true drop_media_captions:flags.12?true noforwards:flags.14?true from_peer:InputPeer id:Vector random_id:Vector to_peer:InputPeer top_msg_id:flags.9?int schedule_date:flags.10?int send_as:flags.13?InputPeer quick_reply_shortcut:flags.17?InputQuickReplyShortcut = Updates;
+messages.sendMessage#fe05dc9a flags:# no_webpage:flags.1?true silent:flags.5?true background:flags.6?true clear_draft:flags.7?true noforwards:flags.14?true update_stickersets_order:flags.15?true invert_media:flags.16?true allow_paid_floodskip:flags.19?true peer:InputPeer reply_to:flags.0?InputReplyTo message:string random_id:long reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector schedule_date:flags.10?int send_as:flags.13?InputPeer quick_reply_shortcut:flags.17?InputQuickReplyShortcut effect:flags.18?long allow_paid_stars:flags.21?long suggested_post:flags.22?SuggestedPost = Updates;
+messages.sendMedia#ac55d9c1 flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true noforwards:flags.14?true update_stickersets_order:flags.15?true invert_media:flags.16?true allow_paid_floodskip:flags.19?true peer:InputPeer reply_to:flags.0?InputReplyTo media:InputMedia message:string random_id:long reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector schedule_date:flags.10?int send_as:flags.13?InputPeer quick_reply_shortcut:flags.17?InputQuickReplyShortcut effect:flags.18?long allow_paid_stars:flags.21?long suggested_post:flags.22?SuggestedPost = Updates;
+messages.forwardMessages#978928ca flags:# silent:flags.5?true background:flags.6?true with_my_score:flags.8?true drop_author:flags.11?true drop_media_captions:flags.12?true noforwards:flags.14?true allow_paid_floodskip:flags.19?true from_peer:InputPeer id:Vector random_id:Vector to_peer:InputPeer top_msg_id:flags.9?int reply_to:flags.22?InputReplyTo schedule_date:flags.10?int send_as:flags.13?InputPeer quick_reply_shortcut:flags.17?InputQuickReplyShortcut video_timestamp:flags.20?int allow_paid_stars:flags.21?long suggested_post:flags.23?SuggestedPost = Updates;
 messages.reportSpam#cf1592db peer:InputPeer = Bool;
 messages.getPeerSettings#efd9a6a2 peer:InputPeer = messages.PeerSettings;
-messages.report#8953ab4e peer:InputPeer id:Vector reason:ReportReason message:string = Bool;
+messages.report#fc78af9b peer:InputPeer id:Vector option:bytes message:string = ReportResult;
 messages.getChats#49e9528f id:Vector = messages.Chats;
 messages.getFullChat#aeb00b34 chat_id:long = messages.ChatFull;
 messages.editChatTitle#73783ffd chat_id:long title:string = Updates;
@@ -2090,7 +2314,7 @@ messages.reportEncryptedSpam#4b0c8c0f peer:InputEncryptedChat = Bool;
 messages.readMessageContents#36a73f77 id:Vector = messages.AffectedMessages;
 messages.getStickers#d5a5d3a1 emoticon:string hash:long = messages.Stickers;
 messages.getAllStickers#b8a0a1a8 hash:long = messages.AllStickers;
-messages.getWebPagePreview#8b68b0cc flags:# message:string entities:flags.3?Vector = MessageMedia;
+messages.getWebPagePreview#570d6f6f flags:# message:string entities:flags.3?Vector = messages.WebPagePreview;
 messages.exportChatInvite#a455de90 flags:# legacy_revoke_permanent:flags.2?true request_needed:flags.3?true peer:InputPeer expire_date:flags.0?int usage_limit:flags.1?int title:flags.4?string subscription_pricing:flags.5?StarsSubscriptionPricing = ExportedChatInvite;
 messages.checkChatInvite#3eadb1bb hash:string = ChatInvite;
 messages.importChatInvite#6c50051c hash:string = Updates;
@@ -2101,21 +2325,21 @@ messages.startBot#e6df7378 bot:InputUser peer:InputPeer random_id:long start_par
 messages.getMessagesViews#5784d3e1 peer:InputPeer id:Vector increment:Bool = messages.MessageViews;
 messages.editChatAdmin#a85bd1c2 chat_id:long user_id:InputUser is_admin:Bool = Bool;
 messages.migrateChat#a2875319 chat_id:long = Updates;
-messages.searchGlobal#4bc6589a flags:# broadcasts_only:flags.1?true folder_id:flags.0?int q:string filter:MessagesFilter min_date:int max_date:int offset_rate:int offset_peer:InputPeer offset_id:int limit:int = messages.Messages;
+messages.searchGlobal#4bc6589a flags:# broadcasts_only:flags.1?true groups_only:flags.2?true users_only:flags.3?true folder_id:flags.0?int q:string filter:MessagesFilter min_date:int max_date:int offset_rate:int offset_peer:InputPeer offset_id:int limit:int = messages.Messages;
 messages.reorderStickerSets#78337739 flags:# masks:flags.0?true emojis:flags.1?true order:Vector = Bool;
 messages.getDocumentByHash#b1f2061f sha256:bytes size:long mime_type:string = Document;
 messages.getSavedGifs#5cf09635 hash:long = messages.SavedGifs;
 messages.saveGif#327a30cb id:InputDocument unsave:Bool = Bool;
 messages.getInlineBotResults#514e999d flags:# bot:InputUser peer:InputPeer geo_point:flags.0?InputGeoPoint query:string offset:string = messages.BotResults;
 messages.setInlineBotResults#bb12a419 flags:# gallery:flags.0?true private:flags.1?true query_id:long results:Vector cache_time:int next_offset:flags.2?string switch_pm:flags.3?InlineBotSwitchPM switch_webview:flags.4?InlineBotWebView = Bool;
-messages.sendInlineBotResult#3ebee86a flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true hide_via:flags.11?true peer:InputPeer reply_to:flags.0?InputReplyTo random_id:long query_id:long id:string schedule_date:flags.10?int send_as:flags.13?InputPeer quick_reply_shortcut:flags.17?InputQuickReplyShortcut = Updates;
+messages.sendInlineBotResult#c0cf7646 flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true hide_via:flags.11?true peer:InputPeer reply_to:flags.0?InputReplyTo random_id:long query_id:long id:string schedule_date:flags.10?int send_as:flags.13?InputPeer quick_reply_shortcut:flags.17?InputQuickReplyShortcut allow_paid_stars:flags.21?long = Updates;
 messages.getMessageEditData#fda68d36 peer:InputPeer id:int = messages.MessageEditData;
 messages.editMessage#dfd14005 flags:# no_webpage:flags.1?true invert_media:flags.16?true peer:InputPeer id:int message:flags.11?string media:flags.14?InputMedia reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector schedule_date:flags.15?int quick_reply_shortcut_id:flags.17?int = Updates;
 messages.editInlineBotMessage#83557dba flags:# no_webpage:flags.1?true invert_media:flags.16?true id:InputBotInlineMessageID message:flags.11?string media:flags.14?InputMedia reply_markup:flags.2?ReplyMarkup entities:flags.3?Vector = Bool;
 messages.getBotCallbackAnswer#9342ca07 flags:# game:flags.1?true peer:InputPeer msg_id:int data:flags.0?bytes password:flags.2?InputCheckPasswordSRP = messages.BotCallbackAnswer;
 messages.setBotCallbackAnswer#d58f130a flags:# alert:flags.1?true query_id:long message:flags.0?string url:flags.2?string cache_time:int = Bool;
 messages.getPeerDialogs#e470bcfd peers:Vector = messages.PeerDialogs;
-messages.saveDraft#d372c5ce flags:# no_webpage:flags.1?true invert_media:flags.6?true reply_to:flags.4?InputReplyTo peer:InputPeer message:string entities:flags.3?Vector media:flags.5?InputMedia effect:flags.7?long = Bool;
+messages.saveDraft#54ae308e flags:# no_webpage:flags.1?true invert_media:flags.6?true reply_to:flags.4?InputReplyTo peer:InputPeer message:string entities:flags.3?Vector media:flags.5?InputMedia effect:flags.7?long suggested_post:flags.8?SuggestedPost = Bool;
 messages.getAllDrafts#6a3f8d65 = Updates;
 messages.getFeaturedStickers#64780b14 hash:long = messages.FeaturedStickers;
 messages.readFeaturedStickers#5b118126 id:Vector = Bool;
@@ -2143,12 +2367,12 @@ messages.faveSticker#b9ffc55b id:InputDocument unfave:Bool = Bool;
 messages.getUnreadMentions#f107e790 flags:# peer:InputPeer top_msg_id:flags.0?int offset_id:int add_offset:int limit:int max_id:int min_id:int = messages.Messages;
 messages.readMentions#36e5bf4d flags:# peer:InputPeer top_msg_id:flags.0?int = messages.AffectedHistory;
 messages.getRecentLocations#702a40e0 peer:InputPeer limit:int hash:long = messages.Messages;
-messages.sendMultiMedia#37b74355 flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true noforwards:flags.14?true update_stickersets_order:flags.15?true invert_media:flags.16?true peer:InputPeer reply_to:flags.0?InputReplyTo multi_media:Vector schedule_date:flags.10?int send_as:flags.13?InputPeer quick_reply_shortcut:flags.17?InputQuickReplyShortcut effect:flags.18?long = Updates;
+messages.sendMultiMedia#1bf89d74 flags:# silent:flags.5?true background:flags.6?true clear_draft:flags.7?true noforwards:flags.14?true update_stickersets_order:flags.15?true invert_media:flags.16?true allow_paid_floodskip:flags.19?true peer:InputPeer reply_to:flags.0?InputReplyTo multi_media:Vector schedule_date:flags.10?int send_as:flags.13?InputPeer quick_reply_shortcut:flags.17?InputQuickReplyShortcut effect:flags.18?long allow_paid_stars:flags.21?long = Updates;
 messages.uploadEncryptedFile#5057c497 peer:InputEncryptedChat file:InputEncryptedFile = EncryptedFile;
 messages.searchStickerSets#35705b8a flags:# exclude_featured:flags.0?true q:string hash:long = messages.FoundStickerSets;
 messages.getSplitRanges#1cff7e08 = Vector;
-messages.markDialogUnread#c286d98f flags:# unread:flags.0?true peer:InputDialogPeer = Bool;
-messages.getDialogUnreadMarks#22e24e22 = Vector;
+messages.markDialogUnread#8c5006f8 flags:# unread:flags.0?true parent_peer:flags.1?InputPeer peer:InputDialogPeer = Bool;
+messages.getDialogUnreadMarks#21202222 flags:# parent_peer:flags.0?InputPeer = Vector;
 messages.clearAllDrafts#7e58ee9c = Bool;
 messages.updatePinnedMessage#d2aaf7ec flags:# silent:flags.0?true unpin:flags.1?true pm_oneside:flags.2?true peer:InputPeer id:int = Updates;
 messages.sendVote#10ea6184 peer:InputPeer msg_id:int options:Vector = Updates;
@@ -2178,7 +2402,7 @@ messages.getOldFeaturedStickers#7ed094a1 offset:int limit:int hash:long = messag
 messages.getReplies#22ddd30c peer:InputPeer msg_id:int offset_id:int offset_date:int add_offset:int limit:int max_id:int min_id:int hash:long = messages.Messages;
 messages.getDiscussionMessage#446972fd peer:InputPeer msg_id:int = messages.DiscussionMessage;
 messages.readDiscussion#f731a9f4 peer:InputPeer msg_id:int read_max_id:int = Bool;
-messages.unpinAllMessages#ee22b9a8 flags:# peer:InputPeer top_msg_id:flags.0?int = messages.AffectedHistory;
+messages.unpinAllMessages#62dd747 flags:# peer:InputPeer top_msg_id:flags.0?int saved_peer_id:flags.1?InputPeer = messages.AffectedHistory;
 messages.deleteChat#5bd0ee50 chat_id:long = Bool;
 messages.deletePhoneCallHistory#f9cbe409 flags:# revoke:flags.0?true = messages.AffectedFoundMessages;
 messages.checkHistoryImport#43fe19f3 import_head:string = messages.HistoryImportParsed;
@@ -2194,7 +2418,7 @@ messages.getAdminsWithInvites#3920e6ef peer:InputPeer = messages.ChatAdminsWithI
 messages.getChatInviteImporters#df04dd4e flags:# requested:flags.0?true subscription_expired:flags.3?true peer:InputPeer link:flags.1?string q:flags.2?string offset_date:int offset_user:InputUser limit:int = messages.ChatInviteImporters;
 messages.setHistoryTTL#b80e5fe4 peer:InputPeer period:int = Updates;
 messages.checkHistoryImportPeer#5dc60f03 peer:InputPeer = messages.CheckedHistoryImportPeer;
-messages.setChatTheme#e63be13f peer:InputPeer emoticon:string = Updates;
+messages.setChatTheme#81202c9 peer:InputPeer theme:InputChatTheme = Updates;
 messages.getMessageReadParticipants#31c1c44f peer:InputPeer msg_id:int = Vector;
 messages.getSearchResultsCalendar#6aa3f6bd flags:# peer:InputPeer saved_peer_id:flags.2?InputPeer filter:MessagesFilter offset_id:int offset_date:int = messages.SearchResultsCalendar;
 messages.getSearchResultsPositions#9c7f2f10 flags:# peer:InputPeer saved_peer_id:flags.2?InputPeer filter:MessagesFilter offset_id:int limit:int = messages.SearchResultsPositions;
@@ -2209,15 +2433,15 @@ messages.setChatAvailableReactions#864b2581 flags:# peer:InputPeer available_rea
 messages.getAvailableReactions#18dea0ac hash:int = messages.AvailableReactions;
 messages.setDefaultReaction#4f47a016 reaction:Reaction = Bool;
 messages.translateText#63183030 flags:# peer:flags.0?InputPeer id:flags.0?Vector text:flags.1?Vector to_lang:string = messages.TranslatedText;
-messages.getUnreadReactions#3223495b flags:# peer:InputPeer top_msg_id:flags.0?int offset_id:int add_offset:int limit:int max_id:int min_id:int = messages.Messages;
-messages.readReactions#54aa7f8e flags:# peer:InputPeer top_msg_id:flags.0?int = messages.AffectedHistory;
+messages.getUnreadReactions#bd7f90ac flags:# peer:InputPeer top_msg_id:flags.0?int saved_peer_id:flags.1?InputPeer offset_id:int add_offset:int limit:int max_id:int min_id:int = messages.Messages;
+messages.readReactions#9ec44f93 flags:# peer:InputPeer top_msg_id:flags.0?int saved_peer_id:flags.1?InputPeer = messages.AffectedHistory;
 messages.searchSentMedia#107e31a0 q:string filter:MessagesFilter limit:int = messages.Messages;
 messages.getAttachMenuBots#16fcc2cb hash:long = AttachMenuBots;
 messages.getAttachMenuBot#77216192 bot:InputUser = AttachMenuBotsBot;
 messages.toggleBotInAttachMenu#69f59d69 flags:# write_allowed:flags.0?true bot:InputUser enabled:Bool = Bool;
-messages.requestWebView#269dc2c1 flags:# from_bot_menu:flags.4?true silent:flags.5?true compact:flags.7?true peer:InputPeer bot:InputUser url:flags.1?string start_param:flags.3?string theme_params:flags.2?DataJSON platform:string reply_to:flags.0?InputReplyTo send_as:flags.13?InputPeer = WebViewResult;
+messages.requestWebView#269dc2c1 flags:# from_bot_menu:flags.4?true silent:flags.5?true compact:flags.7?true fullscreen:flags.8?true peer:InputPeer bot:InputUser url:flags.1?string start_param:flags.3?string theme_params:flags.2?DataJSON platform:string reply_to:flags.0?InputReplyTo send_as:flags.13?InputPeer = WebViewResult;
 messages.prolongWebView#b0d81a83 flags:# silent:flags.5?true peer:InputPeer bot:InputUser query_id:long reply_to:flags.0?InputReplyTo send_as:flags.13?InputPeer = Bool;
-messages.requestSimpleWebView#413a3e73 flags:# from_switch_webview:flags.1?true from_side_menu:flags.2?true compact:flags.7?true bot:InputUser url:flags.3?string start_param:flags.4?string theme_params:flags.0?DataJSON platform:string = WebViewResult;
+messages.requestSimpleWebView#413a3e73 flags:# from_switch_webview:flags.1?true from_side_menu:flags.2?true compact:flags.7?true fullscreen:flags.8?true bot:InputUser url:flags.3?string start_param:flags.4?string theme_params:flags.0?DataJSON platform:string = WebViewResult;
 messages.sendWebViewResultMessage#a4314f5 bot_query_id:string result:InputBotInlineResult = WebViewMessageSent;
 messages.sendWebViewData#dc0242c8 bot:InputUser random_id:long button_text:string data:string = Updates;
 messages.transcribeAudio#269e9a49 peer:InputPeer msg_id:int = messages.TranscribedAudio;
@@ -2239,12 +2463,12 @@ messages.getEmojiProfilePhotoGroups#21a548f3 hash:int = messages.EmojiGroups;
 messages.searchCustomEmoji#2c11c0d7 emoticon:string hash:long = EmojiList;
 messages.togglePeerTranslations#e47cb579 flags:# disabled:flags.0?true peer:InputPeer = Bool;
 messages.getBotApp#34fdc5c3 app:InputBotApp hash:long = messages.BotApp;
-messages.requestAppWebView#53618bce flags:# write_allowed:flags.0?true compact:flags.7?true peer:InputPeer app:InputBotApp start_param:flags.1?string theme_params:flags.2?DataJSON platform:string = WebViewResult;
+messages.requestAppWebView#53618bce flags:# write_allowed:flags.0?true compact:flags.7?true fullscreen:flags.8?true peer:InputPeer app:InputBotApp start_param:flags.1?string theme_params:flags.2?DataJSON platform:string = WebViewResult;
 messages.setChatWallPaper#8ffacae1 flags:# for_both:flags.3?true revert:flags.4?true peer:InputPeer wallpaper:flags.0?InputWallPaper settings:flags.2?WallPaperSettings id:flags.1?int = Updates;
 messages.searchEmojiStickerSets#92b4494c flags:# exclude_featured:flags.0?true q:string hash:long = messages.FoundStickerSets;
-messages.getSavedDialogs#5381d21a flags:# exclude_pinned:flags.0?true offset_date:int offset_id:int offset_peer:InputPeer limit:int hash:long = messages.SavedDialogs;
-messages.getSavedHistory#3d9a414d peer:InputPeer offset_id:int offset_date:int add_offset:int limit:int max_id:int min_id:int hash:long = messages.Messages;
-messages.deleteSavedHistory#6e98102b flags:# peer:InputPeer max_id:int min_date:flags.2?int max_date:flags.3?int = messages.AffectedHistory;
+messages.getSavedDialogs#1e91fc99 flags:# exclude_pinned:flags.0?true parent_peer:flags.1?InputPeer offset_date:int offset_id:int offset_peer:InputPeer limit:int hash:long = messages.SavedDialogs;
+messages.getSavedHistory#998ab009 flags:# parent_peer:flags.0?InputPeer peer:InputPeer offset_id:int offset_date:int add_offset:int limit:int max_id:int min_id:int hash:long = messages.Messages;
+messages.deleteSavedHistory#4dc5085f flags:# parent_peer:flags.0?InputPeer peer:InputPeer max_id:int min_date:flags.2?int max_date:flags.3?int = messages.AffectedHistory;
 messages.getPinnedSavedDialogs#d63d94e0 = messages.SavedDialogs;
 messages.toggleSavedDialogPin#ac81bbde flags:# pinned:flags.0?true peer:InputDialogPeer = Bool;
 messages.reorderPinnedSavedDialogs#8b716587 flags:# force:flags.0?true order:Vector = Bool;
@@ -2267,10 +2491,42 @@ messages.getAvailableEffects#dea20a39 hash:int = messages.AvailableEffects;
 messages.editFactCheck#589ee75 peer:InputPeer msg_id:int text:TextWithEntities = Updates;
 messages.deleteFactCheck#d1da940c peer:InputPeer msg_id:int = Updates;
 messages.getFactCheck#b9cdc5ee peer:InputPeer msg_id:Vector = Vector;
-messages.requestMainWebView#c9e01e7b flags:# compact:flags.7?true peer:InputPeer bot:InputUser start_param:flags.1?string theme_params:flags.0?DataJSON platform:string = WebViewResult;
-messages.sendPaidReaction#9dd6a67b flags:# peer:InputPeer msg_id:int count:int random_id:long private:flags.0?Bool = Updates;
-messages.togglePaidReactionPrivacy#849ad397 peer:InputPeer msg_id:int private:Bool = Bool;
+messages.requestMainWebView#c9e01e7b flags:# compact:flags.7?true fullscreen:flags.8?true peer:InputPeer bot:InputUser start_param:flags.1?string theme_params:flags.0?DataJSON platform:string = WebViewResult;
+messages.sendPaidReaction#58bbcb50 flags:# peer:InputPeer msg_id:int count:int random_id:long private:flags.0?PaidReactionPrivacy = Updates;
+messages.togglePaidReactionPrivacy#435885b5 peer:InputPeer msg_id:int private:PaidReactionPrivacy = Bool;
 messages.getPaidReactionPrivacy#472455aa = Updates;
+messages.viewSponsoredMessage#269e3643 random_id:bytes = Bool;
+messages.clickSponsoredMessage#8235057e flags:# media:flags.0?true fullscreen:flags.1?true random_id:bytes = Bool;
+messages.reportSponsoredMessage#12cbf0c4 random_id:bytes option:bytes = channels.SponsoredMessageReportResult;
+messages.getSponsoredMessages#3d6ce850 flags:# peer:InputPeer msg_id:flags.0?int = messages.SponsoredMessages;
+messages.savePreparedInlineMessage#f21f7f2f flags:# result:InputBotInlineResult user_id:InputUser peer_types:flags.0?Vector = messages.BotPreparedInlineMessage;
+messages.getPreparedInlineMessage#857ebdb8 bot:InputUser id:string = messages.PreparedInlineMessage;
+messages.searchStickers#29b1c66a flags:# emojis:flags.0?true q:string emoticon:string lang_code:Vector offset:int limit:int hash:long = messages.FoundStickers;
+messages.reportMessagesDelivery#5a6d7395 flags:# push:flags.0?true peer:InputPeer id:Vector = Bool;
+messages.getSavedDialogsByID#6f6f9c96 flags:# parent_peer:flags.1?InputPeer ids:Vector = messages.SavedDialogs;
+messages.readSavedHistory#ba4a3b5b parent_peer:InputPeer peer:InputPeer max_id:int = Bool;
+messages.toggleTodoCompleted#d3e03124 peer:InputPeer msg_id:int completed:Vector incompleted:Vector = Updates;
+messages.appendTodoList#21a61057 peer:InputPeer msg_id:int list:Vector = Updates;
+messages.toggleSuggestedPostApproval#8107455c flags:# reject:flags.1?true peer:InputPeer msg_id:int schedule_date:flags.0?int reject_comment:flags.2?string = Updates;
+messages.updateContactNote#139f63fb id:InputUser note:TextWithEntities = Bool;
+messages.updatePinnedForumTopic#175df251 peer:InputPeer topic_id:int pinned:Bool = Updates;
+messages.getWebViewResult#22b6c214 peer:InputPeer bot:InputUser query_id:long = messages.WebViewResult;
+messages.createForumTopic#2f98c3d5 flags:# title_missing:flags.4?true peer:InputPeer title:string icon_color:flags.0?int icon_emoji_id:flags.3?long random_id:long send_as:flags.2?InputPeer = Updates;
+messages.forwardMessage#33963bf9 peer:InputPeer id:int random_id:long = Updates;
+messages.getForumTopics#3ba47bff flags:# peer:InputPeer q:flags.0?string offset_date:int offset_id:int offset_topic:int limit:int = messages.ForumTopics;
+messages.checkPaidAuth#56e59f9c phone_number:string phone_code_hash:string form_id:long = auth.SentCode;
+messages.updateColor#684d214e flags:# for_profile:flags.1?true color:flags.2?PeerColor = Bool;
+messages.getStatsURL#812c2ae6 flags:# dark:flags.0?true peer:InputPeer params:string = StatsURL;
+messages.getAllChats#875f74be except_ids:Vector = messages.Chats;
+messages.sendGroupCallMessage#87893014 call:InputGroupCall random_id:long message:TextWithEntities = Bool;
+messages.getForumTopicsByID#af0a4a08 peer:InputPeer topics:Vector = messages.ForumTopics;
+messages.editForumTopic#cecc1134 flags:# peer:InputPeer topic_id:int title:flags.0?string icon_emoji_id:flags.1?long closed:flags.2?Bool hidden:flags.3?Bool = Updates;
+messages.deleteTopicHistory#d2816f10 peer:InputPeer top_msg_id:int = messages.AffectedHistory;
+messages.setWebViewResult#e41cd11d query_id:long = Bool;
+messages.getUniqueGiftChatThemes#e42ce9c9 offset:string limit:int hash:long = ChatThemes;
+messages.sendGroupCallEncryptedMessage#e5afa56d call:InputGroupCall encrypted_message:bytes = Bool;
+messages.reorderPinnedForumTopics#e7841f0 flags:# force:flags.0?int peer:InputPeer order:Vector = Updates;
+messages.toggleGroupCallSettings#e9723804 flags:# reset_invite_hash:flags.1?true call:InputGroupCall join_muted:flags.0?Bool messages_enabled:flags.2?Bool = Updates;
 
 updates.getState#edd4882a = updates.State;
 updates.getDifference#19c2f763 flags:# pts:int pts_limit:flags.1?int pts_total_limit:flags.0?int date:int qts:int qts_limit:flags.2?int = updates.Difference;
@@ -2352,16 +2608,14 @@ channels.editLocation#58e63f6d channel:InputChannel geo_point:InputGeoPoint addr
 channels.toggleSlowMode#edd49ef0 channel:InputChannel seconds:int = Updates;
 channels.getInactiveChannels#11e831ee = messages.InactiveChats;
 channels.convertToGigagroup#b290c69 channel:InputChannel = Updates;
-channels.viewSponsoredMessage#beaedb94 channel:InputChannel random_id:bytes = Bool;
-channels.getSponsoredMessages#ec210fbf channel:InputChannel = messages.SponsoredMessages;
-channels.getSendAs#dc770ee peer:InputPeer = channels.SendAsPeers;
+channels.getSendAs#e785a43f flags:# for_paid_reactions:flags.0?true peer:InputPeer = channels.SendAsPeers;
 channels.deleteParticipantHistory#367544db channel:InputChannel participant:InputPeer = messages.AffectedHistory;
 channels.toggleJoinToSend#e4cb9580 channel:InputChannel enabled:Bool = Updates;
 channels.toggleJoinRequest#4c2985b6 channel:InputChannel enabled:Bool = Updates;
 channels.reorderUsernames#b45ced1d channel:InputChannel order:Vector = Bool;
 channels.toggleUsername#50f24105 channel:InputChannel username:string active:Bool = Bool;
 channels.deactivateAllUsernames#a245dd3 channel:InputChannel = Bool;
-channels.toggleForum#a4298b29 channel:InputChannel enabled:Bool = Updates;
+channels.toggleForum#3ff75734 channel:InputChannel enabled:Bool tabs:Bool = Updates;
 channels.createForumTopic#f40c0224 flags:# channel:InputChannel title:string icon_color:flags.0?int icon_emoji_id:flags.3?long random_id:long send_as:flags.2?InputPeer = Updates;
 channels.getForumTopics#de560d1 flags:# channel:InputChannel q:flags.0?string offset_date:int offset_id:int offset_topic:int limit:int = messages.ForumTopics;
 channels.getForumTopicsByID#b0831eb9 channel:InputChannel topics:Vector = messages.ForumTopics;
@@ -2372,16 +2626,19 @@ channels.reorderPinnedForumTopics#2950a18f flags:# force:flags.0?true channel:In
 channels.toggleAntiSpam#68f3e4eb channel:InputChannel enabled:Bool = Updates;
 channels.reportAntiSpamFalsePositive#a850a693 channel:InputChannel msg_id:int = Bool;
 channels.toggleParticipantsHidden#6a6e7854 channel:InputChannel enabled:Bool = Updates;
-channels.clickSponsoredMessage#18afbc93 channel:InputChannel random_id:bytes = Bool;
 channels.updateColor#d8aa3671 flags:# for_profile:flags.1?true channel:InputChannel color:flags.2?int background_emoji_id:flags.0?long = Updates;
 channels.toggleViewForumAsMessages#9738bb15 channel:InputChannel enabled:Bool = Updates;
 channels.getChannelRecommendations#25a71742 flags:# channel:flags.0?InputChannel = messages.Chats;
 channels.updateEmojiStatus#f0d3e6a8 channel:InputChannel emoji_status:EmojiStatus = Updates;
 channels.setBoostsToUnblockRestrictions#ad399cee channel:InputChannel boosts:int = Updates;
 channels.setEmojiStickers#3cd930b7 channel:InputChannel stickerset:InputStickerSet = Bool;
-channels.reportSponsoredMessage#af8ff6b9 channel:InputChannel random_id:bytes option:bytes = channels.SponsoredMessageReportResult;
 channels.restrictSponsoredMessages#9ae91519 channel:InputChannel restricted:Bool = Updates;
-channels.searchPosts#d19f987b hashtag:string offset_rate:int offset_peer:InputPeer offset_id:int limit:int = messages.Messages;
+channels.searchPosts#f2c4f24d flags:# hashtag:flags.0?string query:flags.1?string offset_rate:int offset_peer:InputPeer offset_id:int limit:int allow_paid_stars:flags.2?long = messages.Messages;
+channels.updatePaidMessagesPrice#4b12327b flags:# broadcast_messages_allowed:flags.0?true channel:InputChannel send_paid_messages_stars:long = Updates;
+channels.toggleAutotranslation#167fc0a1 channel:InputChannel enabled:Bool = Updates;
+channels.getMessageAuthor#ece2a0e6 channel:InputChannel id:int = User;
+channels.checkSearchPostsFlood#22567115 flags:# query:flags.0?string = SearchPostsFlood;
+channels.setMainProfileTab#3583fcb1 channel:InputChannel tab:ProfileTab = Bool;
 
 bots.sendCustomRequest#aa2769ed custom_method:string params:DataJSON = DataJSON;
 bots.answerWebhookJSONQuery#e6213f4d query_id:long data:DataJSON = Bool;
@@ -2406,6 +2663,13 @@ bots.deletePreviewMedia#2d0135b3 bot:InputUser lang_code:string media:Vector = Bool;
 bots.getPreviewInfo#423ab3ad bot:InputUser lang_code:string = bots.PreviewInfo;
 bots.getPreviewMedias#a2a5594d bot:InputUser = Vector;
+bots.updateUserEmojiStatus#ed9f30c5 user_id:InputUser emoji_status:EmojiStatus = Bool;
+bots.toggleUserEmojiStatusPermission#6de6392 bot:InputUser enabled:Bool = Bool;
+bots.checkDownloadFileParams#50077589 bot:InputUser file_name:string url:string = Bool;
+bots.getAdminedBots#b0711d83 = Vector;
+bots.updateStarRefProgram#778b5ab3 flags:# bot:InputUser commission_permille:int duration_months:flags.0?int = StarRefProgram;
+bots.setCustomVerification#8b89dfbd flags:# enabled:flags.1?true bot:flags.0?InputUser peer:InputPeer custom_description:flags.2?string = Bool;
+bots.getBotRecommendations#a1b70815 bot:InputUser = users.Users;
 
 payments.getPaymentForm#37148dbb flags:# invoice:InputInvoice theme_params:flags.0?DataJSON = payments.PaymentForm;
 payments.getPaymentReceipt#2478d1cc peer:InputPeer msg_id:int = payments.PaymentReceipt;
@@ -2417,26 +2681,54 @@ payments.getBankCardData#2e79d779 number:string = payments.BankCardData;
 payments.exportInvoice#f91b065 invoice_media:InputMedia = payments.ExportedInvoice;
 payments.assignAppStoreTransaction#80ed747d receipt:bytes purpose:InputStorePaymentPurpose = Updates;
 payments.assignPlayMarketTransaction#dffd50d3 receipt:DataJSON purpose:InputStorePaymentPurpose = Updates;
-payments.canPurchasePremium#9fc19eb6 purpose:InputStorePaymentPurpose = Bool;
 payments.getPremiumGiftCodeOptions#2757ba54 flags:# boost_peer:flags.0?InputPeer = Vector;
 payments.checkGiftCode#8e51b4c1 slug:string = payments.CheckedGiftCode;
 payments.applyGiftCode#f6e26854 slug:string = Updates;
 payments.getGiveawayInfo#f4239425 peer:InputPeer msg_id:int = payments.GiveawayInfo;
 payments.launchPrepaidGiveaway#5ff58f20 peer:InputPeer giveaway_id:long purpose:InputStorePaymentPurpose = Updates;
 payments.getStarsTopupOptions#c00ec7d3 = Vector;
-payments.getStarsStatus#104fcfa7 peer:InputPeer = payments.StarsStatus;
-payments.getStarsTransactions#69da4557 flags:# inbound:flags.0?true outbound:flags.1?true ascending:flags.2?true subscription_id:flags.3?string peer:InputPeer offset:string limit:int = payments.StarsStatus;
-payments.sendStarsForm#2bb731d flags:# form_id:long invoice:InputInvoice = payments.PaymentResult;
+payments.getStarsStatus#4ea9b3bf flags:# ton:flags.0?true peer:InputPeer = payments.StarsStatus;
+payments.getStarsTransactions#69da4557 flags:# inbound:flags.0?true outbound:flags.1?true ascending:flags.2?true ton:flags.4?true subscription_id:flags.3?string peer:InputPeer offset:string limit:int = payments.StarsStatus;
+payments.sendStarsForm#7998c914 form_id:long invoice:InputInvoice = payments.PaymentResult;
 payments.refundStarsCharge#25ae8f4a user_id:InputUser charge_id:string = Updates;
-payments.getStarsRevenueStats#d91ffad6 flags:# dark:flags.0?true peer:InputPeer = payments.StarsRevenueStats;
-payments.getStarsRevenueWithdrawalUrl#13bbe8b3 peer:InputPeer stars:long password:InputCheckPasswordSRP = payments.StarsRevenueWithdrawalUrl;
+payments.getStarsRevenueStats#d91ffad6 flags:# dark:flags.0?true ton:flags.1?true peer:InputPeer = payments.StarsRevenueStats;
+payments.getStarsRevenueWithdrawalUrl#2433dc92 flags:# ton:flags.0?true peer:InputPeer amount:flags.1?long password:InputCheckPasswordSRP = payments.StarsRevenueWithdrawalUrl;
 payments.getStarsRevenueAdsAccountUrl#d1d7efc5 peer:InputPeer = payments.StarsRevenueAdsAccountUrl;
-payments.getStarsTransactionsByID#27842d2e peer:InputPeer id:Vector = payments.StarsStatus;
+payments.getStarsTransactionsByID#2dca16b8 flags:# ton:flags.0?true peer:InputPeer id:Vector = payments.StarsStatus;
 payments.getStarsGiftOptions#d3c96bc8 flags:# user_id:flags.0?InputUser = Vector;
 payments.getStarsSubscriptions#32512c5 flags:# missing_balance:flags.0?true peer:InputPeer offset:string = payments.StarsStatus;
 payments.changeStarsSubscription#c7770878 flags:# peer:InputPeer subscription_id:string canceled:flags.0?Bool = Bool;
 payments.fulfillStarsSubscription#cc5bebb3 peer:InputPeer subscription_id:string = Bool;
 payments.getStarsGiveawayOptions#bd1efd3e = Vector;
+payments.getStarGifts#c4563590 hash:int = payments.StarGifts;
+payments.saveStarGift#2a2a697c flags:# unsave:flags.0?true stargift:InputSavedStarGift = Bool;
+payments.convertStarGift#74bf076b stargift:InputSavedStarGift = Bool;
+payments.botCancelStarsSubscription#6dfa0622 flags:# restore:flags.0?true user_id:InputUser charge_id:string = Bool;
+payments.getConnectedStarRefBots#5869a553 flags:# peer:InputPeer offset_date:flags.2?int offset_link:flags.2?string limit:int = payments.ConnectedStarRefBots;
+payments.getConnectedStarRefBot#b7d998f0 peer:InputPeer bot:InputUser = payments.ConnectedStarRefBots;
+payments.getSuggestedStarRefBots#d6b48f7 flags:# order_by_revenue:flags.0?true order_by_date:flags.1?true peer:InputPeer offset:string limit:int = payments.SuggestedStarRefBots;
+payments.connectStarRefBot#7ed5348a peer:InputPeer bot:InputUser = payments.ConnectedStarRefBots;
+payments.editConnectedStarRefBot#e4fca4a3 flags:# revoked:flags.0?true peer:InputPeer link:string = payments.ConnectedStarRefBots;
+payments.getStarGiftUpgradePreview#9c9abcb1 gift_id:long = payments.StarGiftUpgradePreview;
+payments.upgradeStarGift#aed6e4f5 flags:# keep_original_details:flags.0?true stargift:InputSavedStarGift = Updates;
+payments.transferStarGift#7f18176a stargift:InputSavedStarGift to_id:InputPeer = Updates;
+payments.getUniqueStarGift#a1974d72 slug:string = payments.UniqueStarGift;
+payments.getSavedStarGifts#a319e569 flags:# exclude_unsaved:flags.0?true exclude_saved:flags.1?true exclude_unlimited:flags.2?true exclude_unique:flags.4?true sort_by_value:flags.5?true exclude_upgradable:flags.7?true exclude_unupgradable:flags.8?true peer_color_available:flags.9?true exclude_hosted:flags.10?true peer:InputPeer collection_id:flags.6?int offset:string limit:int = payments.SavedStarGifts;
+payments.getSavedStarGift#b455a106 stargift:Vector = payments.SavedStarGifts;
+payments.getStarGiftWithdrawalUrl#d06e93a8 stargift:InputSavedStarGift password:InputCheckPasswordSRP = payments.StarGiftWithdrawalUrl;
+payments.toggleChatStarGiftNotifications#60eaefa1 flags:# enabled:flags.0?true peer:InputPeer = Bool;
+payments.toggleStarGiftsPinnedToTop#1513e7b0 peer:InputPeer stargift:Vector = Bool;
+payments.canPurchaseStore#4fdc5ea7 purpose:InputStorePaymentPurpose = Bool;
+payments.getResaleStarGifts#7a5fa236 flags:# sort_by_price:flags.1?true sort_by_num:flags.2?true attributes_hash:flags.0?long gift_id:long attributes:flags.3?Vector offset:string limit:int = payments.ResaleStarGifts;
+payments.updateStarGiftPrice#edbe6ccb stargift:InputSavedStarGift resell_amount:StarsAmount = Updates;
+payments.createStarGiftCollection#1f4a0e87 peer:InputPeer title:string stargift:Vector = StarGiftCollection;
+payments.updateStarGiftCollection#4fddbee7 flags:# peer:InputPeer collection_id:int title:flags.0?string delete_stargift:flags.1?Vector add_stargift:flags.2?Vector order:flags.3?Vector = StarGiftCollection;
+payments.reorderStarGiftCollections#c32af4cc peer:InputPeer order:Vector = Bool;
+payments.deleteStarGiftCollection#ad5648e8 peer:InputPeer collection_id:int = Bool;
+payments.getStarGiftCollections#981b91dd peer:InputPeer hash:long = payments.StarGiftCollections;
+payments.getUniqueStarGiftValueInfo#4365af6b slug:string = payments.UniqueStarGiftValueInfo;
+payments.checkCanSendGift#c0c4edc9 gift_id:long = payments.CheckCanSendGiftResult;
+payments.requestRecurringPayment#146e958d user_id:InputUser recurring_init_charge:string invoice_media:InputMedia = Updates;
 
 stickers.createStickerSet#9021ab67 flags:# masks:flags.0?true emojis:flags.5?true text_color:flags.6?true user_id:InputUser title:string short_name:string thumb:flags.2?InputDocument stickers:Vector software:flags.3?string = messages.StickerSet;
 stickers.removeStickerFromSet#f7760f51 sticker:InputDocument = messages.StickerSet;
@@ -2460,7 +2752,7 @@ phone.setCallRating#59ead627 flags:# user_initiative:flags.0?true peer:InputPhon
 phone.saveCallDebug#277add7e peer:InputPhoneCall debug:DataJSON = Bool;
 phone.sendSignalingData#ff7a9383 peer:InputPhoneCall data:bytes = Bool;
 phone.createGroupCall#48cdc6d8 flags:# rtmp_stream:flags.2?true peer:InputPeer random_id:int title:flags.0?string schedule_date:flags.1?int = Updates;
-phone.joinGroupCall#b132ff7b flags:# muted:flags.0?true video_stopped:flags.2?true call:InputGroupCall join_as:InputPeer invite_hash:flags.1?string params:DataJSON = Updates;
+phone.joinGroupCall#8fb53057 flags:# muted:flags.0?true video_stopped:flags.2?true call:InputGroupCall join_as:InputPeer invite_hash:flags.1?string public_key:flags.3?int256 block:flags.3?bytes params:DataJSON = Updates;
 phone.leaveGroupCall#500377f9 call:InputGroupCall source:int = Updates;
 phone.inviteToGroupCall#7b393160 call:InputGroupCall users:Vector = Updates;
 phone.discardGroupCall#7a777135 call:InputGroupCall = Updates;
@@ -2481,6 +2773,12 @@ phone.leaveGroupCallPresentation#1c50d144 call:InputGroupCall = Updates;
 phone.getGroupCallStreamChannels#1ab21940 call:InputGroupCall = phone.GroupCallStreamChannels;
 phone.getGroupCallStreamRtmpUrl#deb3abbf peer:InputPeer revoke:Bool = phone.GroupCallStreamRtmpUrl;
 phone.saveCallLog#41248786 peer:InputPhoneCall file:InputFile = Bool;
+phone.createConferenceCall#7d0444bb flags:# muted:flags.0?true video_stopped:flags.2?true join:flags.3?true random_id:int public_key:flags.3?int256 block:flags.3?bytes params:flags.3?DataJSON = Updates;
+phone.deleteConferenceCallParticipants#8ca60525 flags:# only_left:flags.0?true kick:flags.1?true call:InputGroupCall ids:Vector block:bytes = Updates;
+phone.sendConferenceCallBroadcast#c6701900 call:InputGroupCall block:bytes = Updates;
+phone.inviteConferenceCallParticipant#bcf22685 flags:# video:flags.0?true call:InputGroupCall user_id:InputUser = Updates;
+phone.declineConferenceCallInvite#3c479971 msg_id:int = Updates;
+phone.getGroupCallChainBlocks#ee9f88a6 call:InputGroupCall sub_chain_id:int offset:int limit:int = Updates;
 
 langpack.getLangPack#f2f2330a lang_pack:string lang_code:string = LangPackDifference;
 langpack.getStrings#efea3803 lang_pack:string lang_code:string keys:Vector = Vector;
@@ -2489,6 +2787,7 @@ langpack.getLanguages#42c6978f lang_pack:string = Vector;
 langpack.getLanguage#6a596502 lang_pack:string lang_code:string = LangPackLanguage;
 
 folders.editPeerFolders#6847d0ab folder_peers:Vector = Updates;
+folders.deleteFolder#1c295881 folder_id:int = Updates;
 
 stats.getBroadcastStats#ab42441a flags:# dark:flags.0?true channel:InputChannel = stats.BroadcastStats;
 stats.loadAsyncGraph#621d5fa0 flags:# token:string x:flags.0?long = StatsGraph;
@@ -2497,13 +2796,10 @@ stats.getMessagePublicForwards#5f150144 channel:InputChannel msg_id:int offset:s
 stats.getMessageStats#b6e0a3f5 flags:# dark:flags.0?true channel:InputChannel msg_id:int = stats.MessageStats;
 stats.getStoryStats#374fef40 flags:# dark:flags.0?true peer:InputPeer id:int = stats.StoryStats;
 stats.getStoryPublicForwards#a6437ef6 peer:InputPeer id:int offset:string limit:int = stats.PublicForwards;
-stats.getBroadcastRevenueStats#75dfb671 flags:# dark:flags.0?true channel:InputChannel = stats.BroadcastRevenueStats;
-stats.getBroadcastRevenueWithdrawalUrl#2a65ef73 channel:InputChannel password:InputCheckPasswordSRP = stats.BroadcastRevenueWithdrawalUrl;
-stats.getBroadcastRevenueTransactions#69280f channel:InputChannel offset:int limit:int = stats.BroadcastRevenueTransactions;
 
 chatlists.exportChatlistInvite#8472478e chatlist:InputChatlist title:string peers:Vector = chatlists.ExportedChatlistInvite;
 chatlists.deleteExportedInvite#719c5c5e chatlist:InputChatlist slug:string = Bool;
-chatlists.editExportedInvite#653db63d flags:# chatlist:InputChatlist slug:string title:flags.1?string peers:flags.2?Vector = ExportedChatlistInvite;
+chatlists.editExportedInvite#653db63d flags:# revoked:flags.0?true chatlist:InputChatlist slug:string title:flags.1?string peers:flags.2?Vector = ExportedChatlistInvite;
 chatlists.getExportedInvites#ce03da83 chatlist:InputChatlist = chatlists.ExportedInvites;
 chatlists.checkChatlistInvite#41c10fff slug:string = chatlists.ChatlistInvite;
 chatlists.joinChatlistInvite#a6b1e39a slug:string peers:Vector = Updates;
@@ -2513,8 +2809,8 @@ chatlists.hideChatlistUpdates#66e486fb chatlist:InputChatlist = Bool;
 chatlists.getLeaveChatlistSuggestions#fdbcd714 chatlist:InputChatlist = Vector;
 chatlists.leaveChatlist#74fae13a chatlist:InputChatlist peers:Vector = Updates;
 
-stories.canSendStory#c7dfdfdd peer:InputPeer = Bool;
-stories.sendStory#e4e6694b flags:# pinned:flags.2?true noforwards:flags.4?true fwd_modified:flags.7?true peer:InputPeer media:InputMedia media_areas:flags.5?Vector caption:flags.0?string entities:flags.1?Vector privacy_rules:Vector random_id:long period:flags.3?int fwd_from_id:flags.6?InputPeer fwd_from_story:flags.6?int = Updates;
+stories.canSendStory#30eb63f0 peer:InputPeer = stories.CanSendStoryCount;
+stories.sendStory#737fc2ec flags:# pinned:flags.2?true noforwards:flags.4?true fwd_modified:flags.7?true peer:InputPeer media:InputMedia media_areas:flags.5?Vector caption:flags.0?string entities:flags.1?Vector privacy_rules:Vector random_id:long period:flags.3?int fwd_from_id:flags.6?InputPeer fwd_from_story:flags.6?int albums:flags.8?Vector = Updates;
 stories.editStory#b583ba46 flags:# peer:InputPeer id:int media:flags.0?InputMedia media_areas:flags.3?Vector caption:flags.1?string entities:flags.1?Vector privacy_rules:flags.2?Vector = Updates;
 stories.deleteStories#ae59db5f peer:InputPeer id:Vector = Vector;
 stories.togglePinned#9a75a1ef peer:InputPeer id:Vector pinned:Bool = Vector;
@@ -2528,7 +2824,7 @@ stories.incrementStoryViews#b2028afb peer:InputPeer id:Vector = Bool;
 stories.getStoryViewsList#7ed23c57 flags:# just_contacts:flags.0?true reactions_first:flags.2?true forwards_first:flags.3?true peer:InputPeer q:flags.1?string id:int offset:string limit:int = stories.StoryViewsList;
 stories.getStoriesViews#28e16cc8 peer:InputPeer id:Vector = stories.StoryViews;
 stories.exportStoryLink#7b8def20 peer:InputPeer id:int = ExportedStoryLink;
-stories.report#1923fa8c peer:InputPeer id:Vector reason:ReportReason message:string = Bool;
+stories.report#19d8eb45 peer:InputPeer id:Vector option:bytes message:string = ReportResult;
 stories.activateStealthMode#57bbd166 flags:# past:flags.0?true future:flags.1?true = Updates;
 stories.sendReaction#7fd736b2 flags:# add_to_recent:flags.0?true peer:InputPeer story_id:int reaction:Reaction = Updates;
 stories.getPeerStories#2c4ada50 peer:InputPeer = stories.PeerStories;
@@ -2538,7 +2834,13 @@ stories.getChatsToSend#a56a8b60 = messages.Chats;
 stories.togglePeerStoriesHidden#bd0415c4 peer:InputPeer hidden:Bool = Bool;
 stories.getStoryReactionsList#b9b2881f flags:# forwards_first:flags.2?true peer:InputPeer id:int reaction:flags.0?Reaction offset:flags.1?string limit:int = stories.StoryReactionsList;
 stories.togglePinnedToTop#b297e9b peer:InputPeer id:Vector = Bool;
-stories.searchPosts#6cea116a flags:# hashtag:flags.0?string area:flags.1?MediaArea offset:string limit:int = stories.FoundStories;
+stories.searchPosts#d1810907 flags:# hashtag:flags.0?string area:flags.1?MediaArea peer:flags.2?InputPeer offset:string limit:int = stories.FoundStories;
+stories.createAlbum#a36396e5 peer:InputPeer title:string stories:Vector = StoryAlbum;
+stories.updateAlbum#5e5259b6 flags:# peer:InputPeer album_id:int title:flags.0?string delete_stories:flags.1?Vector add_stories:flags.2?Vector order:flags.3?Vector = StoryAlbum;
+stories.reorderAlbums#8535fbd9 peer:InputPeer order:Vector = Bool;
+stories.deleteAlbum#8d3456d0 peer:InputPeer album_id:int = Bool;
+stories.getAlbums#25b3eac7 peer:InputPeer hash:long = stories.Albums;
+stories.getAlbumStories#ac806d61 peer:InputPeer album_id:int offset:int limit:int = stories.Stories;
 
 premium.getBoostsList#60f67660 flags:# gifts:flags.0?true peer:InputPeer offset:string limit:int = premium.BoostsList;
 premium.getMyBoosts#be77b4a = premium.MyBoosts;
@@ -2556,4 +2858,4 @@ smsjobs.finishJob#4f1ebf24 flags:# job_id:string error:flags.0?string = Bool;
 
 fragment.getCollectibleInfo#be1e85ba collectible:InputCollectible = fragment.CollectibleInfo;
 
-// LAYER 187
+// LAYER 216
\ No newline at end of file
diff --git a/compiler/api/template/type.txt b/compiler/api/template/type.txt
index 99310359..2480f5ba 100644
--- a/compiler/api/template/type.txt
+++ b/compiler/api/template/type.txt
@@ -4,20 +4,8 @@
 
 from typing import Union
 from pyrogram import raw
-from pyrogram.raw.core import TLObject
 
 {name} = Union[{types}]
-
-
-# noinspection PyRedeclaration
-class {name}:  # type: ignore
-    """{docstring}
-    """
-
-    QUALNAME = "pyrogram.raw.base.{qualname}"
-
-    def __init__(self):
-        raise TypeError("Base types can only be used for type checking purposes: "
-                        "you tried to use a base type instance as argument, "
-                        "but you need to instantiate one of its constructors instead. "
-                        "More info: https://docs.pyrogram.org/telegram/base/{doc_name}")
+{name}.__doc__ = """
+    {docstring}
+"""
\ No newline at end of file
diff --git a/compiler/docs/compiler.py b/compiler/docs/compiler.py
index cb44a987..f87f1f07 100644
--- a/compiler/docs/compiler.py
+++ b/compiler/docs/compiler.py
@@ -21,6 +21,9 @@
 import re
 import shutil
 
+from dataclasses import dataclass
+from typing import Literal, Optional
+
 HOME = "compiler/docs"
 DESTINATION = "docs/source/telegram"
 PYROGRAM_API_DEST = "docs/source/api"
@@ -39,6 +42,64 @@ def snek(s: str):
     return re.sub(r"([a-z0-9])([A-Z])", r"\1_\2", s).lower()
 
 
+def _extract_union_name(node: ast.AST) -> Optional[str]:
+    """Extract the name of a variable that is assigned a Union type.
+
+    :param node: The AST node to extract the variable name from.
+    :return: The variable name if it is assigned a Union type, otherwise None.
+
+    >>> import ast
+    >>> parsed_ast = ast.parse("User = Union[raw.types.UserEmpty]")
+    >>> _extract_union_name(parsed_ast.body[0])
+    'User'
+    """
+
+    # Check if the assigned value is a Union type
+    if isinstance(node, ast.Assign) and isinstance(node.value, ast.Subscript):
+        if isinstance(node.value.value, ast.Name) and node.value.value.id == "Union":
+            # Extract variable name
+            if isinstance(node.targets[0], ast.Name):
+                return node.targets[0].id  # Variable name
+
+
+def _extract_class_name(node: ast.AST) -> Optional[str]:
+    """Extract the name of a class.
+
+    :param node: The AST node to extract the class name from.
+    :return: The class name if it is a class, otherwise None.
+
+    >>> import ast
+    >>> parsed_ast = ast.parse("class User: pass")
+    >>> _extract_class_name(parsed_ast.body[0])
+    'User'
+    """
+
+    if isinstance(node, ast.ClassDef):
+        return node.name  # Class name
+
+
+NodeType = Literal["class", "union"]
+
+
+@dataclass
+class NodeInfo:
+    name: str
+    type: NodeType
+
+
+def parse_node_info(node: ast.AST) -> Optional[NodeInfo]:
+    """Parse an AST node and extract the class or variable name."""
+    class_name = _extract_class_name(node)
+    if class_name:
+        return NodeInfo(name=class_name, type="class")
+
+    union_name = _extract_union_name(node)
+    if union_name:
+        return NodeInfo(name=union_name, type="union")
+
+    return None
+
+
 def generate(source_path, base):
     all_entities = {}
 
@@ -54,13 +115,13 @@ def build(path, level=0):
                     p = ast.parse(f.read())
 
                 for node in ast.walk(p):
-                    if isinstance(node, ast.ClassDef):
-                        name = node.name
+                    node_info = parse_node_info(node)
+                    if node_info:
                         break
                 else:
                     continue
 
-                full_path = os.path.basename(path) + "/" + snek(name).replace("_", "-") + ".rst"
+                full_path = os.path.basename(path) + "/" + snek(node_info.name).replace("_", "-") + ".rst"
 
                 if level:
                     full_path = base + "/" + full_path
@@ -69,25 +130,41 @@ def build(path, level=0):
                 if namespace in ["base", "types", "functions"]:
                     namespace = ""
 
-                full_name = f"{(namespace + '.') if namespace else ''}{name}"
+                full_name = f"{(namespace + '.') if namespace else ''}{node_info.name}"
 
                 os.makedirs(os.path.dirname(DESTINATION + "/" + full_path), exist_ok=True)
 
                 with open(DESTINATION + "/" + full_path, "w", encoding="utf-8") as f:
+                    title_markup = "=" * len(full_name)
+                    full_class_path = "pyrogram.raw.{}".format(
+                        ".".join(full_path.split("/")[:-1]) + "." + node_info.name
+                    )
+                    if node_info.type == "class":
+                        directive_type = "autoclass"
+                        directive_suffix = "()"
+                        directive_option = "members"
+                    elif node_info.type == "union":
+                        directive_type = "autodata"
+                        directive_suffix = ""
+                        directive_option = "annotation"
+                    else:
+                        raise ValueError(f"Unknown node type: `{node_info.type}`")
+
                     f.write(
                         page_template.format(
                             title=full_name,
-                            title_markup="=" * len(full_name),
-                            full_class_path="pyrogram.raw.{}".format(
-                                ".".join(full_path.split("/")[:-1]) + "." + name
-                            )
+                            title_markup=title_markup,
+                            directive_type=directive_type,
+                            full_class_path=full_class_path,
+                            directive_suffix=directive_suffix,
+                            directive_option=directive_option,
                         )
                     )
 
                 if last not in all_entities:
                     all_entities[last] = []
 
-                all_entities[last].append(name)
+                all_entities[last].append(node_info.name)
 
     build(source_path)
 
@@ -399,6 +476,7 @@ def get_title_list(s: str) -> list:
             MessageEntity
             Photo
             Thumbnail
+            AlternativeVideo
             Audio
             Document
             Animation
@@ -666,4 +744,4 @@ def start():
     DESTINATION = "../../docs/source/telegram"
     PYROGRAM_API_DEST = "../../docs/source/api"
 
-    start()
+    start()
\ No newline at end of file
diff --git a/compiler/errors/sort.py b/compiler/errors/sort.py
index db94e351..c37c283c 100644
--- a/compiler/errors/sort.py
+++ b/compiler/errors/sort.py
@@ -18,18 +18,97 @@
 
 import csv
 from pathlib import Path
+import re
+import requests  # requests==2.28.1
+import sys
 
-for p in Path("source").glob("*.tsv"):
-    with open(p) as f:
-        reader = csv.reader(f, delimiter="\t")
-        dct = {k: v for k, v in reader if k != "id"}
-        keys = sorted(dct)
+if len(sys.argv) != 2:
+    sys.exit(1)
 
-    with open(p, "w") as f:
-        f.write("id\tmessage\n")
+if sys.argv[1] == "sort":
+    for p in Path("source").glob("*.tsv"):
+        with open(p) as f:
+            reader = csv.reader(f, delimiter="\t")
+            dct = {k: v for k, v in reader if k != "id"}
+            keys = sorted(dct)
 
-        for i, item in enumerate(keys, start=1):
-            f.write(f"{item}\t{dct[item]}")
+        with open(p, "w") as f:
+            f.write("id\tmessage\n")
 
-            if i != len(keys):
-                f.write("\n")
+            for i, item in enumerate(keys, start=1):
+                f.write(f"{item}\t{dct[item]}")
+
+                if i != len(keys):
+                    f.write("\n")
+
+elif sys.argv[1] == "scrape":
+    base_url = "https://core.telegram.org"
+    errors_api_path = "/api/errors"
+    errors_data = None
+    html_content = None
+
+    try:
+        response = requests.get(base_url + errors_api_path)
+        response.raise_for_status()
+        html_content = response.text
+    except requests.exceptions.RequestException as e:
+        print(f"Error fetching errors page: {e}")
+
+    match = re.search(r'here.*?', html_content)
+    if not match:
+        print("Link to errors JSON not found.")
+
+    errors_json_url = base_url + match.group(1)
+    try:
+        response = requests.get(errors_json_url)
+        response.raise_for_status()
+        errors_data = response.json()
+    except requests.exceptions.RequestException as e:
+        print(f"Error fetching errors JSON: {e}")
+    except ValueError:
+        print("Error decoding JSON response.")
+
+    error_categories = errors_data.get("errors", [])
+    if not error_categories:
+        print("No error categories found in JSON.")
+
+    source_dir = Path("source/")
+    source_dir.mkdir(exist_ok=True)
+
+    for error_type in error_categories:
+        data_dict = {}
+
+        for tsv_path in source_dir.glob(f"{error_type}*.tsv"):
+            with open(tsv_path, 'r') as tsv_file:
+                reader = csv.DictReader(tsv_file, delimiter='\t')
+                for row in reader:
+                    if row['id'] != 'id':
+                        data_dict[row['id']] = row['message']
+
+        error_details = errors_data["errors"].get(error_type, {})
+        descriptions = errors_data["descriptions"]
+
+        for error_code in error_details:
+            if error_code.endswith("_*"):
+                continue
+
+            description = descriptions.get(error_code, "")
+            if description:
+                processed_description = (
+                    description.replace("%d", "{value}")
+                    .replace("\"", "'")
+                    .replace("»", "»")
+                    .replace("«", "«")
+                    .replace(" »", "")
+                    .replace("](/api/", f"]({base_url}/api/")
+                )
+                data_dict[error_code.replace("_%d", "_X")] = processed_description
+
+        sorted_keys = sorted(data_dict.keys())
+
+        for tsv_path in source_dir.glob(f"{error_type}*.tsv"):
+            print(f"Writing to {tsv_path}")
+            with open(tsv_path, 'w', newline='') as tsv_file:
+                writer = csv.writer(tsv_file, delimiter='\t')
+                writer.writerow(["id", "message"])
+                writer.writerows([(key, data_dict[key]) for key in sorted_keys])
diff --git a/compiler/errors/source/303_SEE_OTHER.tsv b/compiler/errors/source/303_SEE_OTHER.tsv
index 301660ce..c6c3d129 100644
--- a/compiler/errors/source/303_SEE_OTHER.tsv
+++ b/compiler/errors/source/303_SEE_OTHER.tsv
@@ -1,6 +1,6 @@
 id	message
 FILE_MIGRATE_X	The file to be accessed is currently stored in DC{value}
-NETWORK_MIGRATE_X	The source IP address is associated with DC{value} (for registration)
-PHONE_MIGRATE_X	The phone number a user is trying to use for authorization is associated with DC{value}
-STATS_MIGRATE_X	The statistics of the group/channel are stored in DC{value}
-USER_MIGRATE_X	The user whose identity is being used to execute queries is associated with DC{value} (for registration)
\ No newline at end of file
+NETWORK_MIGRATE_X	Your IP address is associated to DC {value}, please re-send the query to that DC.
+PHONE_MIGRATE_X	Your phone number is associated to DC {value}, please re-send the query to that DC.
+STATS_MIGRATE_X	Channel statistics for the specified channel are stored on DC {value}, please re-send the query to that DC.
+USER_MIGRATE_X	Your account is associated to DC {value}, please re-send the query to that DC.
\ No newline at end of file
diff --git a/compiler/errors/source/400_BAD_REQUEST.tsv b/compiler/errors/source/400_BAD_REQUEST.tsv
index e57b1e8f..fae60221 100644
--- a/compiler/errors/source/400_BAD_REQUEST.tsv
+++ b/compiler/errors/source/400_BAD_REQUEST.tsv
@@ -1,456 +1,650 @@
 id	message
-ABOUT_TOO_LONG	The provided about/bio text is too long
-ACCESS_TOKEN_EXPIRED	The bot token has expired
-ACCESS_TOKEN_INVALID	The bot access token is invalid
-ADMINS_TOO_MUCH	The chat has too many administrators
-ADMIN_ID_INVALID	The specified admin ID is invalid
-ADMIN_RANK_EMOJI_NOT_ALLOWED	Emoji are not allowed in custom administrator titles
-ADMIN_RANK_INVALID	The custom administrator title is invalid or too long
-ALBUM_PHOTOS_TOO_MANY	Too many photos were included in the album
-API_ID_INVALID	The api_id/api_hash combination is invalid
-API_ID_PUBLISHED_FLOOD	You are using an API key that is limited on the server side because it was published somewhere
-ARTICLE_TITLE_EMPTY	The article title is empty
-AUDIO_CONTENT_URL_EMPTY	The remote URL specified in the content field is empty
-AUDIO_TITLE_EMPTY	The title attribute of the audio is empty
-AUTH_BYTES_INVALID	The authorization bytes are invalid
-AUTH_TOKEN_ALREADY_ACCEPTED	The authorization token was already used
-AUTH_TOKEN_EXCEPTION	An error occurred while importing the auth token
-AUTH_TOKEN_EXPIRED	The provided authorization token has expired and the updated QR-code must be re-scanned
-AUTH_TOKEN_INVALID	An invalid authorization token was provided
-AUTH_TOKEN_INVALID2	An invalid authorization token was provided
-AUTH_TOKEN_INVALIDX	The specified auth token is invalid
-AUTOARCHIVE_NOT_AVAILABLE	This feature is not yet enabled for your account due to it not receiving too many private messages from strangers
-BANK_CARD_NUMBER_INVALID	The credit card number is invalid
-BANNED_RIGHTS_INVALID	You provided a set of restrictions that is invalid
+2FA_CONFIRM_WAIT_X	Since this account is active and protected by a 2FA password, we will delete it in 1 week for security purposes. You can cancel this process at any time, you'll be able to reset your account in {value} seconds.
+ABOUT_TOO_LONG	About string too long.
+ACCESS_TOKEN_EXPIRED	Access token expired.
+ACCESS_TOKEN_INVALID	Access token invalid.
+ADDRESS_INVALID	The specified geopoint address is invalid.
+ADMINS_TOO_MUCH	There are too many admins.
+ADMIN_ID_INVALID	The specified admin ID is invalid.
+ADMIN_RANK_EMOJI_NOT_ALLOWED	An admin rank cannot contain emojis.
+ADMIN_RANK_INVALID	The specified admin rank is invalid.
+ADMIN_RIGHTS_EMPTY	The chatAdminRights constructor passed in keyboardButtonRequestPeer.peer_type.user_admin_rights has no rights set (i.e. flags is 0).
+AD_EXPIRED	The ad has expired (too old or not found).
+ALBUM_PHOTOS_TOO_MANY	You have uploaded too many profile photos, delete some before retrying.
+API_ID_INVALID	API ID invalid.
+API_ID_PUBLISHED_FLOOD	This API id was published somewhere, you can't use it now.
+ARTICLE_TITLE_EMPTY	The title of the article is empty.
+AUDIO_CONTENT_URL_EMPTY	The remote URL specified in the content field is empty.
+AUDIO_TITLE_EMPTY	An empty audio title was provided.
+AUTH_BYTES_INVALID	The provided authorization is invalid.
+AUTH_TOKEN_ALREADY_ACCEPTED	The specified auth token was already accepted.
+AUTH_TOKEN_EXCEPTION	An error occurred while importing the auth token.
+AUTH_TOKEN_EXPIRED	The authorization token has expired.
+AUTH_TOKEN_INVALID	The specified auth token is invalid.
+AUTH_TOKEN_INVALIDX	The specified auth token is invalid.
+AUTOARCHIVE_NOT_AVAILABLE	The autoarchive setting is not available at this time: please check the value of the [autoarchive_setting_available field in client config »](https://core.telegram.org/api/config#client-configuration) before calling this method.
+BALANCE_TOO_LOW	The transaction cannot be completed because the current [Telegram Stars balance](https://core.telegram.org/api/stars) is too low.
+BANK_CARD_NUMBER_INVALID	The specified card number is invalid.
+BANNED_RIGHTS_INVALID	You provided some invalid flags in the banned rights.
 BASE_PORT_LOC_INVALID	The base port location is invalid
-BOTS_TOO_MUCH	The chat has too many bots
-BOT_CHANNELS_NA	Bots can't edit admin privileges
-BOT_COMMAND_DESCRIPTION_INVALID	The command description was empty, too long or had invalid characters
-BOT_COMMAND_INVALID	The specified command is invalid
-BOT_DOMAIN_INVALID	The domain used for the auth button does not match the one configured in @BotFather
-BOT_GAMES_DISABLED	Bot games cannot be used in this type of chat
-BOT_GROUPS_BLOCKED	This bot can't be added to groups
-BOT_INLINE_DISABLED	The inline feature of the bot is disabled
-BOT_INVALID	This is not a valid bot
-BOT_METHOD_INVALID	The method can't be used by bots
-BOT_MISSING	This method can only be run by a bot
-BOT_ONESIDE_NOT_AVAIL	Bots can't pin messages for one side only in private chats
-BOT_PAYMENTS_DISABLED	This method can only be run by a bot
+BIRTHDAY_INVALID	An invalid age was specified, must be between 0 and 150 years.
+BOOSTS_EMPTY	No boost slots were specified.
+BOOSTS_REQUIRED	The specified channel must first be [boosted by its users](https://core.telegram.org/api/boost) in order to perform this action.
+BOOST_NOT_MODIFIED	You're already [boosting](https://core.telegram.org/api/boost) the specified channel.
+BOOST_PEER_INVALID	The specified `boost_peer` is invalid.
+BOTS_TOO_MUCH	There are too many bots in this chat/channel.
+BOT_ALREADY_DISABLED	The connected business bot was already disabled for the specified peer.
+BOT_APP_BOT_INVALID	The bot_id passed in the inputBotAppShortName constructor is invalid.
+BOT_APP_INVALID	The specified bot app is invalid.
+BOT_APP_SHORTNAME_INVALID	The specified bot app short name is invalid.
+BOT_BUSINESS_MISSING	The specified bot is not a business bot (the [user](https://core.telegram.org/constructor/user).`bot_business` flag is not set).
+BOT_CHANNELS_NA	Bots can't edit admin privileges.
+BOT_COMMAND_DESCRIPTION_INVALID	The specified command description is invalid.
+BOT_COMMAND_INVALID	The specified command is invalid.
+BOT_DOMAIN_INVALID	Bot domain invalid.
+BOT_FALLBACK_UNSUPPORTED	The fallback flag can't be set for bots.
+BOT_GAMES_DISABLED	Games can't be sent to channels.
+BOT_GROUPS_BLOCKED	This bot can't be added to groups.
+BOT_INLINE_DISABLED	This bot can't be used in inline mode.
+BOT_INVALID	This is not a valid bot.
+BOT_INVOICE_INVALID	The specified invoice is invalid.
+BOT_METHOD_INVALID	The specified method cannot be used by bots.
+BOT_MISSING	Only bots can call this method, please use [@stickers](https://t.me/stickers) if you're a user.
+BOT_NOT_CONNECTED_YET	No [business bot](https://core.telegram.org/api/business#connected-bots) is connected to the currently logged in user.
+BOT_ONESIDE_NOT_AVAIL	Bots can't pin messages in PM just for themselves.
+BOT_PAYMENTS_DISABLED	Please enable bot payments in botfather before calling this method.
 BOT_POLLS_DISABLED	Sending polls by bots has been disabled
-BOT_RESPONSE_TIMEOUT	The bot did not answer to the callback query in time
-BOT_SCORE_NOT_MODIFIED	The bot score was not modified
-BROADCAST_CALLS_DISABLED	Broadcast calls disabled
-BROADCAST_ID_INVALID	The channel is invalid
-BROADCAST_PUBLIC_VOTERS_FORBIDDEN	Polls with public voters cannot be sent in channels
-BROADCAST_REQUIRED	The request can only be used with a channel
-BUTTON_DATA_INVALID	The button callback data is invalid or too large
-BUTTON_TEXT_INVALID	The specified button text is invalid
-BUTTON_TYPE_INVALID	The type of one of the buttons you provided is invalid
-BUTTON_URL_INVALID	The button url is invalid
-BUTTON_USER_PRIVACY_RESTRICTED	The privacy settings of the user specified in a keyboard button do not allow creating such button
-CALL_ALREADY_ACCEPTED	The call is already accepted
-CALL_ALREADY_DECLINED	The call is already declined
-CALL_PEER_INVALID	The provided call peer object is invalid
-CALL_PROTOCOL_FLAGS_INVALID	Call protocol flags invalid
-CDN_METHOD_INVALID	The method can't be used on CDN DCs
-CHANNELS_ADMIN_LOCATED_TOO_MUCH	The user has reached the limit of public geogroups
-CHANNELS_ADMIN_PUBLIC_TOO_MUCH	You are an administrator of too many public channels
-CHANNELS_TOO_MUCH	You have joined too many channels or supergroups, leave some and try again
+BOT_RESPONSE_TIMEOUT	A timeout occurred while fetching data from the bot.
+BOT_SCORE_NOT_MODIFIED	The score wasn't modified.
+BOT_WEBVIEW_DISABLED	A webview cannot be opened in the specified conditions: emitted for example if `from_bot_menu` or `url` are set and `peer` is not the chat with the bot.
+BROADCAST_ID_INVALID	Broadcast ID invalid.
+BROADCAST_PUBLIC_VOTERS_FORBIDDEN	You can't forward polls with public voters.
+BROADCAST_REQUIRED	This method can only be called on a channel, please use stats.getMegagroupStats for supergroups.
+BUSINESS_CONNECTION_INVALID	The `connection_id` passed to the wrapping [invokeWithBusinessConnection](https://core.telegram.org/api/business) call is invalid.
+BUSINESS_CONNECTION_NOT_ALLOWED	This method was invoked over a business connection using [invokeWithBusinessConnection](https://core.telegram.org/api/business#connected-bots), but either (1) we're a user, and users cannot invoke methods over a business connection; (2) we're a bot, but business mode was disabled in @botfather or (3); we're a bot, but this method cannot be invoked over a business connection.
+BUSINESS_PEER_INVALID	Messages can't be set to the specified peer through the current [business connection](https://core.telegram.org/api/business#connected-bots).
+BUSINESS_PEER_USAGE_MISSING	You cannot send a message to a user through a [business connection](https://core.telegram.org/api/business#connected-bots) if the user hasn't recently contacted us.
+BUSINESS_RECIPIENTS_EMPTY	You didn't set any flag in inputBusinessBotRecipients, thus the bot cannot work with *any* peer.
+BUSINESS_WORK_HOURS_EMPTY	No work hours were specified.
+BUSINESS_WORK_HOURS_PERIOD_INVALID	The specified work hours are invalid, see [here »](https://core.telegram.org/api/business#opening-hours) for the exact requirements.
+BUTTON_COPY_TEXT_INVALID	The specified [keyboardButtonCopy](https://core.telegram.org/constructor/keyboardButtonCopy).`copy_text` is invalid.
+BUTTON_DATA_INVALID	The data of one or more of the buttons you provided is invalid.
+BUTTON_ID_INVALID	The specified button ID is invalid.
+BUTTON_INVALID	The specified button is invalid.
+BUTTON_POS_INVALID	The position of one of the keyboard buttons is invalid (i.e. a Game or Pay button not in the first position, and so on...).
+BUTTON_TEXT_INVALID	The specified button text is invalid.
+BUTTON_TYPE_INVALID	The type of one or more of the buttons you provided is invalid.
+BUTTON_URL_INVALID	Button URL invalid.
+BUTTON_USER_INVALID	The `user_id` passed to inputKeyboardButtonUserProfile is invalid!
+BUTTON_USER_PRIVACY_RESTRICTED	The privacy setting of the user specified in a [inputKeyboardButtonUserProfile](https://core.telegram.org/constructor/inputKeyboardButtonUserProfile) button do not allow creating such a button.
+CALL_ALREADY_ACCEPTED	The call was already accepted.
+CALL_ALREADY_DECLINED	The call was already declined.
+CALL_OCCUPY_FAILED	The call failed because the user is already making another call.
+CALL_PEER_INVALID	The provided call peer object is invalid.
+CALL_PROTOCOL_FLAGS_INVALID	Call protocol flags invalid.
+CALL_PROTOCOL_LAYER_INVALID	The specified protocol layer version range is invalid.
+CDN_METHOD_INVALID	You can't call this method in a CDN DC.
+CHANNELS_ADMIN_LOCATED_TOO_MUCH	The user has reached the limit of public geogroups.
+CHANNELS_ADMIN_PUBLIC_TOO_MUCH	You're admin of too many public channels, make some channels private to change the username of this channel.
+CHANNELS_TOO_MUCH	You have joined too many channels/supergroups.
 CHANNEL_ADD_INVALID	Internal error.
 CHANNEL_BANNED	The channel is banned
-CHANNEL_INVALID	The channel parameter is invalid
-CHANNEL_PARICIPANT_MISSING	The current user is not in the channel
-CHANNEL_PRIVATE	The channel/supergroup is not accessible
-CHANNEL_TOO_BIG	The channel too big
-CHANNEL_TOO_LARGE	The channel is too large
-CHAT_ABOUT_NOT_MODIFIED	The chat about text was not modified because you tried to edit it using the same content
-CHAT_ABOUT_TOO_LONG	The chat about text is too long
-CHAT_ADMIN_REQUIRED	The method requires chat admin privileges
-CHAT_DISCUSSION_UNALLOWED	The chat discussion is not allowed
-CHAT_FORWARDS_RESTRICTED	The chat restricts forwarding content
-CHAT_ID_EMPTY	The provided chat id is empty
-CHAT_ID_INVALID	The chat id being used is invalid or not known yet. Make sure you see the chat before interacting with it
-CHAT_INVALID	The chat is invalid
-CHAT_INVITE_PERMANENT	The chat invite link is primary
-CHAT_LINK_EXISTS	The action failed because the supergroup is linked to a channel
-CHAT_NOT_MODIFIED	The chat settings (title, permissions, photo, etc..) were not modified because you tried to edit them using the same content
-CHAT_RESTRICTED	The chat is restricted and cannot be used
-CHAT_REVOKE_DATE_UNSUPPORTED	`min_date` and `max_date` are not available for using with non-user peers
-CHAT_SEND_INLINE_FORBIDDEN	You cannot use inline bots to send messages in this chat
-CHAT_TITLE_EMPTY	The chat title is empty
-CHAT_TOO_BIG	The chat is too big for this action
-CODE_EMPTY	The provided code is empty
-CODE_HASH_INVALID	The provided code hash invalid
-CODE_INVALID	The provided code is invalid (i.e. from email)
-CONNECTION_API_ID_INVALID	The provided API id is invalid
-CONNECTION_APP_VERSION_EMPTY	App version is empty
-CONNECTION_DEVICE_MODEL_EMPTY	The device model is empty
-CONNECTION_LANG_PACK_INVALID	The specified language pack is not valid
-CONNECTION_LAYER_INVALID	The connection layer is invalid. Missing InvokeWithLayer-InitConnection call
-CONNECTION_NOT_INITED	The connection was not initialized
-CONNECTION_SYSTEM_EMPTY	The connection to the system is empty
-CONNECTION_SYSTEM_LANG_CODE_EMPTY	The system language code is empty
-CONTACT_ADD_MISSING	Contact to add is missing
-CONTACT_ID_INVALID	The provided contact id is invalid
-CONTACT_NAME_EMPTY	The provided contact name is empty
-CONTACT_REQ_MISSING	Missing contact request
-CREATE_CALL_FAILED	An error occurred while creating the call
-CURRENCY_TOTAL_AMOUNT_INVALID	The total amount of all prices is invalid
-DATA_INVALID	The encrypted data is invalid
-DATA_JSON_INVALID	The provided JSON data is invalid
-DATA_TOO_LONG	Data too long
-DATE_EMPTY	The date argument is empty
-DC_ID_INVALID	The dc_id parameter is invalid
-DH_G_A_INVALID	The g_a parameter invalid
-DOCUMENT_INVALID	The document is invalid
-EMAIL_HASH_EXPIRED	The email hash expired and cannot be used to verify it
-EMAIL_INVALID	The email provided is invalid
-EMAIL_UNCONFIRMED	Email unconfirmed
-EMAIL_UNCONFIRMED_X	The provided email isn't confirmed, {value} is the length of the verification code that was just sent to the email
-EMAIL_VERIFY_EXPIRED	The verification email has expired
-EMOJI_INVALID	The specified theme emoji is valid
-EMOJI_NOT_MODIFIED	The theme wasn't changed
-EMOTICON_EMPTY	The emoticon parameter is empty
-EMOTICON_INVALID	The emoticon parameter is invalid
-EMOTICON_STICKERPACK_MISSING	The emoticon sticker pack you are trying to obtain is missing
-ENCRYPTED_MESSAGE_INVALID	The special binding message (bind_auth_key_inner) contains invalid data
-ENCRYPTION_ALREADY_ACCEPTED	The secret chat is already accepted
-ENCRYPTION_ALREADY_DECLINED	The secret chat is already declined
-ENCRYPTION_DECLINED	The secret chat was declined
-ENCRYPTION_ID_INVALID	The provided secret chat id is invalid
-ENTITIES_TOO_LONG	The entity provided contains data that is too long, or you passed too many entities to this message
-ENTITY_BOUNDS_INVALID	The message entity bounds are invalid
-ENTITY_MENTION_USER_INVALID	The mentioned entity is not an user
-ERROR_TEXT_EMPTY	The provided error message is empty
-EXPIRE_DATE_INVALID	The expiration date is invalid
-EXPIRE_FORBIDDEN	Expire forbidden
-EXPORT_CARD_INVALID	The provided card is invalid
-EXTERNAL_URL_INVALID	The external media URL is invalid
+CHANNEL_FORUM_MISSING	This supergroup is not a forum.
+CHANNEL_ID_INVALID	The specified supergroup ID is invalid.
+CHANNEL_INVALID	The provided channel is invalid.
+CHANNEL_MONOFORUM_UNSUPPORTED	[Monoforums](https://core.telegram.org/api/channel#monoforums) do not support this feature.
+CHANNEL_PARICIPANT_MISSING	The current user is not in the channel.
+CHANNEL_PRIVATE	You haven't joined this channel/supergroup.
+CHANNEL_TOO_BIG	This channel has too many participants (>1000) to be deleted.
+CHANNEL_TOO_LARGE	Channel is too large to be deleted; this error is issued when trying to delete channels with more than 1000 members (subject to change).
+CHARGE_ALREADY_REFUNDED	The transaction was already refunded.
+CHARGE_ID_EMPTY	The specified charge_id is empty.
+CHARGE_ID_INVALID	The specified charge_id is invalid.
+CHATLINKS_TOO_MUCH	Too many [business chat links](https://core.telegram.org/api/business#business-chat-links) were created, please delete some older links.
+CHATLINK_SLUG_EMPTY	The specified slug is empty.
+CHATLINK_SLUG_EXPIRED	The specified [business chat link](https://core.telegram.org/api/business#business-chat-links) has expired.
+CHATLISTS_TOO_MUCH	You have created too many folder links, hitting the `chatlist_invites_limit_default`/`chatlist_invites_limit_premium` [limits »](https://core.telegram.org/api/config#chatlist-invites-limit-default).
+CHATLIST_EXCLUDE_INVALID	The specified `exclude_peers` are invalid.
+CHAT_ABOUT_NOT_MODIFIED	About text has not changed.
+CHAT_ABOUT_TOO_LONG	Chat about too long.
+CHAT_ADMIN_REQUIRED	You must be an admin in this chat to do this.
+CHAT_DISCUSSION_UNALLOWED	You can't enable forum topics in a discussion group linked to a channel.
+CHAT_FORWARDS_RESTRICTED	You can't forward messages from a protected chat.
+CHAT_ID_EMPTY	The provided chat ID is empty.
+CHAT_ID_INVALID	The provided chat id is invalid.
+CHAT_INVALID	Invalid chat.
+CHAT_INVITE_PERMANENT	You can't set an expiration date on permanent invite links.
+CHAT_LINK_EXISTS	The chat is public, you can't hide the history to new users.
+CHAT_MEMBER_ADD_FAILED	Could not add participants.
+CHAT_NOT_MODIFIED	No changes were made to chat information because the new information you passed is identical to the current information.
+CHAT_PUBLIC_REQUIRED	You can only enable join requests in public groups.
+CHAT_RESTRICTED	You can't send messages in this chat, you were restricted.
+CHAT_REVOKE_DATE_UNSUPPORTED	`min_date` and `max_date` are not available for using with non-user peers.
+CHAT_SEND_INLINE_FORBIDDEN	You can't send inline messages in this group.
+CHAT_TITLE_EMPTY	No chat title provided.
+CHAT_TOO_BIG	This method is not available for groups with more than `chat_read_mark_size_threshold` members, [see client configuration »](https://core.telegram.org/api/config#client-configuration).
+CODE_EMPTY	The provided code is empty.
+CODE_HASH_INVALID	Code hash invalid.
+CODE_INVALID	Code invalid.
+COLLECTIBLE_INVALID	The specified collectible is invalid.
+COLLECTIBLE_NOT_FOUND	The specified collectible could not be found.
+COLOR_INVALID	The specified color palette ID was invalid.
+CONNECTION_API_ID_INVALID	The provided API id is invalid.
+CONNECTION_APP_VERSION_EMPTY	App version is empty.
+CONNECTION_DEVICE_MODEL_EMPTY	The specified device model is empty.
+CONNECTION_ID_INVALID	The specified connection ID is invalid.
+CONNECTION_LANG_PACK_INVALID	The specified language pack is empty.
+CONNECTION_LAYER_INVALID	Layer invalid.
+CONNECTION_NOT_INITED	Please initialize the connection using initConnection before making queries.
+CONNECTION_SYSTEM_EMPTY	The specified system version is empty.
+CONNECTION_SYSTEM_LANG_CODE_EMPTY	The specified system language code is empty.
+CONTACT_ADD_MISSING	Contact to add is missing.
+CONTACT_ID_INVALID	The provided contact ID is invalid.
+CONTACT_MISSING	The specified user is not a contact.
+CONTACT_NAME_EMPTY	Contact name empty.
+CONTACT_REQ_MISSING	Missing contact request.
+CREATE_CALL_FAILED	An error occurred while creating the call.
+CURRENCY_TOTAL_AMOUNT_INVALID	The total amount of all prices is invalid.
+CUSTOM_REACTIONS_TOO_MANY	Too many custom reactions were specified.
+DATA_HASH_SIZE_INVALID	The size of the specified secureValueErrorData.data_hash is invalid.
+DATA_INVALID	Encrypted data invalid.
+DATA_JSON_INVALID	The provided JSON data is invalid.
+DATA_TOO_LONG	Data too long.
+DATE_EMPTY	Date empty.
+DC_ID_INVALID	The provided DC ID is invalid.
+DH_G_A_INVALID	g_a invalid.
+DOCUMENT_INVALID	The specified document is invalid.
+EFFECT_ID_INVALID	The specified effect ID is invalid.
+EMAIL_HASH_EXPIRED	Email hash expired.
+EMAIL_INVALID	The specified email is invalid.
+EMAIL_NOT_ALLOWED	The specified email cannot be used to complete the operation.
+EMAIL_NOT_SETUP	In order to change the login email with emailVerifyPurposeLoginChange, an existing login email must already be set using emailVerifyPurposeLoginSetup.
+EMAIL_UNCONFIRMED	Email unconfirmed.
+EMAIL_UNCONFIRMED_X	The provided email isn't confirmed, {value} is the length of the verification code that was just sent to the email: use [account.verifyEmail](https://core.telegram.org/method/account.verifyEmail) to enter the received verification code and enable the recovery email.
+EMAIL_VERIFY_EXPIRED	The verification email has expired.
+EMOJI_INVALID	The specified theme emoji is valid.
+EMOJI_MARKUP_INVALID	The specified `video_emoji_markup` was invalid.
+EMOJI_NOT_MODIFIED	The theme wasn't changed.
+EMOTICON_EMPTY	The emoji is empty.
+EMOTICON_INVALID	The specified emoji is invalid.
+EMOTICON_STICKERPACK_MISSING	inputStickerSetDice.emoji cannot be empty.
+ENCRYPTED_MESSAGE_INVALID	Encrypted message invalid.
+ENCRYPTION_ALREADY_ACCEPTED	Secret chat already accepted.
+ENCRYPTION_ALREADY_DECLINED	The secret chat was already declined.
+ENCRYPTION_DECLINED	The secret chat was declined.
+ENCRYPTION_ID_INVALID	The provided secret chat ID is invalid.
+ENTITIES_TOO_LONG	You provided too many styled message entities.
+ENTITY_BOUNDS_INVALID	A specified [entity offset or length](https://core.telegram.org/api/entities#entity-length) is invalid, see [here »](https://core.telegram.org/api/entities#entity-length) for info on how to properly compute the entity offset/length.
+ENTITY_MENTION_USER_INVALID	You mentioned an invalid user.
+ERROR_TEXT_EMPTY	The provided error message is empty.
+EXPIRES_AT_INVALID	The specified `expires_at` timestamp is invalid.
+EXPIRE_DATE_INVALID	The specified expiration date is invalid.
+EXPORT_CARD_INVALID	Provided card is invalid.
+EXTENDED_MEDIA_AMOUNT_INVALID	The specified `stars_amount` of the passed [inputMediaPaidMedia](https://core.telegram.org/constructor/inputMediaPaidMedia) is invalid.
+EXTENDED_MEDIA_INVALID	The specified paid media is invalid.
+EXTERNAL_URL_INVALID	External URL invalid.
 FIELD_NAME_EMPTY	The field with the name FIELD_NAME is missing
 FIELD_NAME_INVALID	The field with the name FIELD_NAME is invalid
-FILE_CONTENT_TYPE_INVALID	File content-type is invalid
-FILE_EMTPY	An empty file was provided
-FILE_ID_INVALID	The file id is invalid
-FILE_MIGRATE_X	The file is in Data Center No. {value}
-FILE_PARTS_INVALID	Invalid number of parts.
-FILE_PART_0_MISSING	File part 0 missing
-FILE_PART_EMPTY	The file part sent is empty
+FILE_CONTENT_TYPE_INVALID	File content-type is invalid.
+FILE_EMTPY	An empty file was provided.
+FILE_ID_INVALID	The provided file id is invalid.
+FILE_MIGRATE_X	The file currently being accessed is stored in DC {value}, please re-send the query to that DC.
+FILE_PARTS_INVALID	The number of file parts is invalid.
+FILE_PART_EMPTY	The provided file part is empty.
 FILE_PART_INVALID	The file part number is invalid.
-FILE_PART_LENGTH_INVALID	The length of a file part is invalid
-FILE_PART_SIZE_CHANGED	The part size is different from the size of one of the previous parts in the same file
-FILE_PART_SIZE_INVALID	The file part size is invalid
-FILE_PART_TOO_BIG	The size limit for the content of the file part has been exceeded
-FILE_PART_X_MISSING	Part {value} of the file is missing from storage
-FILE_REFERENCE_EMPTY	The file id contains an empty file reference, you must obtain a valid one by fetching the message from the origin context
-FILE_REFERENCE_EXPIRED	The file id contains an expired file reference, you must obtain a valid one by fetching the message from the origin context
-FILE_REFERENCE_INVALID	The file id contains an invalid file reference, you must obtain a valid one by fetching the message from the origin context
-FILE_TITLE_EMPTY	An empty file title was specified
-FILTER_ID_INVALID	The specified filter ID is invalid
-FILTER_INCLUDE_EMPTY	The filter include is empty
-FILTER_NOT_SUPPORTED	The specified filter cannot be used in this context
-FILTER_TITLE_EMPTY	The title field of the filter is empty
-FIRSTNAME_INVALID	The first name is invalid
-FOLDER_ID_EMPTY	The folder you tried to delete was already empty
-FOLDER_ID_INVALID	The folder id is invalid
-FRESH_CHANGE_ADMINS_FORBIDDEN	You can't change administrator settings in this chat because your session was logged-in recently
-FROM_MESSAGE_BOT_DISABLED	Bots can't use fromMessage min constructors
-FROM_PEER_INVALID	The from peer value is invalid
-GAME_BOT_INVALID	You cannot send that game with the current bot
-GEO_POINT_INVALID	Invalid geo point provided
-GIF_CONTENT_TYPE_INVALID	GIF content-type invalid
-GIF_ID_INVALID	The provided gif/animation id is invalid
-GRAPH_EXPIRED_RELOAD	This graph has expired, please obtain a new graph token
-GRAPH_INVALID_RELOAD	Invalid graph token provided, please reload the stats and provide the updated token
-GRAPH_OUTDATED_RELOAD	The graph data is outdated
-GROUPCALL_ALREADY_DISCARDED	The group call was already discarded
-GROUPCALL_INVALID	The specified group call is invalid
-GROUPCALL_JOIN_MISSING	You haven't joined this group call
-GROUPCALL_NOT_MODIFIED	Group call settings weren't modified
-GROUPCALL_SSRC_DUPLICATE_MUCH	Too many group call synchronization source duplicates
-GROUPED_MEDIA_INVALID	The album contains invalid media
+FILE_PART_LENGTH_INVALID	The length of a file part is invalid.
+FILE_PART_SIZE_CHANGED	Provided file part size has changed.
+FILE_PART_SIZE_INVALID	The provided file part size is invalid.
+FILE_PART_TOO_BIG	The uploaded file part is too big.
+FILE_PART_TOO_SMALL	The size of the uploaded file part is too small, please see the documentation for the allowed sizes.
+FILE_PART_X_MISSING	Part {value} of the file is missing from storage. Try repeating the method call to resave the part.
+FILE_REFERENCE_EMPTY	An empty [file reference](https://core.telegram.org/api/file-references) was specified.
+FILE_REFERENCE_EXPIRED	File reference expired, it must be refetched as described in [the documentation](https://core.telegram.org/api/file-references).
+FILE_REFERENCE_INVALID	The specified [file reference](https://core.telegram.org/api/file-references) is invalid.
+FILE_REFERENCE_X_EXPIRED	The file reference of the media file at index {value} in the passed media array expired, it [must be refreshed as specified in the documentation](https://core.telegram.org/api/file-references). .
+FILE_REFERENCE_X_INVALID	The [file reference](https://core.telegram.org/api/file-references) of the media file at index {value} in the passed media array is invalid.
+FILE_TITLE_EMPTY	An empty file title was specified.
+FILE_TOKEN_INVALID	The master DC did not accept the `file_token` (e.g., the token has expired). Continue downloading the file from the master DC using upload.getFile.
+FILTER_ID_INVALID	The specified filter ID is invalid.
+FILTER_INCLUDE_EMPTY	The include_peers vector of the filter is empty.
+FILTER_NOT_SUPPORTED	The specified filter cannot be used in this context.
+FILTER_TITLE_EMPTY	The title field of the filter is empty.
+FIRSTNAME_INVALID	The first name is invalid.
+FOLDER_ID_EMPTY	An empty folder ID was specified.
+FOLDER_ID_INVALID	Invalid folder ID.
+FORM_EXPIRED	The form was generated more than 10 minutes ago and has expired, please re-generate it using [payments.getPaymentForm](https://core.telegram.org/method/payments.getPaymentForm) and pass the new `form_id`.
+FORM_ID_EMPTY	The specified form ID is empty.
+FORM_SUBMIT_DUPLICATE	The same payment form was already submitted.  .
+FORM_UNSUPPORTED	Please update your client.
+FORUM_ENABLED	You can't execute the specified action because the group is a [forum](https://core.telegram.org/api/forum), disable forum functionality to continue.
+FRESH_CHANGE_ADMINS_FORBIDDEN	You were just elected admin, you can't add or modify other admins yet.
+FROM_MESSAGE_BOT_DISABLED	Bots can't use fromMessage min constructors.
+FROM_PEER_INVALID	The specified from_id is invalid.
+FROZEN_PARTICIPANT_MISSING	The current account is [frozen](https://core.telegram.org/api/auth#frozen-accounts), and cannot access the specified peer.
+GAME_BOT_INVALID	Bots can't send another bot's game.
+GENERAL_MODIFY_ICON_FORBIDDEN	You can't modify the icon of the 'General' topic.
+GEO_POINT_INVALID	Invalid geoposition provided.
+GIFT_MONTHS_INVALID	The value passed in invoice.inputInvoicePremiumGiftStars.months is invalid.
+GIFT_SLUG_EXPIRED	The specified gift slug has expired.
+GIFT_SLUG_INVALID	The specified slug is invalid.
+GIFT_STARS_INVALID	The specified amount of stars is invalid.
+GIF_CONTENT_TYPE_INVALID	GIF content-type invalid.
+GIF_ID_INVALID	The provided GIF ID is invalid.
+GRAPH_EXPIRED_RELOAD	This graph has expired, please obtain a new graph token.
+GRAPH_INVALID_RELOAD	Invalid graph token provided, please reload the stats and provide the updated token.
+GRAPH_OUTDATED_RELOAD	The graph is outdated, please get a new async token using stats.getBroadcastStats.
+GROUPCALL_ALREADY_DISCARDED	The group call was already discarded.
+GROUPCALL_FORBIDDEN	The group call has already ended.
+GROUPCALL_INVALID	The specified group call is invalid.
+GROUPCALL_JOIN_MISSING	You haven't joined this group call.
+GROUPCALL_NOT_MODIFIED	Group call settings weren't modified.
+GROUPCALL_SSRC_DUPLICATE_MUCH	The app needs to retry joining the group call with a new SSRC value.
+GROUPED_MEDIA_INVALID	Invalid grouped media.
 GROUP_CALL_INVALID	The group call is invalid
-HASH_INVALID	The provided hash is invalid
-HIDE_REQUESTER_MISSING	The join request was missing or was already handled
-IMAGE_PROCESS_FAILED	The server failed to process your image
-IMPORT_FILE_INVALID	The imported file is invalid
-IMPORT_FORMAT_UNRECOGNIZED	The imported format is unrecognized
-IMPORT_ID_INVALID	The import id is invalid
-INLINE_RESULT_EXPIRED	The inline bot query expired
-INPUT_CONSTRUCTOR_INVALID	The provided constructor is invalid
-INPUT_FETCH_ERROR	An error occurred while deserializing TL parameters
-INPUT_FETCH_FAIL	Failed deserializing TL payload
-INPUT_FILTER_INVALID	The filter is invalid for this query
-INPUT_LAYER_INVALID	The provided layer is invalid
-INPUT_METHOD_INVALID	The method invoked is invalid in the current schema
-INPUT_REQUEST_TOO_LONG	The input request is too long
-INPUT_TEXT_EMPTY	The specified text is empty
-INPUT_USER_DEACTIVATED	The target user has been deleted/deactivated
-INVITE_FORBIDDEN_WITH_JOINAS	If the user has anonymously joined a group call as a channel, they can't invite other users to the group call because that would cause deanonymization, because the invite would be sent using the original user ID, not the anonymized channel ID
-INVITE_HASH_EMPTY	The invite hash is empty
-INVITE_HASH_EXPIRED	The chat invite link is no longer valid
-INVITE_HASH_INVALID	The invite link hash is invalid
-INVITE_REQUEST_SENT	The request to join this chat or channel has been successfully sent
-INVITE_REVOKED_MISSING	The action required a chat invite link to be revoked first
-INVITE_SLUG_EMPTY	The invite slug is empty
-INVITE_SLUG_EXPIRED	The invite slug is expired
-INVOICE_PAYLOAD_INVALID	The specified invoice payload is invalid
-JOIN_AS_PEER_INVALID	The specified peer cannot be used to join a group call
-LANG_CODE_INVALID	The specified language code is invalid
-LANG_CODE_NOT_SUPPORTED	The specified language code is not supported
-LANG_PACK_INVALID	The provided language pack is invalid
-LASTNAME_INVALID	The last name is invalid
-LIMIT_INVALID	The limit parameter is invalid
-LINK_NOT_MODIFIED	The chat link was not modified because you tried to link to the same target
-LOCATION_INVALID	The file location is invalid
-MAX_DATE_INVALID	The specified maximum date is invalid
-MAX_ID_INVALID	The max_id parameter is invalid
-MAX_QTS_INVALID	The provided QTS is invalid
-MD5_CHECKSUM_INVALID	The file's checksum did not match the md5_checksum parameter
-MEDIA_CAPTION_TOO_LONG	The media caption is too long
-MEDIA_EMPTY	The media you tried to send is invalid
-MEDIA_FILE_INVALID	The provided media file is invalid
-MEDIA_GROUPED_INVALID	You tried to send media of different types in an album
-MEDIA_INVALID	The media is invalid
-MEDIA_NEW_INVALID	The new media to edit the message with is invalid
-MEDIA_PREV_INVALID	The previous media cannot be edited with anything else
-MEDIA_TTL_INVALID	The media ttl is invalid
-MEDIA_VIDEO_STORY_MISSING	The media does not have a photo or a video
-MEGAGROUP_ID_INVALID	The supergroup is invalid
-MEGAGROUP_PREHISTORY_HIDDEN	The action failed because the supergroup has the pre-history hidden
-MEGAGROUP_REQUIRED	The request can only be used with a supergroup
-MESSAGE_EDIT_TIME_EXPIRED	You can no longer edit this message because too much time has passed
-MESSAGE_EMPTY	The message sent is empty or contains invalid characters
-MESSAGE_IDS_EMPTY	The requested message doesn't exist or you provided no message id
-MESSAGE_ID_INVALID	The message id is invalid
-MESSAGE_NOT_MODIFIED	The message was not modified because you tried to edit it using the same content
-MESSAGE_POLL_CLOSED	You can't interact with a closed poll
-MESSAGE_TOO_LONG	The message text is too long
-METHOD_INVALID	The API method is invalid and cannot be used
-MIN_DATE_INVALID	The specified minimum date is invalid
-MSG_ID_INVALID	The message ID used in the peer was invalid
-MSG_TOO_OLD	chat_read_mark_expire_period have passed since the message was sent, read receipts were deleted
-MSG_VOICE_MISSING	The message does not contain a voice message
-MSG_WAIT_FAILED	A waiting call returned an error
-MULTI_MEDIA_TOO_LONG	The album/media group contains too many items
-NEW_SALT_INVALID	The new salt is invalid
-NEW_SETTINGS_EMPTY	No password is set on the current account, and no new password was specified in `new_settings`
-NEW_SETTINGS_INVALID	The new settings are invalid
-NEXT_OFFSET_INVALID	The next offset value is invalid
-OFFSET_INVALID	The offset parameter is invalid
-OFFSET_PEER_ID_INVALID	The provided offset peer is invalid
-OPTIONS_TOO_MUCH	The poll options are too many
-OPTION_INVALID	The option specified is invalid and does not exist in the target poll
-PACK_SHORT_NAME_INVALID	Invalid sticker pack name. It must begin with a letter, can't contain consecutive underscores and must end in '_by_'.
-PACK_SHORT_NAME_OCCUPIED	A sticker pack with this name already exists
-PACK_TITLE_INVALID	The sticker pack title is invalid
-PARTICIPANTS_TOO_FEW	The chat doesn't have enough participants
-PARTICIPANT_ID_INVALID	The specified participant ID is invalid
-PARTICIPANT_JOIN_MISSING	Trying to enable a presentation, when the user hasn't joined the Video Chat with phone.joinGroupCall
-PARTICIPANT_VERSION_OUTDATED	The other participant is using an outdated Telegram app version
-PASSWORD_EMPTY	The password provided is empty
-PASSWORD_HASH_INVALID	The two-step verification password is invalid
-PASSWORD_MISSING	The account is missing the two-step verification password
-PASSWORD_RECOVERY_NA	The password recovery e-mail is not available
-PASSWORD_REQUIRED	The two-step verification password is required for this method
-PASSWORD_TOO_FRESH_X	The two-step verification password was added recently and you are required to wait {value} seconds
-PAYMENT_PROVIDER_INVALID	The payment provider was not recognised or its token was invalid
-PEER_FLOOD	The method can't be used because your account is currently limited
-PEER_HISTORY_EMPTY	Peer history empty
-PEER_ID_INVALID	The peer id being used is invalid or not known yet. Make sure you meet the peer before interacting with it
-PEER_ID_NOT_SUPPORTED	The provided peer id is not supported
-PERSISTENT_TIMESTAMP_EMPTY	The pts argument is empty
-PERSISTENT_TIMESTAMP_INVALID	The persistent timestamp is invalid
-PHONE_CODE_EMPTY	The phone code is missing
-PHONE_CODE_EXPIRED	The confirmation code has expired
-PHONE_CODE_HASH_EMPTY	The phone code hash is missing
-PHONE_CODE_INVALID	The confirmation code is invalid
-PHONE_HASH_EXPIRED	An invalid or expired phone_code_hash was provided
-PHONE_NOT_OCCUPIED	No user is associated to the specified phone number
-PHONE_NUMBER_APP_SIGNUP_FORBIDDEN	You can't sign up using this app
-PHONE_NUMBER_BANNED	The phone number is banned from Telegram and cannot be used
-PHONE_NUMBER_FLOOD	This number has tried to login too many times
-PHONE_NUMBER_INVALID	The phone number is invalid
-PHONE_NUMBER_OCCUPIED	The phone number is already in use
-PHONE_NUMBER_UNOCCUPIED	The phone number is not yet being used
-PHONE_PASSWORD_PROTECTED	The phone is password protected
-PHOTO_CONTENT_TYPE_INVALID	The photo content type is invalid
-PHOTO_CONTENT_URL_EMPTY	The photo content URL is empty
-PHOTO_CROP_FILE_MISSING	Photo crop file missing
-PHOTO_CROP_SIZE_SMALL	The photo is too small
-PHOTO_EXT_INVALID	The photo extension is invalid
-PHOTO_FILE_MISSING	Profile photo file missing
-PHOTO_ID_INVALID	The photo id is invalid
-PHOTO_INVALID	The photo is invalid
-PHOTO_INVALID_DIMENSIONS	The photo dimensions are invalid
-PHOTO_SAVE_FILE_INVALID	The photo you tried to send cannot be saved by Telegram
-PHOTO_THUMB_URL_EMPTY	The photo thumb URL is empty
+HASHTAG_INVALID	The specified hashtag is invalid.
+HASH_INVALID	The provided hash is invalid.
+HASH_SIZE_INVALID	The size of the specified secureValueError.hash is invalid.
+HIDE_REQUESTER_MISSING	The join request was missing or was already handled.
+ID_EXPIRED	The passed prepared inline message ID has expired.
+ID_INVALID	The passed ID is invalid.
+IMAGE_PROCESS_FAILED	Failure while processing image.
+IMPORT_FILE_INVALID	The specified chat export file is invalid.
+IMPORT_FORMAT_DATE_INVALID	The date specified in the import file is invalid.
+IMPORT_FORMAT_UNRECOGNIZED	The specified chat export file was exported from an unsupported chat app.
+IMPORT_ID_INVALID	The specified import ID is invalid.
+IMPORT_TOKEN_INVALID	The specified token is invalid.
+INLINE_RESULT_EXPIRED	The inline query expired.
+INPUT_CHATLIST_INVALID	The specified folder is invalid.
+INPUT_CONSTRUCTOR_INVALID	The specified TL constructor is invalid.
+INPUT_FETCH_ERROR	An error occurred while parsing the provided TL constructor.
+INPUT_FETCH_FAIL	An error occurred while parsing the provided TL constructor.
+INPUT_FILE_INVALID	The specified [InputFile](https://core.telegram.org/type/InputFile) is invalid.
+INPUT_FILTER_INVALID	The specified filter is invalid.
+INPUT_LAYER_INVALID	The specified layer is invalid.
+INPUT_METHOD_INVALID	The specified method is invalid.
+INPUT_PEERS_EMPTY	The specified peer array is empty.
+INPUT_PURPOSE_INVALID	The specified payment purpose is invalid.
+INPUT_REQUEST_TOO_LONG	The request payload is too long.
+INPUT_TEXT_EMPTY	The specified text is empty.
+INPUT_TEXT_TOO_LONG	The specified text is too long.
+INPUT_USER_DEACTIVATED	The specified user was deleted.
+INVITES_TOO_MUCH	The maximum number of per-folder invites specified by the `chatlist_invites_limit_default`/`chatlist_invites_limit_premium` [client configuration parameters »](https://core.telegram.org/api/config#chatlist-invites-limit-default) was reached.
+INVITE_FORBIDDEN_WITH_JOINAS	If the user has anonymously joined a group call as a channel, they can't invite other users to the group call because that would cause deanonymization, because the invite would be sent using the original user ID, not the anonymized channel ID.
+INVITE_HASH_EMPTY	The invite hash is empty.
+INVITE_HASH_EXPIRED	The invite link has expired.
+INVITE_HASH_INVALID	The invite hash is invalid.
+INVITE_REQUEST_SENT	You have successfully requested to join this chat or channel.
+INVITE_REVOKED_MISSING	The specified invite link was already revoked or is invalid.
+INVITE_SLUG_EMPTY	The specified invite slug is empty.
+INVITE_SLUG_EXPIRED	The specified chat folder link has expired.
+INVITE_SLUG_INVALID	The specified invitation slug is invalid.
+INVOICE_INVALID	The specified invoice is invalid.
+INVOICE_PAYLOAD_INVALID	The specified invoice payload is invalid.
+JOIN_AS_PEER_INVALID	The specified peer cannot be used to join a group call.
+LANGUAGE_INVALID	The specified lang_code is invalid.
+LANG_CODE_INVALID	The specified language code is invalid.
+LANG_CODE_NOT_SUPPORTED	The specified language code is not supported.
+LANG_PACK_INVALID	The provided language pack is invalid.
+LASTNAME_INVALID	The last name is invalid.
+LIMIT_INVALID	The provided limit is invalid.
+LINK_NOT_MODIFIED	Discussion link not modified.
+LOCATION_INVALID	The provided location is invalid.
+MAX_DATE_INVALID	The specified maximum date is invalid.
+MAX_ID_INVALID	The provided max ID is invalid.
+MAX_QTS_INVALID	The specified max_qts is invalid.
+MD5_CHECKSUM_INVALID	The MD5 checksums do not match.
+MEDIA_ALREADY_PAID	You already paid for the specified media.
+MEDIA_CAPTION_TOO_LONG	The caption is too long.
+MEDIA_EMPTY	The provided media object is invalid.
+MEDIA_FILE_INVALID	The specified media file is invalid.
+MEDIA_GROUPED_INVALID	You tried to send media of different types in an album.
+MEDIA_INVALID	Media invalid.
+MEDIA_NEW_INVALID	The new media is invalid.
+MEDIA_PREV_INVALID	Previous media invalid.
+MEDIA_TTL_INVALID	The specified media TTL is invalid.
+MEDIA_TYPE_INVALID	The specified media type cannot be used in stories.
+MEDIA_VIDEO_STORY_MISSING	A non-story video cannot be repubblished as a story (emitted when trying to resend a non-story video as a story using inputDocument).
+MEGAGROUP_GEO_REQUIRED	This method can only be invoked on a geogroup.
+MEGAGROUP_ID_INVALID	Invalid supergroup ID.
+MEGAGROUP_PREHISTORY_HIDDEN	Group with hidden history for new members can't be set as discussion groups.
+MEGAGROUP_REQUIRED	You can only use this method on a supergroup.
+MESSAGE_EDIT_TIME_EXPIRED	You can't edit this message anymore, too much time has passed since its creation.
+MESSAGE_EMPTY	The provided message is empty.
+MESSAGE_IDS_EMPTY	No message ids were provided.
+MESSAGE_ID_INVALID	The provided message id is invalid.
+MESSAGE_NOT_MODIFIED	The provided message data is identical to the previous message data, the message wasn't modified.
+MESSAGE_NOT_READ_YET	The specified message wasn't read yet.
+MESSAGE_POLL_CLOSED	Poll closed.
+MESSAGE_TOO_LONG	The provided message is too long.
+MESSAGE_TOO_OLD	The message is too old, the requested information is not available.
+METHOD_INVALID	The specified method is invalid.
+MIN_DATE_INVALID	The specified minimum date is invalid.
+MONTH_INVALID	The number of months specified in inputInvoicePremiumGiftStars.months is invalid.
+MSG_ID_INVALID	Invalid message ID provided.
+MSG_TOO_OLD	[`chat_read_mark_expire_period` seconds](https://core.telegram.org/api/config#chat-read-mark-expire-period) have passed since the message was sent, read receipts were deleted.
+MSG_VOICE_MISSING	The specified message is not a voice message.
+MSG_WAIT_FAILED	A waiting call returned an error.
+MULTI_MEDIA_TOO_LONG	Too many media files for album.
+NEW_SALT_INVALID	The new salt is invalid.
+NEW_SETTINGS_EMPTY	No password is set on the current account, and no new password was specified in `new_settings`.
+NEW_SETTINGS_INVALID	The new password settings are invalid.
+NEXT_OFFSET_INVALID	The specified offset is longer than 64 bytes.
+NOGENERAL_HIDE_FORBIDDEN	Only the 'General' topic with `id=1` can be hidden.
+NOT_ELIGIBLE	The current user is not eligible to join the Peer-to-Peer Login Program.
+NOT_JOINED	The current user hasn't joined the Peer-to-Peer Login Program.
+NO_PAYMENT_NEEDED	The upgrade/transfer of the specified gift was already paid for or is free.
+OFFSET_INVALID	The provided offset is invalid.
+OFFSET_PEER_ID_INVALID	The provided offset peer is invalid.
+OPTIONS_TOO_MUCH	Too many options provided.
+OPTION_INVALID	Invalid option selected.
+ORDER_INVALID	The specified username order is invalid.
+PACK_SHORT_NAME_INVALID	Short pack name invalid.
+PACK_SHORT_NAME_OCCUPIED	A stickerpack with this name already exists.
+PACK_TITLE_INVALID	The stickerpack title is invalid.
+PACK_TYPE_INVALID	The masks and emojis flags are mutually exclusive.
+PARENT_PEER_INVALID	The specified `parent_peer` is invalid.
+PARTICIPANTS_TOO_FEW	Not enough participants.
+PARTICIPANT_ID_INVALID	The specified participant ID is invalid.
+PARTICIPANT_JOIN_MISSING	Trying to enable a presentation, when the user hasn't joined the Video Chat with [phone.joinGroupCall](https://core.telegram.org/method/phone.joinGroupCall).
+PARTICIPANT_VERSION_OUTDATED	The other participant does not use an up to date telegram client with support for calls.
+PASSWORD_EMPTY	The provided password is empty.
+PASSWORD_HASH_INVALID	The provided password hash is invalid.
+PASSWORD_MISSING	You must [enable 2FA](https://core.telegram.org/api/srp) before executing this operation.
+PASSWORD_RECOVERY_EXPIRED	The recovery code has expired.
+PASSWORD_RECOVERY_NA	No email was set, can't recover password via email.
+PASSWORD_REQUIRED	A [2FA password](https://core.telegram.org/api/srp) must be configured to use Telegram Passport.
+PASSWORD_TOO_FRESH_X	The password was modified less than 24 hours ago, try again in {value} seconds.
+PAYMENT_CREDENTIALS_INVALID	The specified payment credentials are invalid.
+PAYMENT_PROVIDER_INVALID	The specified payment provider is invalid.
+PAYMENT_REQUIRED	Payment is required for this action, see [here »](https://core.telegram.org/api/gifts) for more info.
+PEERS_LIST_EMPTY	The specified list of peers is empty.
+PEER_FLOOD	The current account is spamreported, you cannot execute this action, check @spambot for more info.
+PEER_HISTORY_EMPTY	You can't pin an empty chat with a user.
+PEER_ID_INVALID	The provided peer id is invalid.
+PEER_ID_NOT_SUPPORTED	The provided peer ID is not supported.
+PEER_TYPES_INVALID	The passed [keyboardButtonSwitchInline](https://core.telegram.org/constructor/keyboardButtonSwitchInline).`peer_types` field is invalid.
+PERSISTENT_TIMESTAMP_EMPTY	Persistent timestamp empty.
+PERSISTENT_TIMESTAMP_INVALID	Persistent timestamp invalid.
+PHONE_CODE_EMPTY	phone_code is missing.
+PHONE_CODE_EXPIRED	The phone code you provided has expired.
+PHONE_CODE_HASH_EMPTY	phone_code_hash is missing.
+PHONE_CODE_INVALID	The provided phone code is invalid.
+PHONE_HASH_EXPIRED	An invalid or expired `phone_code_hash` was provided.
+PHONE_NOT_OCCUPIED	No user is associated to the specified phone number.
+PHONE_NUMBER_APP_SIGNUP_FORBIDDEN	You can't sign up using this app.
+PHONE_NUMBER_BANNED	The provided phone number is banned from telegram.
+PHONE_NUMBER_FLOOD	You asked for the code too many times.
+PHONE_NUMBER_INVALID	The phone number is invalid.
+PHONE_NUMBER_OCCUPIED	The phone number is already in use.
+PHONE_NUMBER_UNOCCUPIED	The phone number is not yet being used.
+PHONE_PASSWORD_PROTECTED	This phone is password protected.
+PHOTO_CONTENT_TYPE_INVALID	Photo mime-type invalid.
+PHOTO_CONTENT_URL_EMPTY	Photo URL invalid.
+PHOTO_CROP_FILE_MISSING	Photo crop file missing.
+PHOTO_CROP_SIZE_SMALL	Photo is too small.
+PHOTO_EXT_INVALID	The extension of the photo is invalid.
+PHOTO_FILE_MISSING	Profile photo file missing.
+PHOTO_ID_INVALID	Photo ID invalid.
+PHOTO_INVALID	Photo invalid.
+PHOTO_INVALID_DIMENSIONS	The photo dimensions are invalid.
+PHOTO_SAVE_FILE_INVALID	Internal issues, try again later.
+PHOTO_THUMB_URL_EMPTY	Photo thumbnail URL is empty.
 PHOTO_THUMB_URL_INVALID	The photo thumb URL is invalid
-PINNED_DIALOGS_TOO_MUCH	Too many pinned dialogs
-PIN_RESTRICTED	You can't pin messages in private chats with other people
-POLL_ANSWERS_INVALID	The poll answers are invalid
-POLL_ANSWER_INVALID	One of the poll answers is not acceptable
-POLL_OPTION_DUPLICATE	A duplicate option was sent in the same poll
-POLL_OPTION_INVALID	A poll option used invalid data (the data may be too long)
-POLL_QUESTION_INVALID	The poll question is invalid
+PINNED_DIALOGS_TOO_MUCH	Too many pinned dialogs.
+PINNED_TOO_MUCH	There are too many pinned topics, unpin some first.
+PIN_RESTRICTED	You can't pin messages.
+PLATFORM_INVALID	The provided platform is invalid. Allowed values are "android", "ios", "wp", "bb", "desktop", "web", "ubp", "other".
+POLL_ANSWERS_INVALID	Invalid poll answers were provided.
+POLL_ANSWER_INVALID	One of the poll answers is not acceptable.
+POLL_OPTION_DUPLICATE	Duplicate poll options provided.
+POLL_OPTION_INVALID	Invalid poll option provided.
+POLL_QUESTION_INVALID	One of the poll questions is not acceptable.
 POLL_UNSUPPORTED	This layer does not support polls in the invoked method
 POLL_VOTE_REQUIRED	Cast a vote in the poll before calling this method
-PREMIUM_ACCOUNT_REQUIRED	The method requires a premium user account
-PRIVACY_KEY_INVALID	The privacy key is invalid
-PRIVACY_TOO_LONG	Your privacy exception list has exceeded the maximum capacity
-PRIVACY_VALUE_INVALID	The privacy value is invalid
-PUBLIC_KEY_REQUIRED	A public key is required
-QUERY_ID_EMPTY	The query ID is empty
-QUERY_ID_INVALID	The callback query id is invalid
-QUERY_TOO_SHORT	The query is too short
-QUIZ_ANSWER_MISSING	You can forward a quiz while hiding the original author only after choosing an option in the quiz
-QUIZ_CORRECT_ANSWERS_EMPTY	The correct answers of the quiz are empty
-QUIZ_CORRECT_ANSWERS_TOO_MUCH	The quiz contains too many correct answers
-QUIZ_CORRECT_ANSWER_INVALID	The correct answers of the quiz are invalid
-QUIZ_MULTIPLE_INVALID	A quiz can't have multiple answers
-RANDOM_ID_EMPTY	The random ID is empty
-RANDOM_ID_INVALID	The provided random ID is invalid
-RANDOM_LENGTH_INVALID	The random length is invalid
-RANGES_INVALID	Invalid range provided
-REACTION_EMPTY	The reaction provided is empty
-REACTION_INVALID	Invalid reaction provided (only valid emoji are allowed)
+PREMIUM_ACCOUNT_REQUIRED	A premium account is required to execute this action.
+PREMIUM_GIFTCODE_WAS_REFUNDED	This gift code can't be redeemed because the giveaway organizer requested a refund
+PREMIUM_SUB_ACTIVE_UNTIL_X	You already have a premium subscription active until unixtime {value} .
+PRICING_CHAT_INVALID	The pricing for the [subscription](https://core.telegram.org/api/subscriptions) is invalid, the maximum price is specified in the [`stars_subscription_amount_max` config key »](https://core.telegram.org/api/config#stars-subscription-amount-max).
+PRIVACY_KEY_INVALID	The privacy key is invalid.
+PRIVACY_TOO_LONG	Too many privacy rules were specified, the current limit is 1000.
+PRIVACY_VALUE_INVALID	The specified privacy rule combination is invalid.
+PUBLIC_KEY_REQUIRED	A public key is required.
+PURPOSE_INVALID	The specified payment purpose is invalid.
+QUERY_ID_EMPTY	The query ID is empty.
+QUERY_ID_INVALID	The query ID is invalid.
+QUERY_TOO_SHORT	The query string is too short.
+QUICK_REPLIES_BOT_NOT_ALLOWED	[Quick replies](https://core.telegram.org/api/business#quick-reply-shortcuts) cannot be used by bots.
+QUICK_REPLIES_TOO_MUCH	A maximum of [appConfig.`quick_replies_limit`](https://core.telegram.org/api/config#quick-replies-limit) shortcuts may be created, the limit was reached.
+QUIZ_ANSWER_MISSING	You can forward a quiz while hiding the original author only after choosing an option in the quiz.
+QUIZ_CORRECT_ANSWERS_EMPTY	No correct quiz answer was specified.
+QUIZ_CORRECT_ANSWERS_TOO_MUCH	You specified too many correct answers in a quiz, quizzes can only have one right answer!
+QUIZ_CORRECT_ANSWER_INVALID	An invalid value was provided to the correct_answers field.
+QUIZ_MULTIPLE_INVALID	Quizzes can't have the multiple_choice flag set!
+QUOTE_TEXT_INVALID	The specified `reply_to`.`quote_text` field is invalid.
+RAISE_HAND_FORBIDDEN	You cannot raise your hand.
+RANDOM_ID_EMPTY	Random ID empty.
+RANDOM_ID_EXPIRED	The specified `random_id` was expired (most likely it didn't follow the required `uint64_t random_id = (time() << 32) | ((uint64_t)random_uint32_t())` format, or the specified time is too far in the past).
+RANDOM_ID_INVALID	A provided random ID is invalid.
+RANDOM_LENGTH_INVALID	Random length invalid.
+RANGES_INVALID	Invalid range provided.
+REACTIONS_COUNT_INVALID	The specified number of reactions is invalid.
+REACTIONS_TOO_MANY	The message already has exactly `reactions_uniq_max` reaction emojis, you can't react with a new emoji, see [the docs for more info »](https://core.telegram.org/api/config#client-configuration).
+REACTION_EMPTY	Empty reaction provided.
+REACTION_INVALID	The specified reaction is invalid.
+RECEIPT_EMPTY	The specified receipt is empty.
 REFLECTOR_NOT_AVAILABLE	The call reflector is not available
-REPLY_MARKUP_BUY_EMPTY	Reply markup for buy button empty
-REPLY_MARKUP_GAME_EMPTY	The provided reply markup for the game is empty
-REPLY_MARKUP_INVALID	The provided reply markup is invalid
-REPLY_MARKUP_TOO_LONG	The reply markup is too long
-REPLY_MESSAGE_ID_INVALID	The reply message id is invalid
-RESET_REQUEST_MISSING	No password reset is in progress
-RESULTS_TOO_MUCH	The result contains too many items
-RESULT_ID_DUPLICATE	The result contains items with duplicated identifiers
-RESULT_ID_EMPTY	Result ID empty
-RESULT_ID_INVALID	The given result cannot be used to send the selection to the bot
-RESULT_TYPE_INVALID	The result type is invalid
-REVOTE_NOT_ALLOWED	You cannot change your vote
-RIGHTS_NOT_MODIFIED	The new admin rights are equal to the old rights, no change was made
-RSA_DECRYPT_FAILED	Internal RSA decryption failed
-SCHEDULE_BOT_NOT_ALLOWED	Bots are not allowed to schedule messages
-SCHEDULE_DATE_INVALID	Invalid schedule date provided
-SCHEDULE_DATE_TOO_LATE	The date you tried to schedule is too far in the future (more than one year)
-SCHEDULE_STATUS_PRIVATE	You cannot schedule a message until the person comes online if their privacy does not show this information
-SCHEDULE_TOO_MUCH	You tried to schedule too many messages in this chat
-SCORE_INVALID	The specified game score is invalid
-SEARCH_QUERY_EMPTY	The search query is empty
-SEARCH_WITH_LINK_NOT_SUPPORTED	You cannot provide a search query and an invite link at the same time
-SECONDS_INVALID	The seconds interval is invalid
-SEND_AS_PEER_INVALID	You can't send messages as the specified peer
-SEND_MESSAGE_MEDIA_INVALID	The message media is invalid
-SEND_MESSAGE_TYPE_INVALID	The message type is invalid
-SESSION_TOO_FRESH_X	You can't do this action because the current session was logged-in recently
-SETTINGS_INVALID	Invalid settings were provided
-SHA256_HASH_INVALID	The provided SHA256 hash is invalid
+REPLY_MARKUP_BUY_EMPTY	Reply markup for buy button empty.
+REPLY_MARKUP_GAME_EMPTY	A game message is being edited, but the newly provided keyboard doesn't have a keyboardButtonGame button.
+REPLY_MARKUP_INVALID	The provided reply markup is invalid.
+REPLY_MARKUP_TOO_LONG	The specified reply_markup is too long.
+REPLY_MESSAGES_TOO_MUCH	Each shortcut can contain a maximum of [appConfig.`quick_reply_messages_limit`](https://core.telegram.org/api/config#quick-reply-messages-limit) messages, the limit was reached.
+REPLY_MESSAGE_ID_INVALID	The specified reply-to message ID is invalid.
+REPLY_TO_INVALID	The specified `reply_to` field is invalid.
+REPLY_TO_MONOFORUM_PEER_INVALID	The specified inputReplyToMonoForum.monoforum_peer_id is invalid.
+REPLY_TO_USER_INVALID	The replied-to user is invalid.
+REQUEST_TOKEN_INVALID	The master DC did not accept the `request_token` from the CDN DC. Continue downloading the file from the master DC using upload.getFile.
+RESET_REQUEST_MISSING	No password reset is in progress.
+RESULTS_TOO_MUCH	Too many results were provided.
+RESULT_ID_DUPLICATE	You provided a duplicate result ID.
+RESULT_ID_EMPTY	Result ID empty.
+RESULT_ID_INVALID	One of the specified result IDs is invalid.
+RESULT_TYPE_INVALID	Result type invalid.
+REVOTE_NOT_ALLOWED	You cannot change your vote.
+RIGHTS_NOT_MODIFIED	The new admin rights are equal to the old rights, no change was made.
+RINGTONE_INVALID	The specified ringtone is invalid.
+RINGTONE_MIME_INVALID	The MIME type for the ringtone is invalid.
+RSA_DECRYPT_FAILED	Internal RSA decryption failed.
+SAVED_DIALOGS_UNSUPPORTED	You cannot use this method
+SAVED_ID_EMPTY	The passed inputSavedStarGiftChat.saved_id is empty.
+SCHEDULE_BOT_NOT_ALLOWED	Bots cannot schedule messages.
+SCHEDULE_DATE_INVALID	Invalid schedule date provided.
+SCHEDULE_DATE_TOO_LATE	You can't schedule a message this far in the future.
+SCHEDULE_STATUS_PRIVATE	Can't schedule until user is online, if the user's last seen timestamp is hidden by their privacy settings.
+SCHEDULE_TOO_MUCH	There are too many scheduled messages.
+SCORE_INVALID	The specified game score is invalid.
+SEARCH_QUERY_EMPTY	The search query is empty.
+SEARCH_WITH_LINK_NOT_SUPPORTED	You cannot provide a search query and an invite link at the same time.
+SECONDS_INVALID	Invalid duration provided.
+SECURE_SECRET_REQUIRED	A secure secret is required.
+SELF_DELETE_RESTRICTED	Business bots can't delete messages just for the user, `revoke` **must** be set.
+SEND_AS_PEER_INVALID	You can't send messages as the specified peer.
+SEND_MESSAGE_GAME_INVALID	An inputBotInlineMessageGame can only be contained in an inputBotInlineResultGame, not in an inputBotInlineResult/inputBotInlineResultPhoto/etc.
+SEND_MESSAGE_MEDIA_INVALID	Invalid media provided.
+SEND_MESSAGE_TYPE_INVALID	The message type is invalid.
+SESSION_TOO_FRESH_X	This session was created less than 24 hours ago, try again in {value} seconds.
+SETTINGS_INVALID	Invalid settings were provided.
+SHA256_HASH_INVALID	The provided SHA256 hash is invalid.
+SHORTCUT_INVALID	The specified shortcut is invalid.
 SHORTNAME_OCCUPY_FAILED	An error occurred when trying to register the short-name used for the sticker pack. Try a different name
-SHORT_NAME_INVALID	The specified short name is invalid
-SHORT_NAME_OCCUPIED	The specified short name is already in use
-SLOWMODE_MULTI_MSGS_DISABLED	Slowmode is enabled, you cannot forward multiple messages to this group
-SMS_CODE_CREATE_FAILED	An error occurred while creating the SMS code
-SRP_ID_INVALID	Invalid SRP ID provided
-SRP_PASSWORD_CHANGED	The password has changed
-START_PARAM_EMPTY	The start parameter is empty
-START_PARAM_INVALID	The start parameter is invalid
-START_PARAM_TOO_LONG	The start parameter is too long
-STICKERPACK_STICKERS_TOO_MUCH	There are too many stickers in this stickerpack, you can't add any more
-STICKERSET_INVALID	The requested sticker set is invalid
-STICKERSET_NOT_MODIFIED	The sticker set is not modified
-STICKERS_EMPTY	The sticker provided is empty
-STICKERS_TOO_MUCH	Too many stickers in the set
-STICKER_DOCUMENT_INVALID	The sticker document is invalid
-STICKER_EMOJI_INVALID	The sticker emoji is invalid
-STICKER_FILE_INVALID	The sticker file is invalid
-STICKER_GIF_DIMENSIONS	The specified video sticker has invalid dimensions
-STICKER_ID_INVALID	The provided sticker id is invalid
-STICKER_INVALID	The provided sticker is invalid
-STICKER_MIME_INVALID	Make sure to pass a valid image file for the right InputFile parameter
-STICKER_PNG_DIMENSIONS	The sticker png dimensions are invalid
-STICKER_PNG_NOPNG	Stickers must be png files but the provided image was not a png
-STICKER_TGS_NODOC	You must send the animated sticker as a document
-STICKER_TGS_NOTGS	A tgs sticker file was expected, but something else was provided
-STICKER_THUMB_PNG_NOPNG	A png sticker thumbnail file was expected, but something else was provided
-STICKER_VIDEO_BIG	The specified video sticker is too big
-STICKER_VIDEO_NODOC	You must send the video sticker as a document
-STICKER_VIDEO_NOWEBM	A webm video file was expected, but something else was provided
-STORIES_TOO_MUCH	Too many stories in the current account
-STORY_PERIOD_INVALID	The story period is invalid
-SWITCH_PM_TEXT_EMPTY	The switch_pm.text field was empty
-TAKEOUT_INVALID	The takeout id is invalid
-TAKEOUT_REQUIRED	The method must be invoked inside a takeout session
-TEMP_AUTH_KEY_ALREADY_BOUND	The passed temporary key is already bound to another perm_auth_key_id
-TEMP_AUTH_KEY_EMPTY	The temporary auth key provided is empty
-THEME_FILE_INVALID	Invalid theme file provided
-THEME_FORMAT_INVALID	Invalid theme format provided
-THEME_INVALID	Invalid theme provided
-THEME_MIME_INVALID	You cannot create this theme because the mime-type is invalid
-THEME_TITLE_INVALID	The specified theme title is invalid
-TITLE_INVALID	The specified stickerpack title is invalid
-TMP_PASSWORD_DISABLED	The temporary password is disabled
-TMP_PASSWORD_INVALID	The temporary password is invalid
-TOKEN_INVALID	The provided token is invalid
-TOPIC_NOT_MODIFIED	The topic was not modified
-TO_LANG_INVALID	The specified destination language is invalid
-TRANSCRIPTION_FAILED	Telegram is having internal problems. Please try again later to transcribe the audio.
-TTL_DAYS_INVALID	The provided TTL days is invalid
-TTL_MEDIA_INVALID	The media does not support self-destruction
-TYPES_EMPTY	The types parameter is empty
+SHORT_NAME_INVALID	The specified short name is invalid.
+SHORT_NAME_OCCUPIED	The specified short name is already in use.
+SLOTS_EMPTY	The specified slot list is empty.
+SLOWMODE_MULTI_MSGS_DISABLED	Slowmode is enabled, you cannot forward multiple messages to this group.
+SLOWMODE_WAIT_X	Slowmode is enabled in this chat: wait {value} seconds before sending another message to this chat.
+SLUG_INVALID	The specified invoice slug is invalid.
+SMSJOB_ID_INVALID	The specified job ID is invalid.
+SMS_CODE_CREATE_FAILED	An error occurred while creating the SMS code.
+SRP_A_INVALID	The specified inputCheckPasswordSRP.A value is invalid.
+SRP_ID_INVALID	Invalid SRP ID provided.
+SRP_PASSWORD_CHANGED	Password has changed.
+STARGIFT_ALREADY_CONVERTED	The specified star gift was already converted to Stars.
+STARGIFT_ALREADY_REFUNDED	The specified star gift was already refunded.
+STARGIFT_ALREADY_UPGRADED	The specified gift was already upgraded to a collectible gift.
+STARGIFT_INVALID	The passed gift is invalid.
+STARGIFT_NOT_FOUND	The specified gift was not found.
+STARGIFT_OWNER_INVALID	You cannot transfer or sell a gift owned by another user.
+STARGIFT_PEER_INVALID	The specified inputSavedStarGiftChat.peer is invalid.
+STARGIFT_RESELL_CURRENCY_NOT_ALLOWED	You can't buy the gift using the specified currency (i.e. trying to pay in Stars for TON gifts).
+STARGIFT_SLUG_INVALID	The specified gift slug is invalid.
+STARGIFT_TRANSFER_TOO_EARLY_X	You cannot transfer this gift yet, wait {value} seconds.
+STARGIFT_UPGRADE_UNAVAILABLE	A received gift can only be upgraded to a collectible gift if the [messageActionStarGift](https://core.telegram.org/constructor/messageActionStarGift)/[savedStarGift](https://core.telegram.org/constructor/savedStarGift).`can_upgrade` flag is set.
+STARGIFT_USAGE_LIMITED	The gift is sold out.
+STARGIFT_USER_USAGE_LIMITED	You've reached the starGift.limited_per_user limit, you can't buy any more gifts of this type.
+STARREF_AWAITING_END	The previous referral program was terminated less than 24 hours ago: further changes can be made after the date specified in userFull.starref_program.end_date.
+STARREF_EXPIRED	The specified referral link is invalid.
+STARREF_HASH_REVOKED	The specified affiliate link was already revoked.
+STARREF_PERMILLE_INVALID	The specified commission_permille is invalid: the minimum and maximum values for this parameter are contained in the [starref_min_commission_permille](https://core.telegram.org/api/config#starref-min-commission-permille) and [starref_max_commission_permille](https://core.telegram.org/api/config#starref-max-commission-permille) client configuration parameters.
+STARREF_PERMILLE_TOO_LOW	The specified commission_permille is too low: the minimum and maximum values for this parameter are contained in the [starref_min_commission_permille](https://core.telegram.org/api/config#starref-min-commission-permille) and [starref_max_commission_permille](https://core.telegram.org/api/config#starref-max-commission-permille) client configuration parameters.
+STARS_AMOUNT_INVALID	The specified amount in stars is invalid.
+STARS_INVOICE_INVALID	The specified Telegram Star invoice is invalid.
+STARS_PAYMENT_REQUIRED	To import this chat invite link, you must first [pay for the associated Telegram Star subscription »](https://core.telegram.org/api/subscriptions#channel-subscriptions).
+START_PARAM_EMPTY	The start parameter is empty.
+START_PARAM_INVALID	Start parameter invalid.
+START_PARAM_TOO_LONG	Start parameter is too long.
+STICKERPACK_STICKERS_TOO_MUCH	There are too many stickers in this stickerpack, you can't add any more.
+STICKERSET_INVALID	The provided sticker set is invalid.
+STICKERSET_NOT_MODIFIED	The passed stickerset information is equal to the current information.
+STICKERS_EMPTY	No sticker provided.
+STICKERS_TOO_MUCH	There are too many stickers in this stickerpack, you can't add any more.
+STICKER_DOCUMENT_INVALID	The specified sticker document is invalid.
+STICKER_EMOJI_INVALID	Sticker emoji invalid.
+STICKER_FILE_INVALID	Sticker file invalid.
+STICKER_GIF_DIMENSIONS	The specified video sticker has invalid dimensions.
+STICKER_ID_INVALID	The provided sticker ID is invalid.
+STICKER_INVALID	The provided sticker is invalid.
+STICKER_MIME_INVALID	The specified sticker MIME type is invalid.
+STICKER_PNG_DIMENSIONS	Sticker png dimensions invalid.
+STICKER_PNG_NOPNG	One of the specified stickers is not a valid PNG file.
+STICKER_TGS_NODOC	You must send the animated sticker as a document.
+STICKER_TGS_NOTGS	Invalid TGS sticker provided.
+STICKER_THUMB_PNG_NOPNG	Incorrect stickerset thumb file provided, PNG / WEBP expected.
+STICKER_THUMB_TGS_NOTGS	Incorrect stickerset TGS thumb file provided.
+STICKER_VIDEO_BIG	The specified video sticker is too big.
+STICKER_VIDEO_NODOC	You must send the video sticker as a document.
+STICKER_VIDEO_NOWEBM	The specified video sticker is not in webm format.
+STORIES_NEVER_CREATED	This peer hasn't ever posted any stories.
+STORIES_TOO_MUCH	You have hit the maximum active stories limit as specified by the [`story_expiring_limit_*` client configuration parameters](https://core.telegram.org/api/config#story-expiring-limit-default): you should buy a [Premium](https://core.telegram.org/api/premium) subscription, delete an active story, or wait for the oldest story to expire.
+STORY_ID_EMPTY	You specified no story IDs.
+STORY_ID_INVALID	The specified story ID is invalid.
+STORY_NOT_MODIFIED	The new story information you passed is equal to the previous story information, thus it wasn't modified.
+STORY_PERIOD_INVALID	The specified story period is invalid for this account.
+STORY_SEND_FLOOD_MONTHLY_X	You've hit the monthly story limit as specified by the [`stories_sent_monthly_limit_*` client configuration parameters](https://core.telegram.org/api/config#stories-sent-monthly-limit-default): wait {value} seconds before posting a new story.
+STORY_SEND_FLOOD_WEEKLY_X	You've hit the weekly story limit as specified by the [`stories_sent_weekly_limit_*` client configuration parameters](https://core.telegram.org/api/config#stories-sent-weekly-limit-default): wait for {value} seconds before posting a new story.
+SUBSCRIPTION_EXPORT_MISSING	You cannot send a [bot subscription invoice](https://core.telegram.org/api/subscriptions#bot-subscriptions) directly, you may only create invoice links using [payments.exportInvoice](https://core.telegram.org/method/payments.exportInvoice).
+SUBSCRIPTION_ID_INVALID	The specified subscription_id is invalid.
+SUBSCRIPTION_PERIOD_INVALID	The specified subscription_pricing.period is invalid.
+SUGGESTED_POST_AMOUNT_INVALID	The specified price for the suggested post is invalid.
+SUGGESTED_POST_PEER_INVALID	You cannot send suggested posts to non-[monoforum](https://core.telegram.org/api/monoforum) peers.
+SWITCH_PM_TEXT_EMPTY	The switch_pm.text field was empty.
+SWITCH_WEBVIEW_URL_INVALID	The URL specified in switch_webview.url is invalid!
+TAKEOUT_INIT_DELAY_X	Sorry, for security reasons, you will be able to begin downloading your data in {value} seconds. We have notified all your devices about the export request to make sure it's authorized and to give you time to react if it's not.
+TAKEOUT_INVALID	The specified takeout ID is invalid.
+TAKEOUT_REQUIRED	A [takeout](https://core.telegram.org/api/takeout) session needs to be initialized first, [see here » for more info](https://core.telegram.org/api/takeout).
+TASK_ALREADY_EXISTS	An email reset was already requested.
+TEMP_AUTH_KEY_ALREADY_BOUND	The passed temporary key is already bound to another **perm_auth_key_id**.
+TEMP_AUTH_KEY_EMPTY	No temporary auth key provided.
+TERMS_URL_INVALID	The specified [invoice](https://core.telegram.org/constructor/invoice).`terms_url` is invalid.
+THEME_FILE_INVALID	Invalid theme file provided.
+THEME_FORMAT_INVALID	Invalid theme format provided.
+THEME_INVALID	Invalid theme provided.
+THEME_MIME_INVALID	The theme's MIME type is invalid.
+THEME_PARAMS_INVALID	The specified `theme_params` field is invalid.
+THEME_SLUG_INVALID	The specified theme slug is invalid.
+THEME_TITLE_INVALID	The specified theme title is invalid.
+TIMEZONE_INVALID	The specified timezone does not exist.
+TITLE_INVALID	The specified stickerpack title is invalid.
+TMP_PASSWORD_DISABLED	The temporary password is disabled.
+TMP_PASSWORD_INVALID	The passed tmp_password is invalid.
+TODO_ITEMS_EMPTY	A checklist was specified, but no [checklist items](https://core.telegram.org/api/todo) were passed.
+TODO_ITEM_DUPLICATE	Duplicate [checklist items](https://core.telegram.org/api/todo) detected.
+TODO_NOT_MODIFIED	No todo items were specified, so no changes were made to the todo list.
+TOKEN_EMPTY	The specified token is empty.
+TOKEN_INVALID	The provided token is invalid.
+TOKEN_TYPE_INVALID	The specified token type is invalid.
+TOPICS_EMPTY	You specified no topic IDs.
+TOPIC_CLOSED	This topic was closed, you can't send messages to it anymore.
+TOPIC_CLOSE_SEPARATELY	The `close` flag cannot be provided together with any of the other flags.
+TOPIC_DELETED	The specified topic was deleted.
+TOPIC_HIDE_SEPARATELY	The `hide` flag cannot be provided together with any of the other flags.
+TOPIC_ID_INVALID	The specified topic ID is invalid.
+TOPIC_NOT_MODIFIED	The updated topic info is equal to the current topic info, nothing was changed.
+TOPIC_TITLE_EMPTY	The specified topic title is empty.
+TO_ID_INVALID	The specified `to_id` of the passed inputInvoiceStarGiftResale or inputInvoiceStarGiftTransfer is invalid.
+TO_LANG_INVALID	The specified destination language is invalid.
+TRANSACTION_ID_INVALID	The specified transaction ID is invalid.
+TRANSCRIPTION_FAILED	Audio transcription failed.
+TRANSLATE_REQ_QUOTA_EXCEEDED	Translation is currently unavailable due to a temporary server-side lack of resources.
+TTL_DAYS_INVALID	The provided TTL is invalid.
+TTL_MEDIA_INVALID	Invalid media Time To Live was provided.
+TTL_PERIOD_INVALID	The specified TTL period is invalid.
+TYPES_EMPTY	No top peer type was provided.
 TYPE_CONSTRUCTOR_INVALID	The type constructor is invalid
-UNKNOWN_ERROR	Unknown error
-UNTIL_DATE_INVALID	That date parameter is invalid
-URL_INVALID	The URL provided is invalid
-USAGE_LIMIT_INVALID	The usage limit is invalid
-USERNAME_INVALID	The username is invalid
-USERNAME_NOT_MODIFIED	The username was not modified because you tried to edit it using the same one
-USERNAME_NOT_OCCUPIED	The username is not occupied by anyone
-USERNAME_OCCUPIED	The username is already in use by someone else
-USERNAME_PURCHASE_AVAILABLE	The username is available for purchase on fragment.com
-USERPIC_UPLOAD_REQUIRED	You are required to upload a profile picture for this action
-USERS_TOO_FEW	Not enough users (to create a chat, for example)
-USERS_TOO_MUCH	The maximum number of users has been exceeded (to create a chat, for example)
-USER_ADMIN_INVALID	The action requires admin privileges. Probably you tried to edit admin privileges on someone you don't have rights to
-USER_ALREADY_INVITED	You have already invited this user
-USER_ALREADY_PARTICIPANT	The user is already a participant of this chat
-USER_BANNED_IN_CHANNEL	You are limited from sending messages in supergroups/channels, check @SpamBot for details
-USER_BLOCKED	The user is blocked
-USER_BOT	Bots in channels can only be administrators, not members.
-USER_BOT_INVALID	This method can only be used by a bot
-USER_BOT_REQUIRED	The method can be used by bots only
-USER_CHANNELS_TOO_MUCH	The user is already in too many channels or supergroups
-USER_CREATOR	You can't leave this channel because you're its creator
-USER_ID_INVALID	The user id being used is invalid or not known yet. Make sure you meet the user before interacting with it
-USER_INVALID	The provided user is invalid
-USER_IS_BLOCKED	The user blocked you
-USER_IS_BOT	A bot cannot send messages to other bots or to itself
-USER_KICKED	This user was kicked from this chat
-USER_NOT_MUTUAL_CONTACT	The user is not a mutual contact
-USER_NOT_PARTICIPANT	The user is not a member of this chat
-USER_PUBLIC_MISSING	The accounts username is missing
-USER_VOLUME_INVALID	The specified user volume is invalid
-VIDEO_CONTENT_TYPE_INVALID	The video content type is invalid (i.e.: not streamable)
-VIDEO_FILE_INVALID	The video file is invalid
-VIDEO_TITLE_EMPTY	The specified video title is empty
-VOICE_MESSAGES_FORBIDDEN	Voice messages are restricted
+UNSUPPORTED	`require_payment` cannot be *set* by users, only by monoforums: users must instead use the [inputPrivacyKeyNoPaidMessages](https://core.telegram.org/constructor/inputPrivacyKeyNoPaidMessages) privacy setting to remove a previously added exemption.
+UNTIL_DATE_INVALID	Invalid until date provided.
+URL_INVALID	Invalid URL provided.
+USAGE_LIMIT_INVALID	The specified usage limit is invalid.
+USERNAMES_ACTIVE_TOO_MUCH	The maximum number of active usernames was reached.
+USERNAME_INVALID	The provided username is not valid.
+USERNAME_NOT_MODIFIED	The username was not modified.
+USERNAME_NOT_OCCUPIED	The provided username is not occupied.
+USERNAME_OCCUPIED	The provided username is already occupied.
+USERNAME_PURCHASE_AVAILABLE	The specified username can be purchased on https://fragment.com.
+USERPIC_UPLOAD_REQUIRED	You must have a profile picture to publish your geolocation.
+USERS_TOO_FEW	Not enough users (to create a chat, for example).
+USERS_TOO_MUCH	The maximum number of users has been exceeded (to create a chat, for example).
+USER_ADMIN_INVALID	You're not an admin.
+USER_ALREADY_INVITED	You have already invited this user.
+USER_ALREADY_PARTICIPANT	The user is already in the group.
+USER_BANNED_IN_CHANNEL	You're banned from sending messages in supergroups/channels.
+USER_BLOCKED	User blocked.
+USER_BOT	Bots can only be admins in channels.
+USER_BOT_INVALID	User accounts must provide the `bot` method parameter when calling this method. If there is no such method parameter, this method can only be invoked by bot accounts.
+USER_BOT_REQUIRED	This method can only be called by a bot.
+USER_CHANNELS_TOO_MUCH	One of the users you tried to add is already in too many channels/supergroups.
+USER_CREATOR	For channels.editAdmin: you've tried to edit the admin rights of the owner, but you're not the owner; for channels.leaveChannel: you can't leave this channel, because you're its creator.
+USER_GIFT_UNAVAILABLE	Gifts are not available in the current region ([stars_gifts_enabled](https://core.telegram.org/api/config#stars-gifts-enabled) is equal to false).
+USER_ID_INVALID	The provided user ID is invalid.
+USER_INVALID	Invalid user provided.
+USER_IS_BLOCKED	You were blocked by this user.
+USER_IS_BOT	Bots can't send messages to other bots.
+USER_KICKED	This user was kicked from this supergroup/channel.
+USER_NOT_MUTUAL_CONTACT	The provided user is not a mutual contact.
+USER_NOT_PARTICIPANT	You're not a member of this supergroup/channel.
+USER_PUBLIC_MISSING	Cannot generate a link to stories posted by a peer without a username.
+USER_VOLUME_INVALID	The specified user volume is invalid.
+VENUE_ID_INVALID	The specified venue ID is invalid.
+VIDEO_CONTENT_TYPE_INVALID	The video's content type is invalid.
+VIDEO_FILE_INVALID	The specified video file is invalid.
+VIDEO_PAUSE_FORBIDDEN	You cannot pause the video stream.
+VIDEO_STOP_FORBIDDEN	You cannot stop the video stream.
+VIDEO_TITLE_EMPTY	The specified video title is empty.
+VOICE_MESSAGES_FORBIDDEN	This user's privacy settings forbid you from sending voice messages.
 VOLUME_LOC_NOT_FOUND	The volume location can't be found
-WALLPAPER_FILE_INVALID	The provided file cannot be used as a wallpaper
-WALLPAPER_INVALID	The input wallpaper was not valid
-WALLPAPER_MIME_INVALID	The wallpaper mime type is invalid
-WC_CONVERT_URL_INVALID	WC convert URL invalid
-WEBDOCUMENT_INVALID	The web document is invalid
-WEBDOCUMENT_MIME_INVALID	The web document mime type is invalid
-WEBDOCUMENT_SIZE_TOO_BIG	The web document is too big
-WEBDOCUMENT_URL_EMPTY	The web document URL is empty
-WEBDOCUMENT_URL_INVALID	The web document URL is invalid
-WEBPAGE_CURL_FAILED	Telegram server could not fetch the provided URL
-WEBPAGE_MEDIA_EMPTY	The URL doesn't contain any valid media
-TOPIC_DELETED	The specified topic was deleted
-TOPIC_CLOSED	This topic was closed, you can't send messages to it anymore
-STORIES_NEVER_CREATED	You have never created any stories
-STORIES_TOO_MUCH	Too many stories posted by the user
-GROUPCALL_FORBIDDEN	The group call has already ended.
-WEBPAGE_NOT_FOUND	Webpage not found
-WEBPAGE_URL_INVALID	Webpage url invalid
-WEBPUSH_AUTH_INVALID	The specified web push authentication secret is invalid
-WEBPUSH_KEY_INVALID	The specified web push elliptic curve Diffie-Hellman public key is invalid
-WEBPUSH_TOKEN_INVALID	The specified web push token is invalid
-YOU_BLOCKED_USER	You blocked this user
+WALLPAPER_FILE_INVALID	The specified wallpaper file is invalid.
+WALLPAPER_INVALID	The specified wallpaper is invalid.
+WALLPAPER_MIME_INVALID	The specified wallpaper MIME type is invalid.
+WALLPAPER_NOT_FOUND	The specified wallpaper could not be found.
+WC_CONVERT_URL_INVALID	WC convert URL invalid.
+WEBDOCUMENT_INVALID	Invalid webdocument URL provided.
+WEBDOCUMENT_MIME_INVALID	Invalid webdocument mime type provided.
+WEBDOCUMENT_SIZE_TOO_BIG	Webdocument is too big!
+WEBDOCUMENT_URL_EMPTY	The passed web document URL is empty.
+WEBDOCUMENT_URL_INVALID	The specified webdocument URL is invalid.
+WEBPAGE_CURL_FAILED	Failure while fetching the webpage with cURL.
+WEBPAGE_MEDIA_EMPTY	Webpage media empty.
+WEBPAGE_NOT_FOUND	A preview for the specified webpage `url` could not be generated.
+WEBPAGE_URL_INVALID	The specified webpage `url` is invalid.
+WEBPUSH_AUTH_INVALID	The specified web push authentication secret is invalid.
+WEBPUSH_KEY_INVALID	The specified web push elliptic curve Diffie-Hellman public key is invalid.
+WEBPUSH_TOKEN_INVALID	The specified web push token is invalid.
+YOU_BLOCKED_USER	You blocked this user.
\ No newline at end of file
diff --git a/compiler/errors/source/401_UNAUTHORIZED.tsv b/compiler/errors/source/401_UNAUTHORIZED.tsv
index 32e0265f..1bacaec5 100644
--- a/compiler/errors/source/401_UNAUTHORIZED.tsv
+++ b/compiler/errors/source/401_UNAUTHORIZED.tsv
@@ -1,10 +1,10 @@
 id	message
 ACTIVE_USER_REQUIRED	The method is only available to already activated users
-AUTH_KEY_INVALID	The key is invalid
-AUTH_KEY_PERM_EMPTY	The method is unavailable for temporary authorization key, not bound to permanent
-AUTH_KEY_UNREGISTERED	The key is not registered in the system. Delete your session file and login again
-SESSION_EXPIRED	The authorization has expired
-SESSION_PASSWORD_NEEDED	The two-step verification is enabled and a password is required
-SESSION_REVOKED	The authorization has been invalidated, because of the user terminating all sessions
-USER_DEACTIVATED	The user has been deleted/deactivated
-USER_DEACTIVATED_BAN	The user has been deleted/deactivated
\ No newline at end of file
+AUTH_KEY_INVALID	The specified auth key is invalid.
+AUTH_KEY_PERM_EMPTY	The method is unavailable for temporary authorization keys, not bound to a permanent authorization key.
+AUTH_KEY_UNREGISTERED	The specified authorization key is not registered in the system (for example, a PFS temporary key has expired).
+SESSION_EXPIRED	The session has expired.
+SESSION_PASSWORD_NEEDED	2FA is enabled, use a password to login.
+SESSION_REVOKED	The session was revoked by the user.
+USER_DEACTIVATED	The current account was deleted by the user.
+USER_DEACTIVATED_BAN	The current account was deleted and banned by Telegram's antispam system.
\ No newline at end of file
diff --git a/compiler/errors/source/403_FORBIDDEN.tsv b/compiler/errors/source/403_FORBIDDEN.tsv
index c45d9ede..15fa54b2 100644
--- a/compiler/errors/source/403_FORBIDDEN.tsv
+++ b/compiler/errors/source/403_FORBIDDEN.tsv
@@ -1,44 +1,516 @@
 id	message
-BROADCAST_FORBIDDEN	The request can't be used in channels
-CHANNEL_PUBLIC_GROUP_NA	The channel/supergroup is not available
-CHAT_ADMIN_INVITE_REQUIRED	You don't have rights to invite other users
-CHAT_ADMIN_REQUIRED	The method requires chat admin privileges
-CHAT_FORBIDDEN	You cannot write in this chat
-CHAT_SEND_AUDIOS_FORBIDDEN	You cannot send audio messages in this chat
-CHAT_SEND_DOCS_FORBIDDEN	You cannot send document messages in this chat
-CHAT_SEND_GIFS_FORBIDDEN	You can't send animations in this chat
-CHAT_SEND_INLINE_FORBIDDEN	You cannot use inline bots to send messages in this chat
-CHAT_SEND_MEDIA_FORBIDDEN	You cannot send media messages in this chat
-CHAT_SEND_PHOTOS_FORBIDDEN	You cannot send photos in this chat
-CHAT_SEND_PLAIN_FORBIDDEN	You cannot send text messages in this chat
-CHAT_SEND_POLL_FORBIDDEN	You cannot send polls in this chat
-CHAT_SEND_ROUNDVIDEOS_FORBIDDEN	You cannot send video notes in this chat
-CHAT_SEND_STICKERS_FORBIDDEN	You can't send stickers in this chat
-CHAT_SEND_VIDEOS_FORBIDDEN	You cannot send videos in this chat
-CHAT_WRITE_FORBIDDEN	You don't have rights to send messages in this chat
-EDIT_BOT_INVITE_FORBIDDEN	Bots' chat invite links can't be edited
-GROUPCALL_ALREADY_STARTED	The groupcall has already started, you can join directly using phone.joinGroupCall
-GROUPCALL_FORBIDDEN	The group call has already ended
-INLINE_BOT_REQUIRED	The action must be performed through an inline bot callback
-MESSAGE_AUTHOR_REQUIRED	You are not the author of this message
-MESSAGE_DELETE_FORBIDDEN	You don't have rights to delete messages in this chat, most likely because you are not the author of them
-NOT_ALLOWED	Not allowed
-PARTICIPANT_JOIN_MISSING	Trying to enable a presentation, when the user hasn't joined the Video Chat with phone.joinGroupCall
-POLL_VOTE_REQUIRED	Cast a vote in the poll before calling this method
-PREMIUM_ACCOUNT_REQUIRED	This action requires a premium account
-PRIVACY_PREMIUM_REQUIRED	The user has restricted from sending messages or this action requires a premium account
-PUBLIC_CHANNEL_MISSING	You can only export group call invite links for public chats or channels
-RIGHT_FORBIDDEN	You don't have enough rights for this action, or you tried to set one or more admin rights that can't be applied to this kind of chat (channel or supergroup)
-SENSITIVE_CHANGE_FORBIDDEN	Your sensitive content settings can't be changed at this time
-TAKEOUT_REQUIRED	The method must be invoked inside a takeout session
-USER_BOT_INVALID	This method can only be called by a bot
-USER_CHANNELS_TOO_MUCH	One of the users you tried to add is already in too many channels/supergroups
-USER_DELETED	You can't send this secret message because the other participant deleted their account
-USER_INVALID	The provided user is invalid
-USER_IS_BLOCKED	The user is blocked
-USER_NOT_MUTUAL_CONTACT	The provided user is not a mutual contact
-USER_PRIVACY_RESTRICTED	The user's privacy settings is preventing you to perform this action
-USER_RESTRICTED	You are limited/restricted. You can't perform this action
-CHAT_SEND_GAME_FORBIDDEN	You can't send a game to this chat
-CHAT_SEND_VOICES_FORBIDDEN	You can't send voice recordings in this chat
-LIVE_DISABLED	Story is disabled server-side
+2FA_CONFIRM_WAIT_X	Since this account is active and protected by a 2FA password, we will delete it in 1 week for security purposes. You can cancel this process at any time, you'll be able to reset your account in {value} seconds.
+ABOUT_TOO_LONG	About string too long.
+ACCESS_TOKEN_EXPIRED	Access token expired.
+ACCESS_TOKEN_INVALID	Access token invalid.
+ADDRESS_INVALID	The specified geopoint address is invalid.
+ADMINS_TOO_MUCH	There are too many admins.
+ADMIN_ID_INVALID	The specified admin ID is invalid.
+ADMIN_RANK_EMOJI_NOT_ALLOWED	An admin rank cannot contain emojis.
+ADMIN_RANK_INVALID	The specified admin rank is invalid.
+ADMIN_RIGHTS_EMPTY	The chatAdminRights constructor passed in keyboardButtonRequestPeer.peer_type.user_admin_rights has no rights set (i.e. flags is 0).
+ALBUM_PHOTOS_TOO_MANY	You have uploaded too many profile photos, delete some before retrying.
+ALLOW_PAYMENT_REQUIRED_X	This peer charges {value} [Telegram Stars](https://core.telegram.org/api/stars) per message, but the `allow_paid_stars` was not set or its value is smaller than {value}.
+ANONYMOUS_REACTIONS_DISABLED	Sorry, anonymous administrators cannot leave reactions or participate in polls.
+API_ID_INVALID	API ID invalid.
+API_ID_PUBLISHED_FLOOD	This API id was published somewhere, you can't use it now.
+ARTICLE_TITLE_EMPTY	The title of the article is empty.
+AUDIO_CONTENT_URL_EMPTY	The remote URL specified in the content field is empty.
+AUDIO_TITLE_EMPTY	An empty audio title was provided.
+AUTH_BYTES_INVALID	The provided authorization is invalid.
+AUTH_TOKEN_ALREADY_ACCEPTED	The specified auth token was already accepted.
+AUTH_TOKEN_EXCEPTION	An error occurred while importing the auth token.
+AUTH_TOKEN_EXPIRED	The authorization token has expired.
+AUTH_TOKEN_INVALID	The specified auth token is invalid.
+AUTH_TOKEN_INVALIDX	The specified auth token is invalid.
+AUTOARCHIVE_NOT_AVAILABLE	The autoarchive setting is not available at this time: please check the value of the [autoarchive_setting_available field in client config »](https://core.telegram.org/api/config#client-configuration) before calling this method.
+BANK_CARD_NUMBER_INVALID	The specified card number is invalid.
+BANNED_RIGHTS_INVALID	You provided some invalid flags in the banned rights.
+BOOSTS_EMPTY	No boost slots were specified.
+BOOSTS_REQUIRED	The specified channel must first be [boosted by its users](https://core.telegram.org/api/boost) in order to perform this action.
+BOOST_NOT_MODIFIED	You're already [boosting](https://core.telegram.org/api/boost) the specified channel.
+BOOST_PEER_INVALID	The specified `boost_peer` is invalid.
+BOTS_TOO_MUCH	There are too many bots in this chat/channel.
+BOT_ACCESS_FORBIDDEN	The specified method *can* be used over a [business connection](https://core.telegram.org/api/bots/connected-business-bots) for some operations, but the specified query attempted an operation that is not allowed over a business connection.
+BOT_APP_INVALID	The specified bot app is invalid.
+BOT_APP_SHORTNAME_INVALID	The specified bot app short name is invalid.
+BOT_CHANNELS_NA	Bots can't edit admin privileges.
+BOT_COMMAND_DESCRIPTION_INVALID	The specified command description is invalid.
+BOT_COMMAND_INVALID	The specified command is invalid.
+BOT_DOMAIN_INVALID	Bot domain invalid.
+BOT_GROUPS_BLOCKED	This bot can't be added to groups.
+BOT_INLINE_DISABLED	This bot can't be used in inline mode.
+BOT_INVALID	This is not a valid bot.
+BOT_MISSING	Only bots can call this method, please use [@stickers](https://t.me/stickers) if you're a user.
+BOT_ONESIDE_NOT_AVAIL	Bots can't pin messages in PM just for themselves.
+BOT_PAYMENTS_DISABLED	Please enable bot payments in botfather before calling this method.
+BOT_RESPONSE_TIMEOUT	A timeout occurred while fetching data from the bot.
+BOT_SCORE_NOT_MODIFIED	The score wasn't modified.
+BOT_VERIFIER_FORBIDDEN	This bot cannot assign [verification icons](https://core.telegram.org/api/bots/verification).
+BOT_WEBVIEW_DISABLED	A webview cannot be opened in the specified conditions: emitted for example if `from_bot_menu` or `url` are set and `peer` is not the chat with the bot.
+BROADCAST_FORBIDDEN	Channel poll voters and reactions cannot be fetched to prevent deanonymization.
+BROADCAST_ID_INVALID	Broadcast ID invalid.
+BROADCAST_PUBLIC_VOTERS_FORBIDDEN	You can't forward polls with public voters.
+BROADCAST_REQUIRED	This method can only be called on a channel, please use stats.getMegagroupStats for supergroups.
+BUTTON_DATA_INVALID	The data of one or more of the buttons you provided is invalid.
+BUTTON_TEXT_INVALID	The specified button text is invalid.
+BUTTON_TYPE_INVALID	The type of one or more of the buttons you provided is invalid.
+BUTTON_URL_INVALID	Button URL invalid.
+BUTTON_USER_PRIVACY_RESTRICTED	The privacy setting of the user specified in a [inputKeyboardButtonUserProfile](/constructor/inputKeyboardButtonUserProfile) button do not allow creating such a button.
+CALL_ALREADY_ACCEPTED	The call was already accepted.
+CALL_ALREADY_DECLINED	The call was already declined.
+CALL_OCCUPY_FAILED	The call failed because the user is already making another call.
+CALL_PEER_INVALID	The provided call peer object is invalid.
+CALL_PROTOCOL_FLAGS_INVALID	Call protocol flags invalid.
+CDN_METHOD_INVALID	You can't call this method in a CDN DC.
+CHANNELS_ADMIN_LOCATED_TOO_MUCH	The user has reached the limit of public geogroups.
+CHANNELS_ADMIN_PUBLIC_TOO_MUCH	You're admin of too many public channels, make some channels private to change the username of this channel.
+CHANNELS_TOO_MUCH	You have joined too many channels/supergroups.
+CHANNEL_FORUM_MISSING	This supergroup is not a forum.
+CHANNEL_ID_INVALID	The specified supergroup ID is invalid.
+CHANNEL_INVALID	The provided channel is invalid.
+CHANNEL_PARICIPANT_MISSING	The current user is not in the channel.
+CHANNEL_PRIVATE	You haven't joined this channel/supergroup.
+CHANNEL_PUBLIC_GROUP_NA	channel/supergroup not available.
+CHANNEL_TOO_BIG	This channel has too many participants (>1000) to be deleted.
+CHANNEL_TOO_LARGE	Channel is too large to be deleted; this error is issued when trying to delete channels with more than 1000 members (subject to change).
+CHATLIST_EXCLUDE_INVALID	The specified `exclude_peers` are invalid.
+CHAT_ABOUT_NOT_MODIFIED	About text has not changed.
+CHAT_ABOUT_TOO_LONG	Chat about too long.
+CHAT_ACTION_FORBIDDEN	You cannot execute this action.
+CHAT_ADMIN_INVITE_REQUIRED	You do not have the rights to do this.
+CHAT_ADMIN_REQUIRED	You must be an admin in this chat to do this.
+CHAT_DISCUSSION_UNALLOWED	You can't enable forum topics in a discussion group linked to a channel.
+CHAT_FORBIDDEN	This chat is not available to the current user.
+CHAT_FORWARDS_RESTRICTED	You can't forward messages from a protected chat.
+CHAT_GUEST_SEND_FORBIDDEN	You join the discussion group before commenting, see [here »](https://core.telegram.org/api/discussion#requiring-users-to-join-the-group) for more info.
+CHAT_ID_EMPTY	The provided chat ID is empty.
+CHAT_ID_INVALID	The provided chat id is invalid.
+CHAT_INVALID	Invalid chat.
+CHAT_INVITE_PERMANENT	You can't set an expiration date on permanent invite links.
+CHAT_LINK_EXISTS	The chat is public, you can't hide the history to new users.
+CHAT_NOT_MODIFIED	No changes were made to chat information because the new information you passed is identical to the current information.
+CHAT_PUBLIC_REQUIRED	You can only enable join requests in public groups.
+CHAT_RESTRICTED	You can't send messages in this chat, you were restricted.
+CHAT_REVOKE_DATE_UNSUPPORTED	`min_date` and `max_date` are not available for using with non-user peers.
+CHAT_SEND_AUDIOS_FORBIDDEN	You can't send audio messages in this chat.
+CHAT_SEND_DOCS_FORBIDDEN	You can't send documents in this chat.
+CHAT_SEND_GAME_FORBIDDEN	You can't send a game to this chat.
+CHAT_SEND_GIFS_FORBIDDEN	You can't send gifs in this chat.
+CHAT_SEND_INLINE_FORBIDDEN	You can't send inline messages in this group.
+CHAT_SEND_MEDIA_FORBIDDEN	You can't send media in this chat.
+CHAT_SEND_PHOTOS_FORBIDDEN	You can't send photos in this chat.
+CHAT_SEND_PLAIN_FORBIDDEN	You can't send non-media (text) messages in this chat.
+CHAT_SEND_POLL_FORBIDDEN	You can't send polls in this chat.
+CHAT_SEND_ROUNDVIDEOS_FORBIDDEN	You can't send round videos to this chat.
+CHAT_SEND_STICKERS_FORBIDDEN	You can't send stickers in this chat.
+CHAT_SEND_VIDEOS_FORBIDDEN	You can't send videos in this chat.
+CHAT_SEND_VOICES_FORBIDDEN	You can't send voice recordings in this chat.
+CHAT_SEND_WEBPAGE_FORBIDDEN	You can't send webpage previews to this chat.
+CHAT_TITLE_EMPTY	No chat title provided.
+CHAT_TOO_BIG	This method is not available for groups with more than `chat_read_mark_size_threshold` members, [see client configuration »](https://core.telegram.org/api/config#client-configuration).
+CHAT_TYPE_INVALID	The specified user type is invalid.
+CHAT_WRITE_FORBIDDEN	You can't write in this chat.
+CODE_EMPTY	The provided code is empty.
+CODE_HASH_INVALID	Code hash invalid.
+CODE_INVALID	Code invalid.
+COLOR_INVALID	The specified color palette ID was invalid.
+CONNECTION_API_ID_INVALID	The provided API id is invalid.
+CONNECTION_APP_VERSION_EMPTY	App version is empty.
+CONNECTION_LAYER_INVALID	Layer invalid.
+CONTACT_ADD_MISSING	Contact to add is missing.
+CONTACT_ID_INVALID	The provided contact ID is invalid.
+CONTACT_MISSING	The specified user is not a contact.
+CONTACT_NAME_EMPTY	Contact name empty.
+CONTACT_REQ_MISSING	Missing contact request.
+CREATE_CALL_FAILED	An error occurred while creating the call.
+CURRENCY_TOTAL_AMOUNT_INVALID	The total amount of all prices is invalid.
+CUSTOM_REACTIONS_TOO_MANY	Too many custom reactions were specified.
+DATA_INVALID	Encrypted data invalid.
+DATA_JSON_INVALID	The provided JSON data is invalid.
+DATA_TOO_LONG	Data too long.
+DATE_EMPTY	Date empty.
+DC_ID_INVALID	The provided DC ID is invalid.
+DH_G_A_INVALID	g_a invalid.
+DOCUMENT_INVALID	The specified document is invalid.
+EDIT_BOT_INVITE_FORBIDDEN	Normal users can't edit invites that were created by bots.
+EMAIL_HASH_EXPIRED	Email hash expired.
+EMAIL_INVALID	The specified email is invalid.
+EMAIL_NOT_SETUP	In order to change the login email with emailVerifyPurposeLoginChange, an existing login email must already be set using emailVerifyPurposeLoginSetup.
+EMAIL_UNCONFIRMED	Email unconfirmed.
+EMAIL_UNCONFIRMED_X	The provided email isn't confirmed, {value} is the length of the verification code that was just sent to the email: use [account.verifyEmail](https://core.telegram.org/method/account.verifyEmail) to enter the received verification code and enable the recovery email.
+EMAIL_VERIFY_EXPIRED	The verification email has expired.
+EMOJI_INVALID	The specified theme emoji is valid.
+EMOJI_MARKUP_INVALID	The specified `video_emoji_markup` was invalid.
+EMOJI_NOT_MODIFIED	The theme wasn't changed.
+EMOTICON_EMPTY	The emoji is empty.
+EMOTICON_INVALID	The specified emoji is invalid.
+EMOTICON_STICKERPACK_MISSING	inputStickerSetDice.emoji cannot be empty.
+ENCRYPTED_MESSAGE_INVALID	Encrypted message invalid.
+ENCRYPTION_ALREADY_ACCEPTED	Secret chat already accepted.
+ENCRYPTION_ALREADY_DECLINED	The secret chat was already declined.
+ENCRYPTION_DECLINED	The secret chat was declined.
+ENCRYPTION_ID_INVALID	The provided secret chat ID is invalid.
+ENTITIES_TOO_LONG	You provided too many styled message entities.
+ENTITY_BOUNDS_INVALID	A specified [entity offset or length](/api/entities#entity-length) is invalid, see [here »](/api/entities#entity-length) for info on how to properly compute the entity offset/length.
+ENTITY_MENTION_USER_INVALID	You mentioned an invalid user.
+ERROR_TEXT_EMPTY	The provided error message is empty.
+EXPIRE_DATE_INVALID	The specified expiration date is invalid.
+EXPORT_CARD_INVALID	Provided card is invalid.
+EXTERNAL_URL_INVALID	External URL invalid.
+FILE_CONTENT_TYPE_INVALID	File content-type is invalid.
+FILE_EMTPY	An empty file was provided.
+FILE_ID_INVALID	The provided file id is invalid.
+FILE_PARTS_INVALID	The number of file parts is invalid.
+FILE_PART_EMPTY	The provided file part is empty.
+FILE_PART_INVALID	The file part number is invalid.
+FILE_PART_LENGTH_INVALID	The length of a file part is invalid.
+FILE_PART_SIZE_CHANGED	Provided file part size has changed.
+FILE_PART_SIZE_INVALID	The provided file part size is invalid.
+FILE_PART_TOO_BIG	The uploaded file part is too big.
+FILE_REFERENCE_EMPTY	An empty [file reference](https://core.telegram.org/api/file_reference) was specified.
+FILE_REFERENCE_EXPIRED	File reference expired, it must be refetched as described in [the documentation](https://core.telegram.org/api/file_reference).
+FILE_REFERENCE_INVALID	The specified [file reference](https://core.telegram.org/api/file_reference) is invalid.
+FILE_TITLE_EMPTY	An empty file title was specified.
+FILE_TOKEN_INVALID	The specified file token is invalid.
+FILTER_ID_INVALID	The specified filter ID is invalid.
+FILTER_INCLUDE_EMPTY	The include_peers vector of the filter is empty.
+FILTER_NOT_SUPPORTED	The specified filter cannot be used in this context.
+FILTER_TITLE_EMPTY	The title field of the filter is empty.
+FIRSTNAME_INVALID	The first name is invalid.
+FOLDER_ID_EMPTY	An empty folder ID was specified.
+FOLDER_ID_INVALID	Invalid folder ID.
+FORUM_ENABLED	You can't execute the specified action because the group is a [forum](https://core.telegram.org/api/forum), disable forum functionality to continue.
+FRESH_CHANGE_ADMINS_FORBIDDEN	You were just elected admin, you can't add or modify other admins yet.
+FROM_MESSAGE_BOT_DISABLED	Bots can't use fromMessage min constructors.
+FROM_PEER_INVALID	The specified from_id is invalid.
+GAME_BOT_INVALID	Bots can't send another bot's game.
+GENERAL_MODIFY_ICON_FORBIDDEN	You can't modify the icon of the "General" topic.
+GEO_POINT_INVALID	Invalid geoposition provided.
+GIFT_SLUG_EXPIRED	The specified gift slug has expired.
+GIFT_SLUG_INVALID	The specified slug is invalid.
+GIF_CONTENT_TYPE_INVALID	GIF content-type invalid.
+GIF_ID_INVALID	The provided GIF ID is invalid.
+GRAPH_EXPIRED_RELOAD	This graph has expired, please obtain a new graph token.
+GRAPH_INVALID_RELOAD	Invalid graph token provided, please reload the stats and provide the updated token.
+GRAPH_OUTDATED_RELOAD	The graph is outdated, please get a new async token using stats.getBroadcastStats.
+GROUPCALL_ALREADY_DISCARDED	The group call was already discarded.
+GROUPCALL_ALREADY_STARTED	The groupcall has already started, you can join directly using [phone.joinGroupCall](https://core.telegram.org/method/phone.joinGroupCall).
+GROUPCALL_FORBIDDEN	The group call has already ended.
+GROUPCALL_INVALID	The specified group call is invalid.
+GROUPCALL_JOIN_MISSING	You haven't joined this group call.
+GROUPCALL_NOT_MODIFIED	Group call settings weren't modified.
+GROUPCALL_SSRC_DUPLICATE_MUCH	The app needs to retry joining the group call with a new SSRC value.
+GROUPED_MEDIA_INVALID	Invalid grouped media.
+HASH_INVALID	The provided hash is invalid.
+HIDE_REQUESTER_MISSING	The join request was missing or was already handled.
+IMAGE_PROCESS_FAILED	Failure while processing image.
+IMPORT_FILE_INVALID	The specified chat export file is invalid.
+IMPORT_FORMAT_UNRECOGNIZED	The specified chat export file was exported from an unsupported chat app.
+IMPORT_ID_INVALID	The specified import ID is invalid.
+IMPORT_TOKEN_INVALID	The specified token is invalid.
+INLINE_BOT_REQUIRED	Only the inline bot can edit message.
+INLINE_RESULT_EXPIRED	The inline query expired.
+INPUT_CHATLIST_INVALID	The specified folder is invalid.
+INPUT_FILTER_INVALID	The specified filter is invalid.
+INPUT_TEXT_EMPTY	The specified text is empty.
+INPUT_TEXT_TOO_LONG	The specified text is too long.
+INPUT_USER_DEACTIVATED	The specified user was deleted.
+INVITES_TOO_MUCH	The maximum number of per-folder invites specified by the `chatlist_invites_limit_default`/`chatlist_invites_limit_premium` [client configuration parameters »](/api/config#chatlist-invites-limit-default) was reached.
+INVITE_FORBIDDEN_WITH_JOINAS	If the user has anonymously joined a group call as a channel, they can't invite other users to the group call because that would cause deanonymization, because the invite would be sent using the original user ID, not the anonymized channel ID.
+INVITE_HASH_EMPTY	The invite hash is empty.
+INVITE_HASH_EXPIRED	The invite link has expired.
+INVITE_HASH_INVALID	The invite hash is invalid.
+INVITE_REQUEST_SENT	You have successfully requested to join this chat or channel.
+INVITE_REVOKED_MISSING	The specified invite link was already revoked or is invalid.
+INVITE_SLUG_EMPTY	The specified invite slug is empty.
+INVITE_SLUG_EXPIRED	The specified chat folder link has expired.
+INVOICE_PAYLOAD_INVALID	The specified invoice payload is invalid.
+JOIN_AS_PEER_INVALID	The specified peer cannot be used to join a group call.
+LANG_CODE_INVALID	The specified language code is invalid.
+LANG_CODE_NOT_SUPPORTED	The specified language code is not supported.
+LANG_PACK_INVALID	The provided language pack is invalid.
+LASTNAME_INVALID	The last name is invalid.
+LIMIT_INVALID	The provided limit is invalid.
+LINK_NOT_MODIFIED	Discussion link not modified.
+LOCATION_INVALID	The provided location is invalid.
+MAX_DATE_INVALID	The specified maximum date is invalid.
+MAX_ID_INVALID	The provided max ID is invalid.
+MAX_QTS_INVALID	The specified max_qts is invalid.
+MD5_CHECKSUM_INVALID	The MD5 checksums do not match.
+MEDIA_CAPTION_TOO_LONG	The caption is too long.
+MEDIA_EMPTY	The provided media object is invalid.
+MEDIA_FILE_INVALID	The specified media file is invalid.
+MEDIA_GROUPED_INVALID	You tried to send media of different types in an album.
+MEDIA_INVALID	Media invalid.
+MEDIA_NEW_INVALID	The new media is invalid.
+MEDIA_PREV_INVALID	Previous media invalid.
+MEDIA_TTL_INVALID	The specified media TTL is invalid.
+MEDIA_TYPE_INVALID	The specified media type cannot be used in stories.
+MEDIA_VIDEO_STORY_MISSING	
+MEGAGROUP_GEO_REQUIRED	This method can only be invoked on a geogroup.
+MEGAGROUP_ID_INVALID	Invalid supergroup ID.
+MEGAGROUP_PREHISTORY_HIDDEN	Group with hidden history for new members can't be set as discussion groups.
+MEGAGROUP_REQUIRED	You can only use this method on a supergroup.
+MESSAGE_AUTHOR_REQUIRED	Message author required.
+MESSAGE_DELETE_FORBIDDEN	You can't delete one of the messages you tried to delete, most likely because it is a service message.
+MESSAGE_EDIT_TIME_EXPIRED	You can't edit this message anymore, too much time has passed since its creation.
+MESSAGE_EMPTY	The provided message is empty.
+MESSAGE_IDS_EMPTY	No message ids were provided.
+MESSAGE_ID_INVALID	The provided message id is invalid.
+MESSAGE_NOT_MODIFIED	The provided message data is identical to the previous message data, the message wasn't modified.
+MESSAGE_POLL_CLOSED	Poll closed.
+MESSAGE_TOO_LONG	The provided message is too long.
+METHOD_INVALID	The specified method is invalid.
+MIN_DATE_INVALID	The specified minimum date is invalid.
+MSG_ID_INVALID	Invalid message ID provided.
+MSG_TOO_OLD	[`chat_read_mark_expire_period` seconds](https://core.telegram.org/api/config#chat-read-mark-expire-period) have passed since the message was sent, read receipts were deleted.
+MSG_WAIT_FAILED	A waiting call returned an error.
+MULTI_MEDIA_TOO_LONG	Too many media files for album.
+NEW_SALT_INVALID	The new salt is invalid.
+NEW_SETTINGS_EMPTY	No password is set on the current account, and no new password was specified in `new_settings`.
+NEW_SETTINGS_INVALID	The new password settings are invalid.
+NEXT_OFFSET_INVALID	The specified offset is longer than 64 bytes.
+NOT_ELIGIBLE	The current user is not eligible to join the Peer-to-Peer Login Program.
+OFFSET_INVALID	The provided offset is invalid.
+OFFSET_PEER_ID_INVALID	The provided offset peer is invalid.
+OPTIONS_TOO_MUCH	Too many options provided.
+OPTION_INVALID	Invalid option selected.
+ORDER_INVALID	The specified username order is invalid.
+PACK_SHORT_NAME_INVALID	Short pack name invalid.
+PACK_SHORT_NAME_OCCUPIED	A stickerpack with this name already exists.
+PACK_TITLE_INVALID	The stickerpack title is invalid.
+PARTICIPANTS_TOO_FEW	Not enough participants.
+PARTICIPANT_ID_INVALID	The specified participant ID is invalid.
+PARTICIPANT_JOIN_MISSING	Trying to enable a presentation, when the user hasn't joined the Video Chat with [phone.joinGroupCall](https://core.telegram.org/method/phone.joinGroupCall).
+PARTICIPANT_VERSION_OUTDATED	The other participant does not use an up to date telegram client with support for calls.
+PASSWORD_EMPTY	The provided password is empty.
+PASSWORD_HASH_INVALID	The provided password hash is invalid.
+PASSWORD_MISSING	You must enable 2FA in order to transfer ownership of a channel.
+PASSWORD_RECOVERY_EXPIRED	The recovery code has expired.
+PASSWORD_RECOVERY_NA	No email was set, can't recover password via email.
+PASSWORD_REQUIRED	A [2FA password](https://core.telegram.org/api/srp) must be configured to use Telegram Passport.
+PASSWORD_TOO_FRESH_X	The password was modified less than 24 hours ago, try again in {value} seconds.
+PAYMENT_PROVIDER_INVALID	The specified payment provider is invalid.
+PEERS_LIST_EMPTY	The specified list of peers is empty.
+PEER_HISTORY_EMPTY	You can't pin an empty chat with a user.
+PEER_ID_INVALID	The provided peer id is invalid.
+PEER_ID_NOT_SUPPORTED	The provided peer ID is not supported.
+PERSISTENT_TIMESTAMP_EMPTY	Persistent timestamp empty.
+PERSISTENT_TIMESTAMP_INVALID	Persistent timestamp invalid.
+PHONE_CODE_EMPTY	phone_code is missing.
+PHONE_CODE_EXPIRED	The phone code you provided has expired.
+PHONE_CODE_HASH_EMPTY	phone_code_hash is missing.
+PHONE_CODE_INVALID	The provided phone code is invalid.
+PHONE_HASH_EXPIRED	An invalid or expired `phone_code_hash` was provided.
+PHONE_NOT_OCCUPIED	No user is associated to the specified phone number.
+PHONE_NUMBER_APP_SIGNUP_FORBIDDEN	You can't sign up using this app.
+PHONE_NUMBER_BANNED	The provided phone number is banned from telegram.
+PHONE_NUMBER_FLOOD	You asked for the code too many times.
+PHONE_NUMBER_INVALID	The phone number is invalid.
+PHONE_NUMBER_OCCUPIED	The phone number is already in use.
+PHONE_NUMBER_UNOCCUPIED	The phone number is not yet being used.
+PHONE_PASSWORD_PROTECTED	This phone is password protected.
+PHOTO_CONTENT_TYPE_INVALID	Photo mime-type invalid.
+PHOTO_CONTENT_URL_EMPTY	Photo URL invalid.
+PHOTO_CROP_FILE_MISSING	Photo crop file missing.
+PHOTO_CROP_SIZE_SMALL	Photo is too small.
+PHOTO_EXT_INVALID	The extension of the photo is invalid.
+PHOTO_FILE_MISSING	Profile photo file missing.
+PHOTO_ID_INVALID	Photo ID invalid.
+PHOTO_INVALID	Photo invalid.
+PHOTO_INVALID_DIMENSIONS	The photo dimensions are invalid.
+PHOTO_SAVE_FILE_INVALID	Internal issues, try again later.
+PHOTO_THUMB_URL_EMPTY	Photo thumbnail URL is empty.
+PINNED_DIALOGS_TOO_MUCH	Too many pinned dialogs.
+PIN_RESTRICTED	You can't pin messages.
+POLL_ANSWERS_INVALID	Invalid poll answers were provided.
+POLL_ANSWER_INVALID	One of the poll answers is not acceptable.
+POLL_OPTION_DUPLICATE	Duplicate poll options provided.
+POLL_OPTION_INVALID	Invalid poll option provided.
+POLL_QUESTION_INVALID	One of the poll questions is not acceptable.
+POLL_VOTE_REQUIRED	Cast a vote in the poll before calling this method.
+PREMIUM_ACCOUNT_REQUIRED	A premium account is required to execute this action.
+PREMIUM_SUB_ACTIVE_UNTIL_X	You already have a premium subscription active until unixtime {value} .
+PRIVACY_KEY_INVALID	The privacy key is invalid.
+PRIVACY_PREMIUM_REQUIRED	You need a [Telegram Premium subscription](https://core.telegram.org/api/premium) to send a message to this user.
+PRIVACY_TOO_LONG	Too many privacy rules were specified, the current limit is 1000.
+PRIVACY_VALUE_INVALID	The specified privacy rule combination is invalid.
+PUBLIC_CHANNEL_MISSING	You can only export group call invite links for public chats or channels.
+PUBLIC_KEY_REQUIRED	A public key is required.
+QUERY_ID_EMPTY	The query ID is empty.
+QUERY_ID_INVALID	The query ID is invalid.
+QUERY_TOO_SHORT	The query string is too short.
+QUIZ_ANSWER_MISSING	You can forward a quiz while hiding the original author only after choosing an option in the quiz.
+QUIZ_CORRECT_ANSWERS_EMPTY	No correct quiz answer was specified.
+QUIZ_CORRECT_ANSWERS_TOO_MUCH	You specified too many correct answers in a quiz, quizzes can only have one right answer!
+QUIZ_CORRECT_ANSWER_INVALID	An invalid value was provided to the correct_answers field.
+QUIZ_MULTIPLE_INVALID	Quizzes can't have the multiple_choice flag set!
+RANDOM_ID_EMPTY	Random ID empty.
+RANDOM_ID_INVALID	A provided random ID is invalid.
+RANDOM_LENGTH_INVALID	Random length invalid.
+RANGES_INVALID	Invalid range provided.
+REACTIONS_TOO_MANY	The message already has exactly `reactions_uniq_max` reaction emojis, you can't react with a new emoji, see [the docs for more info »](/api/config#client-configuration).
+REACTION_EMPTY	Empty reaction provided.
+REACTION_INVALID	The specified reaction is invalid.
+REPLY_MARKUP_BUY_EMPTY	Reply markup for buy button empty.
+REPLY_MARKUP_INVALID	The provided reply markup is invalid.
+REPLY_MARKUP_TOO_LONG	The specified reply_markup is too long.
+REPLY_MESSAGE_ID_INVALID	The specified reply-to message ID is invalid.
+REPLY_TO_INVALID	The specified `reply_to` field is invalid.
+REPLY_TO_USER_INVALID	The replied-to user is invalid.
+RESET_REQUEST_MISSING	No password reset is in progress.
+RESULTS_TOO_MUCH	Too many results were provided.
+RESULT_ID_DUPLICATE	You provided a duplicate result ID.
+RESULT_ID_EMPTY	Result ID empty.
+RESULT_ID_INVALID	One of the specified result IDs is invalid.
+RESULT_TYPE_INVALID	Result type invalid.
+REVOTE_NOT_ALLOWED	You cannot change your vote.
+RIGHTS_NOT_MODIFIED	The new admin rights are equal to the old rights, no change was made.
+RIGHT_FORBIDDEN	Your admin rights do not allow you to do this.
+RSA_DECRYPT_FAILED	Internal RSA decryption failed.
+SCHEDULE_BOT_NOT_ALLOWED	Bots cannot schedule messages.
+SCHEDULE_DATE_INVALID	Invalid schedule date provided.
+SCHEDULE_DATE_TOO_LATE	You can't schedule a message this far in the future.
+SCHEDULE_STATUS_PRIVATE	Can't schedule until user is online, if the user's last seen timestamp is hidden by their privacy settings.
+SCHEDULE_TOO_MUCH	There are too many scheduled messages.
+SCORE_INVALID	The specified game score is invalid.
+SEARCH_QUERY_EMPTY	The search query is empty.
+SEARCH_WITH_LINK_NOT_SUPPORTED	You cannot provide a search query and an invite link at the same time.
+SECONDS_INVALID	Invalid duration provided.
+SEND_AS_PEER_INVALID	You can't send messages as the specified peer.
+SEND_MESSAGE_MEDIA_INVALID	Invalid media provided.
+SEND_MESSAGE_TYPE_INVALID	The message type is invalid.
+SENSITIVE_CHANGE_FORBIDDEN	You can't change your sensitive content settings.
+SESSION_TOO_FRESH_X	This session was created less than 24 hours ago, try again in {value} seconds.
+SETTINGS_INVALID	Invalid settings were provided.
+SHA256_HASH_INVALID	The provided SHA256 hash is invalid.
+SHORT_NAME_INVALID	The specified short name is invalid.
+SHORT_NAME_OCCUPIED	The specified short name is already in use.
+SLOTS_EMPTY	The specified slot list is empty.
+SLOWMODE_MULTI_MSGS_DISABLED	Slowmode is enabled, you cannot forward multiple messages to this group.
+SLOWMODE_WAIT_X	Slowmode is enabled in this chat: wait {value} seconds before sending another message to this chat.
+SLUG_INVALID	The specified invoice slug is invalid.
+SMS_CODE_CREATE_FAILED	An error occurred while creating the SMS code.
+SRP_ID_INVALID	Invalid SRP ID provided.
+SRP_PASSWORD_CHANGED	Password has changed.
+START_PARAM_EMPTY	The start parameter is empty.
+START_PARAM_INVALID	Start parameter invalid.
+START_PARAM_TOO_LONG	Start parameter is too long.
+STICKERPACK_STICKERS_TOO_MUCH	There are too many stickers in this stickerpack, you can't add any more.
+STICKERSET_INVALID	The provided sticker set is invalid.
+STICKERS_EMPTY	No sticker provided.
+STICKERS_TOO_MUCH	There are too many stickers in this stickerpack, you can't add any more.
+STICKER_DOCUMENT_INVALID	The specified sticker document is invalid.
+STICKER_EMOJI_INVALID	Sticker emoji invalid.
+STICKER_FILE_INVALID	Sticker file invalid.
+STICKER_GIF_DIMENSIONS	The specified video sticker has invalid dimensions.
+STICKER_ID_INVALID	The provided sticker ID is invalid.
+STICKER_INVALID	The provided sticker is invalid.
+STICKER_MIME_INVALID	The specified sticker MIME type is invalid.
+STICKER_PNG_DIMENSIONS	Sticker png dimensions invalid.
+STICKER_PNG_NOPNG	One of the specified stickers is not a valid PNG file.
+STICKER_TGS_NODOC	You must send the animated sticker as a document.
+STICKER_TGS_NOTGS	Invalid TGS sticker provided.
+STICKER_THUMB_PNG_NOPNG	Incorrect stickerset thumb file provided, PNG / WEBP expected.
+STICKER_THUMB_TGS_NOTGS	Incorrect stickerset TGS thumb file provided.
+STICKER_VIDEO_BIG	The specified video sticker is too big.
+STICKER_VIDEO_NODOC	You must send the video sticker as a document.
+STICKER_VIDEO_NOWEBM	The specified video sticker is not in webm format.
+STORIES_NEVER_CREATED	This peer hasn't ever posted any stories.
+STORIES_TOO_MUCH	You have hit the maximum active stories limit as specified by the [`story_expiring_limit_*` client configuration parameters](https://core.telegram.org/api/config#story-expiring-limit-default): you should buy a [Premium](/api/premium) subscription, delete an active story, or wait for the oldest story to expire.
+STORY_ID_EMPTY	You specified no story IDs.
+STORY_ID_INVALID	The specified story ID is invalid.
+STORY_NOT_MODIFIED	The new story information you passed is equal to the previous story information, thus it wasn't modified.
+STORY_PERIOD_INVALID	The specified story period is invalid for this account.
+STORY_SEND_FLOOD_MONTHLY_X	You've hit the monthly story limit as specified by the [`stories_sent_monthly_limit_*` client configuration parameters](https://core.telegram.org/api/config#stories-sent-monthly-limit-default): wait for the specified number of seconds before posting a new story.
+STORY_SEND_FLOOD_WEEKLY_X	You've hit the weekly story limit as specified by the [`stories_sent_weekly_limit_*` client configuration parameters](https://core.telegram.org/api/config#stories-sent-weekly-limit-default): wait for the specified number of seconds before posting a new story.
+SWITCH_PM_TEXT_EMPTY	The switch_pm.text field was empty.
+TAKEOUT_INIT_DELAY_X	Sorry, for security reasons, you will be able to begin downloading your data in {value} seconds. We have notified all your devices about the export request to make sure it's authorized and to give you time to react if it's not.
+TAKEOUT_INVALID	The specified takeout ID is invalid.
+TAKEOUT_REQUIRED	A [takeout](https://core.telegram.org/api/takeout) session needs to be initialized first, [see here » for more info](https://core.telegram.org/api/takeout).
+TASK_ALREADY_EXISTS	An email reset was already requested.
+TEMP_AUTH_KEY_ALREADY_BOUND	The passed temporary key is already bound to another **perm_auth_key_id**.
+TEMP_AUTH_KEY_EMPTY	No temporary auth key provided.
+THEME_FILE_INVALID	Invalid theme file provided.
+THEME_FORMAT_INVALID	Invalid theme format provided.
+THEME_INVALID	Invalid theme provided.
+THEME_MIME_INVALID	The theme's MIME type is invalid.
+THEME_TITLE_INVALID	The specified theme title is invalid.
+TITLE_INVALID	The specified stickerpack title is invalid.
+TMP_PASSWORD_DISABLED	The temporary password is disabled.
+TOKEN_EMPTY	The specified token is empty.
+TOKEN_INVALID	The provided token is invalid.
+TOKEN_TYPE_INVALID	The specified token type is invalid.
+TOPICS_EMPTY	You specified no topic IDs.
+TOPIC_CLOSED	This topic was closed, you can't send messages to it anymore.
+TOPIC_CLOSE_SEPARATELY	The `close` flag cannot be provided together with any of the other flags.
+TOPIC_DELETED	The specified topic was deleted.
+TOPIC_HIDE_SEPARATELY	The `hide` flag cannot be provided together with any of the other flags.
+TOPIC_ID_INVALID	The specified topic ID is invalid.
+TOPIC_NOT_MODIFIED	The updated topic info is equal to the current topic info, nothing was changed.
+TOPIC_TITLE_EMPTY	The specified topic title is empty.
+TO_LANG_INVALID	The specified destination language is invalid.
+TRANSCRIPTION_FAILED	Audio transcription failed.
+TTL_DAYS_INVALID	The provided TTL is invalid.
+TTL_MEDIA_INVALID	Invalid media Time To Live was provided.
+TTL_PERIOD_INVALID	The specified TTL period is invalid.
+TYPES_EMPTY	No top peer type was provided.
+UNTIL_DATE_INVALID	Invalid until date provided.
+URL_INVALID	Invalid URL provided.
+USAGE_LIMIT_INVALID	The specified usage limit is invalid.
+USERNAMES_ACTIVE_TOO_MUCH	The maximum number of active usernames was reached.
+USERNAME_INVALID	The provided username is not valid.
+USERNAME_NOT_MODIFIED	The username was not modified.
+USERNAME_NOT_OCCUPIED	The provided username is not occupied.
+USERNAME_OCCUPIED	The provided username is already occupied.
+USERNAME_PURCHASE_AVAILABLE	The specified username can be purchased on https://fragment.com.
+USERPIC_UPLOAD_REQUIRED	You must have a profile picture to publish your geolocation.
+USERS_TOO_FEW	Not enough users (to create a chat, for example).
+USERS_TOO_MUCH	The maximum number of users has been exceeded (to create a chat, for example).
+USER_ADMIN_INVALID	You're not an admin.
+USER_ALREADY_INVITED	You have already invited this user.
+USER_ALREADY_PARTICIPANT	The user is already in the group.
+USER_BANNED_IN_CHANNEL	You're banned from sending messages in supergroups/channels.
+USER_BLOCKED	User blocked.
+USER_BOT	Bots can only be admins in channels.
+USER_BOT_INVALID	User accounts must provide the `bot` method parameter when calling this method. If there is no such method parameter, this method can only be invoked by bot accounts.
+USER_BOT_REQUIRED	This method can only be called by a bot.
+USER_CHANNELS_TOO_MUCH	One of the users you tried to add is already in too many channels/supergroups.
+USER_CREATOR	You can't leave this channel, because you're its creator.
+USER_DELETED	You can't send this secret message because the other participant deleted their account.
+USER_ID_INVALID	The provided user ID is invalid.
+USER_INVALID	Invalid user provided.
+USER_IS_BLOCKED	You were blocked by this user.
+USER_IS_BOT	Bots can't send messages to other bots.
+USER_KICKED	This user was kicked from this supergroup/channel.
+USER_NOT_MUTUAL_CONTACT	The provided user is not a mutual contact.
+USER_NOT_PARTICIPANT	You're not a member of this supergroup/channel.
+USER_PERMISSION_DENIED	The user hasn't granted or has revoked the bot's access to change their emoji status using [bots.toggleUserEmojiStatusPermission](https://core.telegram.org/method/bots.toggleUserEmojiStatusPermission).
+USER_PRIVACY_RESTRICTED	The user's privacy settings do not allow you to do this.
+USER_PUBLIC_MISSING	Cannot generate a link to stories posted by a peer without a username.
+USER_RESTRICTED	You're spamreported, you can't create channels or chats.
+USER_VOLUME_INVALID	The specified user volume is invalid.
+VENUE_ID_INVALID	The specified venue ID is invalid.
+VIDEO_CONTENT_TYPE_INVALID	The video's content type is invalid.
+VIDEO_FILE_INVALID	The specified video file is invalid.
+VIDEO_TITLE_EMPTY	The specified video title is empty.
+VOICE_MESSAGES_FORBIDDEN	This user's privacy settings forbid you from sending voice messages.
+WALLPAPER_FILE_INVALID	The specified wallpaper file is invalid.
+WALLPAPER_INVALID	The specified wallpaper is invalid.
+WALLPAPER_MIME_INVALID	The specified wallpaper MIME type is invalid.
+WALLPAPER_NOT_FOUND	The specified wallpaper could not be found.
+WC_CONVERT_URL_INVALID	WC convert URL invalid.
+WEBDOCUMENT_INVALID	Invalid webdocument URL provided.
+WEBDOCUMENT_MIME_INVALID	Invalid webdocument mime type provided.
+WEBDOCUMENT_SIZE_TOO_BIG	Webdocument is too big!
+WEBDOCUMENT_URL_INVALID	The specified webdocument URL is invalid.
+WEBPAGE_CURL_FAILED	Failure while fetching the webpage with cURL.
+WEBPAGE_MEDIA_EMPTY	Webpage media empty.
+WEBPAGE_NOT_FOUND	A preview for the specified webpage `url` could not be generated.
+WEBPAGE_URL_INVALID	The specified webpage `url` is invalid.
+WEBPUSH_AUTH_INVALID	The specified web push authentication secret is invalid.
+WEBPUSH_KEY_INVALID	The specified web push elliptic curve Diffie-Hellman public key is invalid.
+WEBPUSH_TOKEN_INVALID	The specified web push token is invalid.
+YOUR_PRIVACY_RESTRICTED	You cannot fetch the read date of this message because you have disallowed other users to do so for *your* messages; to fix, allow other users to see *your* exact last online date OR purchase a [Telegram Premium](https://core.telegram.org/api/premium) subscription.
+YOU_BLOCKED_USER	You blocked this user.
\ No newline at end of file
diff --git a/compiler/errors/source/406_NOT_ACCEPTABLE.tsv b/compiler/errors/source/406_NOT_ACCEPTABLE.tsv
index 831bc663..d7f44093 100644
--- a/compiler/errors/source/406_NOT_ACCEPTABLE.tsv
+++ b/compiler/errors/source/406_NOT_ACCEPTABLE.tsv
@@ -1,22 +1,534 @@
 id	message
-AUTH_KEY_DUPLICATED	The same authorization key (session file) was used in more than one place simultaneously. You must delete your session file and log in again with your phone number or bot token
-CHANNEL_PRIVATE	The channel/supergroup is not accessible
-CHANNEL_TOO_LARGE	Сhannel is too large to be deleted. Contact support for removal
-CHAT_FORWARDS_RESTRICTED	You can't forward messages from a protected chat
-FILEREF_UPGRADE_NEEDED	The file reference has expired and you must use a refreshed one by obtaining the original media message
-FRESH_CHANGE_ADMINS_FORBIDDEN	You were just elected admin, you can't add or modify other admins yet
-FRESH_CHANGE_PHONE_FORBIDDEN	You can't change your phone number because your session was logged-in recently
-FRESH_RESET_AUTHORISATION_FORBIDDEN	You can't terminate other authorized sessions because the current was logged-in recently
-GIFTCODE_NOT_ALLOWED	Giftcode not allowed
-INVITE_HASH_EXPIRED	The chat the user tried to join has expired and is not valid anymore
-PHONE_NUMBER_INVALID	The phone number is invalid
-PHONE_PASSWORD_FLOOD	You have tried to log-in too many times
-PREMIUM_CURRENTLY_UNAVAILABLE	Premium currently unavailable
-PREVIOUS_CHAT_IMPORT_ACTIVE_WAIT_XMIN	Similar to a flood wait, must wait {value} minutes
-SEND_CODE_UNAVAILABLE	Returned when all available options for this type of number were already used (e.g. flash-call, then SMS, then this error might be returned to trigger a second resend)
-STICKERSET_INVALID	The sticker set is invalid
-STICKERSET_OWNER_ANONYMOUS	This sticker set can't be used as the group's sticker set because it was created by one of its anonymous admins
-UPDATE_APP_TO_LOGIN	Update app to login
-USERPIC_PRIVACY_REQUIRED	You need to disable privacy settings for your profile picture in order to make your geolocation public
-USERPIC_UPLOAD_REQUIRED	You must have a profile picture to publish your geolocation
-USER_RESTRICTED	You are limited/restricted. You can't perform this action
\ No newline at end of file
+2FA_CONFIRM_WAIT_X	Since this account is active and protected by a 2FA password, we will delete it in 1 week for security purposes. You can cancel this process at any time, you'll be able to reset your account in {value} seconds.
+ABOUT_TOO_LONG	About string too long.
+ACCESS_TOKEN_EXPIRED	Access token expired.
+ACCESS_TOKEN_INVALID	Access token invalid.
+ADDRESS_INVALID	The specified geopoint address is invalid.
+ADMINS_TOO_MUCH	There are too many admins.
+ADMIN_ID_INVALID	The specified admin ID is invalid.
+ADMIN_RANK_EMOJI_NOT_ALLOWED	An admin rank cannot contain emojis.
+ADMIN_RANK_INVALID	The specified admin rank is invalid.
+ADMIN_RIGHTS_EMPTY	The chatAdminRights constructor passed in keyboardButtonRequestPeer.peer_type.user_admin_rights has no rights set (i.e. flags is 0).
+ALBUM_PHOTOS_TOO_MANY	You have uploaded too many profile photos, delete some before retrying.
+ALLOW_PAYMENT_REQUIRED	This peer only accepts [paid messages »](https://core.telegram.org/api/paid-messages): this error is only emitted for older layers without paid messages support, so the client must be updated in order to use paid messages.  .
+ANONYMOUS_REACTIONS_DISABLED	Sorry, anonymous administrators cannot leave reactions or participate in polls.
+API_GIFT_RESTRICTED_UPDATE_APP	Please update the app to access the gift API.
+API_ID_INVALID	API ID invalid.
+API_ID_PUBLISHED_FLOOD	This API id was published somewhere, you can't use it now.
+ARTICLE_TITLE_EMPTY	The title of the article is empty.
+AUDIO_CONTENT_URL_EMPTY	The remote URL specified in the content field is empty.
+AUDIO_TITLE_EMPTY	An empty audio title was provided.
+AUTH_BYTES_INVALID	The provided authorization is invalid.
+AUTH_KEY_DUPLICATED	Concurrent usage of the current session from multiple connections was detected, the current session was invalidated by the server for security reasons!
+AUTH_RESTART	Restart the authorization process.
+AUTH_TOKEN_ALREADY_ACCEPTED	The specified auth token was already accepted.
+AUTH_TOKEN_EXCEPTION	An error occurred while importing the auth token.
+AUTH_TOKEN_EXPIRED	The authorization token has expired.
+AUTH_TOKEN_INVALID	The specified auth token is invalid.
+AUTH_TOKEN_INVALIDX	The specified auth token is invalid.
+AUTOARCHIVE_NOT_AVAILABLE	The autoarchive setting is not available at this time: please check the value of the [autoarchive_setting_available field in client config »](https://core.telegram.org/api/config#client-configuration) before calling this method.
+BANK_CARD_NUMBER_INVALID	The specified card number is invalid.
+BANNED_RIGHTS_INVALID	You provided some invalid flags in the banned rights.
+BOOSTS_EMPTY	No boost slots were specified.
+BOOSTS_REQUIRED	The specified channel must first be [boosted by its users](https://core.telegram.org/api/boost) in order to perform this action.
+BOOST_NOT_MODIFIED	You're already [boosting](https://core.telegram.org/api/boost) the specified channel.
+BOOST_PEER_INVALID	The specified `boost_peer` is invalid.
+BOTS_TOO_MUCH	There are too many bots in this chat/channel.
+BOT_APP_INVALID	The specified bot app is invalid.
+BOT_APP_SHORTNAME_INVALID	The specified bot app short name is invalid.
+BOT_CHANNELS_NA	Bots can't edit admin privileges.
+BOT_COMMAND_DESCRIPTION_INVALID	The specified command description is invalid.
+BOT_COMMAND_INVALID	The specified command is invalid.
+BOT_DOMAIN_INVALID	Bot domain invalid.
+BOT_GROUPS_BLOCKED	This bot can't be added to groups.
+BOT_INLINE_DISABLED	This bot can't be used in inline mode.
+BOT_INVALID	This is not a valid bot.
+BOT_MISSING	Only bots can call this method, please use [@stickers](https://t.me/stickers) if you're a user.
+BOT_ONESIDE_NOT_AVAIL	Bots can't pin messages in PM just for themselves.
+BOT_PAYMENTS_DISABLED	Please enable bot payments in botfather before calling this method.
+BOT_RESPONSE_TIMEOUT	A timeout occurred while fetching data from the bot.
+BOT_SCORE_NOT_MODIFIED	The score wasn't modified.
+BOT_WEBVIEW_DISABLED	A webview cannot be opened in the specified conditions: emitted for example if `from_bot_menu` or `url` are set and `peer` is not the chat with the bot.
+BROADCAST_FORBIDDEN	Channel poll voters and reactions cannot be fetched to prevent deanonymization.
+BROADCAST_ID_INVALID	Broadcast ID invalid.
+BROADCAST_PUBLIC_VOTERS_FORBIDDEN	You can't forward polls with public voters.
+BROADCAST_REQUIRED	This method can only be called on a channel, please use stats.getMegagroupStats for supergroups.
+BUSINESS_ADDRESS_ACTIVE	The user is currently advertising a [Business Location](https://core.telegram.org/api/business#location), the location may only be changed (or removed) using [account.updateBusinessLocation »](https://core.telegram.org/method/account.updateBusinessLocation).  .
+BUTTON_DATA_INVALID	The data of one or more of the buttons you provided is invalid.
+BUTTON_TEXT_INVALID	The specified button text is invalid.
+BUTTON_TYPE_INVALID	The type of one or more of the buttons you provided is invalid.
+BUTTON_URL_INVALID	Button URL invalid.
+BUTTON_USER_PRIVACY_RESTRICTED	The privacy setting of the user specified in a [inputKeyboardButtonUserProfile](/constructor/inputKeyboardButtonUserProfile) button do not allow creating such a button.
+CALL_ALREADY_ACCEPTED	The call was already accepted.
+CALL_ALREADY_DECLINED	The call was already declined.
+CALL_OCCUPY_FAILED	The call failed because the user is already making another call.
+CALL_PEER_INVALID	The provided call peer object is invalid.
+CALL_PROTOCOL_COMPAT_LAYER_INVALID	The other side of the call does not support any of the VoIP protocols supported by the local client, as specified by the `protocol.layer` and `protocol.library_versions` fields.
+CALL_PROTOCOL_FLAGS_INVALID	Call protocol flags invalid.
+CDN_METHOD_INVALID	You can't call this method in a CDN DC.
+CDN_UPLOAD_TIMEOUT	A server-side timeout occurred while reuploading the file to the CDN DC.
+CHANNELS_ADMIN_LOCATED_TOO_MUCH	The user has reached the limit of public geogroups.
+CHANNELS_ADMIN_PUBLIC_TOO_MUCH	You're admin of too many public channels, make some channels private to change the username of this channel.
+CHANNELS_TOO_MUCH	You have joined too many channels/supergroups.
+CHANNEL_FORUM_MISSING	This supergroup is not a forum.
+CHANNEL_ID_INVALID	The specified supergroup ID is invalid.
+CHANNEL_INVALID	The provided channel is invalid.
+CHANNEL_PARICIPANT_MISSING	The current user is not in the channel.
+CHANNEL_PRIVATE	You haven't joined this channel/supergroup.
+CHANNEL_PUBLIC_GROUP_NA	channel/supergroup not available.
+CHANNEL_TOO_BIG	This channel has too many participants (>1000) to be deleted.
+CHANNEL_TOO_LARGE	Channel is too large to be deleted; this error is issued when trying to delete channels with more than 1000 members (subject to change).
+CHATLIST_EXCLUDE_INVALID	The specified `exclude_peers` are invalid.
+CHAT_ABOUT_NOT_MODIFIED	About text has not changed.
+CHAT_ABOUT_TOO_LONG	Chat about too long.
+CHAT_ADMIN_INVITE_REQUIRED	You do not have the rights to do this.
+CHAT_ADMIN_REQUIRED	You must be an admin in this chat to do this.
+CHAT_DISCUSSION_UNALLOWED	You can't enable forum topics in a discussion group linked to a channel.
+CHAT_FORWARDS_RESTRICTED	You can't forward messages from a protected chat.
+CHAT_GUEST_SEND_FORBIDDEN	You join the discussion group before commenting, see [here »](/api/discussion#requiring-users-to-join-the-group) for more info.
+CHAT_ID_EMPTY	The provided chat ID is empty.
+CHAT_ID_GENERATE_FAILED	Failure while generating the chat ID.
+CHAT_ID_INVALID	The provided chat id is invalid.
+CHAT_INVALID	Invalid chat.
+CHAT_INVITE_PERMANENT	You can't set an expiration date on permanent invite links.
+CHAT_LINK_EXISTS	The chat is public, you can't hide the history to new users.
+CHAT_NOT_MODIFIED	No changes were made to chat information because the new information you passed is identical to the current information.
+CHAT_PUBLIC_REQUIRED	You can only enable join requests in public groups.
+CHAT_RESTRICTED	You can't send messages in this chat, you were restricted.
+CHAT_REVOKE_DATE_UNSUPPORTED	`min_date` and `max_date` are not available for using with non-user peers.
+CHAT_SEND_AUDIOS_FORBIDDEN	You can't send audio messages in this chat.
+CHAT_SEND_DOCS_FORBIDDEN	You can't send documents in this chat.
+CHAT_SEND_GAME_FORBIDDEN	You can't send a game to this chat.
+CHAT_SEND_GIFS_FORBIDDEN	You can't send gifs in this chat.
+CHAT_SEND_INLINE_FORBIDDEN	You can't send inline messages in this group.
+CHAT_SEND_MEDIA_FORBIDDEN	You can't send media in this chat.
+CHAT_SEND_PHOTOS_FORBIDDEN	You can't send photos in this chat.
+CHAT_SEND_PLAIN_FORBIDDEN	You can't send non-media (text) messages in this chat.
+CHAT_SEND_POLL_FORBIDDEN	You can't send polls in this chat.
+CHAT_SEND_STICKERS_FORBIDDEN	You can't send stickers in this chat.
+CHAT_SEND_VIDEOS_FORBIDDEN	You can't send videos in this chat.
+CHAT_SEND_VOICES_FORBIDDEN	You can't send voice recordings in this chat.
+CHAT_TITLE_EMPTY	No chat title provided.
+CHAT_TOO_BIG	This method is not available for groups with more than `chat_read_mark_size_threshold` members, [see client configuration »](https://core.telegram.org/api/config#client-configuration).
+CHAT_WRITE_FORBIDDEN	You can't write in this chat.
+CODE_EMPTY	The provided code is empty.
+CODE_HASH_INVALID	Code hash invalid.
+CODE_INVALID	Code invalid.
+COLOR_INVALID	The specified color palette ID was invalid.
+CONNECTION_API_ID_INVALID	The provided API id is invalid.
+CONNECTION_APP_VERSION_EMPTY	App version is empty.
+CONNECTION_LAYER_INVALID	Layer invalid.
+CONTACT_ADD_MISSING	Contact to add is missing.
+CONTACT_ID_INVALID	The provided contact ID is invalid.
+CONTACT_MISSING	The specified user is not a contact.
+CONTACT_NAME_EMPTY	Contact name empty.
+CONTACT_REQ_MISSING	Missing contact request.
+CREATE_CALL_FAILED	An error occurred while creating the call.
+CURRENCY_TOTAL_AMOUNT_INVALID	The total amount of all prices is invalid.
+CUSTOM_REACTIONS_TOO_MANY	Too many custom reactions were specified.
+DATA_INVALID	Encrypted data invalid.
+DATA_JSON_INVALID	The provided JSON data is invalid.
+DATA_TOO_LONG	Data too long.
+DATE_EMPTY	Date empty.
+DC_ID_INVALID	The provided DC ID is invalid.
+DH_G_A_INVALID	g_a invalid.
+DOCUMENT_INVALID	The specified document is invalid.
+EDIT_BOT_INVITE_FORBIDDEN	Normal users can't edit invites that were created by bots.
+EMAIL_HASH_EXPIRED	Email hash expired.
+EMAIL_INVALID	The specified email is invalid.
+EMAIL_NOT_SETUP	In order to change the login email with emailVerifyPurposeLoginChange, an existing login email must already be set using emailVerifyPurposeLoginSetup.
+EMAIL_UNCONFIRMED	Email unconfirmed.
+EMAIL_UNCONFIRMED_X	The provided email isn't confirmed, {value} is the length of the verification code that was just sent to the email: use [account.verifyEmail](https://core.telegram.org/method/account.verifyEmail) to enter the received verification code and enable the recovery email.
+EMAIL_VERIFY_EXPIRED	The verification email has expired.
+EMOJI_INVALID	The specified theme emoji is valid.
+EMOJI_MARKUP_INVALID	The specified `video_emoji_markup` was invalid.
+EMOJI_NOT_MODIFIED	The theme wasn't changed.
+EMOTICON_EMPTY	The emoji is empty.
+EMOTICON_INVALID	The specified emoji is invalid.
+EMOTICON_STICKERPACK_MISSING	inputStickerSetDice.emoji cannot be empty.
+ENCRYPTED_MESSAGE_INVALID	Encrypted message invalid.
+ENCRYPTION_ALREADY_ACCEPTED	Secret chat already accepted.
+ENCRYPTION_ALREADY_DECLINED	The secret chat was already declined.
+ENCRYPTION_DECLINED	The secret chat was declined.
+ENCRYPTION_ID_INVALID	The provided secret chat ID is invalid.
+ENTITIES_TOO_LONG	You provided too many styled message entities.
+ENTITY_BOUNDS_INVALID	A specified [entity offset or length](/api/entities#entity-length) is invalid, see [here »](/api/entities#entity-length) for info on how to properly compute the entity offset/length.
+ENTITY_MENTION_USER_INVALID	You mentioned an invalid user.
+ERROR_TEXT_EMPTY	The provided error message is empty.
+EXPIRE_DATE_INVALID	The specified expiration date is invalid.
+EXPORT_CARD_INVALID	Provided card is invalid.
+EXTERNAL_URL_INVALID	External URL invalid.
+FILEREF_UPGRADE_NEEDED	The client has to be updated in order to support [file references](https://core.telegram.org/api/file-references).
+FILE_CONTENT_TYPE_INVALID	File content-type is invalid.
+FILE_EMTPY	An empty file was provided.
+FILE_ID_INVALID	The provided file id is invalid.
+FILE_PARTS_INVALID	The number of file parts is invalid.
+FILE_PART_EMPTY	The provided file part is empty.
+FILE_PART_INVALID	The file part number is invalid.
+FILE_PART_LENGTH_INVALID	The length of a file part is invalid.
+FILE_PART_SIZE_CHANGED	Provided file part size has changed.
+FILE_PART_SIZE_INVALID	The provided file part size is invalid.
+FILE_PART_TOO_BIG	The uploaded file part is too big.
+FILE_REFERENCE_EMPTY	An empty [file reference](https://core.telegram.org/api/file_reference) was specified.
+FILE_REFERENCE_EXPIRED	File reference expired, it must be refetched as described in [the documentation](https://core.telegram.org/api/file_reference).
+FILE_REFERENCE_INVALID	The specified [file reference](https://core.telegram.org/api/file_reference) is invalid.
+FILE_TITLE_EMPTY	An empty file title was specified.
+FILE_TOKEN_INVALID	The specified file token is invalid.
+FILTER_ID_INVALID	The specified filter ID is invalid.
+FILTER_INCLUDE_EMPTY	The include_peers vector of the filter is empty.
+FILTER_NOT_SUPPORTED	The specified filter cannot be used in this context.
+FILTER_TITLE_EMPTY	The title field of the filter is empty.
+FIRSTNAME_INVALID	The first name is invalid.
+FOLDER_ID_EMPTY	An empty folder ID was specified.
+FOLDER_ID_INVALID	Invalid folder ID.
+FORUM_ENABLED	You can't execute the specified action because the group is a [forum](https://core.telegram.org/api/forum), disable forum functionality to continue.
+FRESH_CHANGE_ADMINS_FORBIDDEN	You were just elected admin, you can't add or modify other admins yet.
+FRESH_CHANGE_PHONE_FORBIDDEN	You can't change phone number right after logging in, please wait at least 24 hours.
+FRESH_RESET_AUTHORISATION_FORBIDDEN	You can't logout other sessions if less than 24 hours have passed since you logged on the current session.
+FROM_MESSAGE_BOT_DISABLED	Bots can't use fromMessage min constructors.
+FROM_PEER_INVALID	The specified from_id is invalid.
+GAME_BOT_INVALID	Bots can't send another bot's game.
+GENERAL_MODIFY_ICON_FORBIDDEN	You can't modify the icon of the "General" topic.
+GEO_POINT_INVALID	Invalid geoposition provided.
+GIFT_SLUG_EXPIRED	The specified gift slug has expired.
+GIFT_SLUG_INVALID	The specified slug is invalid.
+GIF_CONTENT_TYPE_INVALID	GIF content-type invalid.
+GIF_ID_INVALID	The provided GIF ID is invalid.
+GRAPH_EXPIRED_RELOAD	This graph has expired, please obtain a new graph token.
+GRAPH_INVALID_RELOAD	Invalid graph token provided, please reload the stats and provide the updated token.
+GRAPH_OUTDATED_RELOAD	The graph is outdated, please get a new async token using stats.getBroadcastStats.
+GROUPCALL_ALREADY_DISCARDED	The group call was already discarded.
+GROUPCALL_ALREADY_STARTED	The groupcall has already started, you can join directly using [phone.joinGroupCall](https://core.telegram.org/method/phone.joinGroupCall).
+GROUPCALL_FORBIDDEN	The group call has already ended.
+GROUPCALL_INVALID	The specified group call is invalid.
+GROUPCALL_JOIN_MISSING	You haven't joined this group call.
+GROUPCALL_NOT_MODIFIED	Group call settings weren't modified.
+GROUPCALL_SSRC_DUPLICATE_MUCH	The app needs to retry joining the group call with a new SSRC value.
+GROUPED_MEDIA_INVALID	Invalid grouped media.
+HASH_INVALID	The provided hash is invalid.
+HIDE_REQUESTER_MISSING	The join request was missing or was already handled.
+IMAGE_PROCESS_FAILED	Failure while processing image.
+IMPORT_FILE_INVALID	The specified chat export file is invalid.
+IMPORT_FORMAT_UNRECOGNIZED	The specified chat export file was exported from an unsupported chat app.
+IMPORT_ID_INVALID	The specified import ID is invalid.
+IMPORT_TOKEN_INVALID	The specified token is invalid.
+INLINE_BOT_REQUIRED	Only the inline bot can edit message.
+INLINE_RESULT_EXPIRED	The inline query expired.
+INPUT_CHATLIST_INVALID	The specified folder is invalid.
+INPUT_FILTER_INVALID	The specified filter is invalid.
+INPUT_TEXT_EMPTY	The specified text is empty.
+INPUT_TEXT_TOO_LONG	The specified text is too long.
+INPUT_USER_DEACTIVATED	The specified user was deleted.
+INVITES_TOO_MUCH	The maximum number of per-folder invites specified by the `chatlist_invites_limit_default`/`chatlist_invites_limit_premium` [client configuration parameters »](/api/config#chatlist-invites-limit-default) was reached.
+INVITE_FORBIDDEN_WITH_JOINAS	If the user has anonymously joined a group call as a channel, they can't invite other users to the group call because that would cause deanonymization, because the invite would be sent using the original user ID, not the anonymized channel ID.
+INVITE_HASH_EMPTY	The invite hash is empty.
+INVITE_HASH_EXPIRED	The invite link has expired.
+INVITE_HASH_INVALID	The invite hash is invalid.
+INVITE_REQUEST_SENT	You have successfully requested to join this chat or channel.
+INVITE_REVOKED_MISSING	The specified invite link was already revoked or is invalid.
+INVITE_SLUG_EMPTY	The specified invite slug is empty.
+INVITE_SLUG_EXPIRED	The specified chat folder link has expired.
+INVOICE_PAYLOAD_INVALID	The specified invoice payload is invalid.
+JOIN_AS_PEER_INVALID	The specified peer cannot be used to join a group call.
+LANG_CODE_INVALID	The specified language code is invalid.
+LANG_CODE_NOT_SUPPORTED	The specified language code is not supported.
+LANG_PACK_INVALID	The provided language pack is invalid.
+LASTNAME_INVALID	The last name is invalid.
+LIMIT_INVALID	The provided limit is invalid.
+LINK_NOT_MODIFIED	Discussion link not modified.
+LOCATION_INVALID	The provided location is invalid.
+MAX_DATE_INVALID	The specified maximum date is invalid.
+MAX_ID_INVALID	The provided max ID is invalid.
+MAX_QTS_INVALID	The specified max_qts is invalid.
+MD5_CHECKSUM_INVALID	The MD5 checksums do not match.
+MEDIA_CAPTION_TOO_LONG	The caption is too long.
+MEDIA_EMPTY	The provided media object is invalid.
+MEDIA_FILE_INVALID	The specified media file is invalid.
+MEDIA_GROUPED_INVALID	You tried to send media of different types in an album.
+MEDIA_INVALID	Media invalid.
+MEDIA_NEW_INVALID	The new media is invalid.
+MEDIA_PREV_INVALID	Previous media invalid.
+MEDIA_TTL_INVALID	The specified media TTL is invalid.
+MEDIA_TYPE_INVALID	The specified media type cannot be used in stories.
+MEDIA_VIDEO_STORY_MISSING	
+MEGAGROUP_GEO_REQUIRED	This method can only be invoked on a geogroup.
+MEGAGROUP_ID_INVALID	Invalid supergroup ID.
+MEGAGROUP_PREHISTORY_HIDDEN	Group with hidden history for new members can't be set as discussion groups.
+MEGAGROUP_REQUIRED	You can only use this method on a supergroup.
+MESSAGE_AUTHOR_REQUIRED	Message author required.
+MESSAGE_DELETE_FORBIDDEN	You can't delete one of the messages you tried to delete, most likely because it is a service message.
+MESSAGE_EDIT_TIME_EXPIRED	You can't edit this message anymore, too much time has passed since its creation.
+MESSAGE_EMPTY	The provided message is empty.
+MESSAGE_IDS_EMPTY	No message ids were provided.
+MESSAGE_ID_INVALID	The provided message id is invalid.
+MESSAGE_NOT_MODIFIED	The provided message data is identical to the previous message data, the message wasn't modified.
+MESSAGE_POLL_CLOSED	Poll closed.
+MESSAGE_TOO_LONG	The provided message is too long.
+METHOD_INVALID	The specified method is invalid.
+MIN_DATE_INVALID	The specified minimum date is invalid.
+MSG_ID_INVALID	Invalid message ID provided.
+MSG_TOO_OLD	[`chat_read_mark_expire_period` seconds](https://core.telegram.org/api/config#chat-read-mark-expire-period) have passed since the message was sent, read receipts were deleted.
+MSG_WAIT_FAILED	A waiting call returned an error.
+MULTI_MEDIA_TOO_LONG	Too many media files for album.
+NEW_SALT_INVALID	The new salt is invalid.
+NEW_SETTINGS_EMPTY	No password is set on the current account, and no new password was specified in `new_settings`.
+NEW_SETTINGS_INVALID	The new password settings are invalid.
+NEXT_OFFSET_INVALID	The specified offset is longer than 64 bytes.
+OFFSET_INVALID	The provided offset is invalid.
+OFFSET_PEER_ID_INVALID	The provided offset peer is invalid.
+OPTIONS_TOO_MUCH	Too many options provided.
+OPTION_INVALID	Invalid option selected.
+ORDER_INVALID	The specified username order is invalid.
+PACK_SHORT_NAME_INVALID	Short pack name invalid.
+PACK_SHORT_NAME_OCCUPIED	A stickerpack with this name already exists.
+PACK_TITLE_INVALID	The stickerpack title is invalid.
+PARTICIPANTS_TOO_FEW	Not enough participants.
+PARTICIPANT_ID_INVALID	The specified participant ID is invalid.
+PARTICIPANT_JOIN_MISSING	Trying to enable a presentation, when the user hasn't joined the Video Chat with [phone.joinGroupCall](https://core.telegram.org/method/phone.joinGroupCall).
+PARTICIPANT_VERSION_OUTDATED	The other participant does not use an up to date telegram client with support for calls.
+PASSWORD_EMPTY	The provided password is empty.
+PASSWORD_HASH_INVALID	The provided password hash is invalid.
+PASSWORD_MISSING	You must enable 2FA in order to transfer ownership of a channel.
+PASSWORD_RECOVERY_EXPIRED	The recovery code has expired.
+PASSWORD_RECOVERY_NA	No email was set, can't recover password via email.
+PASSWORD_REQUIRED	A [2FA password](https://core.telegram.org/api/srp) must be configured to use Telegram Passport.
+PASSWORD_TOO_FRESH_X	The password was modified less than 24 hours ago, try again in {value} seconds.
+PAYMENT_PROVIDER_INVALID	The specified payment provider is invalid.
+PAYMENT_UNSUPPORTED	A detailed description of the error will be received separately as described [here »](https://core.telegram.org/api/errors#406-not-acceptable).
+PEERS_LIST_EMPTY	The specified list of peers is empty.
+PEER_HISTORY_EMPTY	You can't pin an empty chat with a user.
+PEER_ID_INVALID	The provided peer id is invalid.
+PEER_ID_NOT_SUPPORTED	The provided peer ID is not supported.
+PERSISTENT_TIMESTAMP_EMPTY	Persistent timestamp empty.
+PERSISTENT_TIMESTAMP_INVALID	Persistent timestamp invalid.
+PERSISTENT_TIMESTAMP_OUTDATED	Channel internal replication issues, try again later (treat this like an RPC_CALL_FAIL).
+PHONE_CODE_EMPTY	phone_code is missing.
+PHONE_CODE_EXPIRED	The phone code you provided has expired.
+PHONE_CODE_HASH_EMPTY	phone_code_hash is missing.
+PHONE_CODE_INVALID	The provided phone code is invalid.
+PHONE_HASH_EXPIRED	An invalid or expired `phone_code_hash` was provided.
+PHONE_NOT_OCCUPIED	No user is associated to the specified phone number.
+PHONE_NUMBER_APP_SIGNUP_FORBIDDEN	You can't sign up using this app.
+PHONE_NUMBER_BANNED	The provided phone number is banned from telegram.
+PHONE_NUMBER_FLOOD	You asked for the code too many times.
+PHONE_NUMBER_INVALID	The phone number is invalid.
+PHONE_NUMBER_OCCUPIED	The phone number is already in use.
+PHONE_NUMBER_UNOCCUPIED	The phone number is not yet being used.
+PHONE_PASSWORD_FLOOD	You have tried logging in too many times.
+PHONE_PASSWORD_PROTECTED	This phone is password protected.
+PHOTO_CONTENT_TYPE_INVALID	Photo mime-type invalid.
+PHOTO_CONTENT_URL_EMPTY	Photo URL invalid.
+PHOTO_CROP_FILE_MISSING	Photo crop file missing.
+PHOTO_CROP_SIZE_SMALL	Photo is too small.
+PHOTO_EXT_INVALID	The extension of the photo is invalid.
+PHOTO_FILE_MISSING	Profile photo file missing.
+PHOTO_ID_INVALID	Photo ID invalid.
+PHOTO_INVALID	Photo invalid.
+PHOTO_INVALID_DIMENSIONS	The photo dimensions are invalid.
+PHOTO_SAVE_FILE_INVALID	Internal issues, try again later.
+PHOTO_THUMB_URL_EMPTY	Photo thumbnail URL is empty.
+PINNED_DIALOGS_TOO_MUCH	Too many pinned dialogs.
+PIN_RESTRICTED	You can't pin messages.
+PLAYMARKET_PURCHASE_USED	 The Google account logged in the Play Store has already an ongoing Telegram Premium cycle in progress
+POLL_ANSWERS_INVALID	Invalid poll answers were provided.
+POLL_ANSWER_INVALID	One of the poll answers is not acceptable.
+POLL_OPTION_DUPLICATE	Duplicate poll options provided.
+POLL_OPTION_INVALID	Invalid poll option provided.
+POLL_QUESTION_INVALID	One of the poll questions is not acceptable.
+POLL_VOTE_REQUIRED	Cast a vote in the poll before calling this method.
+PRECHECKOUT_FAILED	Precheckout failed, a detailed and localized description for the error will be emitted via an [updateServiceNotification as specified here »](https://core.telegram.org/api/errors#406-not-acceptable).
+PREMIUM_ACCOUNT_REQUIRED	A premium account is required to execute this action.
+PREMIUM_CURRENTLY_UNAVAILABLE	You cannot currently purchase a Premium subscription.
+PREMIUM_GIFTCODE_WAS_REFUNDED	This gift code can't be redeemed because the giveaway organizer requested a refund
+PREMIUM_SUB_ACTIVE_UNTIL_X	You already have a premium subscription active until unixtime {value} .
+PREVIOUS_CHAT_IMPORT_ACTIVE_WAIT_XMIN	Import for this chat is already in progress, wait {value} minutes before starting a new one.
+PRIVACY_KEY_INVALID	The privacy key is invalid.
+PRIVACY_PREMIUM_REQUIRED	You need a [Telegram Premium subscription](https://core.telegram.org/api/premium) to send a message to this user.
+PRIVACY_TOO_LONG	Too many privacy rules were specified, the current limit is 1000.
+PRIVACY_VALUE_INVALID	The specified privacy rule combination is invalid.
+PUBLIC_CHANNEL_MISSING	You can only export group call invite links for public chats or channels.
+PUBLIC_KEY_REQUIRED	A public key is required.
+QUERY_ID_EMPTY	The query ID is empty.
+QUERY_ID_INVALID	The query ID is invalid.
+QUERY_TOO_SHORT	The query string is too short.
+QUIZ_ANSWER_MISSING	You can forward a quiz while hiding the original author only after choosing an option in the quiz.
+QUIZ_CORRECT_ANSWERS_EMPTY	No correct quiz answer was specified.
+QUIZ_CORRECT_ANSWERS_TOO_MUCH	You specified too many correct answers in a quiz, quizzes can only have one right answer!
+QUIZ_CORRECT_ANSWER_INVALID	An invalid value was provided to the correct_answers field.
+QUIZ_MULTIPLE_INVALID	Quizzes can't have the multiple_choice flag set!
+RANDOM_ID_DUPLICATE	You provided a random ID that was already used.
+RANDOM_ID_EMPTY	Random ID empty.
+RANDOM_ID_INVALID	A provided random ID is invalid.
+RANDOM_LENGTH_INVALID	Random length invalid.
+RANGES_INVALID	Invalid range provided.
+REACTIONS_TOO_MANY	The message already has exactly `reactions_uniq_max` reaction emojis, you can't react with a new emoji, see [the docs for more info »](/api/config#client-configuration).
+REACTION_EMPTY	Empty reaction provided.
+REACTION_INVALID	The specified reaction is invalid.
+REPLY_MARKUP_BUY_EMPTY	Reply markup for buy button empty.
+REPLY_MARKUP_INVALID	The provided reply markup is invalid.
+REPLY_MARKUP_TOO_LONG	The specified reply_markup is too long.
+REPLY_MESSAGE_ID_INVALID	The specified reply-to message ID is invalid.
+REPLY_TO_INVALID	The specified `reply_to` field is invalid.
+REPLY_TO_USER_INVALID	The replied-to user is invalid.
+RESET_REQUEST_MISSING	No password reset is in progress.
+RESULTS_TOO_MUCH	Too many results were provided.
+RESULT_ID_DUPLICATE	You provided a duplicate result ID.
+RESULT_ID_EMPTY	Result ID empty.
+RESULT_ID_INVALID	One of the specified result IDs is invalid.
+RESULT_TYPE_INVALID	Result type invalid.
+REVOTE_NOT_ALLOWED	You cannot change your vote.
+RIGHTS_NOT_MODIFIED	The new admin rights are equal to the old rights, no change was made.
+RIGHT_FORBIDDEN	Your admin rights do not allow you to do this.
+RSA_DECRYPT_FAILED	Internal RSA decryption failed.
+SCHEDULE_BOT_NOT_ALLOWED	Bots cannot schedule messages.
+SCHEDULE_DATE_INVALID	Invalid schedule date provided.
+SCHEDULE_DATE_TOO_LATE	You can't schedule a message this far in the future.
+SCHEDULE_STATUS_PRIVATE	Can't schedule until user is online, if the user's last seen timestamp is hidden by their privacy settings.
+SCHEDULE_TOO_MUCH	There are too many scheduled messages.
+SCORE_INVALID	The specified game score is invalid.
+SEARCH_QUERY_EMPTY	The search query is empty.
+SEARCH_WITH_LINK_NOT_SUPPORTED	You cannot provide a search query and an invite link at the same time.
+SECONDS_INVALID	Invalid duration provided.
+SEND_AS_PEER_INVALID	You can't send messages as the specified peer.
+SEND_CODE_UNAVAILABLE	Returned when all available options for this type of number were already used (e.g. flash-call, then SMS, then this error might be returned to trigger a second resend).
+SEND_MEDIA_INVALID	The specified media is invalid.
+SEND_MESSAGE_MEDIA_INVALID	Invalid media provided.
+SEND_MESSAGE_TYPE_INVALID	The message type is invalid.
+SENSITIVE_CHANGE_FORBIDDEN	You can't change your sensitive content settings.
+SESSION_TOO_FRESH_X	This session was created less than 24 hours ago, try again in {value} seconds.
+SETTINGS_INVALID	Invalid settings were provided.
+SHA256_HASH_INVALID	The provided SHA256 hash is invalid.
+SHORT_NAME_INVALID	The specified short name is invalid.
+SHORT_NAME_OCCUPIED	The specified short name is already in use.
+SIGN_IN_FAILED	Failure while signing in.
+SLOTS_EMPTY	The specified slot list is empty.
+SLOWMODE_MULTI_MSGS_DISABLED	Slowmode is enabled, you cannot forward multiple messages to this group.
+SLOWMODE_WAIT_X	Slowmode is enabled in this chat: wait {value} seconds before sending another message to this chat.
+SLUG_INVALID	The specified invoice slug is invalid.
+SMS_CODE_CREATE_FAILED	An error occurred while creating the SMS code.
+SRP_ID_INVALID	Invalid SRP ID provided.
+SRP_PASSWORD_CHANGED	Password has changed.
+STARGIFT_EXPORT_IN_PROGRESS	A gift export is in progress, a detailed and localized description for the error will be emitted via an [updateServiceNotification as specified here »](https://core.telegram.org/api/errors#406-not-acceptable).
+STARS_FORM_AMOUNT_MISMATCH	The form amount has changed, please fetch the new form using [payments.getPaymentForm](https://core.telegram.org/method/payments.getPaymentForm) and restart the process.
+START_PARAM_EMPTY	The start parameter is empty.
+START_PARAM_INVALID	Start parameter invalid.
+START_PARAM_TOO_LONG	Start parameter is too long.
+STICKERPACK_STICKERS_TOO_MUCH	There are too many stickers in this stickerpack, you can't add any more.
+STICKERSET_INVALID	The provided sticker set is invalid.
+STICKERSET_OWNER_ANONYMOUS	Provided stickerset can't be installed as group stickerset to prevent admin deanonymization.
+STICKERS_EMPTY	No sticker provided.
+STICKERS_TOO_MUCH	There are too many stickers in this stickerpack, you can't add any more.
+STICKER_DOCUMENT_INVALID	The specified sticker document is invalid.
+STICKER_EMOJI_INVALID	Sticker emoji invalid.
+STICKER_FILE_INVALID	Sticker file invalid.
+STICKER_GIF_DIMENSIONS	The specified video sticker has invalid dimensions.
+STICKER_ID_INVALID	The provided sticker ID is invalid.
+STICKER_INVALID	The provided sticker is invalid.
+STICKER_MIME_INVALID	The specified sticker MIME type is invalid.
+STICKER_PNG_DIMENSIONS	Sticker png dimensions invalid.
+STICKER_PNG_NOPNG	One of the specified stickers is not a valid PNG file.
+STICKER_TGS_NODOC	You must send the animated sticker as a document.
+STICKER_TGS_NOTGS	Invalid TGS sticker provided.
+STICKER_THUMB_PNG_NOPNG	Incorrect stickerset thumb file provided, PNG / WEBP expected.
+STICKER_THUMB_TGS_NOTGS	Incorrect stickerset TGS thumb file provided.
+STICKER_VIDEO_BIG	The specified video sticker is too big.
+STICKER_VIDEO_NODOC	You must send the video sticker as a document.
+STICKER_VIDEO_NOWEBM	The specified video sticker is not in webm format.
+STORIES_NEVER_CREATED	This peer hasn't ever posted any stories.
+STORIES_TOO_MUCH	You have hit the maximum active stories limit as specified by the [`story_expiring_limit_*` client configuration parameters](https://core.telegram.org/api/config#story-expiring-limit-default): you should buy a [Premium](/api/premium) subscription, delete an active story, or wait for the oldest story to expire.
+STORY_ID_EMPTY	You specified no story IDs.
+STORY_ID_INVALID	The specified story ID is invalid.
+STORY_NOT_MODIFIED	The new story information you passed is equal to the previous story information, thus it wasn't modified.
+STORY_PERIOD_INVALID	The specified story period is invalid for this account.
+STORY_SEND_FLOOD_MONTHLY_X	You've hit the monthly story limit as specified by the [`stories_sent_monthly_limit_*` client configuration parameters](https://core.telegram.org/api/config#stories-sent-monthly-limit-default): wait for the specified number of seconds before posting a new story.
+STORY_SEND_FLOOD_WEEKLY_X	You've hit the weekly story limit as specified by the [`stories_sent_weekly_limit_*` client configuration parameters](https://core.telegram.org/api/config#stories-sent-weekly-limit-default): wait for the specified number of seconds before posting a new story.
+SWITCH_PM_TEXT_EMPTY	The switch_pm.text field was empty.
+TAKEOUT_INIT_DELAY_X	Sorry, for security reasons, you will be able to begin downloading your data in {value} seconds. We have notified all your devices about the export request to make sure it's authorized and to give you time to react if it's not.
+TAKEOUT_INVALID	The specified takeout ID is invalid.
+TAKEOUT_REQUIRED	A [takeout](https://core.telegram.org/api/takeout) session needs to be initialized first, [see here » for more info](/api/takeout).
+TASK_ALREADY_EXISTS	An email reset was already requested.
+TEMP_AUTH_KEY_ALREADY_BOUND	The passed temporary key is already bound to another **perm_auth_key_id**.
+TEMP_AUTH_KEY_EMPTY	No temporary auth key provided.
+THEME_FILE_INVALID	Invalid theme file provided.
+THEME_FORMAT_INVALID	Invalid theme format provided.
+THEME_INVALID	Invalid theme provided.
+THEME_MIME_INVALID	The theme's MIME type is invalid.
+THEME_TITLE_INVALID	The specified theme title is invalid.
+TITLE_INVALID	The specified stickerpack title is invalid.
+TMP_PASSWORD_DISABLED	The temporary password is disabled.
+TOKEN_EMPTY	The specified token is empty.
+TOKEN_INVALID	The provided token is invalid.
+TOKEN_TYPE_INVALID	The specified token type is invalid.
+TOPICS_EMPTY	You specified no topic IDs.
+TOPIC_CLOSED	This topic was closed, you can't send messages to it anymore.
+TOPIC_CLOSE_SEPARATELY	The `close` flag cannot be provided together with any of the other flags.
+TOPIC_DELETED	The specified topic was deleted.
+TOPIC_HIDE_SEPARATELY	The `hide` flag cannot be provided together with any of the other flags.
+TOPIC_ID_INVALID	The specified topic ID is invalid.
+TOPIC_NOT_MODIFIED	The updated topic info is equal to the current topic info, nothing was changed.
+TOPIC_TITLE_EMPTY	The specified topic title is empty.
+TO_LANG_INVALID	The specified destination language is invalid.
+TRANSCRIPTION_FAILED	Audio transcription failed.
+TRANSLATIONS_DISABLED	Translations are unavailable, a detailed and localized description for the error will be emitted via an [updateServiceNotification as specified here »](https://core.telegram.org/api/errors#406-not-acceptable).
+TTL_DAYS_INVALID	The provided TTL is invalid.
+TTL_MEDIA_INVALID	Invalid media Time To Live was provided.
+TTL_PERIOD_INVALID	The specified TTL period is invalid.
+TYPES_EMPTY	No top peer type was provided.
+UNTIL_DATE_INVALID	Invalid until date provided.
+UPDATE_APP_TO_LOGIN	Please update your client to login.
+URL_INVALID	Invalid URL provided.
+USAGE_LIMIT_INVALID	The specified usage limit is invalid.
+USERNAMES_ACTIVE_TOO_MUCH	The maximum number of active usernames was reached.
+USERNAME_INVALID	The provided username is not valid.
+USERNAME_NOT_MODIFIED	The username was not modified.
+USERNAME_NOT_OCCUPIED	The provided username is not occupied.
+USERNAME_OCCUPIED	The provided username is already occupied.
+USERNAME_PURCHASE_AVAILABLE	The specified username can be purchased on https://fragment.com.
+USERPIC_PRIVACY_REQUIRED	You need to disable privacy settings for your profile picture in order to make your geolocation public.
+USERPIC_UPLOAD_REQUIRED	You must have a profile picture to publish your geolocation.
+USERS_TOO_FEW	Not enough users (to create a chat, for example).
+USERS_TOO_MUCH	The maximum number of users has been exceeded (to create a chat, for example).
+USER_ADMIN_INVALID	You're not an admin.
+USER_ALREADY_INVITED	You have already invited this user.
+USER_ALREADY_PARTICIPANT	The user is already in the group.
+USER_BANNED_IN_CHANNEL	You're banned from sending messages in supergroups/channels.
+USER_BLOCKED	User blocked.
+USER_BOT	Bots can only be admins in channels.
+USER_BOT_INVALID	User accounts must provide the `bot` method parameter when calling this method. If there is no such method parameter, this method can only be invoked by bot accounts.
+USER_BOT_REQUIRED	This method can only be called by a bot.
+USER_CHANNELS_TOO_MUCH	One of the users you tried to add is already in too many channels/supergroups.
+USER_CREATOR	You can't leave this channel, because you're its creator.
+USER_DELETED	You can't send this secret message because the other participant deleted their account.
+USER_ID_INVALID	The provided user ID is invalid.
+USER_INVALID	Invalid user provided.
+USER_IS_BLOCKED	You were blocked by this user.
+USER_IS_BOT	Bots can't send messages to other bots.
+USER_KICKED	This user was kicked from this supergroup/channel.
+USER_NOT_MUTUAL_CONTACT	The provided user is not a mutual contact.
+USER_NOT_PARTICIPANT	You're not a member of this supergroup/channel.
+USER_PRIVACY_RESTRICTED	The user's privacy settings do not allow you to do this.
+USER_PUBLIC_MISSING	Cannot generate a link to stories posted by a peer without a username.
+USER_RESTRICTED	You're spamreported, you can't create channels or chats.
+USER_VOLUME_INVALID	The specified user volume is invalid.
+VENUE_ID_INVALID	The specified venue ID is invalid.
+VIDEO_CONTENT_TYPE_INVALID	The video's content type is invalid.
+VIDEO_FILE_INVALID	The specified video file is invalid.
+VIDEO_TITLE_EMPTY	The specified video title is empty.
+VOICE_MESSAGES_FORBIDDEN	This user's privacy settings forbid you from sending voice messages.
+WALLPAPER_FILE_INVALID	The specified wallpaper file is invalid.
+WALLPAPER_INVALID	The specified wallpaper is invalid.
+WALLPAPER_MIME_INVALID	The specified wallpaper MIME type is invalid.
+WALLPAPER_NOT_FOUND	The specified wallpaper could not be found.
+WC_CONVERT_URL_INVALID	WC convert URL invalid.
+WEBDOCUMENT_INVALID	Invalid webdocument URL provided.
+WEBDOCUMENT_MIME_INVALID	Invalid webdocument mime type provided.
+WEBDOCUMENT_SIZE_TOO_BIG	Webdocument is too big!
+WEBDOCUMENT_URL_INVALID	The specified webdocument URL is invalid.
+WEBPAGE_CURL_FAILED	Failure while fetching the webpage with cURL.
+WEBPAGE_MEDIA_EMPTY	Webpage media empty.
+WEBPAGE_NOT_FOUND	A preview for the specified webpage `url` could not be generated.
+WEBPAGE_URL_INVALID	The specified webpage `url` is invalid.
+WEBPUSH_AUTH_INVALID	The specified web push authentication secret is invalid.
+WEBPUSH_KEY_INVALID	The specified web push elliptic curve Diffie-Hellman public key is invalid.
+WEBPUSH_TOKEN_INVALID	The specified web push token is invalid.
+YOU_BLOCKED_USER	You blocked this user.
\ No newline at end of file
diff --git a/compiler/errors/source/420_FLOOD.tsv b/compiler/errors/source/420_FLOOD.tsv
index c1b67465..36c262f0 100644
--- a/compiler/errors/source/420_FLOOD.tsv
+++ b/compiler/errors/source/420_FLOOD.tsv
@@ -1,7 +1,10 @@
 id	message
-2FA_CONFIRM_WAIT_X	A wait of {value} seconds is required because this account is active and protected by a 2FA password
-FLOOD_PREMIUM_WAIT_X	A wait of {value} seconds is required
+2FA_CONFIRM_WAIT_X	Since this account is active and protected by a 2FA password, we will delete it in 1 week for security purposes. You can cancel this process at any time, you'll be able to reset your account in {value} seconds.
+ADDRESS_INVALID	The specified geopoint address is invalid.
+FLOOD_PREMIUM_WAIT_X	Please wait {value} seconds before repeating the action, or purchase a [Telegram Premium subscription](https://core.telegram.org/api/premium) to remove this rate limit.
 FLOOD_TEST_PHONE_WAIT_X	A wait of {value} seconds is required in the test servers
-FLOOD_WAIT_X	A wait of {value} seconds is required
-SLOWMODE_WAIT_X	A wait of {value} seconds is required to send messages in this chat.
-TAKEOUT_INIT_DELAY_X	You have to confirm the data export request using one of your mobile devices or wait {value} seconds
\ No newline at end of file
+FLOOD_WAIT_X	Please wait {value} seconds before repeating the action.
+FROZEN_METHOD_INVALID	The current account is [frozen](https://core.telegram.org/api/auth#frozen-accounts), and thus cannot execute the specified action.
+PREMIUM_SUB_ACTIVE_UNTIL_X	You already have a premium subscription active until unixtime {value} .
+SLOWMODE_WAIT_X	Slowmode is enabled in this chat: wait {value} seconds before sending another message to this chat.
+TAKEOUT_INIT_DELAY_X	Sorry, for security reasons, you will be able to begin downloading your data in {value} seconds. We have notified all your devices about the export request to make sure it's authorized and to give you time to react if it's not.
\ No newline at end of file
diff --git a/compiler/errors/source/500_INTERNAL_SERVER_ERROR.tsv b/compiler/errors/source/500_INTERNAL_SERVER_ERROR.tsv
index ca821810..675bb84b 100644
--- a/compiler/errors/source/500_INTERNAL_SERVER_ERROR.tsv
+++ b/compiler/errors/source/500_INTERNAL_SERVER_ERROR.tsv
@@ -1,47 +1,556 @@
 id	message
+2FA_CONFIRM_WAIT_X	Since this account is active and protected by a 2FA password, we will delete it in 1 week for security purposes. You can cancel this process at any time, you'll be able to reset your account in {value} seconds.
+ABOUT_TOO_LONG	About string too long.
+ACCESS_TOKEN_EXPIRED	Access token expired.
+ACCESS_TOKEN_INVALID	Access token invalid.
+ADDRESS_INVALID	The specified geopoint address is invalid.
+ADMINS_TOO_MUCH	There are too many admins.
+ADMIN_ID_INVALID	The specified admin ID is invalid.
+ADMIN_RANK_EMOJI_NOT_ALLOWED	An admin rank cannot contain emojis.
+ADMIN_RANK_INVALID	The specified admin rank is invalid.
+ADMIN_RIGHTS_EMPTY	The chatAdminRights constructor passed in keyboardButtonRequestPeer.peer_type.user_admin_rights has no rights set (i.e. flags is 0).
+ALBUM_PHOTOS_TOO_MANY	You have uploaded too many profile photos, delete some before retrying.
+ANONYMOUS_REACTIONS_DISABLED	Sorry, anonymous administrators cannot leave reactions or participate in polls.
 API_CALL_ERROR	API call error due to Telegram having internal problems. Please try again later
-AUTH_RESTART	User authorization has restarted
-CALL_OCCUPY_FAILED	The call failed because the user is already making another call
-CHAT_ID_GENERATE_FAILED	Failure while generating the chat ID due to Telegram having internal problems. Please try again later
+API_ID_INVALID	API ID invalid.
+API_ID_PUBLISHED_FLOOD	This API id was published somewhere, you can't use it now.
+ARTICLE_TITLE_EMPTY	The title of the article is empty.
+AUDIO_CONTENT_URL_EMPTY	The remote URL specified in the content field is empty.
+AUDIO_TITLE_EMPTY	An empty audio title was provided.
+AUTH_BYTES_INVALID	The provided authorization is invalid.
+AUTH_KEY_UNSYNCHRONIZED	Internal error, please repeat the method call.
+AUTH_RESTART	Restart the authorization process.
+AUTH_RESTART_X	Internal error (debug info {value}), please repeat the method call.
+AUTH_TOKEN_ALREADY_ACCEPTED	The specified auth token was already accepted.
+AUTH_TOKEN_EXCEPTION	An error occurred while importing the auth token.
+AUTH_TOKEN_EXPIRED	The authorization token has expired.
+AUTH_TOKEN_INVALID	The specified auth token is invalid.
+AUTH_TOKEN_INVALIDX	The specified auth token is invalid.
+AUTOARCHIVE_NOT_AVAILABLE	The autoarchive setting is not available at this time: please check the value of the [autoarchive_setting_available field in client config »](https://core.telegram.org/api/config#client-configuration) before calling this method.
+BANK_CARD_NUMBER_INVALID	The specified card number is invalid.
+BANNED_RIGHTS_INVALID	You provided some invalid flags in the banned rights.
+BOOSTS_EMPTY	No boost slots were specified.
+BOOSTS_REQUIRED	The specified channel must first be [boosted by its users](https://core.telegram.org/api/boost) in order to perform this action.
+BOOST_NOT_MODIFIED	You're already [boosting](https://core.telegram.org/api/boost) the specified channel.
+BOOST_PEER_INVALID	The specified `boost_peer` is invalid.
+BOTS_TOO_MUCH	There are too many bots in this chat/channel.
+BOT_APP_INVALID	The specified bot app is invalid.
+BOT_APP_SHORTNAME_INVALID	The specified bot app short name is invalid.
+BOT_CHANNELS_NA	Bots can't edit admin privileges.
+BOT_COMMAND_DESCRIPTION_INVALID	The specified command description is invalid.
+BOT_COMMAND_INVALID	The specified command is invalid.
+BOT_DOMAIN_INVALID	Bot domain invalid.
+BOT_GROUPS_BLOCKED	This bot can't be added to groups.
+BOT_INLINE_DISABLED	This bot can't be used in inline mode.
+BOT_INVALID	This is not a valid bot.
+BOT_MISSING	Only bots can call this method, please use [@stickers](https://t.me/stickers) if you're a user.
+BOT_ONESIDE_NOT_AVAIL	Bots can't pin messages in PM just for themselves.
+BOT_PAYMENTS_DISABLED	Please enable bot payments in botfather before calling this method.
+BOT_RESPONSE_TIMEOUT	A timeout occurred while fetching data from the bot.
+BOT_SCORE_NOT_MODIFIED	The score wasn't modified.
+BOT_WEBVIEW_DISABLED	A webview cannot be opened in the specified conditions: emitted for example if `from_bot_menu` or `url` are set and `peer` is not the chat with the bot.
+BROADCAST_FORBIDDEN	Channel poll voters and reactions cannot be fetched to prevent deanonymization.
+BROADCAST_ID_INVALID	Broadcast ID invalid.
+BROADCAST_PUBLIC_VOTERS_FORBIDDEN	You can't forward polls with public voters.
+BROADCAST_REQUIRED	This method can only be called on a channel, please use stats.getMegagroupStats for supergroups.
+BUTTON_DATA_INVALID	The data of one or more of the buttons you provided is invalid.
+BUTTON_TEXT_INVALID	The specified button text is invalid.
+BUTTON_TYPE_INVALID	The type of one or more of the buttons you provided is invalid.
+BUTTON_URL_INVALID	Button URL invalid.
+BUTTON_USER_PRIVACY_RESTRICTED	The privacy setting of the user specified in a [inputKeyboardButtonUserProfile](/constructor/inputKeyboardButtonUserProfile) button do not allow creating such a button.
+CALL_ALREADY_ACCEPTED	The call was already accepted.
+CALL_ALREADY_DECLINED	The call was already declined.
+CALL_OCCUPY_FAILED	The call failed because the user is already making another call.
+CALL_PEER_INVALID	The provided call peer object is invalid.
+CALL_PROTOCOL_FLAGS_INVALID	Call protocol flags invalid.
+CDN_METHOD_INVALID	You can't call this method in a CDN DC.
+CDN_UPLOAD_TIMEOUT	A server-side timeout occurred while reuploading the file to the CDN DC.
+CHANNELS_ADMIN_LOCATED_TOO_MUCH	The user has reached the limit of public geogroups.
+CHANNELS_ADMIN_PUBLIC_TOO_MUCH	You're admin of too many public channels, make some channels private to change the username of this channel.
+CHANNELS_TOO_MUCH	You have joined too many channels/supergroups.
+CHANNEL_FORUM_MISSING	This supergroup is not a forum.
+CHANNEL_ID_INVALID	The specified supergroup ID is invalid.
+CHANNEL_INVALID	The provided channel is invalid.
+CHANNEL_PARICIPANT_MISSING	The current user is not in the channel.
+CHANNEL_PRIVATE	You haven't joined this channel/supergroup.
+CHANNEL_PUBLIC_GROUP_NA	channel/supergroup not available.
+CHANNEL_TOO_BIG	This channel has too many participants (>1000) to be deleted.
+CHANNEL_TOO_LARGE	Channel is too large to be deleted; this error is issued when trying to delete channels with more than 1000 members (subject to change).
+CHATLIST_EXCLUDE_INVALID	The specified `exclude_peers` are invalid.
+CHAT_ABOUT_NOT_MODIFIED	About text has not changed.
+CHAT_ABOUT_TOO_LONG	Chat about too long.
+CHAT_ADMIN_INVITE_REQUIRED	You do not have the rights to do this.
+CHAT_ADMIN_REQUIRED	You must be an admin in this chat to do this.
+CHAT_DISCUSSION_UNALLOWED	You can't enable forum topics in a discussion group linked to a channel.
+CHAT_FORWARDS_RESTRICTED	You can't forward messages from a protected chat.
+CHAT_GUEST_SEND_FORBIDDEN	You join the discussion group before commenting, see [here »](/api/discussion#requiring-users-to-join-the-group) for more info.
+CHAT_ID_EMPTY	The provided chat ID is empty.
+CHAT_ID_GENERATE_FAILED	Failure while generating the chat ID.
+CHAT_ID_INVALID	The provided chat id is invalid.
+CHAT_INVALID	Invalid chat.
+CHAT_INVITE_PERMANENT	You can't set an expiration date on permanent invite links.
+CHAT_LINK_EXISTS	The chat is public, you can't hide the history to new users.
+CHAT_NOT_MODIFIED	No changes were made to chat information because the new information you passed is identical to the current information.
 CHAT_OCCUPY_LOC_FAILED	An internal error occurred while creating the chat
 CHAT_OCCUPY_USERNAME_FAILED	Failure to occupy chat username due to Telegram having internal problems. Please try again later
+CHAT_PUBLIC_REQUIRED	You can only enable join requests in public groups.
+CHAT_RESTRICTED	You can't send messages in this chat, you were restricted.
+CHAT_REVOKE_DATE_UNSUPPORTED	`min_date` and `max_date` are not available for using with non-user peers.
+CHAT_SEND_AUDIOS_FORBIDDEN	You can't send audio messages in this chat.
+CHAT_SEND_DOCS_FORBIDDEN	You can't send documents in this chat.
+CHAT_SEND_GAME_FORBIDDEN	You can't send a game to this chat.
+CHAT_SEND_GIFS_FORBIDDEN	You can't send gifs in this chat.
+CHAT_SEND_INLINE_FORBIDDEN	You can't send inline messages in this group.
+CHAT_SEND_MEDIA_FORBIDDEN	You can't send media in this chat.
+CHAT_SEND_PHOTOS_FORBIDDEN	You can't send photos in this chat.
+CHAT_SEND_PLAIN_FORBIDDEN	You can't send non-media (text) messages in this chat.
+CHAT_SEND_POLL_FORBIDDEN	You can't send polls in this chat.
+CHAT_SEND_STICKERS_FORBIDDEN	You can't send stickers in this chat.
+CHAT_SEND_VIDEOS_FORBIDDEN	You can't send videos in this chat.
+CHAT_SEND_VOICES_FORBIDDEN	You can't send voice recordings in this chat.
+CHAT_TITLE_EMPTY	No chat title provided.
+CHAT_TOO_BIG	This method is not available for groups with more than `chat_read_mark_size_threshold` members, [see client configuration »](https://core.telegram.org/api/config#client-configuration).
+CHAT_WRITE_FORBIDDEN	You can't write in this chat.
 CHP_CALL_FAIL	Telegram is having internal problems. Please try again later
+CODE_EMPTY	The provided code is empty.
+CODE_HASH_INVALID	Code hash invalid.
+CODE_INVALID	Code invalid.
+COLOR_INVALID	The specified color palette ID was invalid.
+CONNECTION_API_ID_INVALID	The provided API id is invalid.
+CONNECTION_APP_VERSION_EMPTY	App version is empty.
+CONNECTION_LAYER_INVALID	Layer invalid.
+CONTACT_ADD_MISSING	Contact to add is missing.
+CONTACT_ID_INVALID	The provided contact ID is invalid.
+CONTACT_MISSING	The specified user is not a contact.
+CONTACT_NAME_EMPTY	Contact name empty.
+CONTACT_REQ_MISSING	Missing contact request.
+CREATE_CALL_FAILED	An error occurred while creating the call.
+CURRENCY_TOTAL_AMOUNT_INVALID	The total amount of all prices is invalid.
+CUSTOM_REACTIONS_TOO_MANY	Too many custom reactions were specified.
+DATA_INVALID	Encrypted data invalid.
+DATA_JSON_INVALID	The provided JSON data is invalid.
+DATA_TOO_LONG	Data too long.
+DATE_EMPTY	Date empty.
+DC_ID_INVALID	The provided DC ID is invalid.
+DH_G_A_INVALID	g_a invalid.
+DOCUMENT_INVALID	The specified document is invalid.
+EDIT_BOT_INVITE_FORBIDDEN	Normal users can't edit invites that were created by bots.
+EMAIL_HASH_EXPIRED	Email hash expired.
+EMAIL_INVALID	The specified email is invalid.
+EMAIL_NOT_SETUP	In order to change the login email with emailVerifyPurposeLoginChange, an existing login email must already be set using emailVerifyPurposeLoginSetup.
+EMAIL_UNCONFIRMED	Email unconfirmed.
+EMAIL_UNCONFIRMED_X	The provided email isn't confirmed, {value} is the length of the verification code that was just sent to the email: use [account.verifyEmail](https://core.telegram.org/method/account.verifyEmail) to enter the received verification code and enable the recovery email.
+EMAIL_VERIFY_EXPIRED	The verification email has expired.
+EMOJI_INVALID	The specified theme emoji is valid.
+EMOJI_MARKUP_INVALID	The specified `video_emoji_markup` was invalid.
+EMOJI_NOT_MODIFIED	The theme wasn't changed.
+EMOTICON_EMPTY	The emoji is empty.
+EMOTICON_INVALID	The specified emoji is invalid.
+EMOTICON_STICKERPACK_MISSING	inputStickerSetDice.emoji cannot be empty.
+ENCRYPTED_MESSAGE_INVALID	Encrypted message invalid.
+ENCRYPTION_ALREADY_ACCEPTED	Secret chat already accepted.
+ENCRYPTION_ALREADY_DECLINED	The secret chat was already declined.
+ENCRYPTION_DECLINED	The secret chat was declined.
+ENCRYPTION_ID_INVALID	The provided secret chat ID is invalid.
 ENCRYPTION_OCCUPY_ADMIN_FAILED	Failed occupying memory for admin info due to Telegram having internal problems. Please try again later
 ENCRYPTION_OCCUPY_FAILED	Internal server error while accepting secret chat
+ENTITIES_TOO_LONG	You provided too many styled message entities.
+ENTITY_BOUNDS_INVALID	A specified [entity offset or length](/api/entities#entity-length) is invalid, see [here »](/api/entities#entity-length) for info on how to properly compute the entity offset/length.
+ENTITY_MENTION_USER_INVALID	You mentioned an invalid user.
+ERROR_TEXT_EMPTY	The provided error message is empty.
+EXPIRE_DATE_INVALID	The specified expiration date is invalid.
+EXPORT_CARD_INVALID	Provided card is invalid.
+EXTERNAL_URL_INVALID	External URL invalid.
+FILE_CONTENT_TYPE_INVALID	File content-type is invalid.
+FILE_EMTPY	An empty file was provided.
+FILE_ID_INVALID	The provided file id is invalid.
+FILE_PARTS_INVALID	The number of file parts is invalid.
+FILE_PART_EMPTY	The provided file part is empty.
+FILE_PART_INVALID	The file part number is invalid.
+FILE_PART_LENGTH_INVALID	The length of a file part is invalid.
+FILE_PART_SIZE_CHANGED	Provided file part size has changed.
+FILE_PART_SIZE_INVALID	The provided file part size is invalid.
+FILE_PART_TOO_BIG	The uploaded file part is too big.
+FILE_REFERENCE_EMPTY	An empty [file reference](https://core.telegram.org/api/file_reference) was specified.
+FILE_REFERENCE_EXPIRED	File reference expired, it must be refetched as described in [the documentation](https://core.telegram.org/api/file_reference).
+FILE_REFERENCE_INVALID	The specified [file reference](https://core.telegram.org/api/file_reference) is invalid.
+FILE_TITLE_EMPTY	An empty file title was specified.
+FILE_TOKEN_INVALID	The specified file token is invalid.
+FILTER_ID_INVALID	The specified filter ID is invalid.
+FILTER_INCLUDE_EMPTY	The include_peers vector of the filter is empty.
+FILTER_NOT_SUPPORTED	The specified filter cannot be used in this context.
+FILTER_TITLE_EMPTY	The title field of the filter is empty.
+FIRSTNAME_INVALID	The first name is invalid.
 FOLDER_DEAC_AUTOFIX_ALL	Telegram is having internal problems. Please try again later
+FOLDER_ID_EMPTY	An empty folder ID was specified.
+FOLDER_ID_INVALID	Invalid folder ID.
+FORUM_ENABLED	You can't execute the specified action because the group is a [forum](https://core.telegram.org/api/forum), disable forum functionality to continue.
+FRESH_CHANGE_ADMINS_FORBIDDEN	You were just elected admin, you can't add or modify other admins yet.
+FROM_MESSAGE_BOT_DISABLED	Bots can't use fromMessage min constructors.
+FROM_PEER_INVALID	The specified from_id is invalid.
+GAME_BOT_INVALID	Bots can't send another bot's game.
+GENERAL_MODIFY_ICON_FORBIDDEN	You can't modify the icon of the "General" topic.
+GEO_POINT_INVALID	Invalid geoposition provided.
+GIFT_SLUG_EXPIRED	The specified gift slug has expired.
+GIFT_SLUG_INVALID	The specified slug is invalid.
+GIF_CONTENT_TYPE_INVALID	GIF content-type invalid.
+GIF_ID_INVALID	The provided GIF ID is invalid.
+GRAPH_EXPIRED_RELOAD	This graph has expired, please obtain a new graph token.
+GRAPH_INVALID_RELOAD	Invalid graph token provided, please reload the stats and provide the updated token.
+GRAPH_OUTDATED_RELOAD	The graph is outdated, please get a new async token using stats.getBroadcastStats.
 GROUPCALL_ADD_PARTICIPANTS_FAILED	Failure while adding voice chat member due to Telegram having internal problems. Please try again later
+GROUPCALL_ALREADY_DISCARDED	The group call was already discarded.
+GROUPCALL_ALREADY_STARTED	The groupcall has already started, you can join directly using [phone.joinGroupCall](https://core.telegram.org/method/phone.joinGroupCall).
+GROUPCALL_FORBIDDEN	The group call has already ended.
+GROUPCALL_INVALID	The specified group call is invalid.
+GROUPCALL_JOIN_MISSING	You haven't joined this group call.
+GROUPCALL_NOT_MODIFIED	Group call settings weren't modified.
+GROUPCALL_SSRC_DUPLICATE_MUCH	The app needs to retry joining the group call with a new SSRC value.
 GROUPED_ID_OCCUPY_FAILED	Telegram is having internal problems. Please try again later
+GROUPED_MEDIA_INVALID	Invalid grouped media.
+HASH_INVALID	The provided hash is invalid.
+HIDE_REQUESTER_MISSING	The join request was missing or was already handled.
 HISTORY_GET_FAILED	The chat history couldn't be retrieved due to Telegram having internal problems. Please try again later
 IMAGE_ENGINE_DOWN	Image engine down due to Telegram having internal problems. Please try again later
+IMAGE_PROCESS_FAILED	Failure while processing image.
+IMPORT_FILE_INVALID	The specified chat export file is invalid.
+IMPORT_FORMAT_UNRECOGNIZED	The specified chat export file was exported from an unsupported chat app.
+IMPORT_ID_INVALID	The specified import ID is invalid.
+IMPORT_TOKEN_INVALID	The specified token is invalid.
+INLINE_BOT_REQUIRED	Only the inline bot can edit message.
+INLINE_RESULT_EXPIRED	The inline query expired.
+INPUT_CHATLIST_INVALID	The specified folder is invalid.
+INPUT_FILTER_INVALID	The specified filter is invalid.
+INPUT_TEXT_EMPTY	The specified text is empty.
+INPUT_TEXT_TOO_LONG	The specified text is too long.
+INPUT_USER_DEACTIVATED	The specified user was deleted.
 INTERDC_X_CALL_ERROR	An error occurred while Telegram was intercommunicating with DC{value}. Please try again later
 INTERDC_X_CALL_RICH_ERROR	A rich error occurred while Telegram was intercommunicating with DC{value}. Please try again later
+INVITES_TOO_MUCH	The maximum number of per-folder invites specified by the `chatlist_invites_limit_default`/`chatlist_invites_limit_premium` [client configuration parameters »](/api/config#chatlist-invites-limit-default) was reached.
+INVITE_FORBIDDEN_WITH_JOINAS	If the user has anonymously joined a group call as a channel, they can't invite other users to the group call because that would cause deanonymization, because the invite would be sent using the original user ID, not the anonymized channel ID.
+INVITE_HASH_EMPTY	The invite hash is empty.
+INVITE_HASH_EXPIRED	The invite link has expired.
+INVITE_HASH_INVALID	The invite hash is invalid.
+INVITE_REQUEST_SENT	You have successfully requested to join this chat or channel.
+INVITE_REVOKED_MISSING	The specified invite link was already revoked or is invalid.
+INVITE_SLUG_EMPTY	The specified invite slug is empty.
+INVITE_SLUG_EXPIRED	The specified chat folder link has expired.
+INVOICE_PAYLOAD_INVALID	The specified invoice payload is invalid.
+JOIN_AS_PEER_INVALID	The specified peer cannot be used to join a group call.
+LANG_CODE_INVALID	The specified language code is invalid.
+LANG_CODE_NOT_SUPPORTED	The specified language code is not supported.
+LANG_PACK_INVALID	The provided language pack is invalid.
+LASTNAME_INVALID	The last name is invalid.
+LIMIT_INVALID	The provided limit is invalid.
+LINK_NOT_MODIFIED	Discussion link not modified.
+LOCATION_INVALID	The provided location is invalid.
+MAX_DATE_INVALID	The specified maximum date is invalid.
+MAX_ID_INVALID	The provided max ID is invalid.
+MAX_QTS_INVALID	The specified max_qts is invalid.
+MD5_CHECKSUM_INVALID	The MD5 checksums do not match.
+MEDIA_CAPTION_TOO_LONG	The caption is too long.
+MEDIA_EMPTY	The provided media object is invalid.
+MEDIA_FILE_INVALID	The specified media file is invalid.
+MEDIA_GROUPED_INVALID	You tried to send media of different types in an album.
+MEDIA_INVALID	Media invalid.
+MEDIA_NEW_INVALID	The new media is invalid.
+MEDIA_PREV_INVALID	Previous media invalid.
+MEDIA_TTL_INVALID	The specified media TTL is invalid.
+MEDIA_TYPE_INVALID	The specified media type cannot be used in stories.
+MEDIA_VIDEO_STORY_MISSING	
+MEGAGROUP_GEO_REQUIRED	This method can only be invoked on a geogroup.
+MEGAGROUP_ID_INVALID	Invalid supergroup ID.
+MEGAGROUP_PREHISTORY_HIDDEN	Group with hidden history for new members can't be set as discussion groups.
+MEGAGROUP_REQUIRED	You can only use this method on a supergroup.
 MEMBER_FETCH_FAILED	Telegram is having internal problems. Please try again later
 MEMBER_NO_LOCATION	Couldn't find the member's location due to Telegram having internal problems. Please try again later
 MEMBER_OCCUPY_PRIMARY_LOC_FAILED	Telegram is having internal problems. Please try again later
 MEMBER_OCCUPY_USERNAME_FAILED	Failure to occupy member username due to Telegram having internal problems. Please try again later
+MESSAGE_AUTHOR_REQUIRED	Message author required.
+MESSAGE_DELETE_FORBIDDEN	You can't delete one of the messages you tried to delete, most likely because it is a service message.
+MESSAGE_EDIT_TIME_EXPIRED	You can't edit this message anymore, too much time has passed since its creation.
+MESSAGE_EMPTY	The provided message is empty.
+MESSAGE_IDS_EMPTY	No message ids were provided.
+MESSAGE_ID_INVALID	The provided message id is invalid.
+MESSAGE_NOT_MODIFIED	The provided message data is identical to the previous message data, the message wasn't modified.
+MESSAGE_POLL_CLOSED	Poll closed.
+MESSAGE_TOO_LONG	The provided message is too long.
+METHOD_INVALID	The specified method is invalid.
+MIN_DATE_INVALID	The specified minimum date is invalid.
 MSGID_DECREASE_RETRY	Telegram is having internal problems. Please try again later
+MSG_ID_INVALID	Invalid message ID provided.
 MSG_RANGE_UNSYNC	Message range unsynchronized due to Telegram having internal problems. Please try again later
+MSG_TOO_OLD	[`chat_read_mark_expire_period` seconds](https://core.telegram.org/api/config#chat-read-mark-expire-period) have passed since the message was sent, read receipts were deleted.
+MSG_WAIT_FAILED	A waiting call returned an error.
 MT_SEND_QUEUE_TOO_LONG	The MTProto send queue has grown too much due to Telegram having internal problems. Please try again later
+MULTI_MEDIA_TOO_LONG	Too many media files for album.
 NEED_CHAT_INVALID	The provided chat is invalid
 NEED_MEMBER_INVALID	The provided member is invalid or does not exist
+NEW_SALT_INVALID	The new salt is invalid.
+NEW_SETTINGS_EMPTY	No password is set on the current account, and no new password was specified in `new_settings`.
+NEW_SETTINGS_INVALID	The new password settings are invalid.
+NEXT_OFFSET_INVALID	The specified offset is longer than 64 bytes.
 No workers running	The Telegram server is restarting its workers. Try again later.
+OFFSET_INVALID	The provided offset is invalid.
+OFFSET_PEER_ID_INVALID	The provided offset peer is invalid.
+OPTIONS_TOO_MUCH	Too many options provided.
+OPTION_INVALID	Invalid option selected.
+ORDER_INVALID	The specified username order is invalid.
+PACK_SHORT_NAME_INVALID	Short pack name invalid.
+PACK_SHORT_NAME_OCCUPIED	A stickerpack with this name already exists.
+PACK_TITLE_INVALID	The stickerpack title is invalid.
+PARTICIPANTS_TOO_FEW	Not enough participants.
 PARTICIPANT_CALL_FAILED	Failure while making call due to Telegram having internal problems. Please try again later
-PERSISTENT_TIMESTAMP_OUTDATED	The persistent timestamp is outdated due to Telegram having internal problems. Please try again later
+PARTICIPANT_ID_INVALID	The specified participant ID is invalid.
+PARTICIPANT_JOIN_MISSING	Trying to enable a presentation, when the user hasn't joined the Video Chat with [phone.joinGroupCall](https://core.telegram.org/method/phone.joinGroupCall).
+PARTICIPANT_VERSION_OUTDATED	The other participant does not use an up to date telegram client with support for calls.
+PASSWORD_EMPTY	The provided password is empty.
+PASSWORD_HASH_INVALID	The provided password hash is invalid.
+PASSWORD_MISSING	You must enable 2FA in order to transfer ownership of a channel.
+PASSWORD_RECOVERY_EXPIRED	The recovery code has expired.
+PASSWORD_RECOVERY_NA	No email was set, can't recover password via email.
+PASSWORD_REQUIRED	A [2FA password](https://core.telegram.org/api/srp) must be configured to use Telegram Passport.
+PASSWORD_TOO_FRESH_X	The password was modified less than 24 hours ago, try again in {value} seconds.
+PAYMENT_PROVIDER_INVALID	The specified payment provider is invalid.
+PEERS_LIST_EMPTY	The specified list of peers is empty.
+PEER_HISTORY_EMPTY	You can't pin an empty chat with a user.
+PEER_ID_INVALID	The provided peer id is invalid.
+PEER_ID_NOT_SUPPORTED	The provided peer ID is not supported.
+PERSISTENT_TIMESTAMP_EMPTY	Persistent timestamp empty.
+PERSISTENT_TIMESTAMP_INVALID	Persistent timestamp invalid.
+PERSISTENT_TIMESTAMP_OUTDATED	Channel internal replication issues, try again later (treat this like an RPC_CALL_FAIL).
+PHONE_CODE_EMPTY	phone_code is missing.
+PHONE_CODE_EXPIRED	The phone code you provided has expired.
+PHONE_CODE_HASH_EMPTY	phone_code_hash is missing.
+PHONE_CODE_INVALID	The provided phone code is invalid.
+PHONE_HASH_EXPIRED	An invalid or expired `phone_code_hash` was provided.
+PHONE_NOT_OCCUPIED	No user is associated to the specified phone number.
+PHONE_NUMBER_APP_SIGNUP_FORBIDDEN	You can't sign up using this app.
+PHONE_NUMBER_BANNED	The provided phone number is banned from telegram.
+PHONE_NUMBER_FLOOD	You asked for the code too many times.
+PHONE_NUMBER_INVALID	The phone number is invalid.
+PHONE_NUMBER_OCCUPIED	The phone number is already in use.
+PHONE_NUMBER_UNOCCUPIED	The phone number is not yet being used.
+PHONE_PASSWORD_PROTECTED	This phone is password protected.
+PHOTO_CONTENT_TYPE_INVALID	Photo mime-type invalid.
+PHOTO_CONTENT_URL_EMPTY	Photo URL invalid.
 PHOTO_CREATE_FAILED	The creation of the photo failed due to Telegram having internal problems. Please try again later
+PHOTO_CROP_FILE_MISSING	Photo crop file missing.
+PHOTO_CROP_SIZE_SMALL	Photo is too small.
+PHOTO_EXT_INVALID	The extension of the photo is invalid.
+PHOTO_FILE_MISSING	Profile photo file missing.
+PHOTO_ID_INVALID	Photo ID invalid.
+PHOTO_INVALID	Photo invalid.
+PHOTO_INVALID_DIMENSIONS	The photo dimensions are invalid.
+PHOTO_SAVE_FILE_INVALID	Internal issues, try again later.
+PHOTO_THUMB_URL_EMPTY	Photo thumbnail URL is empty.
+PINNED_DIALOGS_TOO_MUCH	Too many pinned dialogs.
+PIN_RESTRICTED	You can't pin messages.
+POLL_ANSWERS_INVALID	Invalid poll answers were provided.
+POLL_ANSWER_INVALID	One of the poll answers is not acceptable.
+POLL_OPTION_DUPLICATE	Duplicate poll options provided.
+POLL_OPTION_INVALID	Invalid poll option provided.
+POLL_QUESTION_INVALID	One of the poll questions is not acceptable.
+POLL_VOTE_REQUIRED	Cast a vote in the poll before calling this method.
 POSTPONED_TIMEOUT	Telegram is having internal problems. Please try again later
+PREMIUM_ACCOUNT_REQUIRED	A premium account is required to execute this action.
+PREMIUM_SUB_ACTIVE_UNTIL_X	You already have a premium subscription active until unixtime {value} .
+PRIVACY_KEY_INVALID	The privacy key is invalid.
+PRIVACY_PREMIUM_REQUIRED	You need a [Telegram Premium subscription](https://core.telegram.org/api/premium) to send a message to this user.
+PRIVACY_TOO_LONG	Too many privacy rules were specified, the current limit is 1000.
+PRIVACY_VALUE_INVALID	The specified privacy rule combination is invalid.
 PTS_CHANGE_EMPTY	No PTS change
-RANDOM_ID_DUPLICATE	You provided a random ID that was already used
+PUBLIC_CHANNEL_MISSING	You can only export group call invite links for public chats or channels.
+PUBLIC_KEY_REQUIRED	A public key is required.
+QUERY_ID_EMPTY	The query ID is empty.
+QUERY_ID_INVALID	The query ID is invalid.
+QUERY_TOO_SHORT	The query string is too short.
+QUIZ_ANSWER_MISSING	You can forward a quiz while hiding the original author only after choosing an option in the quiz.
+QUIZ_CORRECT_ANSWERS_EMPTY	No correct quiz answer was specified.
+QUIZ_CORRECT_ANSWERS_TOO_MUCH	You specified too many correct answers in a quiz, quizzes can only have one right answer!
+QUIZ_CORRECT_ANSWER_INVALID	An invalid value was provided to the correct_answers field.
+QUIZ_MULTIPLE_INVALID	Quizzes can't have the multiple_choice flag set!
+RANDOM_ID_DUPLICATE	You provided a random ID that was already used.
+RANDOM_ID_EMPTY	Random ID empty.
+RANDOM_ID_INVALID	A provided random ID is invalid.
+RANDOM_LENGTH_INVALID	Random length invalid.
+RANGES_INVALID	Invalid range provided.
+REACTIONS_TOO_MANY	The message already has exactly `reactions_uniq_max` reaction emojis, you can't react with a new emoji, see [the docs for more info »](/api/config#client-configuration).
+REACTION_EMPTY	Empty reaction provided.
+REACTION_INVALID	The specified reaction is invalid.
 REG_ID_GENERATE_FAILED	The registration id failed to generate due to Telegram having internal problems. Please try again later
+REPLY_MARKUP_BUY_EMPTY	Reply markup for buy button empty.
+REPLY_MARKUP_INVALID	The provided reply markup is invalid.
+REPLY_MARKUP_TOO_LONG	The specified reply_markup is too long.
+REPLY_MESSAGE_ID_INVALID	The specified reply-to message ID is invalid.
+REPLY_TO_INVALID	The specified `reply_to` field is invalid.
+REPLY_TO_USER_INVALID	The replied-to user is invalid.
+RESET_REQUEST_MISSING	No password reset is in progress.
+RESULTS_TOO_MUCH	Too many results were provided.
+RESULT_ID_DUPLICATE	You provided a duplicate result ID.
+RESULT_ID_EMPTY	Result ID empty.
+RESULT_ID_INVALID	One of the specified result IDs is invalid.
+RESULT_TYPE_INVALID	Result type invalid.
+REVOTE_NOT_ALLOWED	You cannot change your vote.
+RIGHTS_NOT_MODIFIED	The new admin rights are equal to the old rights, no change was made.
+RIGHT_FORBIDDEN	Your admin rights do not allow you to do this.
 RPC_CALL_FAIL	Telegram is having internal problems. Please try again later
 RPC_CONNECT_FAILED	Telegram is having internal problems. Please try again later
 RPC_MCGET_FAIL	Telegram is having internal problems. Please try again later
-SIGN_IN_FAILED	Failure while signing in due to Telegram having internal problems. Please try again later
+RPC_SEND_FAIL	Telegram is having internal problems. Please try again later
+RSA_DECRYPT_FAILED	Internal RSA decryption failed.
+SCHEDULE_BOT_NOT_ALLOWED	Bots cannot schedule messages.
+SCHEDULE_DATE_INVALID	Invalid schedule date provided.
+SCHEDULE_DATE_TOO_LATE	You can't schedule a message this far in the future.
+SCHEDULE_STATUS_PRIVATE	Can't schedule until user is online, if the user's last seen timestamp is hidden by their privacy settings.
+SCHEDULE_TOO_MUCH	There are too many scheduled messages.
+SCORE_INVALID	The specified game score is invalid.
+SEARCH_QUERY_EMPTY	The search query is empty.
+SEARCH_WITH_LINK_NOT_SUPPORTED	You cannot provide a search query and an invite link at the same time.
+SECONDS_INVALID	Invalid duration provided.
+SEND_AS_PEER_INVALID	You can't send messages as the specified peer.
+SEND_MEDIA_INVALID	The specified media is invalid.
+SEND_MESSAGE_MEDIA_INVALID	Invalid media provided.
+SEND_MESSAGE_TYPE_INVALID	The message type is invalid.
+SENSITIVE_CHANGE_FORBIDDEN	You can't change your sensitive content settings.
+SESSION_TOO_FRESH_X	This session was created less than 24 hours ago, try again in {value} seconds.
+SETTINGS_INVALID	Invalid settings were provided.
+SHA256_HASH_INVALID	The provided SHA256 hash is invalid.
+SHORT_NAME_INVALID	The specified short name is invalid.
+SHORT_NAME_OCCUPIED	The specified short name is already in use.
+SIGN_IN_FAILED	Failure while signing in.
+SLOTS_EMPTY	The specified slot list is empty.
+SLOWMODE_MULTI_MSGS_DISABLED	Slowmode is enabled, you cannot forward multiple messages to this group.
+SLOWMODE_WAIT_X	Slowmode is enabled in this chat: wait {value} seconds before sending another message to this chat.
+SLUG_INVALID	The specified invoice slug is invalid.
+SMS_CODE_CREATE_FAILED	An error occurred while creating the SMS code.
+SRP_ID_INVALID	Invalid SRP ID provided.
+SRP_PASSWORD_CHANGED	Password has changed.
+START_PARAM_EMPTY	The start parameter is empty.
+START_PARAM_INVALID	Start parameter invalid.
+START_PARAM_TOO_LONG	Start parameter is too long.
+STICKERPACK_STICKERS_TOO_MUCH	There are too many stickers in this stickerpack, you can't add any more.
+STICKERSET_INVALID	The provided sticker set is invalid.
+STICKERS_EMPTY	No sticker provided.
+STICKERS_TOO_MUCH	There are too many stickers in this stickerpack, you can't add any more.
+STICKER_DOCUMENT_INVALID	The specified sticker document is invalid.
+STICKER_EMOJI_INVALID	Sticker emoji invalid.
+STICKER_FILE_INVALID	Sticker file invalid.
+STICKER_GIF_DIMENSIONS	The specified video sticker has invalid dimensions.
+STICKER_ID_INVALID	The provided sticker ID is invalid.
+STICKER_INVALID	The provided sticker is invalid.
+STICKER_MIME_INVALID	The specified sticker MIME type is invalid.
+STICKER_PNG_DIMENSIONS	Sticker png dimensions invalid.
+STICKER_PNG_NOPNG	One of the specified stickers is not a valid PNG file.
+STICKER_TGS_NODOC	You must send the animated sticker as a document.
+STICKER_TGS_NOTGS	Invalid TGS sticker provided.
+STICKER_THUMB_PNG_NOPNG	Incorrect stickerset thumb file provided, PNG / WEBP expected.
+STICKER_THUMB_TGS_NOTGS	Incorrect stickerset TGS thumb file provided.
+STICKER_VIDEO_BIG	The specified video sticker is too big.
+STICKER_VIDEO_NODOC	You must send the video sticker as a document.
+STICKER_VIDEO_NOWEBM	The specified video sticker is not in webm format.
 STORAGE_CHECK_FAILED	Server storage check failed due to Telegram having internal problems. Please try again later
+STORAGE_CHOOSE_VOLUME_FAILED	Storage choose volume failed due to Telegram having internal problems. Please try again later
 STORE_INVALID_SCALAR_TYPE	Telegram is having internal problems. Please try again later
-TIMEOUT	A timeout occurred while fetching data from the worker
+STORIES_NEVER_CREATED	This peer hasn't ever posted any stories.
+STORIES_TOO_MUCH	You have hit the maximum active stories limit as specified by the [`story_expiring_limit_*` client configuration parameters](https://core.telegram.org/api/config#story-expiring-limit-default): you should buy a [Premium](/api/premium) subscription, delete an active story, or wait for the oldest story to expire.
+STORY_ID_EMPTY	You specified no story IDs.
+STORY_ID_INVALID	The specified story ID is invalid.
+STORY_NOT_MODIFIED	The new story information you passed is equal to the previous story information, thus it wasn't modified.
+STORY_PERIOD_INVALID	The specified story period is invalid for this account.
+STORY_SEND_FLOOD_MONTHLY_X	You've hit the monthly story limit as specified by the [`stories_sent_monthly_limit_*` client configuration parameters](https://core.telegram.org/api/config#stories-sent-monthly-limit-default): wait for the specified number of seconds before posting a new story.
+STORY_SEND_FLOOD_WEEKLY_X	You've hit the weekly story limit as specified by the [`stories_sent_weekly_limit_*` client configuration parameters](https://core.telegram.org/api/config#stories-sent-weekly-limit-default): wait for the specified number of seconds before posting a new story.
+SWITCH_PM_TEXT_EMPTY	The switch_pm.text field was empty.
+TAKEOUT_INIT_DELAY_X	Sorry, for security reasons, you will be able to begin downloading your data in {value} seconds. We have notified all your devices about the export request to make sure it's authorized and to give you time to react if it's not.
+TAKEOUT_INVALID	The specified takeout ID is invalid.
+TAKEOUT_REQUIRED	A [takeout](https://core.telegram.org/api/takeout) session needs to be initialized first, [see here » for more info](/api/takeout).
+TASK_ALREADY_EXISTS	An email reset was already requested.
+TEMP_AUTH_KEY_ALREADY_BOUND	The passed temporary key is already bound to another **perm_auth_key_id**.
+TEMP_AUTH_KEY_EMPTY	No temporary auth key provided.
+THEME_FILE_INVALID	Invalid theme file provided.
+THEME_FORMAT_INVALID	Invalid theme format provided.
+THEME_INVALID	Invalid theme provided.
+THEME_MIME_INVALID	The theme's MIME type is invalid.
+THEME_TITLE_INVALID	The specified theme title is invalid.
+TITLE_INVALID	The specified stickerpack title is invalid.
+TMP_PASSWORD_DISABLED	The temporary password is disabled.
+TOKEN_EMPTY	The specified token is empty.
+TOKEN_INVALID	The provided token is invalid.
+TOKEN_TYPE_INVALID	The specified token type is invalid.
+TOPICS_EMPTY	You specified no topic IDs.
+TOPIC_CLOSED	This topic was closed, you can't send messages to it anymore.
+TOPIC_CLOSE_SEPARATELY	The `close` flag cannot be provided together with any of the other flags.
+TOPIC_DELETED	The specified topic was deleted.
+TOPIC_HIDE_SEPARATELY	The `hide` flag cannot be provided together with any of the other flags.
+TOPIC_ID_INVALID	The specified topic ID is invalid.
+TOPIC_NOT_MODIFIED	The updated topic info is equal to the current topic info, nothing was changed.
+TOPIC_TITLE_EMPTY	The specified topic title is empty.
+TO_LANG_INVALID	The specified destination language is invalid.
+TRANSCRIPTION_FAILED	Audio transcription failed.
+TRANSLATE_REQ_FAILED	Translation failed, please try again later.
+TRANSLATION_TIMEOUT	A timeout occurred while translating the specified text.
+TTL_DAYS_INVALID	The provided TTL is invalid.
+TTL_MEDIA_INVALID	Invalid media Time To Live was provided.
+TTL_PERIOD_INVALID	The specified TTL period is invalid.
+TYPES_EMPTY	No top peer type was provided.
 UNKNOWN_METHOD	The method you tried to call cannot be called on non-CDN DCs
+UNTIL_DATE_INVALID	Invalid until date provided.
 UPLOAD_NO_VOLUME	Telegram is having internal problems. Please try again later
+URL_INVALID	Invalid URL provided.
+USAGE_LIMIT_INVALID	The specified usage limit is invalid.
+USERNAMES_ACTIVE_TOO_MUCH	The maximum number of active usernames was reached.
+USERNAME_INVALID	The provided username is not valid.
+USERNAME_NOT_MODIFIED	The username was not modified.
+USERNAME_NOT_OCCUPIED	The provided username is not occupied.
+USERNAME_OCCUPIED	The provided username is already occupied.
+USERNAME_PURCHASE_AVAILABLE	The specified username can be purchased on https://fragment.com.
+USERPIC_UPLOAD_REQUIRED	You must have a profile picture to publish your geolocation.
+USERS_TOO_FEW	Not enough users (to create a chat, for example).
+USERS_TOO_MUCH	The maximum number of users has been exceeded (to create a chat, for example).
+USER_ADMIN_INVALID	You're not an admin.
+USER_ALREADY_INVITED	You have already invited this user.
+USER_ALREADY_PARTICIPANT	The user is already in the group.
+USER_BANNED_IN_CHANNEL	You're banned from sending messages in supergroups/channels.
+USER_BLOCKED	User blocked.
+USER_BOT	Bots can only be admins in channels.
+USER_BOT_INVALID	User accounts must provide the `bot` method parameter when calling this method. If there is no such method parameter, this method can only be invoked by bot accounts.
+USER_BOT_REQUIRED	This method can only be called by a bot.
+USER_CHANNELS_TOO_MUCH	One of the users you tried to add is already in too many channels/supergroups.
+USER_CREATOR	You can't leave this channel, because you're its creator.
+USER_DELETED	You can't send this secret message because the other participant deleted their account.
+USER_ID_INVALID	The provided user ID is invalid.
+USER_INVALID	Invalid user provided.
+USER_IS_BLOCKED	You were blocked by this user.
+USER_IS_BOT	Bots can't send messages to other bots.
+USER_KICKED	This user was kicked from this supergroup/channel.
+USER_NOT_MUTUAL_CONTACT	The provided user is not a mutual contact.
+USER_NOT_PARTICIPANT	You're not a member of this supergroup/channel.
+USER_PRIVACY_RESTRICTED	The user's privacy settings do not allow you to do this.
+USER_PUBLIC_MISSING	Cannot generate a link to stories posted by a peer without a username.
+USER_RESTRICTED	You're spamreported, you can't create channels or chats.
+USER_VOLUME_INVALID	The specified user volume is invalid.
+VENUE_ID_INVALID	The specified venue ID is invalid.
+VIDEO_CONTENT_TYPE_INVALID	The video's content type is invalid.
+VIDEO_FILE_INVALID	The specified video file is invalid.
+VIDEO_TITLE_EMPTY	The specified video title is empty.
+VOICE_MESSAGES_FORBIDDEN	This user's privacy settings forbid you from sending voice messages.
 VOLUME_LOC_NOT_FOUND	Telegram is having internal problems. Please try again later
+WALLPAPER_FILE_INVALID	The specified wallpaper file is invalid.
+WALLPAPER_INVALID	The specified wallpaper is invalid.
+WALLPAPER_MIME_INVALID	The specified wallpaper MIME type is invalid.
+WALLPAPER_NOT_FOUND	The specified wallpaper could not be found.
+WC_CONVERT_URL_INVALID	WC convert URL invalid.
+WEBDOCUMENT_INVALID	Invalid webdocument URL provided.
+WEBDOCUMENT_MIME_INVALID	Invalid webdocument mime type provided.
+WEBDOCUMENT_SIZE_TOO_BIG	Webdocument is too big!
+WEBDOCUMENT_URL_INVALID	The specified webdocument URL is invalid.
+WEBPAGE_CURL_FAILED	Failure while fetching the webpage with cURL.
+WEBPAGE_MEDIA_EMPTY	Webpage media empty.
+WEBPAGE_NOT_FOUND	A preview for the specified webpage `url` could not be generated.
+WEBPAGE_URL_INVALID	The specified webpage `url` is invalid.
+WEBPUSH_AUTH_INVALID	The specified web push authentication secret is invalid.
+WEBPUSH_KEY_INVALID	The specified web push elliptic curve Diffie-Hellman public key is invalid.
+WEBPUSH_TOKEN_INVALID	The specified web push token is invalid.
 WORKER_BUSY_TOO_LONG_RETRY	Server workers are too busy right now due to Telegram having internal problems. Please try again later
 WP_ID_GENERATE_FAILED	Telegram is having internal problems. Please try again later
-FILE_WRITE_FAILED	Telegram is having internal problems. Please try again later
\ No newline at end of file
+YOU_BLOCKED_USER	You blocked this user.
\ No newline at end of file
diff --git a/compiler/errors/source/503_SERVICE_UNAVAILABLE.tsv b/compiler/errors/source/503_SERVICE_UNAVAILABLE.tsv
index 4db95a10..0164c93a 100644
--- a/compiler/errors/source/503_SERVICE_UNAVAILABLE.tsv
+++ b/compiler/errors/source/503_SERVICE_UNAVAILABLE.tsv
@@ -1,4 +1,4 @@
 id	message
 ApiCallError	Telegram is having internal problems. Please try again later.
-Timeout	Telegram is having internal problems. Please try again later.
 Timedout	Telegram is having internal problems. Please try again later.
+Timeout	Telegram is having internal problems. Please try again later.
\ No newline at end of file
diff --git a/docs/source/conf.py b/docs/source/conf.py
index 58af3fb7..51585914 100644
--- a/docs/source/conf.py
+++ b/docs/source/conf.py
@@ -24,14 +24,13 @@
 sys.path.insert(0, os.path.abspath("../.."))
 
 project = "Pyrogram-Mod"
-copyright = f"2017-present, Dan"
-author = "Dan"
+copyright = f"2017-present, Dan (Original Author), Fork Maintainer: Pyrogram-Mod Developers"
+author = "Dan (Original Author), Fork Maintainer: Pyrogram-Mod Developers"
 
 version = ".".join(__version__.split(".")[:-1])
 
 extensions = [
     "sphinx.ext.autodoc",
-    "sphinx.ext.viewcode",
     "sphinx.ext.autosummary",
     "sphinx.ext.napoleon",
     "sphinx.ext.intersphinx",
@@ -47,21 +46,8 @@
 autodoc_member_order = "bysource"
 
 templates_path = ["../resources/templates"]
-html_copy_source = False
-
-napoleon_use_rtype = False
-napoleon_use_param = False
-
-# The name of the Pygments (syntax highlighting) style to use.
-pygments_style = "sphinx"
-
-# Decides the language used for syntax highlighting of code blocks.
-highlight_language = "python3"
-
-copybutton_prompt_text = "$ "
-
-suppress_warnings = ["image.not_readable"]
 
+html_copy_source = False
 html_title = "Pyrogram-Mod Documentation"
 html_theme = "furo"
 html_static_path = [os.path.abspath("static")]
@@ -77,7 +63,6 @@
     "navigation_with_keys": True,
     "footer_icons": [
         {
-            # Telegram channel logo
             "name": "Telegram Channel",
             "url": "https://t.me/PyrogramModNews/",
             "html": (
@@ -114,6 +99,7 @@
         },
     ]
 }
+
 latex_engine = "xelatex"
 latex_logo = os.path.abspath("static/img/pyrogram.png")
 print("latex_logo", latex_logo)
@@ -126,3 +112,13 @@
         \setmonofont{Ubuntu Mono}
         """
 }
+
+napoleon_use_rtype = False
+napoleon_use_param = False
+
+pygments_style = "sphinx"
+highlight_language = "python3"
+
+copybutton_prompt_text = "$ "
+
+suppress_warnings = ["image.not_readable"]
diff --git a/docs/source/index.rst b/docs/source/index.rst
index ddeab073..0d4f077a 100644
--- a/docs/source/index.rst
+++ b/docs/source/index.rst
@@ -14,15 +14,15 @@ Welcome to PyrogramMod
         Telegram MTProto API Framework for Python
 
         
- + Homepage • - + Development • - + News

diff --git a/docs/source/intro/quickstart.rst b/docs/source/intro/quickstart.rst index e97ef448..1db2ca99 100644 --- a/docs/source/intro/quickstart.rst +++ b/docs/source/intro/quickstart.rst @@ -6,12 +6,6 @@ The next few steps serve as a quick start to see Pyrogram in action as fast as p Get Pyrogram Real Fast ---------------------- -.. admonition :: Cloud Credits - :class: tip - - If you need a cloud server to host your applications, try Hetzner Cloud. You can sign up with - `this link `_ to get €20 in cloud credits. - 1. Install Pyrogram with ``pip3 install -U https://github.com/pyrogrammod/pyrogrammod/archive/main.zip``. 2. Get your own Telegram API key from https://my.telegram.org/apps. @@ -53,4 +47,4 @@ we have just done above. If you are feeling eager to continue you can take a shortcut to :doc:`../start/invoking` and come back later to learn some more details. -.. _community: https://t.me/Pyrogram +.. _community: https://t.me/pyrogramodchat diff --git a/docs/source/topics/text-formatting.rst b/docs/source/topics/text-formatting.rst index 425cd9c5..5cb4471a 100644 --- a/docs/source/topics/text-formatting.rst +++ b/docs/source/topics/text-formatting.rst @@ -31,7 +31,7 @@ list of the basic styles currently supported by Pyrogram. - :strike:`strike` - :underline:`underline` - spoiler -- `text URL `_ +- `text URL `_ - `user text mention `_ - ``inline fixed-width code`` - .. code-block:: text @@ -84,7 +84,7 @@ To strictly use this mode, pass :obj:`~pyrogram.enums.ParseMode.MARKDOWN` to the "--underline--, " "~~strike~~, " "||spoiler||, " - "[URL](https://pyrogrammod.github.io), " + "[URL](https://pyrogrammod.readthedocs.io), " "`code`, " "```" "for i in range(10):\n" diff --git a/hatch_build.py b/hatch_build.py new file mode 100644 index 00000000..7447e711 --- /dev/null +++ b/hatch_build.py @@ -0,0 +1,28 @@ +import os +import sys + +from hatchling.builders.hooks.plugin.interface import BuildHookInterface + + +class CustomHook(BuildHookInterface): + def initialize(self, version, build_data): + if self.target_name not in {"wheel", "install"}: + return + + sys.path.insert(0, os.path.abspath(os.path.dirname(__file__))) + + try: + from compiler.api.compiler import start as compile_api + from compiler.errors.compiler import start as compile_errors + except ImportError as e: + raise RuntimeError("Could not import compiler.") from e + + try: + compile_api() + except Exception as e: + raise RuntimeError("Could not compile compiler.") from e + + try: + compile_errors() + except Exception as e: + raise RuntimeError("Could not compile errors.") from e diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..514503ba --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,90 @@ +[build-system] +build-backend = "hatchling.build" +requires = ["hatchling>=1.27.0"] + +[project] +name = "pyrogrammod" +description = "Modified version of the Pyrogram Telegram MTProto API framework in Python for users and bots." +readme = "README.md" +license = { text = "LGPL-3.0-or-GPL-3.0" } +requires-python = ">=3.9" +authors = [ + { name = "Dan (original author)" }, + { name = "PyrogramMod (Fork Maintainer)" } +] +dynamic = ["version"] +keywords = ["telegram", "chat", "messenger", "mtproto", "api", "client", "library", "python"] + +dependencies = [ + "aiofiles>=24.1.0", + "pyaes==1.6.1", + "pysocks==1.7.1", +] + +classifiers = [ + "Development Status :: 5 - Production/Stable", + "Intended Audience :: Developers", + "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", + "Natural Language :: English", + "Operating System :: OS Independent", + "Programming Language :: Python", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.9", + "Programming Language :: Python :: 3.10", + "Programming Language :: Python :: 3.11", + "Programming Language :: Python :: 3.12", + "Programming Language :: Python :: 3.13", + "Programming Language :: Python :: Implementation", + "Programming Language :: Python :: Implementation :: CPython", + "Programming Language :: Python :: Implementation :: PyPy", + "Topic :: Communications", + "Topic :: Communications :: Chat", + "Topic :: Internet", + "Topic :: Software Development :: Libraries", + "Topic :: Software Development :: Libraries :: Application Frameworks", + "Topic :: Software Development :: Libraries :: Python Modules" +] + +[project.optional-dependencies] +docs = [ + "furo>=2024.8.6", + "pygments>=2.19.1", + "sphinx>=8.0.0", + "sphinx-autobuild>=2024.10.3", + "sphinx-copybutton>=0.5.2" +] +dev = [ + "pytest>=7.0.0", + "pytest-asyncio>=1.2.0", + "pytest-cov>=7.0.0" +] +py_tgcalls = [ + "py-tgcalls>=2.2.5", +] + +[project.urls] +Homepage = "https://pyrogrammod.readthedocs.io" +Tracker = "https://github.com/PyrogramMod/PyrogramMod/issues" +Community = "https://t.me/pyrogramodchat" +Source = "https://github.com/PyrogramMod/PyrogramMod" +Documentation = "https://pyrogrammod.readthedocs.io" + +[tool.hatch.version] +path = "pyrogram/__init__.py" + +[tool.hatch.build.hooks.custom] +module = "scripts.hatch_gen_api" + +[tool.hatch.metadata] +allow-direct-references = true + +[tool.hatch.build.targets.sdist] +exclude = [ + ".gitignore", + "docs/", + "tests/" +] + +[tool.hatch.build.targets.wheel] +ignore-vcs = true +packages = ["pyrogram"] diff --git a/pyrogram/__init__.py b/pyrogram/__init__.py index 7ab55c33..2c17e56f 100644 --- a/pyrogram/__init__.py +++ b/pyrogram/__init__.py @@ -16,7 +16,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with Pyrogram. If not, see . -__version__ = "2.1.1" +__version__ = "2.3.1" __license__ = "GNU Lesser General Public License v3.0 (LGPL-3.0)" __copyright__ = "Copyright (C) 2017-present Dan " diff --git a/pyrogram/client.py b/pyrogram/client.py index 0ce34fe2..5c7f781e 100644 --- a/pyrogram/client.py +++ b/pyrogram/client.py @@ -26,13 +26,16 @@ import shutil import sys from concurrent.futures.thread import ThreadPoolExecutor +from configparser import ConfigParser from datetime import datetime, timedelta from hashlib import sha256 from importlib import import_module from io import StringIO, BytesIO from mimetypes import MimeTypes from pathlib import Path -from typing import Union, List, Optional, Callable, AsyncGenerator, Type +from typing import Union, List, Optional, Callable, AsyncGenerator, Type, Tuple + +import aiofiles import pyrogram from pyrogram import __version__, __license__ @@ -40,13 +43,18 @@ from pyrogram import raw from pyrogram import utils from pyrogram.crypto import aes -from pyrogram.errors import CDNFileHashMismatch, AuthBytesInvalid +from pyrogram.errors import CDNFileHashMismatch, AuthBytesInvalid, ChannelInvalid, PersistentTimestampInvalid, \ + PersistentTimestampOutdated from pyrogram.errors import ( SessionPasswordNeeded, VolumeLocNotFound, ChannelPrivate, - BadRequest, - FloodWait, - FloodPremiumWait + BadRequest, + AuthBytesInvalid, + FloodWait, + FloodPremiumWait, + ChannelInvalid, + PersistentTimestampInvalid, + PersistentTimestampOutdated ) from pyrogram.handlers.handler import Handler from pyrogram.methods import Methods @@ -151,6 +159,10 @@ class Client(Methods): The working directory is the location in the filesystem where Pyrogram will store the session files. Defaults to the parent directory of the main script. + config_file (``str``, *optional*): + Path of the configuration file. + If not provided, the default behavior is to not use any configuration file. + plugins (``dict``, *optional*): Smart Plugins settings as dict, e.g.: *dict(root="plugins")*. @@ -186,13 +198,13 @@ class Client(Methods): Defaults to False, because ``getpass`` (the library used) is known to be problematic in some terminal environments. - max_concurrent_transmissions (``bool``, *optional*): + max_concurrent_transmissions (``int``, *optional*): Set the maximum amount of concurrent transmissions (uploads & downloads). A value that is too high may result in network related issues. Defaults to 1. """ - APP_VERSION = f"Pyrogram {__version__}" + APP_VERSION = f"PyrogramMod {__version__}" DEVICE_MODEL = f"{platform.python_implementation()} {platform.python_version()}" SYSTEM_VERSION = f"{platform.system()} {platform.release()}" @@ -204,6 +216,7 @@ class Client(Methods): TME_PUBLIC_LINK_RE = re.compile(r"^(?:https?://)?(?:www|([\w-]+)\.)?(?:t(?:elegram)?\.(?:org|me|dog))/?([\w-]+)?$") WORKERS = min(32, (os.cpu_count() or 0) + 4) # os.cpu_count() can be None WORKDIR = PARENT_DIR + CONFIG_FILE = PARENT_DIR / "config.ini" # Interval of seconds in which the updates watchdog will kick in UPDATES_WATCHDOG_INTERVAL = 15 * 60 @@ -234,6 +247,7 @@ def __init__( workers: int = WORKERS, message_cache: int = 10000, workdir: str = WORKDIR, + config_file: str = None, plugins: dict = None, parse_mode: "enums.ParseMode" = enums.ParseMode.DEFAULT, no_updates: bool = None, @@ -317,6 +331,7 @@ def __init__( self.last_update_time = datetime.now() self.loop = asyncio.get_event_loop() + self.config_file = config_file def __enter__(self): return self.start() @@ -576,14 +591,14 @@ async def handle_updates(self, updates): pts = getattr(update, "pts", None) pts_count = getattr(update, "pts_count", None) - if pts: + if pts and not self.skip_updates: await self.storage.update_state( ( - utils.get_channel_id(channel_id) if channel_id else self.me.id, + utils.get_channel_id(channel_id) if channel_id else 0, pts, None, updates.date, - None + updates.seq ) ) @@ -594,22 +609,33 @@ async def handle_updates(self, updates): message = update.message if not isinstance(message, raw.types.MessageEmpty): - try: - diff = await self.invoke( - raw.functions.updates.GetChannelDifference( - channel=await self.resolve_peer(utils.get_channel_id(channel_id)), - filter=raw.types.ChannelMessagesFilter( - ranges=[raw.types.MessageRange( - min_id=update.message.id, - max_id=update.message.id - )] - ), - pts=pts - pts_count, - limit=pts + retries = 5 + while retries > 0: + try: + diff = await self.invoke( + raw.functions.updates.GetChannelDifference( + channel=await self.resolve_peer(utils.get_channel_id(channel_id)), + filter=raw.types.ChannelMessagesFilter( + ranges=[raw.types.MessageRange( + min_id=update.message.id, + max_id=update.message.id + )] + ), + pts=pts - pts_count, + limit=pts, + force=False + ) ) - ) - except ChannelPrivate: - pass + break + except (ChannelPrivate, PersistentTimestampOutdated, PersistentTimestampInvalid): + pass + except OSError as e: + log.error(f"Connection error while fetching ChannelDifference: {e}. Retrying...") + retries -= 1 + if retries == 0: + log.error(f"Max retries reached for ChannelDifference: {e}") + raise + await asyncio.sleep(5) else: if not isinstance(diff, raw.types.updates.ChannelDifferenceEmpty): users.update({u.id: u for u in diff.users}) @@ -617,23 +643,35 @@ async def handle_updates(self, updates): self.dispatcher.updates_queue.put_nowait((update, users, chats)) elif isinstance(updates, (raw.types.UpdateShortMessage, raw.types.UpdateShortChatMessage)): - await self.storage.update_state( - ( - self.me.id, - updates.pts, - None, - updates.date, - None + if not self.skip_updates: + await self.storage.update_state( + ( + 0, + updates.pts, + None, + updates.date, + None + ) ) - ) - diff = await self.invoke( - raw.functions.updates.GetDifference( - pts=updates.pts - updates.pts_count, - date=updates.date, - qts=-1 - ) - ) + retries = 5 + while retries > 0: + try: + diff = await self.invoke( + raw.functions.updates.GetDifference( + pts=updates.pts - updates.pts_count, + date=updates.date, + qts=-1 + ) + ) + break + except OSError as e: + log.error(f"Connection error during GetDifference: {e}. Retrying...") + retries -= 1 + if retries == 0: + log.error(f"Max retries reached for GetDifference: {e}") + raise + await asyncio.sleep(5) if diff.new_messages: self.dispatcher.updates_queue.put_nowait(( @@ -653,6 +691,126 @@ async def handle_updates(self, updates): elif isinstance(updates, raw.types.UpdatesTooLong): log.info(updates) + async def load_config(self): + if self.config_file is None: + return + + if not os.path.isfile(self.config_file): + raise FileNotFoundError(f"The configuration file at {self.config_file} does not exist.") + + async with aiofiles.open(self.config_file, mode='r') as file: + contents = await file.read() + + parser = ConfigParser() + parser.read_string(contents) + + if not self.bot_token: + self.bot_token = parser.get("pyrogram_mod", "bot_token", fallback=None) + + if not (self.api_id and self.api_hash): + if parser.has_section("pyrogram_mod"): + self.api_id = parser.getint("pyrogram_mod", "api_id") + self.api_hash = parser.get("pyrogram_mod", "api_hash") + else: + raise AttributeError("No API Key found. More info: https://pyrogrammod.readthedocs.io/start/setup.html") + + for option in ["app_version", "device_model", "system_version", "lang_code"]: + if not getattr(self, option): + if parser.has_section("pyrogram_mod"): + setattr(self, option, parser.get( + "pyrogram_mod", + option, + fallback=getattr(Client, option.upper()) + )) + else: + setattr(self, option, getattr(Client, option.upper())) + + async def recover_gaps(self) -> Tuple[int, int]: + states = await self.storage.update_state() + + message_updates_counter = 0 + other_updates_counter = 0 + + if not states: + log.info("No states found, skipping recovery.") + return (message_updates_counter, other_updates_counter) + + for state in states: + id, local_pts, _, local_date, _ = state + + prev_pts = 0 + + while True: + try: + diff = await self.invoke( + raw.functions.updates.GetChannelDifference( + channel=await self.resolve_peer(id), + filter=raw.types.ChannelMessagesFilterEmpty(), + pts=local_pts, + limit=10000, + force=False + ) if id < 0 else + raw.functions.updates.GetDifference( + pts=local_pts, + date=local_date, + qts=0 + ) + ) + except (ChannelPrivate, ChannelInvalid, PersistentTimestampOutdated, PersistentTimestampInvalid): + break + + if isinstance(diff, raw.types.updates.DifferenceEmpty): + break + elif isinstance(diff, raw.types.updates.DifferenceTooLong): + break + elif isinstance(diff, raw.types.updates.Difference): + local_pts = diff.state.pts + elif isinstance(diff, raw.types.updates.DifferenceSlice): + local_pts = diff.intermediate_state.pts + local_date = diff.intermediate_state.date + + if prev_pts == local_pts: + break + + prev_pts = local_pts + elif isinstance(diff, raw.types.updates.ChannelDifferenceEmpty): + break + elif isinstance(diff, raw.types.updates.ChannelDifferenceTooLong): + break + elif isinstance(diff, raw.types.updates.ChannelDifference): + local_pts = diff.pts + + users = {i.id: i for i in diff.users} + chats = {i.id: i for i in diff.chats} + + for message in diff.new_messages: + message_updates_counter += 1 + self.dispatcher.updates_queue.put_nowait( + ( + raw.types.UpdateNewMessage( + message=message, + pts=local_pts, + pts_count=-1 + ), + users, + chats + ) + ) + + for update in diff.other_updates: + other_updates_counter += 1 + self.dispatcher.updates_queue.put_nowait( + (update, users, chats) + ) + + if isinstance(diff, (raw.types.updates.Difference, raw.types.updates.ChannelDifference)): + break + + await self.storage.update_state(id) + + log.info("Recovered %s messages and %s updates.", message_updates_counter, other_updates_counter) + return (message_updates_counter, other_updates_counter) + async def load_session(self): await self.storage.open() @@ -819,14 +977,14 @@ def load_plugins(self): log.warning('[%s] No plugin loaded from "%s"', self.name, root) async def handle_download(self, packet): - file_id, directory, file_name, in_memory, file_size, progress, progress_args = packet + file_id, directory, file_name, in_memory, file_size, progress, progress_args, workers, chunk_size, use_experimental_download_boost = packet os.makedirs(directory, exist_ok=True) if not in_memory else None temp_file_path = os.path.abspath(re.sub("\\\\", "/", os.path.join(directory, file_name))) + ".temp" file = BytesIO() if in_memory else open(temp_file_path, "wb") try: - async for chunk in self.get_file(file_id, file_size, 0, 0, progress, progress_args): + async for chunk in self.get_file(file_id, file_size, 0, 0, progress, progress_args, workers, chunk_size, use_experimental_download_boost): file.write(chunk) except BaseException as e: if not in_memory: @@ -857,7 +1015,10 @@ async def get_file( limit: int = 0, offset: int = 0, progress: Callable = None, - progress_args: tuple = () + progress_args: tuple = (), + workers: int = 4, + chunk_size: int = 1024 * 1024, + use_experimental_download_boost: bool = False ) -> AsyncGenerator[bytes, None]: async with self.get_file_semaphore: file_type = file_id.file_type @@ -899,11 +1060,6 @@ async def get_file( thumb_size=file_id.thumbnail_size ) - current = 0 - total = abs(limit) or (1 << 31) - 1 - chunk_size = 1024 * 1024 - offset_bytes = abs(offset) * chunk_size - dc_id = file_id.dc_id try: @@ -941,133 +1097,238 @@ async def get_file( else: raise AuthBytesInvalid - r = await session.invoke( - raw.functions.upload.GetFile( - location=location, - offset=offset_bytes, - limit=chunk_size - ), - sleep_threshold=30 - ) + if not use_experimental_download_boost: + current = 0 + total = abs(limit) or (1 << 31) - 1 + offset_bytes = abs(offset) * chunk_size + + r = await session.invoke( + raw.functions.upload.GetFile( + location=location, + offset=offset_bytes, + limit=chunk_size + ), + sleep_threshold=30 + ) - if isinstance(r, raw.types.upload.File): - while True: - chunk = r.bytes + if isinstance(r, raw.types.upload.File): + while True: + chunk = r.bytes + + yield chunk + + current += 1 + offset_bytes += chunk_size - yield chunk + if progress: + func = functools.partial( + progress, + min(offset_bytes, file_size) + if file_size != 0 + else offset_bytes, + file_size, + *progress_args + ) + if inspect.iscoroutinefunction(progress): + await func() + else: + await self.loop.run_in_executor(self.executor, func) - current += 1 - offset_bytes += chunk_size + if len(chunk) < chunk_size or current >= total: + break - if progress: - func = functools.partial( - progress, - min(offset_bytes, file_size) - if file_size != 0 - else offset_bytes, - file_size, - *progress_args + r = await session.invoke( + raw.functions.upload.GetFile( + location=location, + offset=offset_bytes, + limit=chunk_size + ), + sleep_threshold=30 ) - if inspect.iscoroutinefunction(progress): - await func() - else: - await self.loop.run_in_executor(self.executor, func) + elif isinstance(r, raw.types.upload.FileCdnRedirect): + cdn_session = Session( + self, r.dc_id, await Auth(self, r.dc_id, await self.storage.test_mode()).create(), + await self.storage.test_mode(), is_media=True, is_cdn=True + ) - if len(chunk) < chunk_size or current >= total: - break + try: + await cdn_session.start() + + while True: + r2 = await cdn_session.invoke( + raw.functions.upload.GetCdnFile( + file_token=r.file_token, + offset=offset_bytes, + limit=chunk_size + ) + ) + + if isinstance(r2, raw.types.upload.CdnFileReuploadNeeded): + try: + await session.invoke( + raw.functions.upload.ReuploadCdnFile( + file_token=r.file_token, + request_token=r2.request_token + ) + ) + except VolumeLocNotFound: + break + else: + continue + + chunk = r2.bytes + + # https://core.telegram.org/cdn#decrypting-files + decrypted_chunk = aes.ctr256_decrypt( + chunk, + r.encryption_key, + bytearray( + r.encryption_iv[:-4] + + (offset_bytes // 16).to_bytes(4, "big") + ) + ) + + hashes = await session.invoke( + raw.functions.upload.GetCdnFileHashes( + file_token=r.file_token, + offset=offset_bytes + ) + ) + + # https://core.telegram.org/cdn#verifying-files + for i, h in enumerate(hashes): + cdn_chunk = decrypted_chunk[h.limit * i: h.limit * (i + 1)] + CDNFileHashMismatch.check( + h.hash == sha256(cdn_chunk).digest(), + "h.hash == sha256(cdn_chunk).digest()" + ) + + yield decrypted_chunk + + current += 1 + offset_bytes += chunk_size + + if progress: + func = functools.partial( + progress, + min(offset_bytes, file_size) if file_size != 0 else offset_bytes, + file_size, + *progress_args + ) + + if inspect.iscoroutinefunction(progress): + await func() + else: + await self.loop.run_in_executor(self.executor, func) + if len(chunk) < chunk_size or current >= total: + break + except Exception as e: + raise e + finally: + await cdn_session.stop() + else: + total = abs(limit) or file_size or (1 << 31) - 1 + total_chunks = (total + chunk_size - 1) // chunk_size + next_chunk = 0 + completed = 0 + buffer = {} + + async def _fetch_chunk(idx: int): + offset_bytes = idx * chunk_size r = await session.invoke( raw.functions.upload.GetFile( location=location, offset=offset_bytes, limit=chunk_size ), - sleep_threshold=30 + sleep_threshold=5 ) - elif isinstance(r, raw.types.upload.FileCdnRedirect): - cdn_session = Session( - self, r.dc_id, await Auth(self, r.dc_id, await self.storage.test_mode()).create(), - await self.storage.test_mode(), is_media=True, is_cdn=True - ) - - try: - await cdn_session.start() - - while True: - r2 = await cdn_session.invoke( - raw.functions.upload.GetCdnFile( - file_token=r.file_token, - offset=offset_bytes, - limit=chunk_size - ) + if isinstance(r, raw.types.upload.File): + return idx, r.bytes + elif isinstance(r, raw.types.upload.FileCdnRedirect): + cdn_session = Session( + self, r.dc_id, + await Auth(self, r.dc_id, await self.storage.test_mode()).create(), + await self.storage.test_mode(), + is_media=True, + is_cdn=True ) - - if isinstance(r2, raw.types.upload.CdnFileReuploadNeeded): - try: + await cdn_session.start() + try: + r2 = await cdn_session.invoke( + raw.functions.upload.GetCdnFile( + file_token=r.file_token, + offset=offset_bytes, + limit=chunk_size + ) + ) + if isinstance(r2, raw.types.upload.CdnFileReuploadNeeded): await session.invoke( raw.functions.upload.ReuploadCdnFile( file_token=r.file_token, request_token=r2.request_token ) ) - except VolumeLocNotFound: - break - else: - continue - - chunk = r2.bytes - - # https://core.telegram.org/cdn#decrypting-files - decrypted_chunk = aes.ctr256_decrypt( - chunk, - r.encryption_key, - bytearray( - r.encryption_iv[:-4] - + (offset_bytes // 16).to_bytes(4, "big") + return await _fetch_chunk(idx) + + chunk = r2.bytes + decrypted_chunk = aes.ctr256_decrypt( + chunk, + r.encryption_key, + bytearray( + r.encryption_iv[:-4] + + (offset_bytes // 16).to_bytes(4, "big") + ) ) - ) - - hashes = await session.invoke( - raw.functions.upload.GetCdnFileHashes( - file_token=r.file_token, - offset=offset_bytes + hashes = await session.invoke( + raw.functions.upload.GetCdnFileHashes( + file_token=r.file_token, + offset=offset_bytes + ) ) - ) + for i, h in enumerate(hashes): + cdn_chunk = decrypted_chunk[h.limit * i: h.limit * (i + 1)] + CDNFileHashMismatch.check( + h.hash == sha256(cdn_chunk).digest(), + "h.hash == sha256(cdn_chunk).digest()" + ) + return idx, decrypted_chunk + finally: + await cdn_session.stop() - # https://core.telegram.org/cdn#verifying-files - for i, h in enumerate(hashes): - cdn_chunk = decrypted_chunk[h.limit * i: h.limit * (i + 1)] - CDNFileHashMismatch.check( - h.hash == sha256(cdn_chunk).digest(), - "h.hash == sha256(cdn_chunk).digest()" - ) + raise RuntimeError("Unexpected response type") - yield decrypted_chunk + # Loop principale parallelo + while completed < total_chunks: + tasks = [] + for _ in range(min(workers, total_chunks - next_chunk)): + tasks.append(asyncio.create_task(_fetch_chunk(next_chunk))) + next_chunk += 1 - current += 1 - offset_bytes += chunk_size + for coro in asyncio.as_completed(tasks): + idx, data = await coro + buffer[idx] = data - if progress: + while completed in buffer: + chunk = buffer.pop(completed) + yield chunk + completed += 1 + + if progress and (completed * chunk_size) % (5 * 1024 * 1024) == 0: func = functools.partial( progress, - min(offset_bytes, file_size) if file_size != 0 else offset_bytes, + min(completed * chunk_size, file_size) if file_size else completed * chunk_size, file_size, *progress_args ) - if inspect.iscoroutinefunction(progress): await func() else: await self.loop.run_in_executor(self.executor, func) - if len(chunk) < chunk_size or current >= total: - break - except Exception as e: - raise e - finally: - await cdn_session.stop() except pyrogram.StopTransmission: raise except (FloodWait, FloodPremiumWait): diff --git a/pyrogram/dispatcher.py b/pyrogram/dispatcher.py index 804f5fbd..e9174b69 100644 --- a/pyrogram/dispatcher.py +++ b/pyrogram/dispatcher.py @@ -23,7 +23,6 @@ import pyrogram from pyrogram import utils -from pyrogram import raw from pyrogram.handlers import ( CallbackQueryHandler, MessageHandler, EditedMessageHandler, DeletedMessagesHandler, UserStatusHandler, RawUpdateHandler, InlineQueryHandler, PollHandler, @@ -155,85 +154,7 @@ async def start(self): log.info("Started %s HandlerTasks", self.client.workers) if not self.client.skip_updates: - states = await self.client.storage.update_state() - - if not states: - log.info("No states found, skipping recovery.") - return - - message_updates_counter = 0 - other_updates_counter = 0 - - for state in states: - id, local_pts, _, local_date, _ = state - - prev_pts = 0 - - while True: - diff = await self.client.invoke( - raw.functions.updates.GetDifference( - pts=local_pts, - date=local_date, - qts=0 - ) if id == self.client.me.id else - raw.functions.updates.GetChannelDifference( - channel=await self.client.resolve_peer(id), - filter=raw.types.ChannelMessagesFilterEmpty(), - pts=local_pts, - limit=10000 - ) - ) - - if isinstance(diff, (raw.types.updates.DifferenceEmpty, raw.types.updates.ChannelDifferenceEmpty)): - break - elif isinstance(diff, (raw.types.updates.DifferenceTooLong, raw.types.updates.ChannelDifferenceTooLong)): - break - elif isinstance(diff, raw.types.updates.ChannelDifference): - local_pts = diff.pts - elif isinstance(diff, raw.types.updates.Difference): - local_pts = diff.state.pts - elif isinstance(diff, raw.types.updates.DifferenceSlice): - local_pts = diff.intermediate_state.pts - local_date = diff.intermediate_state.date - - if prev_pts == local_pts: - break - - prev_pts = local_pts - - users = {i.id: i for i in diff.users} - chats = {i.id: i for i in diff.chats} - - for message in diff.new_messages: - message_updates_counter += 1 - self.updates_queue.put_nowait( - ( - raw.types.UpdateNewMessage( - message=message, - pts=local_pts, - pts_count=-1 - ) if id == self.client.me.id else - raw.types.UpdateNewChannelMessage( - message=message, - pts=local_pts, - pts_count=-1 - ), - users, - chats - ) - ) - - for update in diff.other_updates: - other_updates_counter += 1 - self.updates_queue.put_nowait( - (update, users, chats) - ) - - if isinstance(diff, (raw.types.updates.Difference, raw.types.updates.ChannelDifference)): - break - - await self.client.storage.update_state(None) - log.info("Recovered %s messages and %s updates.", message_updates_counter, other_updates_counter) + await self.client.recover_gaps() async def stop(self): if not self.client.no_updates: diff --git a/pyrogram/filters.py b/pyrogram/filters.py index 25032c71..6504d78d 100644 --- a/pyrogram/filters.py +++ b/pyrogram/filters.py @@ -458,8 +458,12 @@ async def media_spoiler_filter(_, __, m: Message): # endregion # region private_filter -async def private_filter(_, __, m: Message): - m = m.message if isinstance(m, CallbackQuery) else m +async def private_filter(_, __, m: Union[Message, CallbackQuery]) -> bool: + m = getattr(m, "message", None) if isinstance(m, CallbackQuery) else m + if not m: + raise ValueError( + "filters.private is not supported here " + ) return bool(m.chat and m.chat.type in {enums.ChatType.PRIVATE, enums.ChatType.BOT}) diff --git a/pyrogram/methods/advanced/save_file.py b/pyrogram/methods/advanced/save_file.py index 453a62af..ebb01998 100644 --- a/pyrogram/methods/advanced/save_file.py +++ b/pyrogram/methods/advanced/save_file.py @@ -128,7 +128,7 @@ async def worker(session): if file_size == 0: raise ValueError("File size equals to 0 B") - file_size_limit_mib = 4000 if self.me.is_premium else 2000 + file_size_limit_mib = 4000 if self.me and self.me.is_premium else 2000 if file_size > file_size_limit_mib * 1024 * 1024: raise ValueError(f"Can't upload files bigger than {file_size_limit_mib} MiB") diff --git a/pyrogram/methods/auth/connect.py b/pyrogram/methods/auth/connect.py index 612e064b..1a6b44aa 100644 --- a/pyrogram/methods/auth/connect.py +++ b/pyrogram/methods/auth/connect.py @@ -37,6 +37,7 @@ async def connect( if self.is_connected: raise ConnectionError("Client is already connected") + await self.load_config() await self.load_session() self.session = Session( diff --git a/pyrogram/methods/chats/join_chat.py b/pyrogram/methods/chats/join_chat.py index 85584bf8..9f2943d4 100644 --- a/pyrogram/methods/chats/join_chat.py +++ b/pyrogram/methods/chats/join_chat.py @@ -44,16 +44,16 @@ async def join_chat( .. code-block:: python # Join chat via invite link - await app.join_chat("https://t.me/+AbCdEf0123456789") + await app.join_chat("https://t.me/+PtU-zNsbDNU3ODA8") # Join chat via username - await app.join_chat("pyrogram") + await app.join_chat("pyrogramodchat") # Join chat via Telegram Public Link - await app.join_chat("https://t.me/pyrogram") + await app.join_chat("https://t.me/pyrogramodchat") # Join a linked chat - await app.join_chat(app.get_chat("pyrogram").linked_chat.id) + await app.join_chat(app.get_chat("pyrogramodchat").linked_chat.id) """ match = self.INVITE_LINK_RE.match(str(chat_id)) diff --git a/pyrogram/methods/messages/download_media.py b/pyrogram/methods/messages/download_media.py index 4f44ff25..db9a9a14 100644 --- a/pyrogram/methods/messages/download_media.py +++ b/pyrogram/methods/messages/download_media.py @@ -35,6 +35,9 @@ async def download_media( file_name: str = DEFAULT_DOWNLOAD_DIR, in_memory: bool = False, block: bool = True, + workers: int = 4, + chunk_size: int = 1024 * 1024, + use_experimental_download_boost: bool = False, progress: Callable = None, progress_args: tuple = () ) -> Optional[Union[str, BinaryIO]]: @@ -178,7 +181,7 @@ async def progress(current, total): ) downloader = self.handle_download( - (file_id_obj, directory, file_name, in_memory, file_size, progress, progress_args) + (file_id_obj, directory, file_name, in_memory, file_size, progress, progress_args, workers, chunk_size, use_experimental_download_boost) ) if block: diff --git a/pyrogram/session/session.py b/pyrogram/session/session.py index 91168599..bd02897a 100644 --- a/pyrogram/session/session.py +++ b/pyrogram/session/session.py @@ -20,6 +20,7 @@ import bisect import logging import os +from datetime import datetime, timedelta from hashlib import sha1 from io import BytesIO from typing import Optional @@ -29,8 +30,9 @@ from pyrogram.connection import Connection from pyrogram.crypto import mtproto from pyrogram.errors import ( - RPCError, InternalServerError, AuthKeyDuplicated, FloodWait, FloodPremiumWait, ServiceUnavailable, BadMsgNotification, - SecurityCheckMismatch + RPCError, InternalServerError, AuthKeyDuplicated, FloodWait, FloodPremiumWait, ServiceUnavailable, + BadMsgNotification, + SecurityCheckMismatch, Unauthorized ) from pyrogram.raw.all import layer from pyrogram.raw.core import TLObject, MsgContainer, Int, FutureSalts @@ -53,6 +55,7 @@ class Session: ACKS_THRESHOLD = 10 PING_INTERVAL = 5 STORED_MSG_IDS_MAX_SIZE = 1000 * 2 + RECONNECT_THRESHOLD = timedelta(seconds=10) TRANSPORT_ERRORS = { 404: "auth key not found", @@ -69,6 +72,7 @@ def __init__( is_media: bool = False, is_cdn: bool = False ): + self.last_reconnect_attempt = None self.client = client self.dc_id = dc_id self.auth_key = auth_key @@ -182,18 +186,31 @@ async def stop(self): log.info("Session stopped") async def restart(self): + now = datetime.now() + if ( + self.last_reconnect_attempt + and now - self.last_reconnect_attempt < self.RECONNECT_THRESHOLD + ): + log.info("Reconnecting too frequently, sleeping for a while") + await asyncio.sleep(5) + self.last_reconnect_attempt = now await self.stop() await self.start() async def handle_packet(self, packet): - data = await self.loop.run_in_executor( - pyrogram.crypto_executor, - mtproto.unpack, - BytesIO(packet), - self.session_id, - self.auth_key, - self.auth_key_id - ) + try: + data = await self.loop.run_in_executor( + pyrogram.crypto_executor, + mtproto.unpack, + BytesIO(packet), + self.session_id, + self.auth_key, + self.auth_key_id + ) + except ValueError as e: + log.debug(e) + self.loop.create_task(self.restart()) + return messages = ( data.body.messages @@ -287,7 +304,10 @@ async def ping_worker(self): ping_id=0, disconnect_delay=self.WAIT_TIMEOUT + 10 ), False ) - except (OSError, RPCError): + except OSError: + self.loop.create_task(self.restart()) + break + except RPCError: pass log.info("PingTask stopped") @@ -302,6 +322,12 @@ async def recv_worker(self): if packet: error_code = -Int.read(BytesIO(packet)) + if error_code == 404: + raise Unauthorized( + "Auth key not found in the system. You must delete your session file " + "and log in again with your phone number or bot token." + ) + log.warning( "Server sent transport error: %s (%s)", error_code, Session.TRANSPORT_ERRORS.get(error_code, "unknown error") @@ -386,7 +412,7 @@ async def invoke( query_name = ".".join(inner_query.QUALNAME.split(".")[1:]) - while True: + while retries > 0: try: return await self.send(query, timeout=timeout) except (FloodWait, FloodPremiumWait) as e: @@ -400,15 +426,16 @@ async def invoke( await asyncio.sleep(amount) except (OSError, InternalServerError, ServiceUnavailable) as e: + retries -= 1 if retries == 0: - raise e from None + raise e (log.warning if retries < 2 else log.info)( '[%s] Retrying "%s" due to: %s', - Session.MAX_RETRIES - retries + 1, + Session.MAX_RETRIES - retries, query_name, str(e) or repr(e) ) await asyncio.sleep(0.5) - return await self.invoke(query, retries - 1, timeout) + raise TimeoutError("Exceeded maximum number of retries") diff --git a/pyrogram/types/messages_and_media/__init__.py b/pyrogram/types/messages_and_media/__init__.py index 797926e9..f4da93aa 100644 --- a/pyrogram/types/messages_and_media/__init__.py +++ b/pyrogram/types/messages_and_media/__init__.py @@ -16,6 +16,7 @@ # You should have received a copy of the GNU Lesser General Public License # along with Pyrogram. If not, see . +from .alternative_video import AlternativeVideo from .animation import Animation from .audio import Audio from .contact import Contact @@ -45,5 +46,5 @@ __all__ = [ "Animation", "Audio", "Contact", "Document", "Game", "Location", "Message", "MessageEntity", "Photo", "Thumbnail", "StrippedThumbnail", "Poll", "PollOption", "Sticker", "Venue", "Video", "VideoNote", "Voice", "WebPage", "Dice", - "Reaction", "WebAppData", "MessageReactions", "Story", "Giveaway" + "Reaction", "WebAppData", "MessageReactions", "Story", "Giveaway", "AlternativeVideo" ] diff --git a/pyrogram/types/messages_and_media/alternative_video.py b/pyrogram/types/messages_and_media/alternative_video.py new file mode 100644 index 00000000..921830a7 --- /dev/null +++ b/pyrogram/types/messages_and_media/alternative_video.py @@ -0,0 +1,134 @@ +# Pyrogram - Telegram MTProto API Client Library for Python +# Copyright (C) 2017-present Dan +# +# This file is part of Pyrogram. +# +# Pyrogram is free software: you can redistribute it and/or modify +# it under the terms of the GNU Lesser General Public License as published +# by the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# Pyrogram is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public License +# along with Pyrogram. If not, see . + +from datetime import datetime +from typing import List + +import pyrogram +from pyrogram import raw, utils +from pyrogram import types +from pyrogram.file_id import FileId, FileType, FileUniqueId, FileUniqueType, ThumbnailSource +from ..object import Object + + +class AlternativeVideo(Object): + """Describes an alternative reencoded quality of a video file. + + Parameters: + file_id (``str``): + Identifier for this file, which can be used to download or reuse the file. + + file_unique_id (``str``): + Unique identifier for this file, which is supposed to be the same over time and for different accounts. + Can't be used to download or reuse the file. + + width (``int``): + Video width as defined by sender. + + height (``int``): + Video height as defined by sender. + + codec (``str``): + Codec used for video file encoding, for example, "h264", "h265", or "av1". + + duration (``int``): + Duration of the video in seconds as defined by sender. + + file_name (``str``, *optional*): + Video file name. + + mime_type (``str``, *optional*): + Mime type of a file as defined by sender. + + file_size (``int``, *optional*): + File size. + + supports_streaming (``bool``, *optional*): + True, if the video was uploaded with streaming support. + + date (:py:obj:`~datetime.datetime`, *optional*): + Date the video was sent. + + thumbs (List of :obj:`~pyrogram.types.Thumbnail`, *optional*): + Video thumbnails. + + """ + + def __init__( + self, + *, + client: "pyrogram.Client" = None, + file_id: str, + file_unique_id: str, + width: int, + height: int, + codec: str, + duration: int, + file_name: str = None, + mime_type: str = None, + file_size: int = None, + supports_streaming: bool = None, + date: datetime = None, + thumbs: List["types.Thumbnail"] = None + ): + super().__init__(client) + + self.file_id = file_id + self.file_unique_id = file_unique_id + self.width = width + self.height = height + self.codec = codec + self.duration = duration + self.file_name = file_name + self.mime_type = mime_type + self.file_size = file_size + self.supports_streaming = supports_streaming + self.date = date + self.thumbs = thumbs + + @staticmethod + def _parse( + client, + video: "raw.types.Document", + video_attributes: "raw.types.DocumentAttributeVideo", + file_name: str + ) -> "AlternativeVideo": + return AlternativeVideo( + file_id=FileId( + file_type=FileType.VIDEO, + dc_id=video.dc_id, + media_id=video.id, + access_hash=video.access_hash, + file_reference=video.file_reference + ).encode() if video else None, + file_unique_id=FileUniqueId( + file_unique_type=FileUniqueType.DOCUMENT, + media_id=video.id + ).encode() if video else None, + width=video_attributes.w if video_attributes else None, + height=video_attributes.h if video_attributes else None, + codec=video_attributes.video_codec if video_attributes else None, + duration=video_attributes.duration if video_attributes else None, + file_name=file_name, + mime_type=video.mime_type if video else None, + supports_streaming=video_attributes.supports_streaming if video_attributes else None, + file_size=video.size if video else None, + date=utils.timestamp_to_datetime(video.date) if video else None, + thumbs=types.Thumbnail._parse(client, video) if video else None, + client=client + ) diff --git a/pyrogram/types/messages_and_media/message.py b/pyrogram/types/messages_and_media/message.py index e3f97464..e1e4f30a 100644 --- a/pyrogram/types/messages_and_media/message.py +++ b/pyrogram/types/messages_and_media/message.py @@ -179,6 +179,9 @@ class Message(Object, Update): video (:obj:`~pyrogram.types.Video`, *optional*): Message is a video, information about the video. + alternative_videos (List of :obj:`~pyrogram.types.AlternativeVideo`, *optional*): + Alternative qualities of the video, if the message is a video. + voice (:obj:`~pyrogram.types.Voice`, *optional*): Message is a voice message, information about the file. @@ -393,7 +396,8 @@ def __init__( "types.ReplyKeyboardRemove", "types.ForceReply" ] = None, - reactions: List["types.Reaction"] = None + reactions: List["types.Reaction"] = None, + alternative_videos: List["types.AlternativeVideo"] = None, ): super().__init__(client) @@ -433,6 +437,7 @@ def __init__( self.animation = animation self.game = game self.video = video + self.alternative_videos = alternative_videos self.voice = voice self.story = story self.giveaway = giveaway @@ -668,6 +673,7 @@ async def _parse( voice = None animation = None video = None + alternative_videos = [] video_note = None sticker = None document = None @@ -732,6 +738,22 @@ async def _parse( video = types.Video._parse(client, doc, video_attributes, file_name, media.ttl_seconds) media_type = enums.MessageMediaType.VIDEO has_media_spoiler = media.spoiler + + altdocs = media.alt_documents or [] + for altdoc in altdocs: + if isinstance(altdoc, raw.types.Document): + altdoc_attributes = {type(i): i for i in altdoc.attributes} + + altdoc_file_name = getattr( + altdoc_attributes.get( + raw.types.DocumentAttributeFilename, None + ), "file_name", None + ) + altdoc_video_attribute = altdoc_attributes.get(raw.types.DocumentAttributeVideo, None) + if altdoc_video_attribute: + alternative_videos.append( + types.AlternativeVideo._parse(client, altdoc, altdoc_video_attribute, altdoc_file_name) + ) elif raw.types.DocumentAttributeAudio in attributes: audio_attributes = attributes[raw.types.DocumentAttributeAudio] @@ -831,6 +853,7 @@ async def _parse( story=story, giveaway=giveaway, video=video, + alternative_videos=types.List(alternative_videos) if alternative_videos else None, video_note=video_note, sticker=sticker, document=document, @@ -3543,6 +3566,9 @@ async def download( file_name: str = "", in_memory: bool = False, block: bool = True, + workers: int = 4, + chunk_size: int = 1024 * 1024, + use_experimental_download_boost: bool = False, progress: Callable = None, progress_args: tuple = () ) -> str: @@ -3609,6 +3635,9 @@ async def download( file_name=file_name, in_memory=in_memory, block=block, + workers=workers, + chunk_size=chunk_size, + use_experimental_download_boost=use_experimental_download_boost, progress=progress, progress_args=progress_args, ) diff --git a/pyrogram/types/messages_and_media/reaction.py b/pyrogram/types/messages_and_media/reaction.py index 17e08ff5..c4fec5b9 100644 --- a/pyrogram/types/messages_and_media/reaction.py +++ b/pyrogram/types/messages_and_media/reaction.py @@ -39,6 +39,9 @@ class Reaction(Object): chosen_order (``int``, *optional*): Chosen reaction order. Available for chosen reactions. + + is_paid (``bool``, *optional*): + True, if reaction is paid. """ def __init__( @@ -48,7 +51,8 @@ def __init__( emoji: Optional[str] = None, custom_emoji_id: Optional[int] = None, count: Optional[int] = None, - chosen_order: Optional[int] = None + chosen_order: Optional[int] = None, + is_paid: Optional[bool] = None ): super().__init__(client) @@ -56,6 +60,7 @@ def __init__( self.custom_emoji_id = custom_emoji_id self.count = count self.chosen_order = chosen_order + self.is_paid = is_paid @staticmethod def _parse( @@ -74,6 +79,12 @@ def _parse( custom_emoji_id=reaction.document_id ) + if isinstance(reaction, raw.types.ReactionPaid): + return Reaction( + client=client, + is_paid=True + ) + @staticmethod def _parse_count( client: "pyrogram.Client", diff --git a/pyrogram/types/user_and_chats/emoji_status.py b/pyrogram/types/user_and_chats/emoji_status.py index 50b46bfa..6ec9ad08 100644 --- a/pyrogram/types/user_and_chats/emoji_status.py +++ b/pyrogram/types/user_and_chats/emoji_status.py @@ -29,49 +29,99 @@ class EmojiStatus(Object): """A user emoji status. Parameters: - custom_emoji_id (``int``): + custom_emoji_id (``int``, *optional*): Custom emoji id. until_date (:py:obj:`~datetime.datetime`, *optional*): Valid until date. + + title (``str``, *optional*): + Title of the collectible. + + gift_id (``int``, *optional*): + Gift collectible id. + + name (``str``, *optional*): + Name of the collectible. + + pattern_custom_emoji_id (``int``, *optional*): + Pattern emoji id. + + center_color (``int``, *optional*): + Center color of the collectible emoji in decimal format. + + edge_color (``int``, *optional*): + Edge color of the collectible emoji in decimal format. + + pattern_color (``int``, *optional*): + Pattern color of the collectible emoji in decimal format. + + text_color (``int``, *optional*): + Text color of the collectible emoji in decimal format. """ def __init__( self, *, client: "pyrogram.Client" = None, - custom_emoji_id: int, - until_date: Optional[datetime] = None + custom_emoji_id: Optional[int] = None, + gift_id: Optional[int] = None, + until_date: Optional[datetime] = None, + title: Optional[str] = None, + name: Optional[str] = None, + pattern_custom_emoji_id: Optional[int] = None, + center_color: Optional[int] = None, + edge_color: Optional[int] = None, + pattern_color: Optional[int] = None, + text_color: Optional[int] = None ): super().__init__(client) self.custom_emoji_id = custom_emoji_id + self.gift_id = gift_id self.until_date = until_date + self.title = title + self.name = name + self.pattern_custom_emoji_id = pattern_custom_emoji_id + self.center_color = center_color + self.edge_color = edge_color + self.pattern_color = pattern_color + self.text_color = text_color @staticmethod def _parse(client, emoji_status: "raw.base.EmojiStatus") -> Optional["EmojiStatus"]: if isinstance(emoji_status, raw.types.EmojiStatus): return EmojiStatus( client=client, - custom_emoji_id=emoji_status.document_id + custom_emoji_id=emoji_status.document_id, + until_date=utils.timestamp_to_datetime(getattr(emoji_status, "until", None)) ) - if isinstance(emoji_status, raw.types.EmojiStatusUntil): + if isinstance(emoji_status, raw.types.EmojiStatusCollectible): return EmojiStatus( client=client, custom_emoji_id=emoji_status.document_id, - until_date=utils.timestamp_to_datetime(emoji_status.until) + gift_id=emoji_status.collectible_id, + until_date=utils.timestamp_to_datetime(getattr(emoji_status, "until", None)), + title=emoji_status.title, + name=emoji_status.slug, + pattern_custom_emoji_id=emoji_status.pattern_document_id, + center_color=emoji_status.center_color, + edge_color=emoji_status.edge_color, + pattern_color=emoji_status.pattern_color, + text_color=emoji_status.text_color ) return None def write(self): - if self.until_date: - return raw.types.EmojiStatusUntil( - document_id=self.custom_emoji_id, + if self.gift_id: + return raw.types.InputEmojiStatusCollectible( + collectible_id=self.gift_id, until=utils.datetime_to_timestamp(self.until_date) ) return raw.types.EmojiStatus( - document_id=self.custom_emoji_id - ) + document_id=self.custom_emoji_id, + until=utils.datetime_to_timestamp(self.until_date) + ) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index bf664153..b392534b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ pyaes==1.6.1 pysocks==1.7.1 +aiofiles \ No newline at end of file diff --git a/setup.py b/setup.py index 7bc105e1..20319f7e 100644 --- a/setup.py +++ b/setup.py @@ -14,75 +14,7 @@ # GNU Lesser General Public License for more details. # # You should have received a copy of the GNU Lesser General Public License -# along with Pyrogram. If not, see . +# along with Pyrogram. If not, see . -import re -from sys import argv - -from setuptools import setup, find_packages - -from compiler.api import compiler as api_compiler -from compiler.errors import compiler as errors_compiler - -with open("requirements.txt", encoding="utf-8") as r: - requires = [i.strip() for i in r] - -with open("pyrogram/__init__.py", encoding="utf-8") as f: - version = re.findall(r"__version__ = \"(.+)\"", f.read())[0] - -with open("README.md", encoding="utf-8") as f: - readme = f.read() - -if len(argv) > 1 and argv[1] in ["bdist_wheel", "install", "develop"]: - api_compiler.start() - errors_compiler.start() - -setup( - name="Pyrogram", - version=version, - description="Elegant, modern and asynchronous Telegram MTProto API framework in Python for users and bots", - long_description=readme, - long_description_content_type="text/markdown", - url="https://github.com/pyrogram", - download_url="https://github.com/pyrogram/pyrogram/releases/latest", - author="Dan", - author_email="dan@pyrogram.org", - license="LGPLv3", - classifiers=[ - "Development Status :: 5 - Production/Stable", - "Intended Audience :: Developers", - "Natural Language :: English", - "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", - "Operating System :: OS Independent", - "Programming Language :: Python", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Programming Language :: Python :: Implementation", - "Programming Language :: Python :: Implementation :: CPython", - "Programming Language :: Python :: Implementation :: PyPy", - "Topic :: Internet", - "Topic :: Communications", - "Topic :: Communications :: Chat", - "Topic :: Software Development :: Libraries", - "Topic :: Software Development :: Libraries :: Python Modules", - "Topic :: Software Development :: Libraries :: Application Frameworks" - ], - keywords="telegram chat messenger mtproto api client library python", - project_urls={ - "Tracker": "https://github.com/pyrogram/pyrogram/issues", - "Community": "https://t.me/pyrogram", - "Source": "https://github.com/pyrogram/pyrogram", - "Documentation": "https://docs.pyrogram.org", - }, - python_requires="~=3.8", - package_data={ - "pyrogram": ["py.typed"], - }, - packages=find_packages(exclude=["compiler*", "tests*"]), - zip_safe=False, - install_requires=requires -) +from setuptools import setup +setup()