HiAPI
  • Models
  • Pricing
Search

Search HiAPI models, tools, and resources.

  • Models
  • Pricing
HiAPI

One API, All AI Models

Generate images, video, and audio with leading models through one production-ready API.

Get a free API key

AI Image API

  • All image models
  • GPT Image 2
  • Nano Banana 2
  • Seedream 5.0 Pro
  • Qwen Image 2.0 Pro
  • FLUX 1.1 Pro

AI Video API

  • All video models
  • Seedance 2.5
  • FLUX.3 Video
  • Seedance 2.0
  • Veo 3.1
  • Kling 3.0

AI Audio API

  • All audio models
  • MiniMax Music 2.6
  • MiniMax Music 1.5
  • ElevenLabs v3
  • Text to music
  • Text to speech

Product

  • Model marketplace
  • Playground
  • Pricing
  • Image API Cost Calculator
  • Free GPT Image 2 Generator
  • Free Nano Banana Image Generator
  • Outfit Preview
  • Product Photo Lab

Developers

  • Documentation
  • API Reference
  • Agent Skills
  • LLM integration index
  • Blog

Company

  • About
  • Contact support
  • Terms of Service
  • Privacy Policy

© 2026 hiapi. All rights reserved.

Open source on GitHubPython SDK on PyPI
  • What an imageassetpointer looks like
  • Recover the asset from a complete export
  • 1. Extract the entire archive
  • 2. Find the pointer record
  • 3. Extract the file id
  • 4. Search the extracted files
  • 5. Verify and re-host the bytes
  • A small script for many pointers
  • When the pointer has no matching file
  • FAQ
  • What is file-service:// in a ChatGPT export?
  • How do I map imageassetpointer to an exported image?
  • Can I curl a file-service:// URI?
  • Does gen_id identify the exported asset file?
  • Why is the asset missing from my export?
GuideJul 27, 2026

Recover ChatGPT file-service:// Assets from a Conversation Export

Map image_asset_pointer records in conversations.json to files in a complete ChatGPT data export.

hiapiUpdated Aug 10, 2026troubleshootingchatgpt-exportasset-pointer

Latest models

Explore models

Contents
  • What an imageassetpointer looks like
  • Recover the asset from a complete export
  • 1. Extract the entire archive
  • 2. Find the pointer record
  • 3. Extract the file id
  • 4. Search the extracted files
  • 5. Verify and re-host the bytes
  • A small script for many pointers
  • When the pointer has no matching file
  • FAQ
  • What is file-service:// in a ChatGPT export?
  • How do I map imageassetpointer to an exported image?
  • Can I curl a file-service:// URI?
  • Does gen_id identify the exported asset file?
  • Why is the asset missing from my export?

Generate it with HiAPI

Choose a model, enter your prompt, and see the result.

HiAPI Blog

Related articles

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.

What an image_asset_pointer looks like

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:

FieldUseful for export recovery?Meaning
asset_pointerYesThe internal file reference; use the file-... portion as the join key
content_typeYesLets you find image pointer records without matching unrelated strings
size_bytes, width, heightSometimesUseful checks after a candidate file is found
gen_idNoConversation 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.

Recover the asset from a complete export

1. Extract the entire archive

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.

2. Find the pointer record

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

3. Extract the file id

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.

4. Search the extracted files

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.

5. Verify and re-host the bytes

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.

A small script for many pointers

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.

When the pointer has no matching file

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:

  • the export was incomplete or only conversations.json was saved;
  • the asset had already expired before the export was prepared;
  • the conversation or file was deleted;
  • the candidate file was renamed during extraction or moved by another tool.

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.

FAQ

What is file-service:// in a ChatGPT export?

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.

How do I map image_asset_pointer to an exported image?

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.

Can I curl a file-service:// URI?

No. curl does not implement that internal scheme, and replacing it with an HTTPS host does not create a signed download URL.

Does gen_id identify the exported asset file?

No. gen_id describes the generation in conversation metadata. The file-... part of asset_pointer is the relevant key for matching export files.

Why is the asset missing from my export?

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.

Latest models

View all models
  • GPT Image 2From $0.007/image
  • Nano Banana 2From $0.051/image
  • Seedream 5.0 ProFrom $0.050/image
  • Seedance 2.5From $0.121/s

Explore models

TextImageVideoAudio
Back to blog
GPT Image 2From $0.007/image
Nano Banana 2From $0.051/image
Seedream 5.0 ProFrom $0.050/image
Seedance 2.5From $0.121/s
View all models
TextChat and reasoning
ImageGenerate and edit
VideoText and image to video
AudioSpeech and music
Start generating
View model pricing
View all articles
Seedance 2.5 Text-to-Video: Build Short-Form Clips with the hiapi API

Seedance 2.5 Text-to-Video: Build Short-Form Clips with the hiapi API

Seedance 2.5 Reference-to-Video for Short-Form TikTok and Reels Clips

Seedance 2.5 Reference-to-Video for Short-Form TikTok and Reels Clips

Grok Imagine Image 2.0 Image-to-Image Prompts: 4 Recipes With Real Outputs

Grok Imagine Image 2.0 Image-to-Image Prompts: 4 Recipes With Real Outputs

Grok Imagine 2.0 Text-to-Image Prompt Recipes: Copy-Paste Prompts With Real Outputs

Grok Imagine 2.0 Text-to-Image Prompt Recipes: Copy-Paste Prompts With Real Outputs

Using flux-2-klein-9b/text-to-image for E-Commerce Product Images via the hiapi API

Using flux-2-klein-9b/text-to-image for E-Commerce Product Images via the hiapi API

Flux-2-Klein-9b Image-to-Image for E-Commerce Product Photos

Flux-2-Klein-9b Image-to-Image for E-Commerce Product Photos

Start generating