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.json uses a tree-shaped mapping structure 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 structured contents — 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

  1. Open chatgpt.com  and sign in.
  2. Click your profile icon (bottom left) → Settings.

Settings entry highlighted in the ChatGPT account menu

  1. Go to Data controls.
  2. Click Export data → confirm.

Export data button highlighted in ChatGPT Data controls panel

  1. Wait for OpenAI’s email (usually 20–30 minutes; accounts with many conversations may take longer — official docs  say up to 24 hours).
  2. Click the download link in the email (valid for 24 hours — check spam if needed).
  3. Unzip the archive and locate conversations.json (newer exports may split into conversations-000.json and other shards).

What You Get

  • conversations.json — full chat history in a tree-shaped mapping structure with timestamps and model info
  • chat.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:

  1. Tree-shaped mapping with parent/child pointers — you must walk the graph to reconstruct conversation order.
  2. Edited prompts create branches — one thread can have multiple paths, making parsing harder.
  3. Text buried in content.parts[] — not a simple string field.
  4. Unix float timestamps — e.g. 1713350400.0, requiring extra conversion.
  5. All or nothing — no selective single-message export, no instant download.
StrengthsDetails
Official and reliableProvided by OpenAI, no third party needed
True bulk exportAll account conversations in one go
Rich metadataTimestamps, model info, and conversation structure
No installDone from ChatGPT settings
LimitationsDetails
All or nothingCan’t pick specific chats or date ranges
Complex structureTree JSON needs heavy parsing before use
No format optionsNo PDF, Markdown, or Word
Slow deliveryMinutes to days
Missing contentTemporary 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

DimensionOfficial conversations.jsonAI Exporter JSON
StructureTree mapping, heavy parsingFlat message array, iterate directly
ScopeFull account bulkSingle chat / partial messages on demand
SpeedMinutes to daysInstant one-click
TimestampsUnix floatsHuman-readable created_at per message
Model infoScattered in metadatamodel / displayModel / modelId on each assistant message
Content typesLags on new featurescontents array preserves multiple structured types

What AI Exporter JSON Looks Like

The top level is a message array (not metadata + mapping):

json
[
  {
    "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:

FieldDescription
roleuser (your message) or assistant (AI reply)
model / displayModel / modelIdPlatform name, display name, and model version (e.g. GPT-4o, Claude Sonnet)
created_at / updated_atMessage time for sorting and stats
chatGroupIdGroups a user/assistant turn for pairing

contents array (structured content — the core value of JSON export):

typeWhat’s preserved
markdown / textBody text, code blocks, math
thinkingReasoning / chain-of-thought
sourcesWeb search and Deep Research citations
image / attachmentImages and uploaded files
html_widgetCanvas / interactive artifacts
shopping_card / shopping_tableShopping 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

  1. Install AI Exporter from the Chrome Web Store  (also works on Edge and Firefox).
  2. Open the ChatGPT conversation you want to export.
  3. Click the extension icon → choose JSON.
  4. Optional: select specific messages to export only what you need.
  5. 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:

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:

python
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):

python
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:

FormatBest for
JSONAnalysis, migration, automation, fine-tuning
MarkdownObsidian, blogging, knowledge bases
PDFSharing, printing, archiving — keeps code highlighting, LaTeX, images
WordOffice docs you need to edit further
NotionOne-click sync to your knowledge base
TXT / ImageLightweight 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:

  1. Cmd/Ctrl + click multiple chats in the ChatGPT sidebar to open each in a new tab.
  2. Pre-configure format and download folder (disable browser “ask where to save each time”).
  3. Per tab: Select → Export → Close tab — about two clicks each.
  4. ~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

  1. Complete Method 1 to get the official ZIP export.
  2. Unzip and locate conversations.json.
  3. 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)
  4. Each conversation becomes a separate .md file.

Pros and Cons

StrengthsLimitations
True bulk, readable, good for one-time migrationTwo-step flow, some technical skill required
Many open-source tools, local processing for privacyOutput 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

FeatureOfficial exportAI ExporterOfficial + converter
Export scopeAll chatsOn demandAll chats
JSON structureTree mappingFlat message arrayMust parse official JSON first
Output formatsJSON / HTMLJSON / PDF / MD / Word / Notion etc.Mainly Markdown
Timestamps / model namesPresent but hard to extractReadable per messageDepends on converter
Selective exportNoYes (per message)No
Multi-platformChatGPT onlyChatGPT + 10+ platformsChatGPT only
Technical skillNoneNoneModerate
Export 20 chatsMinutes to days~3–5 minutesWait + convert
Best forSafety-net backupDay-to-day export + structured JSONBulk historical archive

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 goalBest formatBest method
Full account backup (safety net)JSON (official raw)Official export
Scripting / fine-tuning / RAGJSON (structured)AI Exporter
Knowledge base (Obsidian / Notion)MarkdownAI Exporter
Share with clients / colleaguesPDFAI Exporter
Further editing neededWordAI Exporter
Team knowledge baseNotionAI Exporter
Bulk readable archive of full historyMarkdownOfficial + 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.