How to Export ChatGPT Conversations: JSON, PDF & Markdown Guide
ChatGPT has no per-conversation download button. This guide walks through OpenAI's official export flow and compares browser extensions and JSON converters so you can save chats as JSON, PDF, or Markdown.
1. Can You Export ChatGPT Conversations?
ChatGPT doesn’t have a “download this conversation” button, but saving chats is a common need — study notes, work deliverables, code backups, knowledge bases, and account-level disaster recovery all depend on export.
Formats matter: PDF works well for sharing, Markdown for notes, and JSON for programmatic use — whether you’re analyzing conversations with Python or jq, extracting code blocks, building fine-tuning datasets, or piping data into a RAG workflow, JSON is the best starting point.
This article compares three practical approaches and explains why AI Exporter’s JSON export is easier to work with than OpenAI’s official conversations.json.
2. Quick Answer: Which Method to Choose
- Official data export (Settings → Data controls → Export data) is ChatGPT’s only official full-account backup, but
conversations.jsonuses a tree-shapedmappingstructure that’s costly to parse and isn’t ready for PDF or Word delivery. - AI Exporter JSON export outputs a flat message array where each message includes
role,model,modelId,created_at, and structuredcontents— ideal for scripts, migration, and downstream development. - Recommended combo: use official export for periodic full backups; use AI Exporter for day-to-day single or selected conversations as JSON or PDF / Markdown; use official JSON + a converter when you need hundreds of past chats turned into readable documents at once.
3. Method 1: ChatGPT Official Data Export (Best for Full Backup)
The only official bulk export option from OpenAI.
When to Use It
- Periodic full-account backups
- Migrating to another AI platform (e.g. importing chats to Gemini)
- Not ideal for: saving a single conversation or delivering a readable document right away
Steps
- Open chatgpt.com and sign in.
- Click your profile icon (bottom left) → Settings.

- Go to Data controls.
- Click Export data → confirm.

