Telegram JSON Viewer
Open a Telegram Desktop result.json export and read the chat in your browser. Search it, filter it, export it. No upload, no install, no account.
The CSV has one row per message. The Markdown keeps sender and date per line. The HTML is a single self-contained file you can open offline.
Runs entirely in your browser. The file is never sent anywhere and is discarded when you close the tab.
How this works
Telegram Desktop writes two kinds of export. A single-chat export puts a name, a type, and a messages array at the top level of result.json. A full-account export wraps everything in chats.list for the chat metadata and messages.list for the messages, with a chat_id on each message linking the two.
The parser checks which shape it has before reading anything else. If messages is an array, it is a single-chat file and every message belongs to the one chat. If messages.list exists, it is a full export and each message is grouped by its chat_id against chats.list. Both are flattened into the same list of messages with a chat name attached, which is why the viewer behaves the same way for either file.
Rich text is the other part that matters. Telegram does not store bold, italic, links, or code as markup in the text field. It stores a plain string plus a parallel text_entities array, where each entry has a type and the substring it applies to. The viewer walks that array and rebuilds the formatting as HTML for display and as Markdown for the export. If an export has no text_entities, the plain string is shown as-is, which is what you want for very old exports or hand-edited files.
Media is referenced by relative path, such as photos/photo_1.jpg or video_files/video_1.mp4. The browser cannot read a sibling folder automatically, so the viewer shows the media type and the reference rather than trying to render the file. The export folder on disk still has the actual files. Copying the reference into a file manager is the fastest way to open one.
What the export contains
| Field | Where it lives | What the viewer does with it |
|---|---|---|
| name | Top level, or chats.list[].name |
Shown as the chat label in the filter dropdown. |
| type | Top level, or chats.list[].type |
Kept in the CSV so you can tell personal chats from groups and channels. |
| id | Each message | Kept in the CSV for cross-referencing against the original file. |
| date | Each message, ISO string | Shown as a local date and time, and written to CSV in ISO form. |
| from | Each message | Shown as the sender name. |
| text | Each message, string or entity array | Rendered with formatting, searched, and exported. |
| text_entities | Each message, optional | Rebuilt as bold, italic, links, code, and pre. |
| photo | Each message, optional | Shown as a media reference, not rendered. |
| file | Each message, optional | Shown as a media reference, not rendered. |
| media_type | Each message, optional | Shown next to the reference so you know what the file is. |
| type: "service" | Each message, optional | Shown in italic, and included in the CSV. |
When you would use this
You exported a chat for a research project and the JSON is unreadable in a text editor. Loading it here gives you a scrollable transcript you can search in seconds, without installing Python or writing a parser.
You need the messages in a spreadsheet and the export is JSON. The CSV export gives you one row per message with the sender, date, and text, ready to open in Excel or import into a database.
You want to move a channel archive into a static site or a notes app. The Markdown export preserves the sender and date per line and converts the original formatting, which is the shape a Markdown-based tool expects.
You are checking what Telegram actually exported before deleting the original account. The viewer shows every message and every media reference, so you can confirm the export is complete before relying on it.
You are building a parser yourself and want to see how a real export is shaped. The viewer's source and the field table above are a faster reference than the schema docs for the common cases.
What this does and does not handle
It handles:
- Single-chat exports with a top-level
messagesarray. - Full-account exports with
chats.listandmessages.list. - Rich text entities: bold, italic, underline, strikethrough, links, code, pre, and spoiler.
- Service messages, shown in italic and included in exports.
- Media references, shown as type plus path.
- Search across every message in every chat in the file, case-insensitive.
- CSV, Markdown, and self-contained HTML exports.
- Files of tens of megabytes on a desktop browser.
It does not handle:
- Opening the media folder and rendering images or video. The browser cannot read a sibling folder without the user selecting it, and a folder picker is a different interaction.
- Bot update JSON. That is a different object shape and is not a chat export.
- HTML exports from Telegram. This page reads JSON only. If you have
messages.html, open it in a browser directly. - Telegram mobile app exports. The mobile apps do not produce a JSON export.
- Very large exports of several gigabytes. The whole JSON is parsed at once and the tab will run out of memory. Split the export by chat.
- Editing the export. The viewer reads and exports, it does not write back to the original file.
- Decrypting a passcode-protected Telegram account. The export is already decrypted when Telegram writes it.
Questions
How do I open a Telegram JSON export?
Drop the result.json file into the box on this page. The parser reads it in your browser and shows the chats and messages. Nothing is uploaded, so the file never leaves your device. If you exported a single chat, the file contains one chat. If you used Export Telegram data from Settings, the file contains every chat you selected.
What is result.json in a Telegram export?
result.json is the machine-readable file Telegram Desktop writes when you export chat history in JSON format instead of HTML. It holds an array of messages with ids, dates, senders, text, and media references. The HTML export writes a separate messages.html file, and the JSON export writes result.json. Both are produced by the same Export chat history menu.
How do I export my Telegram chat as JSON?
Open Telegram Desktop, open the chat, click the three-dot menu, and choose Export chat history. Pick JSON as the format. If you want every chat at once, go to Settings, Advanced, Export Telegram data, and tick the chat types you need. The export produces a folder containing result.json plus a media folder when media is included.
Is my chat uploaded to a server?
No. The page reads the file with the browser File API and parses it with JavaScript. There is no network request during parsing, search, or export. You can confirm this by loading the page, switching the browser to offline mode, and opening a file. It still works.
How do I convert a Telegram export to CSV?
Open the result.json file, then click Export CSV. The download contains one row per message with the chat name, message id, date, sender, message type, text, and media reference. It is UTF-8 with a byte order mark, so Excel opens it without an import step. Emoji and non-Latin text survive intact.
How do I convert a Telegram export to Markdown?
Open the file and click Export Markdown. Each chat becomes a heading and each message becomes a line with the sender and date, followed by the text. Bold, italic, links, and code formatting from the original message entities are converted to Markdown syntax. Media is written as a bracketed reference to the file path in the export.
Can I search inside an exported Telegram chat?
Yes. Type into the search box after loading a file. The search runs across every message in every chat in the export, case-insensitively. Results are highlighted in the message list. Clear the box to return to the full list. The search is client-side and works offline.
Does it work with a single-chat export and a full-account export?
Both. A single-chat export has a name, type, id, and a messages array at the top level. A full-account export has chats.list and messages.list. The parser checks for both shapes and flattens them into the same view. The chat selector shows one entry for a single-chat file and every chat for a full export.
How are bold, italic, links, and code handled?
Telegram stores rich text as an array of entities alongside the plain text. The parser walks that array and rebuilds the formatting. Bold becomes strong, italic becomes em, links become anchors, code becomes code, and pre blocks become pre. In the Markdown export the same entities become asterisks, underscores, brackets, and backticks.
Why do some media messages show only a filename?
A JSON export references media by relative path, such as photos/photo_1.jpg. The browser cannot read a folder automatically, so the viewer shows the reference and the media type instead of the image itself. If you need the actual files, open the export folder on disk and use the path shown in the message.
How large a result.json can it handle?
The practical limit is the browser tab's memory. A result.json of tens of megabytes and hundreds of thousands of messages usually opens on a desktop browser. Very large exports of several gigabytes may be slow or fail, because the whole JSON has to be parsed at once. Splitting the export by chat is the workaround.
Does it work with Telegram exports from a phone?
Telegram mobile apps do not produce a JSON export. The JSON format is written by Telegram Desktop on Windows, macOS, and Linux. If you only have a phone, use Telegram Web or install Telegram Desktop and export from there. The mobile app exports HTML in some regions, which this page does not parse.
Is this the same as a Telegram bot JSON viewer?
No. A bot JSON viewer shows the update objects Telegram sends to a bot, which have a different shape and are used for bot development. This page reads the chat history export written by Telegram Desktop. The field names and nesting are different, and a bot update object will not parse as a chat export.
What happened to the media and stickers in the export?
They are still in the export folder if you ticked the media options. The JSON holds the reference, the type, and any caption. The viewer shows the type and path rather than rendering the file, because a browser cannot read a sibling folder without the user selecting it. Stickers and GIFs often have no file in the export at all, and appear as a type only.