Topic: chatgpt export not working

ChatGPT Export Not Working? Eight Failure Modes and How to Recover

The Settings → Data Controls → Export flow looks linear, but it fails in eight predictable places. Here's how to tell which one hit you, and the recovery for each.

TL;DR

Most "ChatGPT export not working" reports are one of: (1) email never arrived — wait 30 min, check spam, then re-request; (2) link expired — no recovery, must re-request; (3) ZIP unzips but JSON parser chokes — your viewer can't handle the size, use jq; (4) partial ZIP — the download truncated, re-fetch; (5) missing custom GPT system prompts / images — those aren't in the export by design; (6) mobile dead end — the export flow is web-only, switch browsers; (7) Enterprise admin block — ask admin or use Compliance API; (8) silent stuck request — re-request from the same Settings page, which auto-cancels the prior one.

The right diagnosis question

Before reading the failure modes below, answer two questions: (a) did you ever get the email? and (b) did the ZIP finish downloading?. The first separates request-side failures (modes 1, 6, 7, 8) from delivery failures (mode 2) and post-download failures (modes 3, 4, 5). Most people skip this triage and try the same thing six times — re-requesting won't fix a partial download, and re-downloading won't fix a stuck request.

Mode 1 — The email never arrived

Symptom: You clicked Export data → Request, the modal said "you'll receive an email in up to 30 minutes," and you've been waiting 90 minutes with nothing.

Diagnosis: Check three things, in order. (a) Is the email in spam? Sender is noreply@tm.openai.com, subject contains "ChatGPT data export." (b) Does the email address shown on your ChatGPT profile match the inbox you're watching? Single-sign-on accounts sometimes route to a corporate inbox you don't actively check. (c) Has Data Controls export been disabled by your workspace admin? On Enterprise/Edu the export option may be visible but greyed out, or the request may silently no-op.

Recovery: If all three are clean, request again from the same Settings page. The system cancels the pending request and starts a fresh one — your old request isn't queued behind the new one. After three failed re-requests in a row, the issue is account-side; open a ticket with OpenAI support referencing the request timestamps.

Mode 2 — The download link expired

Symptom: You got the email a few hours ago, clicked the link now, and it returns "link expired" or 404.

Diagnosis: Links are valid for 24 hours from the moment the email is sent. There is no re-download endpoint and no "extend the link" path.

Recovery: Request a fresh export from Settings. The new ZIP is a full re-snapshot, not a delta from the prior one. Save the ZIP to disk the moment the new download starts — don't leave it open in a browser tab. On a slow connection the link can expire mid-download. (If you're on a 5–10 Mbps link and the export is >500 MB, start the download immediately on email arrival and don't pause it.)

Mode 3 — JSON viewer chokes on conversations.json

Symptom: The ZIP unzipped fine. You opened conversations.json in VS Code or Notepad++ or your favorite JSON-tree viewer, and the editor froze, hit OOM, or printed a parse error.

Diagnosis: The file isn't corrupted — your tool can't handle the size. A heavy ChatGPT user produces a 100–800 MB conversations.json after a year. Tree-rendering JSON editors hold the entire parsed object in memory plus a DOM for rendering, which kills them at >100 MB.

Recovery: Use a streaming tool, not a tree-rendering editor. jq reads streamingly:

# every conversation title
jq -r '.[] | .title' conversations.json

# count of total conversations
jq 'length' conversations.json

# first 5 conversations as compact JSON
jq -c '.[0:5][]' conversations.json

For programmatic access in Node, use stream-json with StreamArray — it parses each top-level array element one at a time. The schema is documented at conversations.json format if you need to know which fields exist.

Mode 4 — Partial / truncated ZIP

Symptom: The ZIP "downloaded," but unzipping fails with "unexpected end of file" or you get only some of the expected files (e.g., chat.html but no conversations.json).

Diagnosis: Truncated download. Either the link expired mid-download, the connection dropped, or the browser's download manager flushed before the file was complete.

Recovery: Re-download from the same email link if it's still within 24h. If the link is past expiry, request a fresh export. Use a CLI fetcher with retry support if your connection is unreliable: curl -L -o chatgpt-export.zip "<LINK>" --retry 3 --retry-delay 5. Verify the ZIP integrity before deleting any prior partial: unzip -t chatgpt-export.zip — exit code 0 and the line "No errors detected in compressed data" is the success signal.

Mode 5 — Missing custom GPTs, Memory, or images

Symptom: You exported, opened the files, and noticed your custom GPT system prompts, your saved Memory entries, or the DALL-E images you generated last quarter aren't there.

