ChatGPT vs Claude vs Gemini export formats: what’s in each file
Updated · By Chatelope (Hilo Inc)
All three assistants let you download your history, but the files look nothing alike. ChatGPT gives you a tree of messages in JSON, Claude a flat JSON list, and Gemini an HTML activity log with no conversations at all. This reference describes each format as it appeared in real exports in 2026, and how Chatelope turns them into one library. None of the vendors publishes a schema, so treat the details as a snapshot.
At a glance
| ChatGPT | Claude | Gemini | |
|---|---|---|---|
| Archive | ZIP | ZIP | ZIP or TGZ (Google Takeout) |
| Chat file | conversations.json | conversations.json | My Activity/Gemini Apps/My Activity.html |
| Format | JSON array | JSON array | HTML activity log |
| Conversation ID | conversation_id | uuid | None |
| Title | title | name (sometimes empty) | None |
| Timestamps | Unix seconds (create_time, update_time) | ISO 8601 (created_at, updated_at) | Text, e.g. “13 Feb 2026, 10:20:42 WET” |
| Model per message | Yes (metadata.model_slug) | No | No |
| Edits and regenerations | Kept as branches in a message tree | Flat list of messages | Each prompt is a separate entry |
| Attachments | Uploaded and generated files in the ZIP, linked by file ID | Extracted text of attachments; other files by name only | Uploaded and generated files in the same folder, linked from the HTML |
| Other files | chat.html, user.json, shared_conversations.json, message_feedback.json | projects.json, memories.json, users.json | None for chats (Gems are a separate Takeout product) |
ChatGPT: conversations.json
Each conversation keeps its messages in a mapping object: a tree of nodes, each with a parent and a list of children. Editing a prompt or regenerating an answer adds a branch rather than replacing the message. current_node points at the last message of the branch you were viewing. Abbreviated, with placeholder values:
[
{
"conversation_id": "…",
"title": "…",
"create_time": 1767273642.07, // Unix time, seconds
"update_time": 1767273700.51,
"current_node": "<message id>", // the branch you last saw
"gizmo_id": "g-p-…", // set for project or custom GPT chats
"is_archived": false,
"mapping": {
"<message id>": {
"parent": "<message id>",
"children": ["<message id>"],
"message": {
"author": { "role": "user" },
"create_time": 1767273642.07,
"content": { "content_type": "text", "parts": ["…"] },
"metadata": { "model_slug": "…" }
}
}
}
}
]- Roles are user, assistant, system and tool. Many system messages are hidden in the ChatGPT interface and flagged as such in metadata.
- content_type is usually text, but also code, multimodal_text (text plus images or audio), execution_output, reasoning and browsing variants.
- Images and audio appear as asset pointers (file-service:// or sediment://) that refer to files elsewhere in the ZIP.
- Chats in a project or with a custom GPT have a gizmo_id. Project names are not in the export.
- Web citations are kept in each message’s metadata.
Claude: conversations.json
Claude’s export is simpler: one object per conversation with a flat chat_messages list in order. Abbreviated, with placeholder values:
[
{
"uuid": "…",
"name": "…", // can be empty
"summary": "…",
"created_at": "2026-02-13T10:20:42.000000Z",
"updated_at": "2026-02-13T10:25:03.000000Z",
"account": { "uuid": "…" },
"chat_messages": [
{
"uuid": "…",
"sender": "human", // or "assistant"
"created_at": "2026-02-13T10:20:42.000000Z",
"text": "…",
"content": [ { "type": "text", "text": "…" } ],
"attachments": [ { "file_name": "…", "extracted_content": "…" } ],
"files": [ { "file_name": "…" } ]
}
]
}
]- sender is human or assistant.
- content is a list of blocks. Besides text you’ll see tool_use and tool_result (web search, artifacts and other tools), and thinking blocks for extended thinking.
- Attachments carry their extracted text (extracted_content). Other files are listed by file name only; the files themselves are not in the ZIP.
- The model used is not recorded.
- projects.json holds your projects (name, description, instructions and documents) and memories.json your saved memory.
Gemini: Google Takeout My Activity.html
Gemini chats are exported as part of your Google activity, not as conversations. Every prompt and response is its own entry in a long HTML page.
Takeout/
My Activity/
Gemini Apps/
My Activity.html <- one entry per prompt and response
(images and files you uploaded or generated)
Each entry in My Activity.html:
Prompted <your prompt>
<date and time, e.g. 13 Feb 2026, 10:20:42 WET>
<Gemini's response as HTML>
Products: Gemini Apps- There are no conversation IDs or titles, so you can’t tell from the file which prompts belonged to the same chat.
- Times are written out as text with a time zone abbreviation, not as machine-readable timestamps.
- Files you uploaded and images Gemini generated sit next to the HTML file and are linked from it.
- Only activity Google still holds is exported. By default Gemini Apps activity older than 18 months is deleted.
- The separate “Gemini” product in Takeout exports your Gems, not your chats.
How Chatelope reads each format
Chatelope converts all three into the same structure of conversations and messages, then skips anything already in your library, so importing a newer export only adds new chats.
- ChatGPT: follows current_node back to the first message, so you get the branch you last viewed; other branches are not imported. Hidden system messages are skipped, and model names, images, audio transcripts and web citations are kept.
- Claude: keeps text, summarises tool calls and their results, and adds attachment text to the message. Thinking blocks are not imported.
- Gemini: groups entries less than five minutes apart into one conversation and titles it with the first prompt. Uploaded files and generated images are attached to their messages.