Sonnet

What’s inside ChatGPT’s conversations.json

You asked ChatGPT for your data, the zip arrived, and the big file in it reads like nothing you recognise — the same reply three times, your own messages out of order. That isn’t a corrupt download. It’s how the file is built.

Short answer

In ChatGPT’s export, conversations.json is an array of conversation objects. Each one has a title, timestamps and a mapping: a tree of message nodes joined by parent and children links, because every edit and regenerate adds a branch. The readable version of the same history is chat.html in the same zip. Open the JSON when you want the structure, the timestamps or proof that a chat is in there.

Get Sonnet free Reads the file offline, nothing uploaded.

How to export your ChatGPT data

The export is requested from the app or the website, not downloaded directly. In the ChatGPT Android app, open Settings → Data Controls and choose the export option; some versions hand you off to the website to finish. OpenAI then emails you a link to a zip. The help page for the Android app says that link expires after 24 hours, so download it when it lands rather than filing the email away. The mail carries a download link rather than the zip itself, so tapping it on the phone puts the archive in Downloads — the same place a mailed file lands when you open a JSON attachment on Android.

What’s in the export zip

Extract the zip with your file manager and you get a handful of files, not a folder tree. Five of them show up consistently:

FileWhat it holdsWorth opening?
chat.htmlA viewer page that renders your whole chat history in a browserYes: start here if you just want to read your chats
conversations.jsonEvery conversation as structured data, with its message tree and timestampsYes, if you want the structure or the dates
user.jsonAccount details: your id, email, phone number, whether the account is a paid oneYes: tiny and readable
message_feedback.jsonYour thumbs up and thumbs down ratings, by message and conversation idRarely
model_comparisons.jsonData from the side-by-side comparisons you were shown when a reply was regeneratedRarely

File set per a long-running community project that documents the export, cross-checked against an open-source converter’s own file listing, as of October 2026. OpenAI does not publish a schema for this, and the set has changed between versions, so treat the list as what exports have looked like rather than a guarantee. The file may sit at the top level of the extracted folder or inside a subfolder: look for a name starting conversations.

As of October 2026, large exports are reported to arrive split into numbered files — conversations-000.json, conversations-001.json and so on, with a manifest listing them — instead of one document. Two third-party guides and a developer on OpenAI’s own community forum describe this, and each numbered file has the same shape as the single one. If you have several, each opens on its own.

Why conversations.json looks scrambled

This is the part no export guide explains, and it is the whole reason the file confuses people. A conversation is not stored as a list of messages in order. It is stored as mapping, an object keyed by message id, where each entry carries the message plus a parent id and a children array. The conversation also has a current_node: the id of the last message on the thread you actually ended up with.

Every time you edited a prompt or hit regenerate, ChatGPT kept both versions. The old one stays in the tree as a sibling branch. So a conversation can hold noticeably more nodes than the messages you remember, and reading the file top to bottom gives you abandoned drafts mixed in with the thread you saw. Tools that convert the export to Markdown deal with this the same way: start at current_node, follow parent up to the root, keep the nodes that hold a message, and reverse. That is the path you remember; everything else is branch.

Nodes with message set to null are normal — the schema allows it, and converters just skip them. So are messages whose author.role is system or tool rather than user or assistant: instructions and tool traffic you never saw on screen.

Where the text of a message actually is

Inside a node, the words are two levels down: message → content → parts, an array. For an ordinary reply, content_type is text and parts holds one string. For a chat with images or code it can be multimodal_text or code, and parts can hold objects — image references rather than text — so a message can look empty when its content simply isn’t a sentence. Images themselves are separate files alongside the JSON, and community notes say not every one of them makes it into the export.

create_time and update_time are Unix timestamps in seconds, usually with a decimal fraction, not dates you can read. If you want the real date of a chat, a formatted view of the JSON gets you the number; converting it is a separate step.

Read your chats the easy way: chat.html

If your goal is to re-read conversations, open chat.html in your browser and stop there. It is a viewer page built to display the entire history, and it is the same underlying data. The JSON is worth opening for the things the viewer page doesn’t give you: which account the export belongs to, exactly when something was said, whether a chat you thought you lost is in the file at all, and how many branches a conversation really has.

Will conversations.json open on a phone?

It depends entirely on how long you have used the account, because this is one document rather than a folder of small ones — the same problem as a TikTok data download. A short history is a few hundred kilobytes and opens as a tree without complaint. A couple of years of daily use is a different file: third-party guides put a heavy user’s export in the hundreds of megabytes, and no official figure exists to check that against. The split numbered files above are the same story from the other side.

For reference, Sonnet opens JSON up to 20 MB as formatted text for free, and shows the full collapsible tree up to about 2 MB. Sonnet Pro, a one-time unlock, raises that to 50 MB files and a roughly 30 MB tree, and adds search, which is the feature that matters in a file shaped like this one: it jumps to a title or a phrase instead of making you scroll a tree of node ids. Past 50 MB no phone app is the right tool — how to open a large JSON file names the ones that handle files that size on a computer.

One last thing before you send the file anywhere: it contains every conversation you have had, and user.json has your email and phone number in it. An offline viewer keeps that on the device. An online “JSON prettifier” is a stranger’s server. If the file itself is new territory, what a JSON file is is the shorter read.

Open your ChatGPT export on your phone

Sonnet opens JSON files as a collapsible tree, entirely offline, so your conversations never leave the device. No ads, no account. Free on Google Play.

Get it on Google Play