Map image_asset_pointer records in conversations.json to files in a complete ChatGPT data export.
Choose a model, enter your prompt, and see the result.
HiAPI Blog
HiAPI
Generate it with HiAPI
A ChatGPT conversation export can record an image as an image_asset_pointer whose value begins with file-service://. That value is not a downloadable URL. It is an internal reference that can help you match a JSON record to a file included elsewhere in the same export.
This guide covers only that export-recovery path. If you have an active conversation, only a gen_id, or need an automated image pipeline, use the gen_id download endpoint decision guide.
Inside conversations.json, an image message may contain a record similar to:
{
"content_type": "image_asset_pointer",
"asset_pointer": "file-service://file-A1b2C3d4E5f6",
"size_bytes": 1417238,
"width": 1024,
"height": 1024,
"metadata": {
"dalle": {"gen_id": "aBcD3fGh1jKl"}
}
}
The fields have separate roles:
| Field | Useful for export recovery? | Meaning |
|---|---|---|
asset_pointer | Yes | The internal file reference; use the file-... portion as the join key |
content_type | Yes | Lets you find image pointer records without matching unrelated strings |
size_bytes, width, height | Sometimes | Useful checks after a candidate file is found |
gen_id | No | Conversation generation metadata; it cannot retrieve the file |
file-service:// is a URI scheme understood by ChatGPT's own systems. Browsers and curl do not have a resolver for it:
curl: (1) Protocol "file-service" not supported
Do not replace the scheme with https:// or guess a private endpoint. The recovery value is the file id inside the URI.
Keep the directory structure intact. You need both conversations.json and the exported asset files; opening only the JSON removes the other half of the mapping.
Search conversations.json for "content_type": "image_asset_pointer", then identify the conversation, message, and image you need. Copy the full asset_pointer value.
For example:
file-service://file-A1b2C3d4E5f6
Remove only the file-service:// prefix:
file-A1b2C3d4E5f6
Do not use gen_id for this match. The asset filename is normally related to the file id, not the generation id.
On macOS or Linux:
find . -type f -iname '*file-A1b2C3d4E5f6*'
If the archive renamed or nested assets differently, broaden the search to the distinctive id segment. Compare any result with the JSON's size_bytes, width, and height when those values are present.
Open the candidate file locally and confirm it is the expected image. Then copy it to storage you control and record your own durable URL. Keep the original export unchanged as evidence until recovery is complete.
This Python snippet lists unique asset ids from conversations.json. It does not contact ChatGPT and does not attempt to resolve internal URLs.
import json
from pathlib import Path
data = json.loads(Path("conversations.json").read_text())
seen = set()
def walk(value):
if isinstance(value, dict):
if value.get("content_type") == "image_asset_pointer":
pointer = value.get("asset_pointer", "")
if pointer.startswith("file-service://"):
seen.add(pointer.removeprefix("file-service://"))
for child in value.values():
walk(child)
elif isinstance(value, list):
for child in value:
walk(child)
walk(data)
for file_id in sorted(seen):
print(file_id)
Use the output as a checklist against the extracted files. For large exports, build a filename index once instead of scanning the directory separately for every pointer.
A pointer in conversations.json proves that the conversation once referred to an asset. It does not guarantee that the export contains the image bytes.
Common cases include:
conversations.json was saved;First search the original, fully extracted archive again and compare file sizes. If no asset exists, neither file-service:// nor gen_id can reconstruct the pixels. Use the four recovery paths to decide whether an in-app download or regeneration is still possible.
It is an internal URI scheme for a stored file reference. It is not HTTP and cannot be opened directly outside ChatGPT's own systems.
Copy the file id after file-service:// and search the extracted export for a filename containing that id. Use size and image dimensions as secondary checks.
No. curl does not implement that internal scheme, and replacing it with an HTTPS host does not create a signed download URL.
No. gen_id describes the generation in conversation metadata. The file-... part of asset_pointer is the relevant key for matching export files.
The export may be incomplete, the file may have expired or been deleted, or extraction may have changed its location. A pointer without matching bytes is not enough to recover the image.