Back to Blog

How to Download All Media from a Telegram Group, Channel, or Chat

June 6, 2026·

Open the channel in Telegram Web, click the extension, choose Download media — every photo, video and file lands in a ZIP.

This is the Telegram Video Downloader extension — install it here.

The native Telegram client is built around the assumption that you want to look at one piece of media at a time. Tap the photo, save to camera roll. Tap the video, save to Files. That's fine for the messages you actively engage with. It is the wrong tool for the moment when you realize there are 4,000 attachments in a group going back two years and you need them on disk.

This guide covers three reliable ways to bulk-download media from a Telegram group, channel, or chat — the native "save all" path that most people miss, a Python script for repeatable pulls, and a browser extension for everyone else. Each gets you the same files; the difference is how much time and code you want to invest.

What "all media" actually means

Telegram media isn't a single category. A typical chat contains:

  • Photos — JPEGs sent inline, usually compressed by Telegram unless the sender chose "Send as file."
  • Videos — MP4, often re-encoded by Telegram to a target size.
  • Documents — anything sent as a file, including PDFs, ZIPs, and uncompressed images and videos.
  • Audio — voice notes (OGG/Opus) and music files (MP3/M4A).
  • Stickers and GIFs — usually WebP and MP4. Most bulk-download flows skip these by default.
  • Round videos — those circular video messages, MP4 with their own quirks.

The right answer to "download all media" depends on which of these you actually want. The methods below let you pick.

Folders of downloaded photos and videos on a desktop

Method comparison

Method Setup time Per-chat selection Filter by type Resume on fail Where it runs
Telegram Desktop export 0 min No (all-or-nothing) Yes (rough) No Desktop app
Telethon script (Python) 30–60 min Yes Yes Yes (you code) Anywhere
Mastros browser extension 2 min Yes Yes Yes Browser

Pick by what you actually need. If you want everything from your whole account once, the native export is fine. If you need one chat repeatedly and you can write code, Telethon. If you want one chat now and don't want to write code, the extension.

Method 1 — Telegram Desktop's built-in export

Settings → Advanced → Export Telegram Data. Pick a format (HTML or JSON), check "Photos / Videos / Voice messages / Video messages / Stickers / GIFs / Files," set a size cap, hit Export.

This is the most powerful native option and most users have never opened the menu. A few things to know:

It's all chats or none. You can't pick a single group from this dialog. Telegram exports your full account — every chat, every channel you're in. Exclusions are coarse-grained: you can skip "channels" or "groups" as categories, but not "this group, not that one."

There's a size cap on individual files. The default is 8 MB; raise it to whatever your downstream storage can handle. The cap is meant to keep the export sane on accounts with thousands of large videos.

It rate-limits hard on re-runs. If you run the export, then delete the output and re-run within a few hours, Telegram will throttle aggressively. This is a feature — meant to make abuse harder — but it surprises people who treat it as an interactive command.

Time scales with account, not with what you want. If you're after one chat's media but your account has a hundred chats, you'll wait for everything before you get the slice you cared about.

The output is a folder tree with media organized by chat and message ID, plus an messages.html index. It's the right tool when "I want a personal backup" is the actual job.

Method 2 — Telethon (Python) for one chat at a time

If you want a specific chat and you're comfortable with Python, this is the cleanest path. Telethon's iter_messages plus download_media does most of the work:

from telethon.sync import TelegramClient
from telethon.tl.types import (
    MessageMediaPhoto, MessageMediaDocument
)
import os

api_id   = 1234567
api_hash = 'YOUR_HASH'
target   = 'your_group_or_channel'   # username, link, or chat ID
out_dir  = './media'

os.makedirs(out_dir, exist_ok=True)

with TelegramClient('session', api_id, api_hash) as client:
    for m in client.iter_messages(target, limit=None):
        if not m.media:
            continue
        if isinstance(m.media, (MessageMediaPhoto, MessageMediaDocument)):
            path = client.download_media(m, file=out_dir)
            print(f'#{m.id}  ->  {path}')

A few practical notes:

  • Resume. Add a min_id=last_seen_id to iter_messages so a re-run picks up where the previous one stopped. Persist last_seen_id to a file after every successful download.
  • Filter by type. m.photo, m.video, m.document.mime_type let you skip stickers, voice notes, or anything you don't want. Branch on MessageMediaDocument.mime_type to tell PDFs from videos.
  • FloodWaitError will happen. Wrap the loop in a try/except telethon.errors.FloodWaitError as e: time.sleep(e.seconds + 5). On a 50K-message channel, you'll hit it. Plan for it.
  • Original quality. download_media pulls the original file, not the compressed preview. If you want the preview, you have to ask for thumb= explicitly.

For the broader Telethon walkthrough — credentials, sessions, and the API surface — see our member export guide and the API vs extension comparison.

Method 3 — Browser extension (Mastros) for one-click bulk

Install the Telegram Video Downloader, open Telegram Web, navigate to the group or channel, click the toolbar icon, choose Download media. You get the same checkboxes the Telethon script gives you in code: photo, video, document, audio, voice, with optional date-range and sender filters.

The extension batches downloads through the Telegram Web session you're already signed into — it reads Telegram's own structured data layer rather than bundling a separate MTProto client of its own. Telegram's servers see calls from your IP, the same way they would if you'd opened Telegram Web, and there's nothing to register or connect first. No data passes through a Mastros server because there isn't one in the data path.

