Tu estudio. En código.

Transforma fotos cotidianas de productos en imágenes profesionales con una API sencilla.

API_BASEhttps://api.reimaginalo.com
  1. Sube una imagen

    Envía una foto de producto con tus ajustes.

  2. Consulta el estado

    Consulta el ID devuelto para saber cuándo está lista.

  3. Descarga el resultado

    Obtén tu imagen final desde la URL recibida.

Haz tu primera solicitud

Una imagen. Una solicitud.
curl -X POST "$API_BASE/v1/generations" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Idempotency-Key: $REQUEST_KEY" \
  -F 'image=@shirt.jpg' \
  -F 'quality=low' \
  -F 'mode=default'

202 AcceptedConsulta el ID devuelto para obtener tu imagen.

Configura API_BASE, API_KEY y un REQUEST_KEY único. Reutiliza REQUEST_KEY al reintentar esta imagen.

Usa un archivo local llamado shirt.jpg. Configura API_BASE y API_KEY antes de ejecutar un ejemplo. Python necesita requests; JavaScript, Node.js 20+.

Autenticación

Crea una clave en Cuenta → Claves API y cópiala una vez. Autentica cada solicitud con un token bearer en la cabecera Authorization.

Cabecera de solicitud
Authorization: Bearer <api_key>
Tu clave se queda en tu servidor.

No incluyas claves en el navegador ni en el control de versiones. Cada cuenta admite cinco claves activas, válidas hasta revocarlas. La revocación bloquea nuevas solicitudes; las generaciones aceptadas continúan.

La API está disponible para todas las cuentas. Las claves API no pueden gestionar suscripciones ni otras claves.

Endpoints

Abre un endpoint para ver todo lo necesario para usarlo. Los ejemplos usan API_BASE y API_KEY del inicio rápido.

POST/v1/generationsGenerar una imagen

Generar una imagen

Sube una foto de producto. Devuelve una generación de inmediato; la imagen se procesa de forma asíncrona.

Entradas

Cuerpo: multipart/form-data. Deja que tu cliente HTTP establezca Content-Type y su boundary. No se aceptan JSON ni URLs de imágenes.

CampoTipoDetalles
Authorizationstring · headerObligatorio en todos los endpoints: Bearer <api_key>.
Idempotency-Keystring · headerOpcional, recomendado. 1–128 caracteres ASCII visibles, sin espacios. Reutilízalo con el mismo archivo y ajustes para reintentar.
imagebinary · formObligatorio. Un JPEG, PNG, WebP, HEIC o HEIF; ≤5 MiB, ≤25 megapíxeles, ≤12.000 píxeles por lado.
qualitystring · formOpcional. Por defecto: low (1 crédito); medium cuesta 1,5 créditos; high cuesta 3 créditos.
modestring · formOpcional. Por defecto: default (maniquí invisible). Otros modos: wall_shadow (sombra de estudio), enhanced_original (mejora la presentación original), subtle_movement (movimiento natural).
background_colorstring · formOpcional. Por defecto: #FFFFFF. Hexadecimal de seis dígitos con o sin #, normalizado a #RRGGBB en mayúsculas. La salida generada es JPEG.

Ejemplo de solicitud

cURL
curl --request POST "$API_BASE/v1/generations" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Idempotency-Key: product-shirt-001" \
  -F 'image=@shirt.jpg' \
  -F 'quality=low' \
  -F 'mode=default' \
  -F 'background_color=#FFFFFF'

Respuesta 202 Accepted · Generation

application/json · Ejemplo ilustrativo; los IDs, fechas y URLs serán distintos.

Cuerpo de respuesta
{
  "id": "ad7cc504-91d3-4b6e-b12f-624b967a8250",
  "status": "queued",
  "quality": "low",
  "mode": "default",
  "background_color": "#FFFFFF",
  "created_at": "2026-09-24T10:00:00Z",
  "completed_at": null,
  "output": null,
  "error": null
}
Cabeceras de respuesta
Location: /v1/generations/ad7cc504-91d3-4b6e-b12f-624b967a8250
Retry-After: 3
Ver campos y tipos de respuesta
CampoTipoDetalles
idstring · UUIDID único del intento. Úsalo para consultar el estado, también de regeneraciones web.
statusstring · enumqueued | processing | completed | failed
qualitystring · enumlow | medium | high
modestring · enumdefault | wall_shadow | enhanced_original | subtle_movement
background_colorstringNormalizado a #RRGGBB en mayúsculas.
created_atstring · date-timeFecha de creación en formato ISO 8601.
completed_atstring | nullFecha de finalización (ISO 8601), o null si no está disponible.
outputobject | nullDisponible al consultar un resultado listo; null mientras está pendiente, si falla y en el historial.
output.urlstringURL de descarga temporal. Descarga sin tu clave API.
output.expires_atstring · date-timeCaducidad de la URL (ISO 8601); una hora después de consultarla.
output.content_typestringimage/jpeg
output.widthinteger | nullAncho en píxeles, si está disponible.
output.heightinteger | nullAlto en píxeles, si está disponible.
errorstring | nullMensaje de error cuando status es failed; en otro caso, null.

