Skip to content
AI Inspector UtilityBox

Guide · System prompts

How to extract and recover lost system prompts from Claude & ChatGPT exports

Request your data takeout, open conversations.json, and filter messages where author.role == "system" — that field stores every system prompt ChatGPT and Claude ever applied, including deleted custom instructions. AI Data Inspector extracts them automatically, entirely in your browser, with zero uploads.

Why system prompts go “missing”

You spent forty minutes tuning the perfect custom instruction — tone, constraints, output format — and then a settings redesign, a workspace switch or an accidental clear erased it. The chat UI never showed the full assembled prompt anyway: providers compose your saved instructions with hidden defaults and inject the result as an invisible first message. But nothing is truly gone. Every applied system prompt is written into the raw export, and a single takeout request hands it back to you.

How system messages are structured in the raw JSON

In a ChatGPT archive, each thread in conversations.json holds a mapping object keyed by message UUIDs. System content is simply the node whose author role resolves to system:

ChatGPT · conversations.json
{
  "title": "Pricing page rewrite",
  "create_time": 1770009600.1,
  "mapping": {
    "a1f2-…": {
      "message": {
        "author": { "role": "system", "metadata": {} },
        "content": {
          "content_type": "text",
          "parts": ["You are a senior conversion copywriter…"]
        },
        "meta_data": { "model_slug": "gpt-5" },
        "create_time": 1770009600.0
      }
    },
    "b7e3-…": { "message": { "author": { "role": "user" }, … } }
  }
}

Three fields do all the work: author.role tells you the message type, content.parts[] carries the literal prompt text, and create_time lets you date each instruction. Custom instructions typically appear as the system node at the root of the mapping tree; tool and plugin definitions surface as additional system or tool nodes deeper in.

Claude's format is flatter. Threads sit in chat_messages arrays with sender instead of role, while standing project instructions live in a separate projects.json — making it the highest-value file for reconstructing how your assistant was configured:

Claude · conversations.json / projects.json
{
  "uuid": "c8d1-…",
  "name": "Pricing page rewrite",
  "created_at": "2026-02-11T09:14:00Z",
  "chat_messages": [
    { "sender": "human", "content": [{ "type": "text", "text": "…" }] },
    { "sender": "assistant", "content": [{ "type": "text", "text": "…" }] }
  ]
}

// projects.json — standing system prompts per project
{ "projects": [{ "name": "Brand site", "custom_instructions": "Always answer in British English…" }] }

The recovery workflow, step by step

01 Request the takeout while the data still exists

Exports are snapshots, so request one before changing anything else: ChatGPT under Settings → Data controls → Export data; Claude under Settings → Privacy → Export data. Both email you a ZIP within minutes to days.

02 Manual extraction (the grep route)

Comfortable on the command line? Extract the ZIP and probe the file directly with jq '[.[] | select(.mapping != null)]' conversations.json or a quick count of system-role nodes via grep -o '"role": "system"' conversations.json | wc -l. It works, but mapping trees, escaped quotes, branching edits and multi-hundred-MB files make manual parsing slow and easy to get wrong.

03 Automated extraction — zero uploads

This is exactly what ai-data-inspector.site automates. Drop the export ZIP onto the analyzer: JSZip decompresses it in browser RAM, Web Workers parse every thread on your own CPU, and the Instructions tab isolates every system message and custom instruction it finds — searchable, dated, one click from a clean Markdown copy. Nothing is uploaded, nothing is stored, and the whole thing works offline.

Extract my system prompts

04 Rebuild and reuse what you recover

Once extracted, treat recovered prompts as living assets: diff versions across exports to see how your instructions evolved, promote the best into a reusable library, or migrate them into Claude projects or a local model's system slot. The migration guide covers cross-platform moves end to end.

Where are system prompts stored in a ChatGPT export?

Inside conversations.json. Every conversation object contains a mapping tree whose nodes hold messages; the node whose author.role is "system" carries the effective system prompt, including your saved custom instructions, verbatim.

Can I recover a deleted custom instruction?

Often yes. Data takeouts are point-in-time snapshots — any export requested before you deleted an instruction still contains it. Project-level instructions survive separately in Claude's projects.json even when individual chats are removed.

Do I need to upload my export anywhere to read system messages?

No. AI Data Inspector parses the ZIP or JSON entirely in your browser RAM using JSZip and Web Workers. Nothing is transmitted, stored or logged — close the tab and everything is gone.

Does this work for Claude, Gemini and DeepSeek too?

Yes. The parser auto-detects Anthropic's conversations.json, Google Gemini activity exports, DeepSeek's chat_history.json and generic role-based JSON/JSONL, then surfaces system-role content across all of them.

Try the tools

Ready to analyze your own export? Open the viewer, scan for secrets, or export to Markdown — all in your browser, no upload.