HiAPI
Blog

Guía de uso

Cómo descargar imágenes desde un enlace de ChatGPT, un paquete de exportación o un gen_id

El enlace aún se abre, solo tienes el paquete de exportación, el enlace ya caducó, solo queda el gen_id: cómo recuperar la imagen original en cada uno de los cuatro casos.

Oct 15, 2026
Cómo descargar imágenes desde un enlace de ChatGPT, un paquete de exportación o un gen_id

Si quieres descargar una imagen desde un enlace de ChatGPT, guarda el archivo mientras el enlace siga abriéndose. Los enlaces de imagen de ChatGPT son temporales; una vez caducados, ni siquiera con el gen_id puedes recuperar la imagen original.

Primero mira qué te queda y luego elige el método correspondiente:

Qué tienes Cómo recuperarlo Resultado
Un enlace de imagen que aún se abre, o la conversación original Abre la imagen, descarga el archivo y guárdalo en tu propio almacenamiento Normalmente se conserva la imagen original
Una exportación completa de datos de ChatGPT (conversations.json más los archivos de imagen) Usa el ID de file-service:// para buscarlo en la carpeta de exportación Si la imagen está en el paquete de exportación, se puede recuperar
Un enlace backend-api o oaiusercontent ya caducado Vuelve a la conversación original, revisa la exportación completa o vuelve a generar Modificar el enlace no hace que vuelva a funcionar
Solo queda un gen_id Vuelve a generar con el prompt original Los píxeles de la imagen original no se pueden recuperar
Un flujo que necesita generar imágenes por lotes repetidamente Genera con una API documentada, descarga y guarda en tu propia dirección Las futuras imágenes quedan en tus manos

La diferencia clave es: un enlace firmado aún válido permite descargar el archivo, mientras que el gen_id solo es un número dentro de la conversación y no permite descargar nada.

El enlace aún se abre: descarga directa

Si la conversación original sigue existiendo, abre la imagen generada y usa el botón de descarga propio de ChatGPT. Si copiaste el enlace de la imagen, ábrelo con el enlace completo (no borres la cadena de parámetros que va después de ?) y guárdala de inmediato.

Antes de darlo por bueno, confirma estos puntos:

  • Devuelve HTTP 200;
  • El tipo de contenido es de imagen, por ejemplo image/png o image/webp;
  • El tamaño del archivo es normal, no unos cientos de bytes;
  • Se abre y es exactamente la imagen que quieres.

Un enlace que solo se abre en tu navegador actual no sirve como dirección a largo plazo: el navegador puede seguir llevando la sesión iniciada o una firma recién emitida. Descarga el archivo y súbelo a tu propio almacenamiento; no envíes directamente los enlaces de ChatGPT ni los incluyas en un producto.

Por qué caducan los enlaces de imagen de ChatGPT

Una imagen generada puede tener varias referencias internas en ChatGPT:

  • gen_id: el número de una generación dentro de la conversación.
  • file-service://file-...: un puntero interno a un archivo, no es una URL.
  • chatgpt.com/backend-api/... y files.oaiusercontent.com/...: enlaces de descarga firmados temporales.

Cada uno sirve para lo suyo; ninguno es una dirección de imagen pública permanente.

Si un enlace copiado no se abre, hay dos casos habituales:

HTTP 422
missing query fields such as p or ts

El enlace se copió incompleto, le faltan parámetros de firma, o al pegarlo alguna herramienta eliminó la parte que va después de ?.

HTTP 404
ResourceNotFound

La firma o el archivo ya caducaron, el archivo se eliminó, o la solicitud ya no está en el contexto con el que se emitió el enlace. Armar con el gen_id una ruta que parece correcta tampoco restaura la firma ni la imagen.

Recuperar imágenes desde una exportación de datos completa

Solicita la exportación de datos en los ajustes de ChatGPT; el paquete completo incluirá conversations.json y archivos de imagen individuales. En el JSON, una imagen se ve más o menos así:

{
  "content_type": "image_asset_pointer",
  "asset_pointer": "file-service://file-A1b2C3d4E5f6",
  "size_bytes": 1417238,
  "width": 1024,
  "height": 1024,
  "metadata": {
    "dalle": {"gen_id": "aBcD3fGh1jKl"}
  }
}

Lo útil es el fragmento file-... que va después de file-service://, ya que coincide con el nombre de archivo dentro del paquete de exportación. El gen_id no es ni un nombre de archivo ni una credencial de descarga.

1. Descomprime completamente el paquete de exportación

Conserva la estructura de directorios original. Si solo abres conversations.json, pierdes la otra mitad: los archivos de imagen con los que hay que cotejar.

2. Encuentra el puntero de la imagen

Busca "content_type": "image_asset_pointer" en conversations.json, localiza la conversación y la imagen que quieres, y copia el asset_pointer completo.

3. Extrae el ID del archivo

Quita solo el prefijo interno:

file-service://file-A1b2C3d4E5f6
               └─ file-A1b2C3d4E5f6

No cambies file-service:// por https:// para hacer curl; no es una dirección pública.

4. Busca en los archivos exportados

macOS o Linux:

find . -type f -iname '*file-A1b2C3d4E5f6*'

Si el paquete de exportación renombró los archivos o los colocó en directorios más profundos, busca el fragmento más distintivo del ID. Si tienes size_bytes, width y height, compáralos con los archivos candidatos.

