telegram-crawler/data/web/core.telegram.org/api/links.html
2024-09-23 18:02:35 +00:00

1597 lines
76 KiB
HTML
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html class="">
<head>
<meta charset="utf-8">
<title>Deep links</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta property="description" content="Telegram clients must handle special tg:// and t.me deep links encountered in messages, link entities and in other apps by registering OS handlers.">
<meta property="og:title" content="Deep links">
<meta property="og:image" content="">
<meta property="og:description" content="Telegram clients must handle special tg:// and t.me deep links encountered in messages, link entities and in other apps by registering OS handlers.">
<link rel="icon" type="image/svg+xml" href="/img/website_icon.svg?4">
<link rel="apple-touch-icon" sizes="180x180" href="/img/apple-touch-icon.png">
<link rel="icon" type="image/png" sizes="32x32" href="/img/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="/img/favicon-16x16.png">
<link rel="alternate icon" href="/img/favicon.ico" type="image/x-icon" />
<link href="/css/bootstrap.min.css?3" rel="stylesheet">
<link href="/css/telegram.css?241" rel="stylesheet" media="screen">
<style>
</style>
</head>
<body class="preload">
<div class="dev_page_wrap">
<div class="dev_page_head navbar navbar-static-top navbar-tg">
<div class="navbar-inner">
<div class="container clearfix">
<ul class="nav navbar-nav navbar-right hidden-xs"><li class="navbar-twitter"><a href="https://twitter.com/telegram" target="_blank" data-track="Follow/Twitter" onclick="trackDlClick(this, event)"><i class="icon icon-twitter"></i><span> Twitter</span></a></li></ul>
<ul class="nav navbar-nav">
<li><a href="//telegram.org/">Home</a></li>
<li class="hidden-xs"><a href="//telegram.org/faq">FAQ</a></li>
<li class="hidden-xs"><a href="//telegram.org/apps">Apps</a></li>
<li class="active"><a href="/api">API</a></li>
<li class=""><a href="/mtproto">Protocol</a></li>
<li class=""><a href="/schema">Schema</a></li>
</ul>
</div>
</div>
</div>
<div class="container clearfix">
<div class="dev_page">
<div id="dev_page_content_wrap" class=" ">
<div class="dev_page_bread_crumbs"><ul class="breadcrumb clearfix"><li><a href="/api" >API</a></li><i class="icon icon-breadcrumb-divider"></i><li><a href="/api/links" >Deep links</a></li></ul></div>
<h1 id="dev_page_title">Deep links</h1>
<div id="dev_page_content"><!-- scroll_nav -->
<p>Telegram clients must handle special <code>tg://</code> and <code>t.me</code> deep links encountered in messages, link entities and in other apps by registering OS handlers. </p>
<p>Links are generally available in two flavors: <code>t.me</code> HTTPS links and <code>tg:</code> URIs. </p>
<p><code>t.me</code> link syntax examples: </p>
<ul>
<li><code>t.me/path?query</code></li>
<li><code>http://t.me/path?query</code></li>
<li><code>https://t.me/path?query</code></li>
</ul>
<p>Where <code>t.me</code> can also be <code>telegram.me</code>, <code>telegram.dog</code>, and the domain specified in the <code>me_url_prefix</code> field of the global <a href="/constructor/config">configuration</a>, obtainable using <a href="/method/help.getConfig">help.getConfig</a>.</p>
<p><code>tg:</code> link syntax examples: </p>
<ul>
<li><code>tg:path?query</code></li>
<li><code>tg://path?query</code></li>
</ul>
<p>The <code>#fragment</code> part is always ignored when parsing Telegram deep links. </p>
<p>Also note that whenever a <code>&lt;username&gt;.t.me</code> link is encountered and <code>&lt;username&gt;</code>:</p>
<ul>
<li>Is not equal to:<ul>
<li><code>www</code></li>
<li><code>addemoji</code></li>
<li><code>addlist</code></li>
<li><code>addstickers</code></li>
<li><code>addtheme</code></li>
<li><code>auth</code></li>
<li><code>boost</code></li>
<li><code>confirmphone</code></li>
<li><code>contact</code></li>
<li><code>giftcode</code></li>
<li><code>invoice</code></li>
<li><code>joinchat</code></li>
<li><code>login</code></li>
<li><code>m</code></li>
<li><code>proxy</code></li>
<li><code>setlanguage</code></li>
<li><code>share</code></li>
<li><code>socks</code></li>
<li><code>web</code></li>
<li><code>a</code></li>
<li><code>k</code></li>
<li><code>z</code></li>
</ul>
</li>
<li>AND is not a single letter</li>
<li>AND is a valid username</li>
</ul>
<p>...it should be treated exactly as a <code>t.me/&lt;username&gt;/</code> link (generate a <code>t.me/&lt;username&gt;/</code> link and append the rest of the path (if present) and the query string (if present)). </p>
<p>Everywhere where link parameters contain a user, chat, channel or supergroup ID, it will be in MTProto format, see <a href="/api/bots/ids">here »</a> for info on how to convert it to bot API format. </p>
<h3><a class="anchor" href="#ton-sites" id="ton-sites" name="ton-sites"><i class="anchor-icon"></i></a>TON Sites</h3>
<p>Used to open <a href="https://blog.ton.org/ton-sites">TON Sites</a> using the in-app <a href="https://telegram.org/blog/w3-browser-mini-app-store#telegram-browser">Telegram Browser</a>. </p>
<p>Syntax:</p>
<pre><code>tonsite://somesite.domain/path?query#hash</code></pre>
<p>Also available without the <code>tonsite://</code> scheme for <code>.ton</code> domains:</p>
<pre><code>getting-started.ton/path?query#hash</code></pre>
<p>In both cases, the <code>#hash</code> part of the URL should <strong>not</strong> be ignored. </p>
<p>To open such URLs:</p>
<ul>
<li>Replace the <code>tonsite</code> scheme with <code>https</code></li>
<li>Transform the host part of the URL thusly:<ul>
<li>Replace all <code>.</code> characters with <code>-d</code></li>
<li>Replace <code>-</code> characters with <code>-h</code> (except for the <code>-</code>s generated by the first replace)</li>
<li>Append a <code>.</code></li>
<li>Append the domain name specified in the <a href="/api/config#ton-proxy-address">ton_proxy_address client configuration parameter »</a></li>
</ul>
</li>
</ul>
<p>The resulting URL should only be opened using the in-app <a href="https://telegram.org/blog/w3-browser-mini-app-store#telegram-browser">Telegram Browser</a> (i.e. no option should be given to open such links using third party browsers). </p>
<h3><a class="anchor" href="#public-username-links" id="public-username-links" name="public-username-links"><i class="anchor-icon"></i></a>Public username links</h3>
<p>Used to link to public users, groups and channels, see <a href="/api/invites#public-usernames">here for more info on how to handle them »</a>. </p>
<p><code>t.me</code> syntax:</p>
<pre><code>t.me/&lt;username&gt;?text=&lt;draft_text&gt;&amp;profile</code></pre>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://resolve?domain=&lt;username&gt;&amp;text=&lt;draft_text&gt;&amp;profile</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>username</code></td>
<td style="text-align: center;">Required</td>
<td>Username to <a href="/api/invites#public-usernames">check or import »</a></td>
</tr>
<tr>
<td><code>draft_text</code></td>
<td style="text-align: center;">Optional</td>
<td>UTF-8 text to pre-enter into the text input bar, if the user can write in the chat. <br>Before insertion: <br>- Validate that the text is valid UTF-8. <br>- If the text starts with a <code>@</code>, prepend a whitespace to it (to avoid triggering an <a href="/api/bots/inline">inline query</a>). <br>- Trim the text to <a href="/constructor/config">message_length_max</a> UTF-8 codepoints.</td>
</tr>
<tr>
<td><code>profile</code></td>
<td style="text-align: center;">Optional</td>
<td>If set, clicking on this link should open the destination peer's profile page, not the chat view.</td>
</tr>
</tbody>
</table>
<p>Note that <a href="#message-links">message links</a> have the same syntax, with extra parameters. </p>
<h3><a class="anchor" href="#temporary-profile-links" id="temporary-profile-links" name="temporary-profile-links"><i class="anchor-icon"></i></a>Temporary profile links</h3>
<p>Used to link to user profiles, generated using <a href="/method/contacts.exportContactToken">contacts.exportContactToken</a>.<br>
These links can be generated even for profiles that don't have a username, and they have an expiration date, specified by the <code>expires</code> field of the <a href="/constructor/exportedContactToken">exportedContactToken</a> constructor returned by <a href="/method/contacts.exportContactToken">contacts.exportContactToken</a>. </p>
<p><code>t.me</code> syntax:</p>
<pre><code>t.me/contact/&lt;token&gt;</code></pre>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://contact?token=&lt;token&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>token</code></td>
<td style="text-align: center;">Required</td>
<td>Profile token to import using <a href="/method/contacts.importContactToken">contacts.importContactToken</a>, will return user information.</td>
</tr>
</tbody>
</table>
<h3><a class="anchor" href="#phone-number-links" id="phone-number-links" name="phone-number-links"><i class="anchor-icon"></i></a>Phone number links</h3>
<p>Used to link to public and private users by their phone number. </p>
<p><code>t.me</code> syntax:</p>
<pre><code>t.me/+&lt;phone_number&gt;?text=&lt;draft_text&gt;&amp;profile</code></pre>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://resolve?phone=&lt;phone_number&gt;&amp;text=&lt;draft_text&gt;&amp;profile</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>phone_number</code></td>
<td style="text-align: center;">Required</td>
<td>Phone number to resolve using <a href="/method/contacts.resolvePhone">contacts.resolvePhone</a></td>
</tr>
<tr>
<td><code>draft_text</code></td>
<td style="text-align: center;">Optional</td>
<td>UTF-8 text to pre-enter into the text input bar, if the user can write in the chat. <br>Before insertion: <br>- Validate that the text is valid UTF-8. <br>- If the text starts with a <code>@</code>, prepend a whitespace to it (to avoid triggering an <a href="/api/bots/inline">inline query</a>). <br>- Trim the text to <a href="/constructor/config">message_length_max</a> UTF-8 codepoints.</td>
</tr>
<tr>
<td><code>profile</code></td>
<td style="text-align: center;">Optional</td>
<td>If set, clicking on this link should open the user's profile page, not the chat with them.</td>
</tr>
</tbody>
</table>
<p>Note that <a href="#message-links">chat invite links</a> have the same syntax, but <code>&lt;phone_number&gt;</code> won't be a valid phone number. </p>
<h3><a class="anchor" href="#chat-invite-links" id="chat-invite-links" name="chat-invite-links"><i class="anchor-icon"></i></a>Chat invite links</h3>
<p>Used to invite users to private groups and channels, see <a href="/api/invites#invite-links">here for more info on how to generate such links »</a>. </p>
<p><code>t.me</code> syntax:</p>
<pre><code>t.me/+&lt;hash&gt;</code></pre>
<p><code>t.me</code> syntax (legacy):</p>
<pre><code>t.me/joinchat/&lt;hash&gt;</code></pre>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://join?invite=&lt;hash&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>hash</code></td>
<td style="text-align: center;">Required</td>
<td>Invite hash to <a href="/api/invites#invite-links">check or import »</a></td>
</tr>
</tbody>
</table>
<h3><a class="anchor" href="#chat-folder-links" id="chat-folder-links" name="chat-folder-links"><i class="anchor-icon"></i></a>Chat folder links</h3>
<p>Used to invite users to private groups and channels, see <a href="/api/folders#shared-folders">here for more info on how to generate such links »</a>. </p>
<p><code>t.me</code> syntax:</p>
<pre><code>t.me/addlist/&lt;slug&gt;</code></pre>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://addlist?slug=&lt;slug&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>slug</code></td>
<td style="text-align: center;">Required</td>
<td>Invite slug to <a href="/api/folders#shared-folders">check or import »</a></td>
</tr>
</tbody>
</table>
<h3><a class="anchor" href="#message-links" id="message-links" name="message-links"><i class="anchor-icon"></i></a>Message links</h3>
<p>Used to link to specific messages in public or private groups and channels. </p>
<p><code>t.me</code> syntax (public links): </p>
<pre><code>t.me/&lt;username&gt;/&lt;id&gt;?single&amp;thread=&lt;thread_id&gt;&amp;comment=&lt;comment&gt;&amp;t=&lt;media_timestamp&gt;
t.me/&lt;username&gt;/&lt;thread_id&gt;/&lt;id&gt;?single&amp;comment=&lt;comment&gt;&amp;t=&lt;media_timestamp&gt;</code></pre>
<p><code>t.me</code> syntax (private links): </p>
<pre><code>t.me/c/&lt;channel&gt;/&lt;id&gt;?single&amp;thread=&lt;thread_id&gt;&amp;comment=&lt;comment&gt;&amp;t=&lt;media_timestamp&gt;
t.me/c/&lt;channel&gt;/&lt;thread_id&gt;/&lt;id&gt;?single&amp;comment=&lt;comment&gt;&amp;t=&lt;media_timestamp&gt;</code></pre>
<p><code>tg:</code> syntax (public links):</p>
<pre><code>tg://resolve?domain=&lt;username&gt;&amp;post=&lt;id&gt;&amp;single&amp;thread=&lt;thread_id&gt;&amp;comment=&lt;comment&gt;&amp;t=&lt;media_timestamp&gt;</code></pre>
<p><code>tg:</code> syntax (private links):</p>
<pre><code>tg://privatepost?channel=&lt;channel&gt;&amp;post=&lt;id&gt;&amp;single&amp;thread=&lt;thread_id&gt;&amp;comment=&lt;comment&gt;&amp;t=&lt;media_timestamp&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>username</code></td>
<td style="text-align: center;">Required if public link</td>
<td>Dialog username.</td>
</tr>
<tr>
<td><code>channel</code></td>
<td style="text-align: center;">Required if private link</td>
<td>Channel or supergroup ID.</td>
</tr>
<tr>
<td><code>id</code></td>
<td style="text-align: center;">Required</td>
<td>Message ID.</td>
</tr>
<tr>
<td><code>single</code></td>
<td style="text-align: center;">Optional</td>
<td>For albums/grouped media, if set indicates that this is a link to a specific media in the album; otherwise, it is a link to the entire album.</td>
</tr>
<tr>
<td><code>thread_id</code></td>
<td style="text-align: center;">Optional</td>
<td>For <a href="/api/threads">message threads</a>, contains the thread ID.</td>
</tr>
<tr>
<td><code>comment</code></td>
<td style="text-align: center;">Optional</td>
<td>For <a href="/api/discussion">channel comments</a>, <code>username</code> will contain the channel username, <code>id</code> will contain the message ID of the channel message that started the comment section and this field will contain the message ID of the comment in the discussion group.</td>
</tr>
<tr>
<td><code>media_timestamp</code></td>
<td style="text-align: center;">Optional</td>
<td>Timestamp at which to start playing the media file present in the body or in the webpage preview of the message, in the following formats: <br>- Seconds: <code>123</code>, regex <code>^(\d+)$</code> <br>- Minutes and seconds: <code>10:23</code>, example regex <code>^(\d+):(\d{1,2})$</code> <br>- Hours, minutes and seconds: <code>1h23m10s</code>, example regex <code>^(?:(\d+)h)?(?:(\d{1,2})m)?(?:(\d{1,2})s)$</code></td>
</tr>
</tbody>
</table>
<p>Note that since a <a href="/api/forum#forum-topics">forum topic</a> ID is actually the ID of the service message that created the topic, whenever the client resolves a <a href="#message-links">message link</a> that points to a <a href="/constructor/messageActionTopicCreate">messageActionTopicCreate</a> service message, it should open the topic, instead.<br>
Also, if the message ID is <code>1</code> and the linked-to supergroup is a forum, the "General" topic should be opened instead of the first message of the supergroup. </p>
<h3><a class="anchor" href="#forum-topic-links" id="forum-topic-links" name="forum-topic-links"><i class="anchor-icon"></i></a>Forum topic links</h3>
<p>Used to link to a specific <a href="/api/forum#forum-topics">forum topic</a>. </p>
<p>The syntax is exactly the same as for <a href="#message-links">message links</a>, because the topic ID is actually the ID of the service message that created the topic, so whenever the client resolves a <a href="#message-links">message link</a> that points to a <a href="/constructor/messageActionTopicCreate">messageActionTopicCreate</a> service message, it should open the topic, instead. </p>
<p>Also, if the message ID is <code>1</code> and the linked-to supergroup is a forum, the "General" topic should be opened instead of the first message of the supergroup. </p>
<h3><a class="anchor" href="#share-links" id="share-links" name="share-links"><i class="anchor-icon"></i></a>Share links</h3>
<p>Used to share a prepared message and URL into a chosen chat's text field.<br>
These links should be handled as follows:</p>
<ul>
<li>Open a dialog selection prompt</li>
<li>After selection: validate, trim and enter the URL at the beginning of the text field</li>
<li>Append a newline to the text field</li>
<li>Append and select the <code>text</code>, if present</li>
</ul>
<p><code>t.me</code> syntax:</p>
<pre><code>t.me/share?url=&lt;url&gt;&amp;text=&lt;text&gt;</code></pre>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://msg_url?url=&lt;url&gt;&amp;text=&lt;text&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>url</code></td>
<td style="text-align: center;">Required</td>
<td>URL to share (urlencoded)</td>
</tr>
<tr>
<td><code>text</code></td>
<td style="text-align: center;">Optional</td>
<td>Message to share</td>
</tr>
</tbody>
</table>
<h3><a class="anchor" href="#business-chat-links" id="business-chat-links" name="business-chat-links"><i class="anchor-icon"></i></a>Business chat links</h3>
<p><a href="/api/business#business-chat-links">Business chat deep links »</a> allow business owners to share pre-made links to their <a href="/api/business">Telegram Business</a> account, optionally filling out the message input field with a pre-prepared message (with support for <a href="/api/entities">styled text entities »</a>). </p>
<p>There is no additional limit on the prepared message length (because the message text is <em>not</em> present in the URL's query string, but rather it's fetched from the server using the link slug); each created business chat deep link also has a view counter. </p>
<p>See <a href="/api/business#business-chat-links">here »</a> for more info on how to create, edit, resolve and get view information about business chat links.</p>
<p>These links should be handled as follows:</p>
<ul>
<li>Invoke <a href="/method/account.resolveBusinessChatLink">account.resolveBusinessChatLink</a>, passing the <code>slug</code> to obtain info about the link as a <a href="/constructor/account.resolvedBusinessChatLinks">account.resolvedBusinessChatLinks</a> and increase the view counter.</li>
<li>Open the returned <code>peer</code>, pre-filling the text input field with the returned <code>message</code> and <code>entities</code> (if present). </li>
</ul>
<p><code>t.me</code> syntax:</p>
<pre><code>t.me/m/&lt;slug&gt;</code></pre>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://message?slug=&lt;slug&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>slug</code></td>
<td style="text-align: center;">Required</td>
<td>Slug to pass to <a href="/method/account.resolveBusinessChatLink">account.resolveBusinessChatLink</a> and link management methods.</td>
</tr>
</tbody>
</table>
<h3><a class="anchor" href="#video-chat-livestream-links" id="video-chat-livestream-links" name="video-chat-livestream-links"><i class="anchor-icon"></i></a>Video chat/Livestream links</h3>
<p>Used to join video/voice chats in groups, and livestreams in channels.<br>
Such links are generated using <a href="/method/phone.exportGroupCallInvite">phone.exportGroupCallInvite</a>.<br>
Note that <code>voicechat</code> links are deprecated, the API will always export <code>videochat</code> links for video and voice chats in groups, clients should support parsing the old link format only for backwards compatibility. </p>
<p><code>t.me</code> syntax:</p>
<pre><code>t.me/&lt;username&gt;?videochat
t.me/&lt;username&gt;?videochat=&lt;invite_hash&gt;
t.me/&lt;username&gt;?livestream
t.me/&lt;username&gt;?livestream=&lt;invite_hash&gt;
t.me/&lt;username&gt;?voicechat
t.me/&lt;username&gt;?voicechat=&lt;invite_hash&gt;</code></pre>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://resolve?domain=&lt;username&gt;&amp;videochat
tg://resolve?domain=&lt;username&gt;&amp;videochat=&lt;invite_hash&gt;
tg://resolve?domain=&lt;username&gt;&amp;livestream
tg://resolve?domain=&lt;username&gt;&amp;livestream=&lt;invite_hash&gt;
tg://resolve?domain=&lt;username&gt;&amp;voicechat
tg://resolve?domain=&lt;username&gt;&amp;voicechat=&lt;invite_hash&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>invite_hash</code></td>
<td style="text-align: center;">Optional</td>
<td>Invite hash exported if the <code>can_self_unmute</code> flag is set when calling <a href="/method/phone.exportGroupCallInvite">phone.exportGroupCallInvite</a>: should be passed to <a href="/method/phone.joinGroupCall">phone.joinGroupCall</a>, allows the user to speak in livestreams or muted group chats.</td>
</tr>
</tbody>
</table>
<h3><a class="anchor" href="#stickerset-links" id="stickerset-links" name="stickerset-links"><i class="anchor-icon"></i></a>Stickerset links</h3>
<p>Used to import stickersets or <a href="/api/custom-emoji">custom emoji</a> stickersets as described <a href="/api/stickers#installing-stickersets">here »</a>.</p>
<p><code>t.me</code> syntax:</p>
<pre><code>t.me/addstickers/&lt;slug&gt;
t.me/addemoji/&lt;slug&gt;</code></pre>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://addstickers?set=&lt;slug&gt;
tg://addemoji?set=&lt;slug&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>slug</code></td>
<td style="text-align: center;">Required</td>
<td>Stickerset short name, used when <a href="/api/stickers#installing-stickersets">installing stickers</a>.</td>
</tr>
</tbody>
</table>
<h3><a class="anchor" href="#custom-emoji-stickerset-links" id="custom-emoji-stickerset-links" name="custom-emoji-stickerset-links"><i class="anchor-icon"></i></a>Custom emoji stickerset links</h3>
<p>Used to import <a href="/api/custom-emoji">custom emoji</a> stickersets as described <a href="/api/stickers#installing-stickersets">here »</a>.</p>
<p><code>t.me</code> syntax:</p>
<pre><code>t.me/addemoji/&lt;slug&gt;</code></pre>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://addemoji?set=&lt;slug&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>slug</code></td>
<td style="text-align: center;">Required</td>
<td>Stickerset short name, used when <a href="/api/stickers#installing-stickersets">installing stickers</a>.</td>
</tr>
</tbody>
</table>
<h3><a class="anchor" href="#story-links" id="story-links" name="story-links"><i class="anchor-icon"></i></a>Story links</h3>
<p>Used to link to a <a href="/api/stories">Telegram Story »</a>, generated using the procedure <a href="/api/links#story-links">specified here »</a>. </p>
<p><code>t.me</code> syntax:</p>
<pre><code>t.me/&lt;username&gt;/s/&lt;story_id&gt;</code></pre>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://resolve?domain=&lt;username&gt;&amp;story=&lt;story_id&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>username</code></td>
<td style="text-align: center;">Required</td>
<td>Username of the user or channel that posted the story.</td>
</tr>
<tr>
<td><code>story_id</code></td>
<td style="text-align: center;">Required</td>
<td>ID of the <a href="/api/stories#watching-stories">Telegram Story to be fetched and viewed as described here »</a>.</td>
</tr>
</tbody>
</table>
<h3><a class="anchor" href="#boost-links" id="boost-links" name="boost-links"><i class="anchor-icon"></i></a>Boost links</h3>
<p>Used by users to <a href="/api/boost">boost channels »</a>, granting them the ability to post stories and further perks.</p>
<p>Use the channel information to boost the channel as described <a href="/api/boost">here »</a>. </p>
<p><code>t.me</code> syntax (public channels):</p>
<pre><code>t.me/boost/&lt;username&gt;
t.me/&lt;username&gt;?boost</code></pre>
<p><code>t.me</code> syntax (private channels):</p>
<pre><code>t.me/boost?c=&lt;id&gt;
t.me/c/&lt;id&gt;?boost</code></pre>
<p><code>tg:</code> syntax (public channels):</p>
<pre><code>tg://boost?domain=&lt;username&gt;</code></pre>
<p><code>tg:</code> syntax (private channels):</p>
<pre><code>tg://boost?channel=&lt;id&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>username</code></td>
<td style="text-align: center;">Required for public links</td>
<td>Channel username.</td>
</tr>
<tr>
<td><code>channel</code></td>
<td style="text-align: center;">Required for private links</td>
<td>Channel ID.</td>
</tr>
</tbody>
</table>
<h3><a class="anchor" href="#proxy-links" id="proxy-links" name="proxy-links"><i class="anchor-icon"></i></a>Proxy links</h3>
<p>Used to share a proxy server that can be used to connect to Telegram. </p>
<h4><a class="anchor" href="#mtproxy-links" id="mtproxy-links" name="mtproxy-links"><i class="anchor-icon"></i></a>MTProxy links</h4>
<p>Used for <a href="/mtproto/mtproto-transports#transport-obfuscation">MTProxies »</a>.</p>
<p><code>t.me</code> syntax:</p>
<pre><code>t.me/proxy?server=&lt;server&gt;&amp;port=&lt;port&gt;&amp;secret=&lt;secret&gt;</code></pre>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://proxy?server=&lt;server&gt;&amp;port=&lt;port&gt;&amp;secret=&lt;secret&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>server</code></td>
<td style="text-align: center;">Required</td>
<td>MTProxy server IP address or host</td>
</tr>
<tr>
<td><code>port</code></td>
<td style="text-align: center;">Required</td>
<td>MTProxy server port</td>
</tr>
<tr>
<td><code>secret</code></td>
<td style="text-align: center;">Required</td>
<td>MTProxy <a href="/mtproto/mtproto-transports#transport-obfuscation">secret »</a></td>
</tr>
</tbody>
</table>
<h4><a class="anchor" href="#socks5-proxy-links" id="socks5-proxy-links" name="socks5-proxy-links"><i class="anchor-icon"></i></a>Socks5 proxy links</h4>
<p>Used for socks5 proxies.</p>
<p><code>t.me</code> syntax:</p>
<pre><code>t.me/socks?server=&lt;server&gt;&amp;port=&lt;port&gt;&amp;user=&lt;user&gt;&amp;pass=&lt;pass&gt;</code></pre>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://socks?server=&lt;server&gt;&amp;port=&lt;port&gt;&amp;user=&lt;user&gt;&amp;pass=&lt;pass&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>server</code></td>
<td style="text-align: center;">Required</td>
<td>Proxy server IP address or host</td>
</tr>
<tr>
<td><code>port</code></td>
<td style="text-align: center;">Required</td>
<td>Proxy server port</td>
</tr>
<tr>
<td><code>user</code></td>
<td style="text-align: center;">Optional</td>
<td>Proxy server username</td>
</tr>
<tr>
<td><code>pass</code></td>
<td style="text-align: center;">Optional</td>
<td>Proxy server password</td>
</tr>
</tbody>
</table>
<h3><a class="anchor" href="#theme-links" id="theme-links" name="theme-links"><i class="anchor-icon"></i></a>Theme links</h3>
<p>Used to <a href="/api/themes#installing-themes">install themes »</a>.</p>
<p><code>t.me</code> syntax:</p>
<pre><code>t.me/addtheme/&lt;name&gt;</code></pre>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://addtheme?slug=&lt;name&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>name</code></td>
<td style="text-align: center;">Required</td>
<td>Theme short name used when <a href="/api/themes#installing-themes">installing themes »</a></td>
</tr>
</tbody>
</table>
<h3><a class="anchor" href="#wallpaper-links" id="wallpaper-links" name="wallpaper-links"><i class="anchor-icon"></i></a>Wallpaper links</h3>
<p>Used to share and install chat backgrounds (wallpapers): see <a href="/api/wallpapers">here for more info on the various wallpaper and fill types »</a>. </p>
<h4><a class="anchor" href="#image-wallpapers" id="image-wallpapers" name="image-wallpapers"><i class="anchor-icon"></i></a><a href="/api/wallpapers#image-wallpapers">Image wallpapers</a></h4>
<p>Used for <a href="/api/wallpapers#image-wallpapers">image-based wallpapers »</a>. </p>
<p><code>t.me</code> syntax:</p>
<pre><code>t.me/bg/&lt;slug&gt;?mode=&lt;mode&gt;</code></pre>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://bg?slug=&lt;slug&gt;&amp;mode=&lt;mode&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>slug</code></td>
<td style="text-align: center;">Required</td>
<td>Wallpaper slug used to obtain the image file using <a href="/method/account.getWallPaper">account.getWallPaper</a>.</td>
</tr>
<tr>
<td><code>mode</code></td>
<td style="text-align: center;">Optional</td>
<td>A combination of <code>blur</code> and <code>motion</code> (joined by <code>+</code>) to enable blurring and/or parallax motion as specified in the <a href="/api/wallpapers#image-wallpapers">docs »</a>.</td>
</tr>
</tbody>
</table>
<h4><a class="anchor" href="#solid-fill-wallpapers" id="solid-fill-wallpapers" name="solid-fill-wallpapers"><i class="anchor-icon"></i></a>Solid fill wallpapers</h4>
<p>Used for <a href="/api/wallpapers#fill-wallpapers">fill wallpapers »</a> with a <a href="/api/wallpapers#solid-fill">solid fill »</a>. </p>
<p><code>t.me</code> syntax:</p>
<pre><code>t.me/bg/&lt;hex_color&gt;</code></pre>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://bg?color=&lt;hex_color&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>hex_color</code></td>
<td style="text-align: center;">Required</td>
<td>Fill color in hex RGB format.</td>
</tr>
</tbody>
</table>
<h4><a class="anchor" href="#gradient-fill-wallpapers" id="gradient-fill-wallpapers" name="gradient-fill-wallpapers"><i class="anchor-icon"></i></a>Gradient fill wallpapers</h4>
<p>Used for <a href="/api/wallpapers#fill-wallpapers">fill wallpapers »</a> with a <a href="/api/wallpapers#gradient-fill">gradient fill »</a>. </p>
<p><code>t.me</code> syntax:</p>
<pre><code>t.me/bg/&lt;top_color&gt;-&lt;bottom_color&gt;?rotation=&lt;rotation&gt;</code></pre>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://bg?gradient=&lt;top_color&gt;-&lt;bottom_color&gt;&amp;rotation=&lt;rotation&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>top_color</code></td>
<td style="text-align: center;">Required</td>
<td>Top gradient color in hex RGB format.</td>
</tr>
<tr>
<td><code>bottom_color</code></td>
<td style="text-align: center;">Required</td>
<td>Bottom gradient color in hex RGB format.</td>
</tr>
<tr>
<td><code>rotation</code></td>
<td style="text-align: center;">Optional</td>
<td>Clockwise rotation angle of the gradient, in degrees; 0-359. Must be always divisible by 45, default to 0 if not set.</td>
</tr>
</tbody>
</table>
<h4><a class="anchor" href="#freeform-gradient-fill-wallpapers" id="freeform-gradient-fill-wallpapers" name="freeform-gradient-fill-wallpapers"><i class="anchor-icon"></i></a>Freeform gradient fill wallpapers</h4>
<p>Used for <a href="/api/wallpapers#fill-wallpapers">fill wallpapers »</a> with a <a href="/api/wallpapers#freeform-gradient-fill">freeform gradient fill »</a>. </p>
<p><code>t.me</code> syntax:</p>
<pre><code>t.me/bg/&lt;hex_color1&gt;~&lt;hex_color2&gt;~&lt;hex_color3&gt;
t.me/bg/&lt;hex_color1&gt;~&lt;hex_color2&gt;~&lt;hex_color3&gt;~&lt;hex_color4&gt;</code></pre>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://bg?gradient=&lt;hex_color1&gt;~&lt;hex_color2&gt;~&lt;hex_color3&gt;
tg://bg?gradient=&lt;hex_color1&gt;~&lt;hex_color2&gt;~&lt;hex_color3&gt;~&lt;hex_color4&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>hex_color1</code></td>
<td style="text-align: center;">Required</td>
<td>First gradient color in hex RGB format.</td>
</tr>
<tr>
<td><code>hex_color2</code></td>
<td style="text-align: center;">Required</td>
<td>Second gradient color in hex RGB format.</td>
</tr>
<tr>
<td><code>hex_color3</code></td>
<td style="text-align: center;">Required</td>
<td>Third gradient color in hex RGB format.</td>
</tr>
<tr>
<td><code>hex_color4</code></td>
<td style="text-align: center;">Optional</td>
<td>Fourth gradient color in hex RGB format.</td>
</tr>
</tbody>
</table>
<h4><a class="anchor" href="#solid-pattern-wallpapers" id="solid-pattern-wallpapers" name="solid-pattern-wallpapers"><i class="anchor-icon"></i></a>Solid pattern wallpapers</h4>
<p>Used for <a href="/api/wallpapers#pattern-wallpapers">pattern wallpapers »</a> with a <a href="/api/wallpapers#solid-fill">solid fill »</a>. </p>
<p><code>t.me</code> syntax:</p>
<pre><code>t.me/bg/&lt;slug&gt;?intensity=&lt;intensity&gt;&amp;bg_color=&lt;bg_color&gt;&amp;mode=&lt;mode&gt;</code></pre>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://bg?slug=&lt;slug&gt;&amp;intensity=&lt;intensity&gt;&amp;bg_color=&lt;bg_color&gt;&amp;mode=&lt;mode&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>slug</code></td>
<td style="text-align: center;">Required</td>
<td>Wallpaper slug used to obtain the pattern file using <a href="/method/account.getWallPaper">account.getWallPaper</a>.</td>
</tr>
<tr>
<td><code>intensity</code></td>
<td style="text-align: center;">Required</td>
<td>A value ranging from -100 to 100, used to combine the pattern with the fill <a href="/api/wallpapers#pattern-wallpapers">as specified in the docs</a>.</td>
</tr>
<tr>
<td><code>bg_color</code></td>
<td style="text-align: center;">Required</td>
<td>Fill color in hex RGB format.</td>
</tr>
<tr>
<td><code>mode</code></td>
<td style="text-align: center;">Optional</td>
<td><code>motion</code> to enable parallax motion as specified in the <a href="/api/wallpapers#image-wallpapers">docs</a>.</td>
</tr>
</tbody>
</table>
<h4><a class="anchor" href="#gradient-pattern-wallpapers" id="gradient-pattern-wallpapers" name="gradient-pattern-wallpapers"><i class="anchor-icon"></i></a>Gradient pattern wallpapers</h4>
<p>Used for <a href="/api/wallpapers#pattern-wallpapers">pattern wallpapers »</a> with a <a href="/api/wallpapers#gradient-fill">gradient fill »</a>. </p>
<p><code>t.me</code> syntax:</p>
<pre><code>t.me/bg/&lt;slug&gt;?intensity=&lt;intensity&gt;&amp;bg_color=&lt;top_color&gt;-&lt;bottom_color&gt;&amp;rotation=&lt;rotation&gt;&amp;mode=&lt;mode&gt;</code></pre>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://bg?slug=&lt;slug&gt;&amp;intensity=&lt;intensity&gt;&amp;bg_color=&lt;top_color&gt;-&lt;bottom_color&gt;&amp;rotation=&lt;rotation&gt;&amp;mode=&lt;mode&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>slug</code></td>
<td style="text-align: center;">Required</td>
<td>Wallpaper slug used to obtain the pattern file using <a href="/method/account.getWallPaper">account.getWallPaper</a>.</td>
</tr>
<tr>
<td><code>intensity</code></td>
<td style="text-align: center;">Required</td>
<td>A value ranging from -100 to 100, used to combine the pattern with the fill <a href="/api/wallpapers#pattern-wallpapers">as specified in the docs</a>.</td>
</tr>
<tr>
<td><code>top_color</code></td>
<td style="text-align: center;">Required</td>
<td>Top gradient color in hex RGB format.</td>
</tr>
<tr>
<td><code>bottom_color</code></td>
<td style="text-align: center;">Required</td>
<td>Bottom gradient color in hex RGB format.</td>
</tr>
<tr>
<td><code>rotation</code></td>
<td style="text-align: center;">Optional</td>
<td>Clockwise rotation angle of the gradient, in degrees; 0-359. Must be always divisible by 45, default to 0 if not set.</td>
</tr>
<tr>
<td><code>mode</code></td>
<td style="text-align: center;">Optional</td>
<td><code>motion</code> to enable parallax motion as specified in the <a href="/api/wallpapers#image-wallpapers">docs</a>.</td>
</tr>
</tbody>
</table>
<h4><a class="anchor" href="#freeform-gradient-pattern-wallpapers" id="freeform-gradient-pattern-wallpapers" name="freeform-gradient-pattern-wallpapers"><i class="anchor-icon"></i></a>Freeform gradient pattern wallpapers</h4>
<p>Used for <a href="/api/wallpapers#pattern-wallpapers">pattern wallpapers »</a> with a <a href="/api/wallpapers#freeform-gradient-fill">freeform gradient fill »</a>. </p>
<p><code>t.me</code> syntax:</p>
<pre><code>t.me/bg/&lt;slug&gt;?intensity=&lt;intensity&gt;&amp;bg_color=&lt;hex_color1&gt;~&lt;hex_color2&gt;~&lt;hex_color3&gt;&amp;mode=&lt;mode&gt;
t.me/bg/&lt;slug&gt;?intensity=&lt;intensity&gt;&amp;bg_color=&lt;hex_color1&gt;~&lt;hex_color2&gt;~&lt;hex_color3&gt;~&lt;hex_color4&gt;&amp;mode=&lt;mode&gt;</code></pre>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://bg?slug=&lt;slug&gt;&amp;intensity=&lt;intensity&gt;&amp;bg_color=&lt;hex_color1&gt;~&lt;hex_color2&gt;~&lt;hex_color3&gt;&amp;mode=&lt;mode&gt;
tg://bg?slug=&lt;slug&gt;&amp;intensity=&lt;intensity&gt;&amp;bg_color=&lt;hex_color1&gt;~&lt;hex_color2&gt;~&lt;hex_color3&gt;~&lt;hex_color4&gt;&amp;mode=&lt;mode&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>slug</code></td>
<td style="text-align: center;">Required</td>
<td>Wallpaper slug used to obtain the pattern file using <a href="/method/account.getWallPaper">account.getWallPaper</a>.</td>
</tr>
<tr>
<td><code>intensity</code></td>
<td style="text-align: center;">Required</td>
<td>A value ranging from -100 to 100, used to combine the pattern with the fill <a href="/api/wallpapers#pattern-wallpapers">as specified in the docs</a>.</td>
</tr>
<tr>
<td><code>hex_color1</code></td>
<td style="text-align: center;">Required</td>
<td>First gradient color in hex RGB format.</td>
</tr>
<tr>
<td><code>hex_color2</code></td>
<td style="text-align: center;">Required</td>
<td>Second gradient color in hex RGB format.</td>
</tr>
<tr>
<td><code>hex_color3</code></td>
<td style="text-align: center;">Required</td>
<td>Third gradient color in hex RGB format.</td>
</tr>
<tr>
<td><code>hex_color4</code></td>
<td style="text-align: center;">Optional</td>
<td>Fourth gradient color in hex RGB format.</td>
</tr>
<tr>
<td><code>mode</code></td>
<td style="text-align: center;">Optional</td>
<td><code>motion</code> to enable parallax motion as specified in the <a href="/api/wallpapers#image-wallpapers">docs</a>.</td>
</tr>
</tbody>
</table>
<h3><a class="anchor" href="#bot-links" id="bot-links" name="bot-links"><i class="anchor-icon"></i></a>Bot links</h3>
<p>Used to link to bots.</p>
<p><code>t.me</code> syntax:</p>
<pre><code>t.me/&lt;bot_username&gt;?start=&lt;parameter&gt;</code></pre>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://resolve?domain=&lt;bot_username&gt;&amp;start=&lt;parameter&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>bot_username</code></td>
<td style="text-align: center;">Required</td>
<td>Bot username</td>
</tr>
<tr>
<td><code>parameter</code></td>
<td style="text-align: center;">Optional</td>
<td>Start parameter, up to 64 <a href="https://en.wikipedia.org/wiki/Base64#The_URL_applications">base64url</a> characters: if provided and the <code>bot_username</code> is indeed a bot, the text input bar should be replaced with a <code>Start</code> button (even if the user has already started the bot) that should invoke <a href="/method/messages.startBot">messages.startBot</a> with the appropriate <code>parameter</code> once clicked. Note that if the <code>bot_username</code> is equal to the <a href="/api/config#premium-bot-username"><code>premium_bot_username</code> configuration value »</a>, clicking on this link should immediately invoke <a href="/method/messages.startBot">messages.startBot</a> with the appropriate <code>parameter</code>.</td>
</tr>
</tbody>
</table>
<h3><a class="anchor" href="#group-channel-bot-links" id="group-channel-bot-links" name="group-channel-bot-links"><i class="anchor-icon"></i></a>Group/channel bot links</h3>
<p>Used to add bots to groups or channels.<br>
First of all, check that the <code>&lt;bot_username&gt;</code> indeed links to a bot.<br>
Then, for group links:</p>
<ul>
<li>If the <code>admin</code> parameter is not provided:<ul>
<li>Bring up a dialog selection of groups where the user can add members</li>
<li>Add the bot to the group</li>
<li>If a <code>parameter</code> is provided, invoke <a href="/method/messages.startBot">messages.startBot</a> with the appropriate <code>parameter</code></li>
</ul>
</li>
<li>If the <code>admin</code> parameter is provided:<ul>
<li>Bring up a dialog selection of groups where the user can add/edit admins</li>
<li>If the bot is already an admin of the group, combine existing admin rights with the admin rights in <code>admin</code></li>
<li>Add the bot as admin/modify admin permissions to the new rights</li>
<li>If a <code>parameter</code> is provided, invoke <a href="/method/messages.startBot">messages.startBot</a> with the appropriate <code>parameter</code></li>
</ul>
</li>
</ul>
<p>For channel links:</p>
<ul>
<li>Bring up a dialog selection of channels where the user can add/edit admins</li>
<li>If the bot is already an admin of the channel, combine existing admin rights with the admin rights in <code>admin</code></li>
<li>Add the bot as admin/modify admin permissions to the new rights</li>
</ul>
<p><code>t.me</code> syntax (groups):</p>
<pre><code>t.me/&lt;bot_username&gt;?startgroup=&lt;parameter&gt;&amp;admin=&lt;permissions&gt;
t.me/&lt;bot_username&gt;?startgroup&amp;admin=&lt;permissions&gt;</code></pre>
<p><code>tg:</code> syntax (groups):</p>
<pre><code>tg://resolve?domain=&lt;bot_username&gt;&amp;startgroup=&lt;parameter&gt;&amp;admin=&lt;permissions&gt;
tg://resolve?domain=&lt;bot_username&gt;&amp;startgroup&amp;admin=&lt;permissions&gt;</code></pre>
<p><code>t.me</code> syntax (channels):</p>
<pre><code>t.me/&lt;bot_username&gt;?startchannel&amp;admin=&lt;permissions&gt;</code></pre>
<p><code>tg:</code> syntax (channels):</p>
<pre><code>tg://resolve?domain=&lt;bot_username&gt;&amp;startchannel&amp;admin=&lt;permissions&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>bot_username</code></td>
<td style="text-align: center;">Required</td>
<td>Bot username</td>
</tr>
<tr>
<td><code>parameter</code></td>
<td style="text-align: center;">Optional for group links, absent in channel links</td>
<td>Start parameter, only for group links, up to 64 <a href="https://en.wikipedia.org/wiki/Base64#The_URL_applications">base64url</a> characters: if provided and the <code>bot_username</code> is indeed a bot, <a href="/method/messages.startBot">messages.startBot</a> with the appropriate <code>parameter</code> should be invoked after adding the bot to the group.</td>
</tr>
<tr>
<td><code>admin</code></td>
<td style="text-align: center;">Optional for group links, required for channel links</td>
<td>A combination of the following identifiers separated by <code>+</code>, each corresponding to the appropriate flag in the <a href="/constructor/chatAdminRights">chatAdminRights »</a> constructor: <br>- <code>change_info</code> - <a href="/constructor/chatAdminRights">chatAdminRights.change_info</a> <br>- <code>post_messages</code> - <a href="/constructor/chatAdminRights">chatAdminRights.post_messages</a> <br>- <code>edit_messages</code> - <a href="/constructor/chatAdminRights">chatAdminRights.edit_messages</a> <br>- <code>delete_messages</code> - <a href="/constructor/chatAdminRights">chatAdminRights.delete_messages</a> <br>- <code>restrict_members</code> - <a href="/constructor/chatAdminRights">chatAdminRights.ban_users</a> <br>- <code>invite_users</code> - <a href="/constructor/chatAdminRights">chatAdminRights.invite_users</a> <br>- <code>pin_messages</code> - <a href="/constructor/chatAdminRights">chatAdminRights.pin_messages</a> <br>- <code>manage_topics</code> - <a href="/constructor/chatAdminRights">chatAdminRights.manage_topics</a> <br>- <code>promote_members</code> - <a href="/constructor/chatAdminRights">chatAdminRights.add_admins</a> <br>- <code>manage_video_chats</code> - <a href="/constructor/chatAdminRights">chatAdminRights.manage_call</a> <br>- <code>anonymous</code> - <a href="/constructor/chatAdminRights">chatAdminRights.anonymous</a> <br>- <code>manage_chat</code> - <a href="/constructor/chatAdminRights">chatAdminRights.other</a> <br>- <code>post_stories</code> - <a href="/constructor/chatAdminRights">chatAdminRights.post_stories</a> <br>- <code>edit_stories</code> - <a href="/constructor/chatAdminRights">chatAdminRights.edit_stories</a> <br>- <code>delete_stories</code> - <a href="/constructor/chatAdminRights">chatAdminRights.delete_stories</a></td>
</tr>
</tbody>
</table>
<h3><a class="anchor" href="#game-links" id="game-links" name="game-links"><i class="anchor-icon"></i></a>Game links</h3>
<p>Used to share <a href="/api/bots/games">games</a>. </p>
<p>These links should be handled as follows: </p>
<ul>
<li>Check if <code>bot_username</code> is indeed a bot username, if so then</li>
<li>Bring up a dialog selection prompt</li>
<li>Send the game to the selected dialog using an <a href="/constructor/inputMediaGame">inputMediaGame</a> with an <a href="/constructor/inputGameShortName">inputGameShortName</a> as specified in the <a href="/api/bots/games#sending-a-game">game docs</a>. </li>
</ul>
<p><code>t.me</code> syntax:</p>
<pre><code>t.me/&lt;bot_username&gt;?game=&lt;short_name&gt;</code></pre>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://resolve?domain=&lt;bot_username&gt;&amp;game=&lt;short_name&gt;</code></pre>
<p>Parameters: </p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>bot_username</code></td>
<td style="text-align: center;">Required</td>
<td>Username of the bot that owns the <a href="/api/bots/games">game</a></td>
</tr>
<tr>
<td><code>short_name</code></td>
<td style="text-align: center;">Required</td>
<td>Game short name</td>
</tr>
</tbody>
</table>
<h3><a class="anchor" href="#settings-links" id="settings-links" name="settings-links"><i class="anchor-icon"></i></a>Settings links</h3>
<h4><a class="anchor" href="#settings-link" id="settings-link" name="settings-link"><i class="anchor-icon"></i></a>Settings link</h4>
<p>Used to bring the user to the app settings. </p>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://settings</code></pre>
<p>No parameters.</p>
<h4><a class="anchor" href="#change-phone-number-link" id="change-phone-number-link" name="change-phone-number-link"><i class="anchor-icon"></i></a>Change phone number link</h4>
<p>Used to bring the user to the phone number modification page, invoking <a href="/method/account.sendChangePhoneCode">account.sendChangePhoneCode</a> and <a href="/method/account.changePhone">account.changePhone</a>.</p>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://settings/change_number</code></pre>
<p>No parameters.</p>
<h4><a class="anchor" href="#active-sessions-link" id="active-sessions-link" name="active-sessions-link"><i class="anchor-icon"></i></a>Active sessions link</h4>
<p>Used to bring the user to the active sessions page, calling <a href="/method/account.getAuthorizations">account.getAuthorizations</a>. </p>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://settings/devices</code></pre>
<p>No parameters.</p>
<h4><a class="anchor" href="#folder-settings-link" id="folder-settings-link" name="folder-settings-link"><i class="anchor-icon"></i></a>Folder settings link</h4>
<p>Used to bring the user to the <a href="/api/folders">folder settings</a>. </p>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://settings/folders</code></pre>
<p>No parameters.</p>
<h4><a class="anchor" href="#language-settings-link" id="language-settings-link" name="language-settings-link"><i class="anchor-icon"></i></a>Language settings link</h4>
<p>Used to bring the user to the language settings. </p>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://settings/language</code></pre>
<p>No parameters.</p>
<h4><a class="anchor" href="#privacy-and-security-settings-link" id="privacy-and-security-settings-link" name="privacy-and-security-settings-link"><i class="anchor-icon"></i></a>Privacy and security settings link</h4>
<p>Used to bring the user to the privacy and security settings. </p>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://settings/privacy</code></pre>
<p>No parameters.</p>
<h4><a class="anchor" href="#autodelete-settings-link" id="autodelete-settings-link" name="autodelete-settings-link"><i class="anchor-icon"></i></a>Autodelete settings link</h4>
<p>Used to bring the user to the message autodeletion settings. </p>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://settings/auto_delete</code></pre>
<p>No parameters.</p>
<h4><a class="anchor" href="#profile-settings-link" id="profile-settings-link" name="profile-settings-link"><i class="anchor-icon"></i></a>Profile settings link</h4>
<p>Used to bring the user to the profile settings menu. </p>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://settings/edit_profile</code></pre>
<p>No parameters.</p>
<h4><a class="anchor" href="#theme-settings-link" id="theme-settings-link" name="theme-settings-link"><i class="anchor-icon"></i></a>Theme settings link</h4>
<p>Used to bring the user to the theme settings section of the app. </p>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://settings/theme</code></pre>
<p>No parameters.</p>
<h3><a class="anchor" href="#login-code-link" id="login-code-link" name="login-code-link"><i class="anchor-icon"></i></a>Login code link</h3>
<p>Contains the phone number verification code to use during <a href="/api/auth">user authorization »</a>. </p>
<p><code>t.me</code> syntax:</p>
<pre><code>t.me/login/&lt;code&gt;</code></pre>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://login?code=&lt;code&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>code</code></td>
<td style="text-align: center;">Required</td>
<td>Login code.</td>
</tr>
</tbody>
</table>
<h3><a class="anchor" href="#invoice-links" id="invoice-links" name="invoice-links"><i class="anchor-icon"></i></a>Invoice links</h3>
<p>Used to initiate <a href="/api/payments">payment of an invoice »</a>, generated using <a href="/constructor/payments.exportedInvoice">payments.exportedInvoice</a>. </p>
<p><code>t.me</code> syntax:</p>
<pre><code>t.me/invoice/&lt;slug&gt;
t.me/$&lt;slug&gt;</code></pre>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://invoice?slug=&lt;slug&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>slug</code></td>
<td style="text-align: center;">Required</td>
<td>The invoice slug to be used <a href="/api/payments">during payment »</a>.</td>
</tr>
</tbody>
</table>
<h3><a class="anchor" href="#language-pack-links" id="language-pack-links" name="language-pack-links"><i class="anchor-icon"></i></a>Language pack links</h3>
<p>Used to import custom language packs using <a href="/method/langpack.getLangPack">langpack.getLangPack</a>.</p>
<p><code>t.me</code> syntax:</p>
<pre><code>t.me/setlanguage/&lt;slug&gt;</code></pre>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://setlanguage?lang=&lt;slug&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>slug</code></td>
<td style="text-align: center;">Required</td>
<td>Name of language pack to import using <a href="/method/langpack.getLangPack">langpack.getLangPack</a></td>
</tr>
</tbody>
</table>
<h3><a class="anchor" href="#telegram-passport-links" id="telegram-passport-links" name="telegram-passport-links"><i class="anchor-icon"></i></a>Telegram Passport links</h3>
<p>See <a href="/api/passport#uri-format">the Telegram Passport documentation for parameters and usage »</a>. </p>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://passport?params
tg://resolve?domain=telegrampassport&amp;params</code></pre>
<h3><a class="anchor" href="#phone-confirmation-links" id="phone-confirmation-links" name="phone-confirmation-links"><i class="anchor-icon"></i></a>Phone confirmation links</h3>
<p>Different from <a href="#login-code-link">login code links</a>.<br>
These links are used to confirm ownership of the phone number, to prevent account deletion: see <a href="/api/account-deletion">the account deletion docs for more info on how to handle them »</a>.</p>
<p><code>t.me</code> syntax:</p>
<pre><code>t.me/confirmphone?phone=&lt;phone&gt;&amp;hash=&lt;hash&gt;</code></pre>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://confirmphone?phone=&lt;phone&gt;&amp;hash=&lt;hash&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>phone</code></td>
<td style="text-align: center;">Required</td>
<td>Phone number</td>
</tr>
<tr>
<td><code>hash</code></td>
<td style="text-align: center;">Required</td>
<td>Confirmation hash to handle <a href="/api/account-deletion">as described here »</a></td>
</tr>
</tbody>
</table>
<h3><a class="anchor" href="#premium-multigift-links" id="premium-multigift-links" name="premium-multigift-links"><i class="anchor-icon"></i></a>Premium multigift links</h3>
<p>Used to bring the user to the screen used for gifting Telegram Premium subscriptions to friends, see <a href="/api/giveaways">here for more info on gifting Telegram Premium to multiple users »</a>. </p>
<p>This link is used to invite users to gift Premium subscription to other users, see <a href="#premium-giftcode-links">here »</a> for the different link type containing the actual giftcodes that can be used to import a gifted Telegram Premium subscription. </p>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://premium_multigift?ref=&lt;referrer&gt;</code></pre>
<p>Parameters: </p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>referrer</code></td>
<td style="text-align: center;">Optional</td>
<td>Used by official apps for analytics using <a href="/method/help.saveAppLog">help.saveAppLog</a>.</td>
</tr>
</tbody>
</table>
<h3><a class="anchor" href="#premium-referrer-links" id="premium-referrer-links" name="premium-referrer-links"><i class="anchor-icon"></i></a>Premium referrer links</h3>
<p>Used by official apps to show the <a href="/api/premium">Telegram Premium</a> subscription page. </p>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://premium_offer?ref=&lt;referrer&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>referrer</code></td>
<td style="text-align: center;">Optional</td>
<td>Used by official apps for analytics using <a href="/method/help.saveAppLog">help.saveAppLog</a></td>
</tr>
</tbody>
</table>
<h3><a class="anchor" href="#premium-giftcode-links" id="premium-giftcode-links" name="premium-giftcode-links"><i class="anchor-icon"></i></a>Premium giftcode links</h3>
<p>Used to process <a href="/api/giveaways">Telegram Premium giftcode links</a>. </p>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://giftcode?slug=&lt;slug&gt;</code></pre>
<p><code>t.me</code> syntax:</p>
<pre><code>t.me/giftcode/&lt;slug&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>slug</code></td>
<td style="text-align: center;">Optional</td>
<td>Gift code slug to be passed to <a href="/method/payments.checkGiftCode">payments.checkGiftCode</a> to obtain further info, and eventually to <a href="/method/payments.applyGiftCode">payments.applyGiftCode</a> to apply it. See the <a href="/api/giveaways">giveaways</a> documentation for more info.</td>
</tr>
</tbody>
</table>
<h3><a class="anchor" href="#qr-code-login-links" id="qr-code-login-links" name="qr-code-login-links"><i class="anchor-icon"></i></a>QR code login links</h3>
<p>Used by the <a href="/api/qr-login">QR code login flow »</a>.</p>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://login?token=&lt;base64encodedtoken&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>server</code></td>
<td style="text-align: center;">Required</td>
<td>Base64URL-encoded <a href="/api/qr-login">QR code login token</a></td>
</tr>
</tbody>
</table>
<h3><a class="anchor" href="#main-mini-app-links" id="main-mini-app-links" name="main-mini-app-links"><i class="anchor-icon"></i></a>Main Mini App links</h3>
<p>Used to open <a href="/api/bots/webapps#main-mini-apps">Main Mini Apps »</a>. </p>
<p>If the specified bot <strong>does not</strong> have a configured Main Mini App (i.e. the <a href="/constructor/user">user</a>.<code>bot_has_main_app</code> flag will <strong>not</strong> be set), fall back to the behavior of <a href="#public-username-links">username links »</a>. </p>
<p>The main mini app should be opened using <a href="/method/messages.requestMainWebView">messages.requestMainWebView</a>. </p>
<p><code>t.me</code> syntax:</p>
<pre><code>t.me/&lt;bot_username&gt;?startapp&amp;mode=&lt;mode&gt;
t.me/&lt;bot_username&gt;?startapp=&lt;start_parameter&gt;&amp;mode=&lt;mode&gt;</code></pre>
<p>Note that <a href="#direct-mini-app-links">Direct Mini App links</a> have a similar syntax, with an additional <code>short_name</code> parameter to identify a specific Mini App owned by the bot. </p>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://resolve?domain=&lt;bot_username&gt;&amp;startapp&amp;mode=&lt;mode&gt;
tg://resolve?domain=&lt;bot_username&gt;&amp;startapp=&lt;start_parameter&gt;&amp;mode=&lt;mode&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>bot_username</code></td>
<td style="text-align: center;">Required</td>
<td>Username of the bot that owns the <a href="/api/bots/webapps#main-mini-apps">main mini app »</a></td>
</tr>
<tr>
<td><code>start_parameter</code></td>
<td style="text-align: center;">Optional</td>
<td>If provided, should be passed to <a href="/method/messages.requestMainWebView">messages.requestMainWebView</a>.<code>start_param</code></td>
</tr>
<tr>
<td><code>mode</code></td>
<td style="text-align: center;">Optional</td>
<td>If equal to <code>compact</code>, the <a href="/method/messages.requestMainWebView">messages.requestMainWebView</a>.<code>compact</code> flag must be set.</td>
</tr>
</tbody>
</table>
<h3><a class="anchor" href="#direct-mini-app-links" id="direct-mini-app-links" name="direct-mini-app-links"><i class="anchor-icon"></i></a>Direct mini app links</h3>
<p>Used to share <a href="/api/bots/webapps#direct-link-mini-apps">Direct link Mini apps</a>. </p>
<p>These links are different from <a href="#bot-attachment-or-side-menu-links">bot attachment menu deep links</a>, because they don't require the user to install an attachment menu, and a single bot can offer multiple named mini apps, distinguished by their <code>short_name</code>. </p>
<p>These links should be handled as specified in the <a href="/api/bots/webapps#direct-link-mini-apps">direct link Mini Apps documentation »</a>. </p>
<p><code>t.me</code> syntax:</p>
<pre><code>t.me/&lt;bot_username&gt;/&lt;short_name&gt;?startapp=&lt;start_parameter&gt;&amp;mode=&lt;mode&gt;</code></pre>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://resolve?domain=&lt;bot_username&gt;&amp;appname=&lt;short_name&gt;&amp;startapp=&lt;start_parameter&gt;&amp;mode=&lt;mode&gt;</code></pre>
<p>Note that <a href="#main-mini-app-links">Main Mini App links</a> have a similar syntax, <em>without</em> a <code>short_name</code> parameter. </p>
<p>Parameters: </p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>bot_username</code></td>
<td style="text-align: center;">Required</td>
<td>Username of the bot that owns the <a href="/api/bots/games">game</a></td>
</tr>
<tr>
<td><code>appname</code></td>
<td style="text-align: center;">Required</td>
<td>Mini app short name, to pass to <a href="/constructor/inputBotAppShortName">inputBotAppShortName</a>.<code>short_name</code> when invoking <a href="/method/messages.getBotApp">messages.getBotApp</a></td>
</tr>
<tr>
<td><code>startapp</code></td>
<td style="text-align: center;">Optional</td>
<td><code>start_param</code> to pass to <a href="/method/messages.requestAppWebView">messages.requestAppWebView</a></td>
</tr>
<tr>
<td><code>mode</code></td>
<td style="text-align: center;">Optional</td>
<td>If equal to <code>compact</code>, the <a href="/method/messages.requestAppWebView">messages.requestAppWebView</a>.<code>compact</code> flag must be set.</td>
</tr>
</tbody>
</table>
<h3><a class="anchor" href="#bot-attachment-or-side-menu-links" id="bot-attachment-or-side-menu-links" name="bot-attachment-or-side-menu-links"><i class="anchor-icon"></i></a>Bot attachment or side menu links</h3>
<p>Used to install and open a <a href="/api/bots/attach">bot attachment or side menu »</a> in a certain chat.<br>
For all link types, clients should first <a href="/api/bots/attach">install the associated bot attachment or side menu entry as specified here »</a>, and if the user accepts the installation prompt, open the Mini App using the following logic, depending on the link subtype:</p>
<h4><a class="anchor" href="#open-in-current-chat" id="open-in-current-chat" name="open-in-current-chat"><i class="anchor-icon"></i></a>Open in current chat</h4>
<p>After installing the attachment/side menu entry globally, opens the associated mini app using <a href="/method/messages.requestWebView">messages.requestWebView</a> in the currently open chat, by passing it to the <code>peer</code> parameter of <a href="/method/messages.requestWebView">messages.requestWebView</a>. </p>
<p>If the current chat is not supported by the <a href="/constructor/attachMenuBot">attachMenuBot</a>.<code>peer_types</code> field: </p>
<ul>
<li>If the user has just installed the attachment menu in the previous step, notify the user that the attachment menu was installed successfully.</li>
<li>Otherwise, notify the user that the attachment menu webapp can't be opened in the specified chat.</li>
</ul>
<p><code>t.me</code> syntax:</p>
<pre><code>t.me/&lt;bot_username&gt;?startattach
t.me/&lt;bot_username&gt;?startattach=&lt;start_parameter&gt;</code></pre>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://resolve?domain=&lt;bot_username&gt;&amp;startattach
tg://resolve?domain=&lt;bot_username&gt;&amp;startattach=&lt;start_parameter&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>bot_username</code></td>
<td style="text-align: center;">Required</td>
<td>Username of the bot that owns the <a href="/api/bots/attach">attachment/side menu entry</a></td>
</tr>
<tr>
<td><code>start_parameter</code></td>
<td style="text-align: center;">Optional</td>
<td>If provided, should be passed to <a href="/method/messages.requestWebView">messages.requestWebView</a>.<code>start_param</code></td>
</tr>
</tbody>
</table>
<h4><a class="anchor" href="#open-in-specific-chat" id="open-in-specific-chat" name="open-in-specific-chat"><i class="anchor-icon"></i></a>Open in specific chat</h4>
<p>After installing the attachment/side menu entry globally, opens the associated mini app using <a href="/method/messages.requestWebView">messages.requestWebView</a> in a specific chat (passed to the <code>peer</code> parameter of <a href="/method/messages.requestWebView">messages.requestWebView</a>). </p>
<p><code>t.me</code> syntax:</p>
<pre><code>t.me/&lt;username&gt;?attach=&lt;bot_username&gt;
t.me/&lt;username&gt;?attach=&lt;bot_username&gt;&amp;startattach=&lt;start_parameter&gt;
t.me/+&lt;phone_number&gt;?attach=&lt;bot_username&gt;
t.me/+&lt;phone_number&gt;?attach=&lt;bot_username&gt;&amp;startattach=&lt;start_parameter&gt;</code></pre>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://resolve?domain=&lt;username&gt;&amp;attach=&lt;bot_username&gt;
tg://resolve?domain=&lt;username&gt;&amp;attach=&lt;bot_username&gt;&amp;startattach=&lt;start_parameter&gt;
tg://resolve?phone=&lt;phone_number&gt;&amp;attach=&lt;bot_username&gt;
tg://resolve?phone=&lt;phone_number&gt;&amp;attach=&lt;bot_username&gt;&amp;startattach=&lt;start_parameter&gt;</code></pre>
<p>If the specified chat is not supported by the <a href="/constructor/attachMenuBot">attachMenuBot</a>.<code>peer_types</code> field: </p>
<ul>
<li>If the user has just installed the attachment menu in the previous step, notify the user that the attachment menu was installed successfully.</li>
<li>Otherwise, notify the user that the attachment menu webapp can't be opened in the specified chat.</li>
</ul>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>username</code></td>
<td style="text-align: center;">Required for <a href="#public-username-links">username links</a></td>
<td>Username of chat where to open the mini app</td>
</tr>
<tr>
<td><code>phone_number</code></td>
<td style="text-align: center;">Required for <a href="#phone-number-links">phone number links</a></td>
<td>Phone number of private chat where to the open mini app</td>
</tr>
<tr>
<td><code>bot_username</code></td>
<td style="text-align: center;">Required</td>
<td>Username of the bot that owns the <a href="/api/bots/attach">attachment/side menu</a></td>
</tr>
<tr>
<td><code>start_parameter</code></td>
<td style="text-align: center;">Optional</td>
<td>If provided, should be passed to <a href="/method/messages.requestWebView">messages.requestWebView</a>.<code>start_param</code></td>
</tr>
</tbody>
</table>
<h4><a class="anchor" href="#open-in-any-chat" id="open-in-any-chat" name="open-in-any-chat"><i class="anchor-icon"></i></a>Open in any chat</h4>
<p>After installing the attachment/side menu entry globally, opens a dialog selection form that will open the attachment menu mini app using <a href="/method/messages.requestWebView">messages.requestWebView</a> in a specific chat (pass it to the <code>peer</code> parameter of <a href="/method/messages.requestWebView">messages.requestWebView</a>). </p>
<p><code>t.me</code> syntax:</p>
<pre><code>t.me/&lt;bot_username&gt;?startattach&amp;choose=users+bots+groups+channels
t.me/&lt;bot_username&gt;?startattach=&lt;start_parameter&gt;&amp;choose=users+bots+groups+channels</code></pre>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://resolve?domain=&lt;bot_username&gt;&amp;startattach&amp;choose=users+bots+groups+channels
tg://resolve?domain=&lt;bot_username&gt;&amp;startattach=&lt;start_parameter&gt;&amp;choose=users+bots+groups+channels</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>bot_username</code></td>
<td style="text-align: center;">Required</td>
<td>Username of the bot that owns the <a href="/api/bots/attach">attachment/side menu</a></td>
</tr>
<tr>
<td><code>start_parameter</code></td>
<td style="text-align: center;">Optional</td>
<td>If provided, should be passed to <a href="/method/messages.requestWebView">messages.requestWebView</a>.<code>start_param</code></td>
</tr>
<tr>
<td><code>choose</code></td>
<td style="text-align: center;">Optional</td>
<td>A combination of <code>users</code>, <code>bots</code>, <code>groups</code>, <code>channels</code> separated by <code>+</code>: indicates the dialog types to show in the dialog selection popup: must be intersected with the dialog types contained in the <a href="/constructor/attachMenuBot">attachMenuBot</a>.<code>peer_types</code> field before use.</td>
</tr>
</tbody>
</table>
<h3><a class="anchor" href="#id-links" id="id-links" name="id-links"><i class="anchor-icon"></i></a>ID links</h3>
<p>ID links are merely an abstraction offered by the <a href="/bots/api">bot API</a> to simplify construction of <a href="/constructor/inputMessageEntityMentionName">inputMessageEntityMentionName</a> and <a href="/constructor/inputKeyboardButtonUserProfile">inputKeyboardButtonUserProfile</a> constructors, and should be ignored by normal clients. </p>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://user?id=&lt;id&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>id</code></td>
<td style="text-align: center;">Required</td>
<td>User ID</td>
</tr>
</tbody>
</table>
<h3><a class="anchor" href="#emoji-links" id="emoji-links" name="emoji-links"><i class="anchor-icon"></i></a>Emoji links</h3>
<p>Emoji links are merely an abstraction offered by the <a href="/bots/api">bot API</a> to simplify construction of <a href="/constructor/messageEntityCustomEmoji">messageEntityCustomEmoji</a> constructors, and should be ignored by normal clients. </p>
<p><code>tg:</code> syntax:</p>
<pre><code>tg://emoji?id=&lt;id&gt;</code></pre>
<p>Parameters:</p>
<table class="table">
<thead>
<tr>
<th>Name</th>
<th style="text-align: center;">Optional</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>id</code></td>
<td style="text-align: center;">Required</td>
<td><a href="/api/custom-emoji">Custom emoji ID</a></td>
</tr>
</tbody>
</table>
<h3><a class="anchor" href="#unsupported-links" id="unsupported-links" name="unsupported-links"><i class="anchor-icon"></i></a>Unsupported links</h3>
<p>If a client encounters a <code>tg:</code> link type not listed on this page, <a href="/method/help.getDeepLinkInfo">help.getDeepLinkInfo</a> should be invoked with just the <code>path</code> component of the link. </p>
<p>Schema:</p>
<pre><code><a href='/constructor/help.deepLinkInfoEmpty'>help.deepLinkInfoEmpty</a>#66afa166 = <a href='/type/help.DeepLinkInfo'>help.DeepLinkInfo</a>;
<a href='/constructor/help.deepLinkInfo'>help.deepLinkInfo</a>#6a4ee832 flags:<a href='/type/%23'>#</a> update_app:flags.0?<a href='/constructor/true'>true</a> message:<a href='/type/string'>string</a> entities:flags.1?<a href='/type/Vector%20t'>Vector</a>&lt;<a href='/type/MessageEntity'>MessageEntity</a>&gt; = <a href='/type/help.DeepLinkInfo'>help.DeepLinkInfo</a>;
---functions---
<a href='/method/help.getDeepLinkInfo'>help.getDeepLinkInfo</a>#3fedc75f path:<a href='/type/string'>string</a> = <a href='/type/help.DeepLinkInfo'>help.DeepLinkInfo</a>;</code></pre>
<p>The method may return formatted text, containing for example: </p>
<ul>
<li>A description of what the link does or,</li>
<li>An explanation of why a certain link isn't supported by the app;</li>
</ul>
<p>And/or an invitation to upgrade to the latest version of the client app to be able to use the link: in this case, the result <code>update_app</code> flag will also be set, and the app should directly link to a store or attempt updating to the latest version. </p>
<p>Example links that can be used for testing: </p>
<ul>
<li><code>tg://need_update_for_some_feature?test=a</code></li>
<li><code>tg:some_unsupported_feature?test=b</code></li>
</ul>
<p>In these cases, <a href="/method/help.getDeepLinkInfo">help.getDeepLinkInfo</a> should be invoked with the following parameters:</p>
<ul>
<li><code>help.getDeepLinkInfo({path: "need_update_for_some_feature"})</code></li>
<li><code>help.getDeepLinkInfo({path: "some_unsupported_feature"})</code></li>
</ul>
<p>Note that this method should not be called for unrecognized <code>t.me</code> links, the usual HTTP link handling logic must be used, instead.</p></div>
</div>
</div>
</div>
<div class="footer_wrap">
<div class="footer_columns_wrap footer_desktop">
<div class="footer_column footer_column_telegram">
<h5>Telegram</h5>
<div class="footer_telegram_description"></div>
Telegram is a cloud-based mobile and desktop messaging app with a focus on security and speed.
</div>
<div class="footer_column">
<h5><a href="//telegram.org/faq">About</a></h5>
<ul>
<li><a href="//telegram.org/faq">FAQ</a></li>
<li><a href="//telegram.org/privacy">Privacy</a></li>
<li><a href="//telegram.org/press">Press</a></li>
</ul>
</div>
<div class="footer_column">
<h5><a href="//telegram.org/apps#mobile-apps">Mobile Apps</a></h5>
<ul>
<li><a href="//telegram.org/dl/ios">iPhone/iPad</a></li>
<li><a href="//telegram.org/android">Android</a></li>
<li><a href="//telegram.org/dl/web">Mobile Web</a></li>
</ul>
</div>
<div class="footer_column">
<h5><a href="//telegram.org/apps#desktop-apps">Desktop Apps</a></h5>
<ul>
<li><a href="//desktop.telegram.org/">PC/Mac/Linux</a></li>
<li><a href="//macos.telegram.org/">macOS</a></li>
<li><a href="//telegram.org/dl/web">Web-browser</a></li>
</ul>
</div>
<div class="footer_column footer_column_platform">
<h5><a href="/">Platform</a></h5>
<ul>
<li><a href="/api">API</a></li>
<li><a href="//translations.telegram.org/">Translations</a></li>
<li><a href="//instantview.telegram.org/">Instant View</a></li>
</ul>
</div>
</div>
<div class="footer_columns_wrap footer_mobile">
<div class="footer_column">
<h5><a href="//telegram.org/faq">About</a></h5>
</div>
<div class="footer_column">
<h5><a href="//telegram.org/blog">Blog</a></h5>
</div>
<div class="footer_column">
<h5><a href="//telegram.org/apps">Apps</a></h5>
</div>
<div class="footer_column">
<h5><a href="/">Platform</a></h5>
</div>
<div class="footer_column">
<h5><a href="//telegram.org/press">Press</a></h5>
</div>
</div>
</div>
</div>
<script src="/js/main.js?47"></script>
<script src="/js/jquery.min.js?1"></script>
<script src="/js/bootstrap.min.js?1"></script>
<script>window.initDevPageNav&&initDevPageNav();
backToTopInit("Go up");
removePreloadInit();
</script>
</body>
</html>