Escenifica una foto inmobiliaria desde tu propio código. Una llamada HTTP devuelve una imagen escenificada. Créditos prepago a 0,15 $ por imagen, sin suscripción, sin mínimo y sin facturas que se disparen.
- URL base
- https://stagify.ai/api/v1
- Autenticación
- Bearer stg_live_…
- Tipo de contenido
- multipart/form-data
Introducción
La API expone una sola cosa: el motor de escenificación que hay detrás de la aplicación web. Envías la foto de una habitación, indicas un tipo de estancia y un estilo de mobiliario, y recibes la imagen escenificada en la misma respuesta. No hay cola de trabajos ni nada que consultar en el camino normal.
Los créditos son imágenes enteras. Los compras por adelantado y cada renderizado correcto gasta uno. Un renderizado fallido se reembolsa automáticamente, así que solo pagas por una foto que has recibido. Y como el saldo es prepago, una clave robada te cuesta como mucho lo que quede en ella. No hay factura a fin de mes.
Las claves están pensadas para uso servidor a servidor. La API no envía cabeceras CORS, por lo que un navegador no puede llamarla directamente; es deliberado, y una clave accesible desde JavaScript de navegador es una clave filtrada. Mostramos la clave una sola vez, guardamos únicamente un hash y la revocamos de inmediato.
Inicio rápido
Crea una clave en tu página de claves de API, compra un paquete de créditos y envía una foto. La respuesta lleva la imagen escenificada como data URL.
curl https://stagify.ai/api/v1/renders \
-H "Authorization: Bearer $STAGIFY_API_KEY" \
-H "Idempotency-Key: $(uuidgen)" \
-F "image=@living-room.jpg" \
-F "roomType=Living room" \
-F "furnitureStyle=modern" \
-F "labelVirtuallyStaged=true"
Un renderizado puede tardar un par de minutos. Ajusta el tiempo de espera de lectura de tu cliente a 300 segundos y reintenta con la misma Idempotency-Key. Eso es lo que garantiza que nunca se te cobre dos veces por una foto.
Paquetes de créditos
Cargando precios…
Parámetros de la petición
POST /api/v1/renders, enviado como multipart/form-data. Todos los valores admitidos que aparecen abajo también se sirven en JSON desde GET /api/v1/options, que no requiere clave de API, para que un cliente pueda rellenar sus propios desplegables en lugar de fijar esta tabla en el código.
| Campo | Tipo | Notas |
|---|---|---|
image | file | Obligatorio. La foto de la habitación. JPEG, PNG o WebP, hasta 25 MB. Se comprueba el tipo MIME, no la extensión del archivo. |
roomType | enum | Bedroom, Living room, Dining room, Kitchen, Office, Bathroom, Outdoors, Dorm. Por defecto Living room. Distingue mayúsculas y espacios, y un valor no reconocido no se rechaza. Se escribe en el prompt como texto libre, por lo que Living Room no es Living room. |
furnitureStyle | enum | standard, modern, midcentury, scandinavian, luxury, coastal, farmhouse, custom. Por defecto standard, que es también en lo que se convierte silenciosamente un valor no reconocido. custom usa tu additionalPrompt en lugar del texto de estilo integrado. |
additionalPrompt | string | Indicaciones en texto libre para este renderizado. |
removeFurniture | boolean | Vaciar la habitación antes de escenificarla. Envía true u on; cualquier otra cosa, incluidos 1 y yes, se lee como falso. |
keepFurniture | string | Texto libre indicando qué conservar, p. ej. keep the dining table and the built-in shelves. Solo se lee cuando removeFurniture está activo. 500 caracteres. |
furnitureImage | file[] | Hasta 5 fotos de referencia de mobiliario a imitar. Mismos formatos y límite de tamaño que image. |
labelVirtuallyStaged | boolean | Graba el aviso “Virtually staged” en la imagen resultante. |
stampStyle | enum | dark, light, minimal, banner. Por defecto dark. No distingue mayúsculas; un valor no reconocido vuelve al valor por defecto. |
stampScale | number | De 0.7 a 1.6, por defecto 1. Los valores fuera de rango se ajustan al límite en vez de rechazarse. |
stampLang | enum | El idioma del distintivo: english, spanish, french, german, chinese, korean, portuguese, russian, italian, japanese, dutch. Por defecto english. |
variations | integer | Solo se acepta 1. Lanza peticiones simultáneas si quieres más. |
Idempotencia
Un renderizado mantiene la conexión abierta durante minutos, lo que significa que el fallo que de verdad te afectará es un socket caído después de que el trabajo se completó: cobrado y sin nada en la mano. Envía una cabecera Idempotency-Key en cada petición y reintenta con el mismo valor.
| Lo que tenemos registrado | Qué hace un reintento |
|---|---|
| Una petición correcta, con los mismos parámetros | Devuelve el resultado guardado con X-Stagify-Replayed: true. Sin segundo cobro. |
| Una petición todavía en curso | 409 REQUEST_IN_FLIGHT. Espera y reintenta. |
| Una petición abandonada a mitad del renderizado | Se vuelve a ejecutar con el cobro existente, hasta tres intentos. |
| La misma clave con parámetros distintos | 422 IDEMPOTENCY_KEY_REUSED. Usa una clave nueva. |
Omitir la cabecera está permitido y significa que no hay protección frente a reintentos, que es el comportamiento honesto por defecto. No derivamos una clave a partir de tu foto: dos renderizados realmente distintos de la misma habitación colisionarían y quien llamase en segundo lugar recibiría la imagen del primero.
Avisos de escenificación
Muchas normas de MLS y NAR exigen que una foto escenificada lo indique. labelVirtuallyStaged graba ese aviso en los píxeles en lugar de añadirlo como metadatos que una herramienta posterior pueda eliminar.
Si el aviso no se puede aplicar, la imagen se retiene en vez de entregarse sin etiquetar, la llamada responde 500 DISCLOSURE_STAMP_FAILED y tu crédito se reembolsa. No hay forma de desactivar ese comportamiento, ni un valor por defecto por clave que lo anule sin avisar.
Errores
Todo fallo responde { "error": "…", "code": "…" }. Ramífica según code, nunca según el mensaje. Los mensajes cambian; los códigos no.
| Estado | Código | Qué hacer |
|---|---|---|
| 401 | API_KEY_MISSING / API_KEY_INVALID / API_KEY_REVOKED | Revisa la cabecera Authorization o crea una clave nueva. |
| 402 | INSUFFICIENT_CREDITS | Recarga. El cuerpo incluye credits_remaining. |
| 403 | ACCOUNT_SUSPENDED | Contacta con soporte. |
| 400 | VARIATIONS_UNSUPPORTED | Esta API renderiza una imagen por petición. Lanza peticiones simultáneas en su lugar. |
| 409 | REQUEST_IN_FLIGHT | Esa clave de idempotencia sigue en curso. Espera y reintenta. |
| 409 | CONCURRENCY_LIMIT | Demasiados renderizados a la vez. Reintenta en unos segundos. |
| 422 | IDEMPOTENCY_KEY_REUSED | Has reutilizado una clave con parámetros distintos. Usa una nueva. |
| 422 | NO_IMAGE_GENERATED | El modelo no devolvió nada. Reembolsado; reintenta o prueba con otra foto. |
| 429 | RATE_LIMITED | Reduce el ritmo y reintenta. |
| 500 | DISCLOSURE_STAMP_FAILED | No se pudo aplicar el aviso, así que la imagen se retuvo. Reembolsado. |
| 500 | RENDER_FAILED | Reembolsado. Cita el ref si contactas con soporte. |
Otros endpoints
GET /api/v1/options: los valores admitidos de cada enumeración anterior. No requiere clave de API.GET /api/v1/me: ¿funciona mi clave? Devuelve la cuenta y el saldo.GET /api/v1/credits: saldo y totales acumulados.GET /api/v1/renders/{id}: el estado de un renderizado.
Cada respuesta lleva X-Stagify-Credits-Remaining, para que puedas ver bajar el saldo sin tener que consultarlo.
Preguntas, límites más altos o una factura en lugar de tarjeta: team@stagify.ai.