Qué ocurre tras la solicitud

Los créditos se reservan al aceptar la solicitud; los intentos fallidos se reembolsan una vez. Las generaciones de la API y la web comparten saldo y biblioteca, con las reglas habituales de disponibilidad y caducidad de tu cuenta. El procesamiento continúa tras la respuesta. Consulta el ID cada 3 segundos, aumentando hasta 15. Un reintento idempotente idéntico devuelve el mismo intento y su estado actual, aunque ya esté completado o fallido.

Posibles errores: 400 / 422 · 401 · 402 · 409 · 413 · 429 · 5xx. Formato de error y recuperación →

GET/v1/generations/{generation_id}Consultar estado y descargar

Consultar estado y descargar

Consulta un intento y obtén una URL de descarga nueva cuando la imagen esté lista.

Entradas

Sin cuerpo ni parámetros de consulta.

CampoTipoDetalles
Authorizationstring · headerObligatorio en todos los endpoints: Bearer <api_key>.
generation_idstring · UUID · pathObligatorio. El id devuelto al crear o consultar el historial. Debe pertenecer a tu cuenta.

Ejemplo de solicitud

cURL
curl "$API_BASE/v1/generations/ad7cc504-91d3-4b6e-b12f-624b967a8250" \
  -H "Authorization: Bearer $API_KEY"

Respuesta 200 OK · Generation

application/json · Ejemplo ilustrativo; los IDs, fechas y URLs serán distintos.

Cuerpo de respuesta
{
  "id": "ad7cc504-91d3-4b6e-b12f-624b967a8250",
  "status": "completed",
  "quality": "low",
  "mode": "default",
  "background_color": "#FFFFFF",
  "created_at": "2026-09-24T10:00:00Z",
  "completed_at": "2026-09-24T10:00:30Z",
  "output": {
    "url": "https://storage.example.com/result.jpg?token=example",
    "expires_at": "2026-09-24T11:00:30Z",
    "content_type": "image/jpeg",
    "width": 1024,
    "height": 1536
  },
  "error": null
}
Ver campos y tipos de respuesta
CampoTipoDetalles
idstring · UUIDID único del intento. Úsalo para consultar el estado, también de regeneraciones web.
statusstring · enumqueued | processing | completed | failed
qualitystring · enumlow | medium | high
modestring · enumdefault | wall_shadow | enhanced_original | subtle_movement
background_colorstringNormalizado a #RRGGBB en mayúsculas.
created_atstring · date-timeFecha de creación en formato ISO 8601.
completed_atstring | nullFecha de finalización (ISO 8601), o null si no está disponible.
outputobject | nullDisponible al consultar un resultado listo; null mientras está pendiente, si falla y en el historial.
output.urlstringURL de descarga temporal. Descarga sin tu clave API.
output.expires_atstring · date-timeCaducidad de la URL (ISO 8601); una hora después de consultarla.
output.content_typestringimage/jpeg
output.widthinteger | nullAncho en píxeles, si está disponible.
output.heightinteger | nullAlto en píxeles, si está disponible.
errorstring | nullMensaje de error cuando status es failed; en otro caso, null.

Qué ocurre tras la solicitud

Deja de consultar al llegar a completed o failed. Descarga output.url sin cabecera Authorization; guarda la imagen en tu almacenamiento para reutilizarla. El enlace caduca tras una hora; vuelve a consultar para obtener otro. Una generación fallida devuelve HTTP 200 con status: failed y un mensaje de error.

Posibles errores: 401 · 404 · 422 · 429 · 5xx. Formato de error y recuperación →

GET/v1/generationsConsultar tu historial

Consultar tu historial

Lista los intentos de tu cuenta en la API y la web, del más reciente al más antiguo, en todos los estados.

Entradas

Sin cuerpo. Envía la paginación en los parámetros de la URL.

CampoTipoDetalles
Authorizationstring · headerObligatorio en todos los endpoints: Bearer <api_key>.
limitinteger · queryOpcional. 1–50; por defecto 20.
offsetinteger · queryOpcional. 0–10.000; por defecto 0.

Ejemplo de solicitud

cURL
curl "$API_BASE/v1/generations?limit=20&offset=0" \
  -H "Authorization: Bearer $API_KEY"

Respuesta 200 OK · GenerationPage

application/json · Ejemplo ilustrativo; los IDs, fechas y URLs serán distintos.