Practical things that matter:

  • Resume by default. Files already in the output folder are skipped on re-run. Re-run after a flaky network and you only re-download what failed.
  • FloodWait is handled. The extension catches the error, waits, and resumes. You don't watch the bar.
  • Filter inline. Pick "videos only," "files larger than 5 MB," "from these senders," "between these dates." The same shape as the Python script's filters, in a UI.
  • Where files land. Your browser's default Downloads folder, in a subfolder named after the chat. Configurable in extension settings.

Larger pulls and team features sit behind the paid tiers.

Choosing where the files live

Before you start a 200 GB pull, decide where it's going. A few patterns that hold up:

Local SSD for active work. Fastest, easiest to inspect. Limited by your disk and not great for sharing.

Network-attached storage (Synology, Unraid, NAS). Right answer when the export is the start of an archive you'll keep. Mount the share as a folder, point the script or extension at it.

Object storage (S3, R2, GCS). The right answer when the archive is also the system of record — covered in detail in our compliance archiving guide. With Object Lock or its equivalent, you get tamper-evidence as a free side effect.

A USB drive in a drawer. Looks dumb, works fine for one-off "I want a copy in case the group disappears" backups. Pair it with a checksum file and you're done.

The mistake to avoid: bulk-downloading 50K files into your main Documents folder. Spotlight, Backup, and Time Machine will all become much slower until you move them.

File naming and de-duplication

A bulk download produces thousands of files with names that may or may not be useful. Telegram's defaults are unhelpful — a typical filename is photo_2026-05-08_14-22-11.jpg, and you'll get a dozen of those colliding within seconds during a busy chat day.

Three rules that save trouble:

  1. Prefix every file with its message ID. 00012345_photo_2026-05-08_14-22-11.jpg. Stable, sortable, and joins back to the message in your CSV/JSON export.
  2. Hash duplicates instead of renaming them. If the same photo was forwarded ten times in the chat, you don't need ten copies. Compute a SHA-256 and write the file once; keep a separate mapping of which message IDs reference it.
  3. Strip path-unsafe characters. Telegram allows colons, slashes, and emoji in filenames. Your filesystem may not. The Telethon download_media does some of this for you; the extension does all of it.

If you're piping the output into a search index or vector store, the message-ID prefix is what lets the index point back to "the original message this file came from."

Edge cases

A few situations that bite people on first runs:

Channels with content protection ("saving disabled"). When the channel admin has enabled this, the native client greys out the download button. The Telegram API enforces this server-side, so legitimate libraries (Telethon, GramJS) and extensions that wrap them honor the flag. Tools that claim to bypass it are doing something the API doesn't permit, with the risks that implies. We cover this in detail in our private and restricted channel guide.

Self-destructing media. Voice notes and view-once photos are designed to be unsavable. They aren't part of any legitimate bulk download.

Live photos. iOS sends photo + a short video as a "live photo." The video portion shows up as a separate document message. Decide whether you want the still, the motion, or both.

Forwarded media. A forwarded photo shows up in your chat with the original sender's metadata. The file you download is the same bytes, but the message metadata reflects the forward, not the original chat.

Verifying your pull is complete

Whatever method you used, before you call the job done:

  1. Count. Open the chat, look at the "Shared media" tab, note the count by type. Compare to your file count.
  2. Spot-check. Pick a date six months ago and a date last week. Confirm files from both are in the output.
  3. Check sizes. A "successful" download of zero bytes is more common than it should be. Sort by size, look for outliers.
  4. Sample play/preview. Open three random files. If they're corrupted, fix the script and rerun before the next 4,000 downloads.

The post-pull validation step is what separates a backup from "I think I have a backup."


One-click bulk download → Install the Telegram Video Downloader, open the group or channel, click Download media.

FAQ

Can I bulk-download media from just one Telegram group?

Not with Telegram Desktop's built-in export, which is all-chats-or-none — you can exclude whole categories like "channels", but not a specific group. Because it processes the entire account, you wait for everything before you get the slice you wanted. A Python script or a browser extension targets a single chat directly.

Why did my Telegram export skip large videos?

There is a per-file size cap in the export dialog, and it defaults to 8 MB. Raise it to whatever your downstream storage can handle before starting the run, or every file above the cap is silently left out.

Why is Telegram throttling my export?

Re-running the built-in export shortly after a previous run triggers aggressive rate limiting. It is deliberate — it makes abuse harder — but it catches people who treat the export as an interactive command they can retry freely. Plan one run and let it finish.

How do I avoid thousands of duplicate and colliding filenames?

Telegram's default names collide within seconds on a busy chat day. Prefix each file with its message ID (00012345_photo_….jpg) so names are stable, sortable, and join back to your CSV or JSON export. Deduplicate by hashing content rather than renaming, keeping a mapping of which message IDs point at each file, and strip characters your filesystem rejects.

Can I download self-destructing or view-once media in bulk?

No. View-once photos and self-destructing voice notes are designed to be unsavable, and they are not part of any legitimate bulk download. The same applies to media in channels where the admin has enabled content protection, which Telegram enforces server-side.

How do I know the download actually captured everything?

Check the chat's "Shared media" tab for counts by type and compare against your file count. Then spot-check two distant dates, sort by file size to catch zero-byte "successes", and open a few files at random to confirm they are not corrupt. That validation step is the difference between a backup and assuming you have one.

Related reading