Extry

Turn a ChatGPT chat into JSON.

A conversation already has structure — roles, order, timestamps, models. Reading it as prose throws all of that away. Extry writes it back out as JSON, one record per message.

Get the launch linkOne email when it ships. Nothing else.
extry · exportexample output
  • retry-backoff-design.json31.7 KBstructured
1 file, inside a .zipone record per message

For the script, not the reader

JSON is what you pick when something other than a person opens the file. Every message keeps its role, its position, the model that produced it and the moment it was created, so a script can filter, count and sort without guessing at the text.

It is the wrong choice for reading. To put the conversation back in front of a human, Markdown or Word will treat you better.

One object, then the messages in order

The top of the file describes the conversation: title, source link, when it was created, when it was exported, and how many messages it holds. Then the messages, in order, one object each.

Message text stays in Markdown, so fenced code survives the trip. Citations are repeated as a sources array, so a script can walk the links without parsing them back out of the text.

retry-backoff-design.jsonjson
{
  "title": "Retry backoff design",
  "source": "https://chatgpt.com/c/…",
  "created_at": "2026-03-11T09:14:22Z",
  "exported_at": "2026-03-12T18:02:41Z",
  "message_count": 2,
  "messages": [
    {
      "index": 1,
      "role": "user",
      "author": "user",
      "model": null,
      "created_at": "2026-03-11T09:14:22Z",
      "text": "Why is the retry loop",
      "sources": []
    }
  ]
}

The things prose does not let you do

The shape is fixed, so most of this is a few lines rather than a parser.

Filter and count

Pull only the assistant messages, only the ones after a date, only the ones a given model wrote.

Feed a pipeline

Load it into a notebook, an embedding job or an evaluation set without cleaning it up first.

Compare two exports

Same conversation, two moments: compare the records instead of reading both versions.

Three steps, one file

  1. Open the conversation in ChatGPT and click the Extry button on the page.
  2. Pick JSON in the panel.
  3. Press Download this chat and take the .json out of the archive.

No account, no upload step. The file is built in the page, so the conversation is not sent anywhere to be converted.

Where each part runs

Extry is a Chrome extension. Exporting does not require sending your conversation anywhere.
WhatWhere it happens
Export to every formatIn your browser
Attachments and imagesIn your browser
Conversation contentNot sent anywhere
Usage statisticsNot collected
Typeset PDF (later, opt-in)On a server, file deleted right after

About the JSON export

What is in each message?

The index, the message id, the role, the author, the model that produced it or null, the creation time as an ISO timestamp, the text, and any sources cited.

Is the text plain or Markdown?

Markdown. Code stays in fenced blocks with its language, so you can render it or strip it as you like.

Can I get every conversation as JSON at once?

Yes. The bulk export writes the same file for each conversation, every one in its own folder inside a single archive.

Is the structure stable enough to script against?

The keys are fixed and written by the extension itself rather than scraped off the page, so the shape does not shift when the interface does. Values still follow whatever ChatGPT reports.

Other shapes for the same chat

The same conversation, written differently: CSV, Markdown, the bulk export, the main page.