There is no single Telegram bot file size limit. The Bot API sets a different ceiling for each way a file can move, so the number that applies depends on how you send it. A bot can upload 50 MB but download only 20 MB. It can send a file of any size by file_id — yet only 20 MB if it asks Telegram to fetch that file from a URL.
That asymmetry is the source of most "why does my bot work for small files and break for big ones" confusion. Here is the whole matrix, quoted from Telegram's documentation.
The limits, at a glance
| Operation | How the file moves | Official limit |
|---|---|---|
Send, by file_id | File already on Telegram's servers | "There are no limits for files sent this way." |
| Send, by HTTP URL | Telegram downloads it for you | 5 MB photos, 20 MB other content |
Send, by multipart/form-data | Your server uploads the bytes | 10 MB photos, 50 MB other files |
Download, via getFile | Telegram → your server | "up to 20MB in size" |
getFile link lifetime | — | "valid for at least 1 hour" |
| Local Bot API Server, upload | Your own server instance | "Upload files up to 2000 MB." |
| Local Bot API Server, download | Your own server instance | "Download files without a size limit." |
| Story video, via Bot API | — | "must not exceed 30 MB" |
| Regular user upload (not a bot) | Telegram app | 2 GB, or 4 GB with Premium |
Every figure above is quoted from Telegram's official pages. Anything not in this table — per-day upload quotas, bitrate targets, whether a video sent as a document gets re-encoded — Telegram does not publish; check the official documentation rather than a forum thread.
Three ways to send, three different ceilings
The Bot API's "Sending files" section says there are three ways to send files, and attaches a different limit to each.
1. By file_id — no limit. The docs: "If the file is already stored somewhere on the Telegram servers, you don't need to reupload it: each file object has a file_id field, simply pass this file_id as a parameter instead of uploading. There are no limits for files sent this way."
That sentence is doing a lot of work. A bot that receives a 1 GB video gets a file_id for it, and can re-send that exact file to a thousand chats without touching the bytes. No download, no upload, no size ceiling.
One restriction, stated just as plainly: "It is not possible to change the file type when resending by file_id. I.e. a video can't be sent as a photo, a photo can't be sent as a document, etc."
2. By HTTP URL — 20 MB. "Provide Telegram with an HTTP URL for the file to be sent. Telegram will download and send the file. 5 MB max size for photos and 20 MB max for other types of content."
This is the ceiling people forget exists, because it feels like it should be free — your server never handles the file. It is also the lowest of the three.
3. By multipart/form-data — 50 MB. "Post the file using multipart/form-data in the usual way that files are uploaded via the browser. 10 MB max size for photos, 50 MB for other files."
The 50 MB figure is repeated on each individual method, with a caveat worth preserving. sendDocument: "Bots can currently send files of any type of up to 50 MB in size, this limit may be changed in the future." sendVideo, sendAudio and sendAnimation state the same 50 MB ceiling and the same caveat. Telegram explicitly reserves the right to move this number, so hard-coding 50 MB into a validation check is a decision with a shelf life.
The asymmetry: your bot can send more than it can receive
Downloading is governed by a completely separate figure. From getFile: "Use this method to get basic information about a file and prepare it for downloading. For the moment, bots can download files of up to 20MB in size." The File object repeats it: "The maximum file size to download is 20 MB".
Put the two halves together and you get the situation that fills GitHub issue trackers:
- A user sends your bot a 100 MB video. Telegram accepts it — regular users can send files "up to 2 GB in size each (or 4 GB with Premium)", and that limit constrains the uploader, not the bot.
- Your bot sees the message, the video's metadata and its
file_id. - Your bot calls
getFileto download it, and fails. 20 MB is the ceiling. - Your bot can still forward that same 100 MB video anywhere, by
file_id, because that path has no limit.
So a bot can relay a file it is not allowed to read. If your bot's job is routing or reposting, you never touch the bytes. If its job is processing — transcoding, thumbnailing, scanning — 20 MB is a hard wall on the default infrastructure.
One more detail on the download path: "It is guaranteed that the link will be valid for at least 1 hour. When the link expires, a new one can be requested by calling getFile again." Do not cache file_path URLs and expect them to work tomorrow — cache the file_id and re-issue getFile on demand.
What to do when you hit the ceiling
Two routes, and they solve different problems.
Route one: run your own Bot API server. Telegram publishes the source and lists exactly what changes. A bot on a local Bot API server can: "Download files without a size limit." · "Upload files up to 2000 MB." · "Upload files using their local path and the file URI scheme." · "Use an HTTP URL for the webhook." · "Receive the absolute local path as a value of the file_path field without the need to download the file after a getFile request."
The asymmetry survives, inverted: downloads become unbounded, uploads get a stated ceiling of 2000 MB — Telegram's wording, not "2 GB". Telegram's own recommendation is restrained: "The majority of bots will be OK with the default configuration, running on our servers. But if you feel that you need one of these features, you're welcome to switch to your own at any time."
Route two: make the file smaller. If it is a video — a screen recording, a phone clip, an editor export — the size is usually a bitrate decision, and 50 MB is plenty for something watched inside a chat window.
Try it right here
Runs in your browser. Your file is not uploaded anywhere.
This runs in your browser tab: the file is read from disk, re-encoded locally, handed back. Nothing is uploaded to a server, which matters when you are testing with recordings you would rather not hand to a third party. To understand the trade-offs instead of accepting a preset, how to compress a video without losing quality covers bitrate and resolution; MOV to MP4 handles QuickTime sources; all Clapr tools lists the rest.
Bot-specific gotchas that are not about size
MP4 is the format that renders as video. sendVideo: "Use this method to send video files, Telegram clients support MPEG4 videos (other formats may be sent as Document)." That is the documented reason a .mkv well under 50 MB arrives as a Document rather than a playable video. Note the phrasing is "may be sent as Document", not a rejection.
Audio needs the right container to reach the music player. sendAudio: "Your audio must be in the .MP3 or .M4A format." That condition governs music-player display, not whether the upload succeeds.
Video notes have a duration limit, not just a size one. sendVideoNote: "Use this method to send a rounded square MPEG4 video of up to 1 minute long." And they cannot be fetched remotely: "Sending video notes by a URL is currently unsupported." That 1-minute figure is a Bot API limit — Telegram does not publish the equivalent for recording a round video in the app.
Thumbnails have a tiny budget of their own: JPEG, "less than 200 kB in size", with "width and height should not exceed 320".
Stories posted through the Bot API are the strictest thing on this page. The video "must be of the size 720x1280, streamable, encoded with H.265 codec, with key frames added each second in the MPEG4 format, and must not exceed 30 MB", with duration "0-60" seconds. Story photos: "must be of the size 1080x1920 and must not exceed 10 MB." Those are Bot API requirements; Telegram publishes no equivalent specs for posting a Story from the app.
FAQ
What is the maximum file size a Telegram bot can send?
50 MB when your server posts the bytes via multipart/form-data, 20 MB when you give Telegram an HTTP URL, and no limit at all when you pass a file_id for a file already on Telegram's servers. Photos are capped lower: 10 MB and 5 MB respectively.
Why can't my bot download a file larger than 20 MB?
Because getFile is capped independently of sending: "For the moment, bots can download files of up to 20MB in size." The user who sent it was working under the regular limit of 2 GB per file (4 GB with Premium), so bots routinely receive files they cannot fetch.
How do I send files larger than 50 MB with a Telegram bot?
Re-send an existing file_id, which has no limit, or run a local Bot API server, which raises uploads to "up to 2000 MB". Otherwise, compress the file below the ceiling first.
Does Telegram Premium raise my bot's limits? The Bot API states the 50 MB and 20 MB figures with no plan condition attached. Premium's "4 GB File Uploads" is described in Telegram's Premium FAQ as an account feature for uploads by users. If you need certainty for your case, check the official documentation.
My bot's download link stopped working — is that a bug?
No. getFile links are "valid for at least 1 hour"; when one expires, "a new one can be requested by calling getFile again." Store the file_id, not the URL.
For the same breakdown on other chat platforms, see Slack's file upload limit and what actually counts as "file too large" on Discord, or browse the rest of the platform limits guides.
All figures quoted from Telegram's official Bot API and help centre documentation, checked 16 September 2026. Telegram states in several places that "this limit may be changed in the future" — verify against the source before relying on them.