Diagnosis: Three sub-cases. (a) Custom GPT chats are in conversations.json — look for the gizmo_id field on the conversation object. (b) Custom GPT definitions (the system prompt you wrote when you built the GPT) are not exported. There is no public surface for retrieving them; you have to copy-paste from the GPT editor before the GPT is deleted. (c) Memory entries are in user.json, not conversations.json — look at the memories[] key. (d) DALL-E images are not in the ZIP — what you see in chat is a CDN URL pointing to OpenAI's storage, and those URLs eventually expire. To preserve images, save them locally before requesting the export.

Recovery: For (b), copy the system prompt from the GPT editor before changes. For (d), the only recovery for old images is to re-open the original chat at chatgpt.com (if the CDN URL still resolves) and right-click → save. Don't expect old DALL-E URLs to stay valid indefinitely; OpenAI's image-CDN expiry is on the order of months for free-tier outputs.

Mode 6 — Mobile app dead end

Symptom: You're on the iOS or Android app, can't find Settings → Data Controls → Export, or the menu item exists but tapping it does nothing.

Diagnosis: The export flow is web-only as of April 2026. The mobile apps don't surface the request endpoint.

Recovery: Open chatgpt.com in a desktop or mobile browser, sign in with the same account, and request the export from the web Settings page. The email link works on mobile — only the request step is web-gated. (See the full step-by-step at how to export your ChatGPT history.)

Mode 7 — Enterprise / Edu admin block

Symptom: You navigated to Data Controls in Settings and either don't see an Export button at all, or it's visible but disabled / greyed out.

Diagnosis: Your workspace admin has disabled self-service export. This is the default for Enterprise and Edu plans, and is also a configurable toggle on Team. There's no user-side workaround.

Recovery: Two paths. (1) Ask the admin to re-enable Data Controls export for your account — it's a per-user toggle in workspace settings, reversible in seconds. (2) If the admin won't re-enable but is willing to pull the export for you, they can use the v1/organization/exports Compliance API, which works regardless of the per-user toggle. The Compliance API returns the same conversations.json shape, so downstream tooling (your search scripts, the WhyChose extractor, the schema reference at conversations.json format) all work identically.

Mode 8 — Silent stuck request

Symptom: You requested the export hours ago. The Settings page now shows the export button is back to its default state (no "request pending" indicator), but no email ever arrived. You don't know whether to re-request or wait.

Diagnosis: Either the request was processed and the email was lost (mode 1), or the request was silently dropped server-side and the UI never reflected the failure. There's no way to distinguish from the user side without telemetry.

Recovery: Re-request. The system treats each request as independent — there's no "queue" you'd be jumping in. Re-requesting is safe and has no rate limit (we've personally re-requested up to 4 times in an hour with no throttling). If three re-requests in a row produce no email, treat it as an account-side issue and open a support ticket.

How WhyChose works around all of this

Once you have conversations.json, the extraction itself is decoupled from the export's quirks. WhyChose's open-source extractor reads whatever ZIP you got — partial, full, or re-snapshot — and emits a structured decision log. If you only got a partial download, the extractor still runs over the conversations that did make it; the output is correspondingly partial but valid. If your custom GPT chats are present, they're processed alongside the others (the gizmo_id shows up in the source-conversation metadata so you can filter for them). The hosted product runs the same extraction engine; the difference is UI, sharing, and Notion/Linear export. If the export itself is what's broken, the extractor can't help — but everything downstream is robust to whatever shape of file you eventually get.

Get early access

Related questions

I clicked Export and never got an email. What now?

Wait 30 min for the tail of slow exports, check spam (sender noreply@tm.openai.com), confirm the account email matches the inbox you're watching, and confirm Data Controls export isn't admin-disabled. If clean, re-request from the same Settings page — it cancels the prior request and starts fresh.

The download link expired. Can I get it back?

No — there's no re-download endpoint. Request a fresh export; the new ZIP is a complete re-snapshot. Save the ZIP to disk immediately on download — the link can expire mid-fetch on slow connections.

conversations.json is huge / fails to parse. Is the file corrupted?

Almost certainly your tool's fault. JSON tree-viewers OOM at >100 MB. Use jq for queries: jq '.[] | .title' conversations.json, or stream-json in Node. If a parser specifically reports "unexpected character at byte X," the download was truncated — re-fetch.

My custom GPTs / Memory / DALL-E images aren't in the export.

Custom GPT chats are present (look for gizmo_id); custom GPT definitions are not exportable. Memory is in user.json → memories[]. DALL-E images aren't in the ZIP at all — what you see in chat is a CDN URL that eventually expires. Save images before requesting the export.

I'm on Enterprise and the Export button is greyed out.

Admin disabled self-service export. Either ask them to re-enable the per-user toggle in workspace settings, or have them pull the export via the v1/organization/exports Compliance API. Same JSON shape on output, so all downstream tools (jq queries, the WhyChose extractor) work unchanged.

Further reading