Telegram and Discord posting APIs compared: bots, webhooks, limits
October 29, 2026
Telegram and Discord are the two places where posting is closest to a plain HTTP call. Neither needs an approval process or a review. The difference is how you are allowed in: Telegram gives you a bot, and Discord gives you a webhook URL.
This post compares them for the job of sending announcements from code: setup, limits, what each can and cannot do, and how yeetpost wraps both. Third-party facts come from Telegram's Bot API, Telegram's bot FAQ and Discord's webhook documentation, as of October 2026. The yeetpost numbers are from our own docs.
#At a glance
| Telegram | Discord | |
|---|---|---|
| Way in | A bot you create with @BotFather | A webhook URL from a channel |
| Credential | Bot token | The token inside the webhook URL |
| Text limit | 4,096 characters | 2,000 characters |
| With an image | Caption up to 1,024 characters | Same 2,000 characters |
| Images per post (in yeetpost) | 5, png and jpeg only | 5, png, jpeg, gif and webp |
| Replies and threads (in yeetpost) | Yes, up to 24 | No |
| Delete (in yeetpost) | Within 48 hours | Yes |
| Metrics read back | No | No |
#Telegram: a bot posts for you
Telegram's API is addressed by bot token. Telegram's docs give the form as https://api.telegram.org/bot<token>/METHOD_NAME. You get the token by creating a bot with @BotFather.
To post to a channel, add the bot to the channel as an admin with permission to post. For a group, the bot joins as a member. A private one-on-one chat with the bot is not a place you can post announcements, and an invite link is not a chat id.
A raw message call:
curl -X POST "https://api.telegram.org/bot$BOT_TOKEN/sendMessage" \
-d chat_id=@your_channel \
-d text="build 412 is live, changelog in the pinned message"Limits that matter, as of October 2026:
- Captions are 1,024 characters. Telegram's docs describe the
captiononsendPhotoas 0 to 1024 characters after entities parsing. Text sent alone is allowed 4,096 characters. When you attach an image, the text becomes the caption, so it shrinks to a quarter. - Rate. Telegram's bot FAQ advises avoiding more than one message a second in a single chat, and says bursts over that may be allowed for a short time before you get 429 errors. Groups are limited to about 20 messages a minute. Bots cannot broadcast more than about 30 messages a second without paid broadcasts.
For announcements, that is plenty. A channel posting a handful of times a day never gets near it.
One gap to plan for: yeetpost reads no metrics back for Telegram, because the Bot API reports nothing back. Discord reports nothing back either.
#Discord: a webhook posts into one channel
A Discord webhook is a URL you create in a channel's Integrations settings. The URL carries its own token, so posting needs no other authentication. Discord's docs give the form as /webhooks/{webhook.id}/{webhook.token}.
curl -X POST "https://discord.com/api/webhooks/$WEBHOOK_ID/$WEBHOOK_TOKEN" \
-H "content-type: application/json" \
-d '{"content": "deploy finished: v2.4 is live"}'What the documentation says, as of October 2026:
contenttakes up to 2,000 characters. At least one ofcontent,embeds,components,fileorpollis required.- You can send up to 10 embed objects for rich content.
usernameandavatar_urloverride the webhook's default name and picture.- With
wait=true, the request waits for confirmation and returns the created message. The default isfalse, and the response is204 No Content. Withfalse, a message that is not saved does not return an error. thread_idsends the message into a thread of the webhook's channel. For forum and media channels, you must supplythread_idorthread_name.- File attachments need a
multipart/form-datarequest withfiles[n]and apayload_json. - Use
allowed_mentionswhen you pass user-written text intocontent, so a stray@everyonedoes not ping the server.
The last point is the one that bites. If your announcement text can come from anywhere, treat mentions as a security setting.
A webhook is a secret. Anyone with the URL can post to that channel, and it is a credential that belongs in a secrets manager, not a repository.
#Which is easier
Discord is easier to start. Create a webhook, paste the URL, post. There is no bot to run and no permissions to configure. Its limit is that a webhook posts into one channel, so more channels mean more webhooks.
Telegram takes two more steps, creating a bot and adding it as an admin, and in return one bot can post to every channel and group it is in. Posts can be longer, up to 4,096 characters, and albums and reply chains are possible.
#Both through yeetpost
yeetpost wraps each the same way. You connect once in the dashboard, and your code holds an API key.
Discord: create a webhook in the channel's Integrations settings and paste its URL in the dashboard. yeetpost stores the URL encrypted and never returns it from the API. There is no bot to install and no OAuth flow.
curl -X POST https://api.yeetpost.com/api/v2/post/discord \
-H "x-api-key: $YEETPOST_API_KEY" \
-d 'deploy finished: v2.4 is live'Telegram: create the bot with @BotFather, add it to your channel as an admin that can post (or to your group as a member), then paste the bot token. The chat is detected for you. If the bot already has a webhook of its own pointed elsewhere, autodetection does not work, and you paste the chat instead: its @handle, a t.me link or its numeric id. yeetpost checks the token, the chat and the bot's membership when you connect, so a connection that exists is one that can post.
curl -X POST https://api.yeetpost.com/api/v2/post/telegram \
-H "x-api-key: $YEETPOST_API_KEY" \
-d 'build 412 is live, changelog in the pinned message'Both can go out in one call, with an image:
curl -X POST https://api.yeetpost.com/api/v2/posts \
-H "x-api-key: $YEETPOST_API_KEY" \
-H "content-type: application/json" \
-d '{
"text": "v2.4 is live. the scheduler is twice as fast.",
"connectionSlugs": ["discord", "telegram"],
"mediaUrls": ["https://example.com/v24.png"]
}'Things to know about how yeetpost behaves here:
- Text limits are checked before sending. Over 2,000 characters on Discord, over 4,096 on Telegram, or over 1,024 on Telegram with an image is a
400 text_too_longwith thefieldthat is too long. yeetpost refuses a long caption instead of splitting it into a photo plus a follow-up message nobody wrote. - Telegram takes png and jpeg only. A gif or a webp comes back
media_unsupportedfor the Telegram connection, and the post still goes to the other connections. - Alt text does not reach Telegram. A photo has no field for it. On Discord it is sent as the attachment description.
- Several Telegram images go out as one album, which clients show as one post. An album is never taken back if a thread fails partway, since deleting one piece would leave a gap.
- Telegram threads work, Discord threads do not. A thread of up to 24 replies is supported on Telegram. A Discord webhook cannot reply to its own message, so
threadon a Discord connection is refused asshape_unsupportedfor that item. - Delete. Telegram deletes within 48 hours of sending, covering the head message, its album and the replies. Discord deletes too.
- Telegram links. The permalink is
https://t.me/<handle>/<message id>for a public channel. A basic group has no message links, sourlcomes backnull. - Rate limits are the platform's, plus ours. yeetpost's own limit is 60 requests a minute per key per endpoint group, with
x-ratelimit-*headers on every response.
Posting to either is free. Billing is per active connected account, and the first 2 are free. See pricing.
#When each is the right call
- A team channel that should hear about deploys: Discord, a webhook, two minutes.
- A public announcement channel with subscribers: Telegram, a channel with a bot as admin.
- Both, from CI: one
POST /postswith both slugs, from a test key first. See safe CI for social posting.
The Telegram API page and Discord API page have the full limits, and the docs cover the rest.