5. Confirma y guarda en tu propio espacio

Abre el archivo candidato en local, confirma que es esa imagen y súbelo a tu propio S3, R2, CDN o almacenamiento de la aplicación, y anota esta dirección a largo plazo.

Si hay muchas imágenes, usa el siguiente script para listar en local todos los IDs de imagen del paquete de exportación; no se conecta a ChatGPT:

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)

Tener el puntero solo indica que la imagen se referenció alguna vez en la conversación; puede que el archivo no esté en el paquete de exportación. Si tras descomprimir completamente sigues sin encontrar el archivo correspondiente, ni file-service:// ni gen_id pueden restaurar la imagen original.

Qué hacer si solo queda el gen_id

No hay ninguna interfaz pública que convierta el gen_id en PNG, WebP o un nuevo enlace firmado. Si ya no tienes la conversación original, ni un enlace utilizable, ni los archivos del paquete de exportación, solo puedes volver a generar con el prompt original y el contexto de aquel momento.

Conserva los IDs inválidos solo como registro de diagnóstico. Para las imágenes que quieras guardar a largo plazo, anota esto:

  • El prompt y los parámetros de generación;
  • Qué servicio y qué modelo se usaron;
  • El ID de tarea del proveedor, para facilitar el diagnóstico y el soporte;
  • La ruta del archivo o la dirección a largo plazo en tu propio almacenamiento.

Montar un flujo de descarga automática con la API

Para generar imágenes por lotes y conservarlas, usa una API que ya devuelva archivos de imagen. En HiAPI, el flujo estable es: enviar, consultar el estado, descargar, verificar y transferir.

curl -X POST https://api.hiapi.ai/v1/tasks \
  -H "Authorization: Bearer $HIAPI_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "gpt-image-2/text-to-image",
    "input": {
      "prompt": "晨光里,书桌上放着一只纸鹤",
      "aspect_ratio": "1:1",
      "resolution": "1K"
    }
  }'

Cuando tengas el taskId, consulta GET /v1/tasks/{taskId} y, tras el éxito, lee data.output[0].url y expireAt:

curl -s "https://api.hiapi.ai/v1/tasks/$TASK_ID" \
  -H "Authorization: Bearer $HIAPI_API_KEY"

curl -s -o generated-image.webp "<data.output[0].url>"

La dirección que devuelve la API también es temporal, pero el tiempo de caducidad viene en el resultado (expireAt), así que puedes procesarlo a tiempo. Descarga antes de que caduque, confirma que lo obtenido es una imagen y no HTML o un error JSON, y luego sube el archivo a tu propio almacenamiento.

gpt-image-2/text-to-image cuesta $0.03 por imagen en 1K, $0.04 en 2K y $0.06 en 4K. Consulta los parámetros y la prueba en línea en la página del modelo GPT Image 2, y el formato de solicitud en la documentación de creación de tareas.

Prácticas de almacenamiento a prueba de enlaces caducados

Para cada tarea exitosa:

  1. Guarda el ID de tarea antes de consultar el estado, así el worker no reenviará ni cobrará dos veces al reintentar.
  2. Descarga el archivo mientras la dirección firmada siga siendo válida.
  3. Comprueba el código de estado, el tipo de contenido y el tamaño del archivo; acéptalo solo si es una imagen.
  4. Súbelo con una ruta de archivo definida por ti.
  5. Guarda tu propia dirección en la base de datos; la dirección temporal solo se conserva para diagnóstico a corto plazo.

Preguntas frecuentes

¿Cómo descargar una imagen desde un enlace de ChatGPT?

Mientras el enlace siga abriéndose, ábrelo completo (con los parámetros de firma), descarga el archivo de imagen y guárdalo en tu propio almacenamiento. Cualquier enlace que solo se abra en tu navegador con sesión iniciada debe tratarse como temporal.

¿Existe una interfaz oficial para descargar por gen_id?

No. ChatGPT no ha publicado ninguna interfaz del tipo «pasar un gen_id y recibir la imagen»; ese número solo tiene sentido dentro de la conversación original.

¿Por qué un enlace de imagen de ChatGPT devuelve 422?

Normalmente porque al enlace firmado le faltan parámetros necesarios. Si solo copiaste la ruta, o la herramienta que usaste eliminó la parte posterior a ?, el enlace deja de funcionar.

¿Por qué el mismo enlace después devuelve 404?

Tanto el enlace firmado como el archivo son temporales. Es normal que tras caducar devuelva ResourceNotFound; el gen_id tampoco puede renovarlo.

¿Cómo encontrar las imágenes file-service:// del paquete de exportación?

Copia el ID de archivo que va después de file-service://, busca en el paquete de exportación completamente descomprimido los nombres de archivo que contengan ese ID y verifica con el tamaño y las dimensiones.

¿Cómo obtener una dirección de imagen permanente?

Mientras el archivo de origen aún se pueda descargar, súbelo a tu propio almacenamiento y guarda tu propia dirección. Que sea permanente o no depende de tu almacenamiento, no del enlace de descarga temporal del proveedor.

Artículos relacionados

Ver todos los artículos →

Empieza a crear con artefactos de IA persistentes

Consigue tu API key y llama a modelos de imagen, vídeo y audio a través de una única API basada en tasks.

Leer la documentación de la API