Tu estudio. En código.
Transforma fotos cotidianas de productos en imágenes profesionales con una API sencilla.
https://api.reimaginalo.comSube una imagen
Envía una foto de producto con tus ajustes.
Consulta el estado
Consulta el ID devuelto para saber cuándo está lista.
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.
Authorization: Bearer <api_key>
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.
| Campo | Tipo | Detalles |
|---|---|---|
Authorization | string · header | Obligatorio en todos los endpoints: Bearer <api_key>. |
Idempotency-Key | string · header | Opcional, recomendado. 1–128 caracteres ASCII visibles, sin espacios. Reutilízalo con el mismo archivo y ajustes para reintentar. |
image | binary · form | Obligatorio. Un JPEG, PNG, WebP, HEIC o HEIF; ≤5 MiB, ≤25 megapíxeles, ≤12.000 píxeles por lado. |
quality | string · form | Opcional. Por defecto: low (1 crédito); medium cuesta 1,5 créditos; high cuesta 3 créditos. |
mode | string · form | Opcional. Por defecto: default (maniquí invisible). Otros modos: wall_shadow (sombra de estudio), enhanced_original (mejora la presentación original), subtle_movement (movimiento natural). |
background_color | string · form | Opcional. 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 --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.
{
"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
}
Location: /v1/generations/ad7cc504-91d3-4b6e-b12f-624b967a8250
Retry-After: 3
Ver campos y tipos de respuesta
| Campo | Tipo | Detalles |
|---|---|---|
id | string · UUID | ID único del intento. Úsalo para consultar el estado, también de regeneraciones web. |
status | string · enum | queued | processing | completed | failed |
quality | string · enum | low | medium | high |
mode | string · enum | default | wall_shadow | enhanced_original | subtle_movement |
background_color | string | Normalizado a #RRGGBB en mayúsculas. |
created_at | string · date-time | Fecha de creación en formato ISO 8601. |
completed_at | string | null | Fecha de finalización (ISO 8601), o null si no está disponible. |
output | object | null | Disponible al consultar un resultado listo; null mientras está pendiente, si falla y en el historial. |
output.url | string | URL de descarga temporal. Descarga sin tu clave API. |
output.expires_at | string · date-time | Caducidad de la URL (ISO 8601); una hora después de consultarla. |
output.content_type | string | image/jpeg |
output.width | integer | null | Ancho en píxeles, si está disponible. |
output.height | integer | null | Alto en píxeles, si está disponible. |
error | string | null | Mensaje 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.
| Campo | Tipo | Detalles |
|---|---|---|
Authorization | string · header | Obligatorio en todos los endpoints: Bearer <api_key>. |
generation_id | string · UUID · path | Obligatorio. El id devuelto al crear o consultar el historial. Debe pertenecer a tu cuenta. |
Ejemplo de solicitud
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.
{
"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
| Campo | Tipo | Detalles |
|---|---|---|
id | string · UUID | ID único del intento. Úsalo para consultar el estado, también de regeneraciones web. |
status | string · enum | queued | processing | completed | failed |
quality | string · enum | low | medium | high |
mode | string · enum | default | wall_shadow | enhanced_original | subtle_movement |
background_color | string | Normalizado a #RRGGBB en mayúsculas. |
created_at | string · date-time | Fecha de creación en formato ISO 8601. |
completed_at | string | null | Fecha de finalización (ISO 8601), o null si no está disponible. |
output | object | null | Disponible al consultar un resultado listo; null mientras está pendiente, si falla y en el historial. |
output.url | string | URL de descarga temporal. Descarga sin tu clave API. |
output.expires_at | string · date-time | Caducidad de la URL (ISO 8601); una hora después de consultarla. |
output.content_type | string | image/jpeg |
output.width | integer | null | Ancho en píxeles, si está disponible. |
output.height | integer | null | Alto en píxeles, si está disponible. |
error | string | null | Mensaje 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.
| Campo | Tipo | Detalles |
|---|---|---|
Authorization | string · header | Obligatorio en todos los endpoints: Bearer <api_key>. |
limit | integer · query | Opcional. 1–50; por defecto 20. |
offset | integer · query | Opcional. 0–10.000; por defecto 0. |
Ejemplo de solicitud
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.
{
"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
| Campo | Tipo | Detalles |
|---|---|---|
items | Generation[] | Intentos de esta página; una lista vacía si no hay resultados. Mismos campos que Generation, con output: null. |
total | integer | Total de intentos de la cuenta en todas las páginas. |
| Campo | Tipo | Detalles |
|---|---|---|
id | string · UUID | ID único del intento. Úsalo para consultar el estado, también de regeneraciones web. |
status | string · enum | queued | processing | completed | failed |
quality | string · enum | low | medium | high |
mode | string · enum | default | wall_shadow | enhanced_original | subtle_movement |
background_color | string | Normalizado a #RRGGBB en mayúsculas. |
created_at | string · date-time | Fecha de creación en formato ISO 8601. |
completed_at | string | null | Fecha de finalización (ISO 8601), o null si no está disponible. |
output | object | null | Disponible al consultar un resultado listo; null mientras está pendiente, si falla y en el historial. |
output.url | string | URL de descarga temporal. Descarga sin tu clave API. |
output.expires_at | string · date-time | Caducidad de la URL (ISO 8601); una hora después de consultarla. |
output.content_type | string | image/jpeg |
output.width | integer | null | Ancho en píxeles, si está disponible. |
output.height | integer | null | Alto en píxeles, si está disponible. |
error | string | null | Mensaje 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.
| Campo | Tipo | Detalles |
|---|---|---|
Authorization | string · header | Obligatorio en todos los endpoints: Bearer <api_key>. |
Ejemplo de solicitud
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.
{
"credits_remaining": 12
}
Ver campos y tipos de respuesta
| Campo | Tipo | Detalles |
|---|---|---|
credits_remaining | number | Saldo 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

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.
| HTTP | Descripción |
|---|---|
400 / 422 | Archivo, ajustes o campos inválidos. |
401 | Clave ausente, inválida o revocada. |
402 | Créditos insuficientes. Gestiona tu saldo en la web. |
404 | Generación inexistente o de otra cuenta. |
409 | Clave de idempotencia usada con otra entrada. |
413 | El archivo supera el tamaño permitido. |
429 | Límite superado. Espera los segundos de Retry-After. |
5xx | Error del servicio. Reintenta con espera exponencial. |
{
"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.