- Wait for OpenAI’s email (usually 20–30 minutes; accounts with many conversations may take longer — official docs say up to 24 hours).
- Click the download link in the email (valid for 24 hours — check spam if needed).
- Unzip the archive and locate
conversations.json(newer exports may split intoconversations-000.jsonand other shards).
What You Get
conversations.json— full chat history in a tree-shapedmappingstructure with timestamps and model infochat.html— a basic browsable version in your browser- May include images and attachments (DALL·E images, temporary chats, and deleted conversations may be missing)
Pain Points of the Official JSON
OpenAI’s export is JSON, but it’s structured for internal storage — not for scripting out of the box:
- Tree-shaped
mappingwith parent/child pointers — you must walk the graph to reconstruct conversation order. - Edited prompts create branches — one thread can have multiple paths, making parsing harder.
- Text buried in
content.parts[]— not a simple string field. - Unix float timestamps — e.g.
1713350400.0, requiring extra conversion. - All or nothing — no selective single-message export, no instant download.
| Strengths | Details |
|---|---|
| Official and reliable | Provided by OpenAI, no third party needed |
| True bulk export | All account conversations in one go |
| Rich metadata | Timestamps, model info, and conversation structure |
| No install | Done from ChatGPT settings |
| Limitations | Details |
|---|---|
| All or nothing | Can’t pick specific chats or date ranges |
| Complex structure | Tree JSON needs heavy parsing before use |
| No format options | No PDF, Markdown, or Word |
| Slow delivery | Minutes to days |
| Missing content | Temporary chats, deleted threads, some AI-specific content may be absent |
Bottom line: Official export is a safety net, not a practical way to get structured data on demand.
4. Method 2: AI Exporter (Best for Day-to-Day Export)
Full disclosure: this is our product. Below is an honest rundown of what it can and can’t do.
Why AI Exporter JSON Beats Official conversations.json
| Dimension | Official conversations.json | AI Exporter JSON |
|---|---|---|
| Structure | Tree mapping, heavy parsing | Flat message array, iterate directly |
| Scope | Full account bulk | Single chat / partial messages on demand |
| Speed | Minutes to days | Instant one-click |
| Timestamps | Unix floats | Human-readable created_at per message |
| Model info | Scattered in metadata | model / displayModel / modelId on each assistant message |
| Content types | Lags on new features | contents array preserves multiple structured types |
What AI Exporter JSON Looks Like
The top level is a message array (not metadata + mapping):
[
{
"id": "msg_001",
"chatGroupId": "group_abc",
"role": "user",
"model": "chatgpt",
"displayModel": "ChatGPT",
"contents": [
{ "type": "markdown", "content": "How do I read a CSV in Python and filter columns?" }
],
"created_at": "2026-04-15 14:30:45",
"updated_at": 1713175845000
},
{
"id": "msg_002",
"chatGroupId": "group_abc",
"role": "assistant",
"model": "chatgpt",
"displayModel": "ChatGPT",
"modelId": "GPT-4o",
"contents": [
{ "type": "markdown", "content": "You can use pandas:\n\n```python\nimport pandas as pd\ndf = pd.read_csv('data.csv')\n```" },
{ "type": "thinking", "content": "User needs a basic CSV read example..." },
{ "type": "sources", "sources": [{ "title": "pandas documentation", "url": "https://pandas.pydata.org", "domain": "pandas.pydata.org" }] }
],
"created_at": "2026-04-15 14:31:22",
"updated_at": 1713175882000
}
]A flat array you can loop over — no nested trees or parent pointers.
Fields Users Care About Most
Per message:
| Field | Description |
|---|---|
role | user (your message) or assistant (AI reply) |
model / displayModel / modelId | Platform name, display name, and model version (e.g. GPT-4o, Claude Sonnet) |
created_at / updated_at | Message time for sorting and stats |
chatGroupId | Groups a user/assistant turn for pairing |
contents array (structured content — the core value of JSON export):
| type | What’s preserved |
|---|---|
markdown / text | Body text, code blocks, math |
thinking | Reasoning / chain-of-thought |
sources | Web search and Deep Research citations |
image / attachment | Images and uploaded files |
html_widget | Canvas / interactive artifacts |
shopping_card / shopping_table | Shopping recommendation cards and comparison tables |
JSON export keeps full structured data regardless of display settings like “show timestamps” in PDF or Markdown.
How to Export JSON with AI Exporter
- Install AI Exporter from the Chrome Web Store (also works on Edge and Firefox).
- Open the ChatGPT conversation you want to export.
- Click the extension icon → choose JSON.
- Optional: select specific messages to export only what you need.
- Optional: enable “Copy to clipboard” to paste JSON straight into a script or API tool.
What You Can Do with the Exported JSON
Examples below use AI Exporter’s JSON format. If you use the official export, extract messages from the mapping tree first.
Quick conversation stats in Python:
import json
from collections import Counter
with open("ChatGPT-my-conversation.json") as f:
messages = json.load(f)
roles = Counter(msg["role"] for msg in messages)
print(f"Your prompts: {roles.get('user', 0)}")
print(f"AI replies: {roles.get('assistant', 0)}")
responses = [m for m in messages if m["role"] == "assistant" and m["contents"]]
longest = max(responses, key=lambda m: len(str(m["contents"])))
print(f"Longest reply (chars): {len(str(longest['contents']))}")Extract all code blocks:
import json
import re
with open("ChatGPT-my-conversation.json") as f:
messages = json.load(f)
for msg in messages:
if msg["role"] != "assistant":
continue
for item in msg.get("contents", []):
if item.get("type") not in ("markdown", "text"):
continue
blocks = re.findall(r"```(\w+)?\n(.*?)```", item.get("content", ""), re.DOTALL)
for lang, code in blocks:
print(f"--- {lang or 'text'} ---")
print(code)Convert to OpenAI fine-tuning format (JSONL):
import json
with open("ChatGPT-my-conversation.json") as f:
messages = json.load(f)
training_data = []
for i in range(0, len(messages) - 1, 2):
user_msg, assistant_msg = messages[i], messages[i + 1]
if user_msg["role"] != "user" or assistant_msg["role"] != "assistant":
continue
user_text = " ".join(c.get("content", "") for c in user_msg.get("contents", []) if c.get("content"))
assistant_text = " ".join(c.get("content", "") for c in assistant_msg.get("contents", []) if c.get("content"))
if user_text and assistant_text:
training_data.append({
"messages": [
{"role": "user", "content": user_text},
{"role": "assistant", "content": assistant_text},
]
})
with open("training.jsonl", "w") as f:
for item in training_data:
f.write(json.dumps(item, ensure_ascii=False) + "\n")
print(f"Generated {len(training_data)} training samples")Other AI Exporter Strengths
JSON is one of several formats. Switch output in the same extension when you need readable documents:
| Format | Best for |
|---|---|
| JSON | Analysis, migration, automation, fine-tuning |
| Markdown | Obsidian, blogging, knowledge bases |
| Sharing, printing, archiving — keeps code highlighting, LaTeX, images | |
| Word | Office docs you need to edit further |
| Notion | One-click sync to your knowledge base |
| TXT / Image | Lightweight archives, visual sharing |
Other core features:
- Selective export — full chat, partial messages, or hover-export on a single reply
- Format preservation — code blocks, tables, LaTeX, Canvas, images
- Multi-platform — ChatGPT, Claude, Gemini, DeepSeek, and 10+ more
- Local processing — JSON, Markdown, TXT handled in the browser, not uploaded
- Free tier — JSON, Markdown, TXT free; PDF, Word, Notion have daily free allowances
Multi-Chat Workflow (Multi-Tab Batch)
There’s no official “export all chats” button, but a multi-tab workflow handles many conversations efficiently:
- Cmd/Ctrl + click multiple chats in the ChatGPT sidebar to open each in a new tab.
- Pre-configure format and download folder (disable browser “ask where to save each time”).
- Per tab: Select → Export → Close tab — about two clicks each.
- ~20 chats in 3–5 minutes, each file cleanly named.
Limitations
- No official-style “export entire account” one-click button.
- Full account backup still pairs best with official export.
- PDF, Word, and Notion have daily free limits (JSON, Markdown, TXT are free).
5. Method 3: Official Export + Conversion Tools (Bulk Readable Archive)
For technical users, or when you need hundreds of past chats turned into Markdown at once.
When to Use It
- Batch-convert full history to readable documents
- Import into Obsidian or Logseq for a knowledge base
- Not ideal for: quickly saving the conversation you’re in right now
Steps
- Complete Method 1 to get the official ZIP export.
- Unzip and locate
conversations.json. - Pick a converter:
- CLI:
npx chatgpt-to-markdown path/to/archive - Browser converter: ChatGPT Conversations to Markdown (local processing, no upload)
- Desktop app: Univik and similar (PDF / DOCX support)
- CLI:
- Each conversation becomes a separate
.mdfile.
Pros and Cons
| Strengths | Limitations |
|---|---|
| True bulk, readable, good for one-time migration | Two-step flow, some technical skill required |
| Many open-source tools, local processing for privacy | Output quality varies; code blocks / tables may convert unevenly |
| No selective export — every chat gets converted | |
| New chats require repeating the full process |
6. Three-Way Comparison
| Feature | Official export | AI Exporter | Official + converter |
|---|---|---|---|
| Export scope | All chats | On demand | All chats |
| JSON structure | Tree mapping | Flat message array | Must parse official JSON first |
| Output formats | JSON / HTML | JSON / PDF / MD / Word / Notion etc. | Mainly Markdown |
| Timestamps / model names | Present but hard to extract | Readable per message | Depends on converter |
| Selective export | No | Yes (per message) | No |
| Multi-platform | ChatGPT only | ChatGPT + 10+ platforms | ChatGPT only |
| Technical skill | None | None | Moderate |
| Export 20 chats | Minutes to days | ~3–5 minutes | Wait + convert |
| Best for | Safety-net backup | Day-to-day export + structured JSON | Bulk historical archive |
7. Recommended Workflow: Combine Methods
Step 1: Official export for full backup
- Settings → Data controls → Export data
- Store ZIP on cloud or external drive
- Suggested cadence: monthly, or before deleting old chats
Step 2: AI Exporter for important conversations
Export right after a valuable chat, pick format by use case:
- Scripting / migration / fine-tuning → JSON
- Research reports, knowledge base → Markdown
- Client deliverables → PDF
- Team collaboration → Notion sync
Step 3 (optional): Batch-convert backup
When you need a readable archive of full history, use Method 3 to batch-convert the official ZIP to Markdown.
8. Which Format Should You Export To?
| Your goal | Best format | Best method |
|---|---|---|
| Full account backup (safety net) | JSON (official raw) | Official export |
| Scripting / fine-tuning / RAG | JSON (structured) | AI Exporter |
| Knowledge base (Obsidian / Notion) | Markdown | AI Exporter |
| Share with clients / colleagues | AI Exporter | |
| Further editing needed | Word | AI Exporter |
| Team knowledge base | Notion | AI Exporter |
| Bulk readable archive of full history | Markdown | Official + converter |
9. FAQ
Q1: Can ChatGPT export JSON directly?
Yes, but only via official bulk data export (Settings → Data Controls → Export Data), which produces a nested file with all conversations. For per-chat JSON with a clean structure, use AI Exporter.
Q2: How is AI Exporter JSON different from official conversations.json?
AI Exporter outputs a flat message array with role, model, modelId, created_at, and structured contents you can loop over directly. Official export uses a tree mapping with parent references, text in parts[], and Unix float timestamps — significant parsing required.
Q3: Does JSON include model names and timestamps?
Yes. Each assistant message has model, displayModel, and modelId (e.g. GPT-4o), and created_at records message time for sorting and per-model stats.
Q4: Are thinking traces, web sources, and code blocks preserved?
Yes. AI Exporter’s contents array uses thinking, sources, markdown, and other types — far more complete than copy-paste.
Q5: Is JSON export free?
Yes. JSON export is available in AI Exporter’s free version — no account or subscription required.
Q6: Can I export only AI replies without my prompts?
Yes. Click Select and choose Answers to pick AI replies only, or manually check/uncheck individual messages.
Q7: Can exported JSON be used for OpenAI API or fine-tuning?
Yes. AI Exporter uses user / assistant role labels consistent with the API — extract text from contents as shown in the fine-tuning example above.
Q8: Can AI Exporter batch-export all conversations?
There’s no official one-click full export, but the multi-tab workflow lets you export chats quickly one by one. Pair with official export for full account backup.
Q9: How long does official export take? What if the link expires?
Usually 20–30 minutes; longer for heavy accounts. Download links expire after 24 hours — request a new export if needed.
Q10: Does free ChatGPT support export?
Yes. Both official export and AI Exporter work on free accounts.
Q11: How is AI Exporter different from ChatGPT Exporter?
Both support JSON export, but AI Exporter covers ChatGPT, Claude, Gemini, DeepSeek, and 10+ platforms, plus Word, Notion, and more — with contents preserving thinking, search sources, Canvas, and other structured types.
Q12: How often should I back up?
Run official full export monthly. Export important chats with AI Exporter right after they happen — don’t wait for the monthly backup.
10. Summary
No single method covers everything — a combined strategy works best:
- Official export = safety net for complete backup
- AI Exporter = day-to-day formats, especially the most practical structured JSON
- Official + converter = bulk readable historical archive
👉 Get started: Install AI Exporter , and remember to run official data export on a regular schedule.