Cuerpo de respuesta
{
  "items": [
    {
      "id": "ad7cc504-91d3-4b6e-b12f-624b967a8250",
      "status": "completed",
      "quality": "low",
      "mode": "default",
      "background_color": "#FFFFFF",
      "created_at": "2026-09-24T10:00:00Z",
      "completed_at": "2026-09-24T10:00:30Z",
      "output": null,
      "error": null
    }
  ],
  "total": 1
}
Ver campos y tipos de respuesta
CampoTipoDetalles
itemsGeneration[]Intentos de esta página; una lista vacía si no hay resultados. Mismos campos que Generation, con output: null.
totalintegerTotal de intentos de la cuenta en todas las páginas.
CampoTipoDetalles
idstring · UUIDID único del intento. Úsalo para consultar el estado, también de regeneraciones web.
statusstring · enumqueued | processing | completed | failed
qualitystring · enumlow | medium | high
modestring · enumdefault | wall_shadow | enhanced_original | subtle_movement
background_colorstringNormalizado a #RRGGBB en mayúsculas.
created_atstring · date-timeFecha de creación en formato ISO 8601.
completed_atstring | nullFecha de finalización (ISO 8601), o null si no está disponible.
outputobject | nullDisponible al consultar un resultado listo; null mientras está pendiente, si falla y en el historial.
output.urlstringURL de descarga temporal. Descarga sin tu clave API.
output.expires_atstring · date-timeCaducidad de la URL (ISO 8601); una hora después de consultarla.
output.content_typestringimage/jpeg
output.widthinteger | nullAncho en píxeles, si está disponible.
output.heightinteger | nullAlto en píxeles, si está disponible.
errorstring | nullMensaje de error cuando status es failed; en otro caso, null.

Qué ocurre tras la solicitud

Aumenta offset por el número de elementos recibidos para obtener la siguiente página. Termina cuando items esté vacío u offset alcance total. Los nuevos intentos pueden desplazar las páginas. Todas las claves de la cuenta pueden leer el historial. Consulta una generación individual para obtener su URL de descarga.

Posibles errores: 401 · 422 · 429 · 5xx. Formato de error y recuperación →

GET/v1/creditsConsultar tu saldo

Consultar tu saldo

Consulta los créditos disponibles en tu cuenta, compartidos con la web.

Entradas

Sin cuerpo, parámetros de ruta ni de consulta.

CampoTipoDetalles
Authorizationstring · headerObligatorio en todos los endpoints: Bearer <api_key>.

Ejemplo de solicitud

cURL
curl "$API_BASE/v1/credits" \
  -H "Authorization: Bearer $API_KEY"

Respuesta 200 OK · Credits

application/json · Ejemplo ilustrativo; los IDs, fechas y URLs serán distintos.

Cuerpo de respuesta
{
  "credits_remaining": 12
}
Ver campos y tipos de respuesta
CampoTipoDetalles
credits_remainingnumberSaldo disponible. Un número JSON, no necesariamente entero.

Qué ocurre tras la solicitud

Es una consulta, no una reserva. Otros envíos pueden cambiar el saldo antes de tu siguiente solicitud. Gestiona créditos y suscripciones en la web.

Posibles errores: 401 · 429 · 5xx. Formato de error y recuperación →

El ciclo de una generación

En colaEsperando para empezarProcesandoCreando tu imagenCompletadaLista para descargarFallidaConsulta el error

Sigue consultando mientras esté queued o processing. completed → descarga la imagen. failed → lee error; usa una clave de idempotencia nueva si decides volver a enviar.

Errores y límites

Por defecto, 100 envíos de imágenes y 500 lecturas por minuto, compartidos entre tus claves API. Cada envío sube una imagen; los reintentos idempotentes también cuentan. Ante 429, espera los segundos de Retry-After; ante errores de red o 5xx, usa espera exponencial.

Reintenta sin pagar dos veces

Envía un Idempotency-Key único (1–128 caracteres ASCII visibles, sin espacios) por imagen deseada. Guárdalo y reutiliza el mismo archivo y ajustes tras un timeout. Los reintentos idénticos devuelven el mismo intento y estado sin otro cargo; cambiar el contenido devuelve 409.

Las claves de idempotencia se aplican a toda tu cuenta, entre claves API y la web, y se conservan con la generación. Usa una nueva para generar otra imagen, también tras un intento fallido. Tras un timeout local, sigue consultando el mismo ID en vez de enviar un reemplazo.

HTTPDescripción
400 / 422Archivo, ajustes o campos inválidos.
401Clave ausente, inválida o revocada.
402Créditos insuficientes. Gestiona tu saldo en la web.
404Generación inexistente o de otra cuenta.
409Clave de idempotencia usada con otra entrada.
413El archivo supera el tamaño permitido.
429Límite superado. Espera los segundos de Retry-After.
5xxError del servicio. Reintenta con espera exponencial.
Respuesta de error
{
  "error": {
    "code": "insufficient_credits",
    "message": "Not enough credits to generate this image",
    "request_id": "…"
  }
}

Las respuestas de error son JSON: error es un objeto con tres campos de texto. code identifica la categoría, message describe el problema y request_id identifica la solicitud para soporte. La cabecera de respuesta X-Request-ID también contiene este identificador. Una respuesta 429 incluye Retry-After (segundos).

Incluye X-Request-ID al contactar con soporte. v1 no ofrece lotes, webhooks, entradas por URL ni endpoints de regeneración.