Capacidad · Apparel
API de virtual try-on para ropa
En una frase
La API de virtual try-on de Photta toma una imagen de ropa en flat-lay, un ID de maniquí y un ID de pose, y devuelve una foto sobre modelo en 2K o 4K. Envía el job mediante POST, haz polling cada 3–5 segundos y descarga cuando el estado sea completed.
- Tiempo típico: 1.5–4 min
- Credits: 5 credits a 2K · 6 credits a 4K
- Procesamiento: asíncrono, polling
- Límites: 600 requests/min
- Autenticación: Bearer key
Cada cifra de esta página proviene de la documentación de la API de Photta · verificado
RESPONSE=$(curl -s -X POST https://api.photta.app/api/v1/tryon/apparel \
-H "Authorization: Bearer $PHOTTA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"product_type": "top",
"product_images": [
"https://cdn.yourstore.com/products/shirt-front.jpg"
],
"product_back_image": "https://cdn.yourstore.com/products/shirt-back.jpg",
"product_category": "t_shirt",
"mannequin_id": "mnk_f3a9b1",
"pose_id": "pose_c2d4e5",
"background": "https://cdn.yourstore.com/backgrounds/studio-loft.jpg",
"lock_background": true,
"resolution": "2K",
"aspect_ratio": "3:4",
"body_size": "M",
"expression": "neutral",
"user_instruction": "Keep the collar pattern crisp and centered."
}')
ID=$(echo "$RESPONSE" | jq -r '.data.id')const res = await fetch("https://api.photta.app/api/v1/tryon/apparel", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.PHOTTA_API_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({
"product_type": "top",
"product_images": [
"https://cdn.yourstore.com/products/shirt-front.jpg"
],
"product_back_image": "https://cdn.yourstore.com/products/shirt-back.jpg",
"product_category": "t_shirt",
"mannequin_id": "mnk_f3a9b1",
"pose_id": "pose_c2d4e5",
"background": "https://cdn.yourstore.com/backgrounds/studio-loft.jpg",
"lock_background": true,
"resolution": "2K",
"aspect_ratio": "3:4",
"body_size": "M",
"expression": "neutral",
"user_instruction": "Keep the collar pattern crisp and centered."
}),
});
const { data } = await res.json(); // data.id, data.statusimport os, requests
res = requests.post(
"https://api.photta.app/api/v1/tryon/apparel",
headers={"Authorization": f"Bearer {os.environ['PHOTTA_API_KEY']}"},
json={
"product_type": "top",
"product_images": [
"https://cdn.yourstore.com/products/shirt-front.jpg"
],
"product_back_image": "https://cdn.yourstore.com/products/shirt-back.jpg",
"product_category": "t_shirt",
"mannequin_id": "mnk_f3a9b1",
"pose_id": "pose_c2d4e5",
"background": "https://cdn.yourstore.com/backgrounds/studio-loft.jpg",
"lock_background": True,
"resolution": "2K",
"aspect_ratio": "3:4",
"body_size": "M",
"expression": "neutral",
"user_instruction": "Keep the collar pattern crisp and centered."
},
)
data = res.json()["data"] # data["id"], data["status"]
De un vistazo
De un vistazo
- Endpoint
- POST /api/v1/tryon/apparel
- Autenticación
- Bearer API key
- Procesamiento
- Asíncrono — realiza polling al endpoint de estado
- Tiempo típico
- 1.5–4 min
- Credits
- 5 credits a 2K · 6 credits a 4K
- Relaciones de aspecto
- 3:4 · 1:1 · 4:3 · 9:16 · 16:9
- Límites de entrada
- Hasta 10 MB por imagen; JPEG, PNG, WebP
- Idempotente
- No
Petición y respuesta
Petición
RESPONSE=$(curl -s -X POST https://api.photta.app/api/v1/tryon/apparel \
-H "Authorization: Bearer $PHOTTA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"product_type": "top",
"product_images": [
"https://cdn.yourstore.com/products/shirt-front.jpg"
],
"product_back_image": "https://cdn.yourstore.com/products/shirt-back.jpg",
"product_category": "t_shirt",
"mannequin_id": "mnk_f3a9b1",
"pose_id": "pose_c2d4e5",
"background": "https://cdn.yourstore.com/backgrounds/studio-loft.jpg",
"lock_background": true,
"resolution": "2K",
"aspect_ratio": "3:4",
"body_size": "M",
"expression": "neutral",
"user_instruction": "Keep the collar pattern crisp and centered."
}')
ID=$(echo "$RESPONSE" | jq -r '.data.id')const res = await fetch("https://api.photta.app/api/v1/tryon/apparel", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.PHOTTA_API_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({
"product_type": "top",
"product_images": [
"https://cdn.yourstore.com/products/shirt-front.jpg"
],
"product_back_image": "https://cdn.yourstore.com/products/shirt-back.jpg",
"product_category": "t_shirt",
"mannequin_id": "mnk_f3a9b1",
"pose_id": "pose_c2d4e5",
"background": "https://cdn.yourstore.com/backgrounds/studio-loft.jpg",
"lock_background": true,
"resolution": "2K",
"aspect_ratio": "3:4",
"body_size": "M",
"expression": "neutral",
"user_instruction": "Keep the collar pattern crisp and centered."
}),
});
const { data } = await res.json(); // data.id, data.statusimport os, requests
res = requests.post(
"https://api.photta.app/api/v1/tryon/apparel",
headers={"Authorization": f"Bearer {os.environ['PHOTTA_API_KEY']}"},
json={
"product_type": "top",
"product_images": [
"https://cdn.yourstore.com/products/shirt-front.jpg"
],
"product_back_image": "https://cdn.yourstore.com/products/shirt-back.jpg",
"product_category": "t_shirt",
"mannequin_id": "mnk_f3a9b1",
"pose_id": "pose_c2d4e5",
"background": "https://cdn.yourstore.com/backgrounds/studio-loft.jpg",
"lock_background": True,
"resolution": "2K",
"aspect_ratio": "3:4",
"body_size": "M",
"expression": "neutral",
"user_instruction": "Keep the collar pattern crisp and centered."
},
)
data = res.json()["data"] # data["id"], data["status"]202 Accepted / Completado
{
"data": {
"id": "try_abc123",
"status": "processing",
"product_type": "top",
"mannequin_id": "mnk_f3a9b1",
"pose_id": "pose_c2d4e5",
"lock_background": true,
"resolution": "2K",
"aspect_ratio": "3:4",
"credits_used": 5,
"created_at": "2026-04-10T12:00:00Z"
},
"request_id": "req_xyz789"
}{
"data": {
"id": "try_abc123",
"status": "completed",
"product_type": "top",
"mannequin_id": "mnk_f3a9b1",
"pose_id": "pose_c2d4e5",
"resolution": "2K",
"aspect_ratio": "3:4",
"output_url": "https://cdn.photta.app/generated/try_abc123.jpg",
"thumbnail_url": "https://cdn.photta.app/generated/try_abc123-thumb.jpg",
"credits_used": 5,
"created_at": "2026-04-10T12:00:00Z",
"completed_at": "2026-04-10T12:01:15Z",
"duration_ms": 75000
},
"request_id": "req_abc001"
}Parámetros de la petición
product_typeTipo: stringObligatorio
Type of garment.
Valores:topbottomtop_and_bottomone_pieceproduct_imagesTipo: array[string]Obligatorio
Array of image URLs or base64 data URIs. The first entry is the FRONT image and is required. Not used when product_type is "top_and_bottom".
product_back_imageTipo: string
Optional URL or base64 data URI for the BACK of the garment. When supplied, the pipeline auto-switches to the back image whenever the selected pose is back-facing (Back / BackCloseUp). Not used when product_type is "top_and_bottom".
top_imageTipo: string
Front image of the top garment. Required when product_type is "top_and_bottom".
top_back_imageTipo: string
Optional back image of the top garment. Auto-selected on back-facing poses when present.
bottom_imageTipo: string
Front image of the bottom garment. Required when product_type is "top_and_bottom".
bottom_back_imageTipo: string
Optional back image of the bottom garment. Auto-selected on back-facing poses when present.
mannequin_idTipo: stringObligatorio
ID of the mannequin to wear the garment. Use GET /api/v1/mannequins to list available options.
pose_idTipo: stringObligatorio
ID of the pose. Use GET /api/v1/poses to list available options. The pose dictates the framing of the output — what's in frame, whether the face/feet are visible, full body vs half body, etc.
backgroundTipo: string
Optional URL or base64 data URI to a background photo. Anything that is not a URL or data: URI is rejected with HTTP 400. When omitted, an editorial neutral backdrop is used.
lock_backgroundTipo: boolean
When true, the supplied background image is reproduced faithfully (locked) instead of being treated as loose inspiration. Requires the background field — returns 400 if set without a background. Echoed back in the response object.
= false
resolutionTipo: string
Output resolution. 4K cannot be combined with aspect_ratio 1:1 — that combination returns 400.
= 2K
Valores:2K4Kaspect_ratioTipo: string
Output aspect ratio. 1:1 cannot be combined with resolution 4K — that combination returns 400.
= 3:4
Valores:3:41:14:39:1616:9body_sizeTipo: string
Body size of the mannequin.
= M
Valores:XSSMLXLXXLexpressionTipo: string
Facial expression.
= neutral
Valores:neutralhappyserioussmilingfootwear_urlTipo: string
URL or base64 of a custom footwear image. The pipeline always stages the footwear when supplied; the prompt's pose-authority block decides whether to render it (poses that don't show feet drop it cleanly).
user_instructionTipo: string
Free-form refinement, e.g. "preserve the seam pattern across the shoulder", "keep the collar contrast strong". Capped at 500 characters server-side; longer strings are silently truncated. Useful for brand-specific details that need an extra nudge.
product_categoryTipo: string
Optional silhouette anchor for the garment (e.g. "t_shirt", "jeans", "blazer", "midi_dress"). Helps disambiguate the structure of the garment when the silhouette is ambiguous from the photo alone. Used for product_type "top", "bottom", and "one_piece".
top_categoryTipo: string
Silhouette anchor for the top half. Only valid when product_type is "top_and_bottom".
bottom_categoryTipo: string
Silhouette anchor for the bottom half. Only valid when product_type is "top_and_bottom".
lengthTipo: string
Garment length key for product_type "top", "bottom", or "one_piece". List available values with GET /api/v1/garment-attributes?type=length&garment_type={product_type}.
fitTipo: string
Garment fit key for product_type "top", "bottom", or "one_piece". List available values with GET /api/v1/garment-attributes?type=fit&garment_type={product_type}.
top_lengthTipo: string
Top length key. Only valid when product_type is "top_and_bottom". List with GET /api/v1/garment-attributes?type=length&garment_type=top.
top_fitTipo: string
Top fit key. Only valid when product_type is "top_and_bottom". List with GET /api/v1/garment-attributes?type=fit&garment_type=top.
bottom_lengthTipo: string
Bottom length key. Only valid when product_type is "top_and_bottom". List with GET /api/v1/garment-attributes?type=length&garment_type=bottom.
bottom_fitTipo: string
Bottom fit key. Only valid when product_type is "top_and_bottom". List with GET /api/v1/garment-attributes?type=fit&garment_type=bottom.
Errores
- 400
invalid_request_error - The request is malformed or contains invalid parameters.
- 401
authentication_error - The API key is missing, invalid, or expired.
- 402
insufficient_credits_error - Your account does not have enough credits.
- 404
not_found_error - The requested resource does not exist.
- 409
conflict_error - The request conflicts with current state — e.g. your concurrent-batch cap is reached.
- 429
rate_limit_error - Too many requests. Slow down and retry.Retry-After: 30
- 500
api_error - An internal server error occurred. Retry later.
Límites
- 600 solicitudes por minuto por API key (Ventana fija; el límite es el mismo en todos los planes)
- Un 429 incluye Retry-After: 30 segundos
- Hasta 10 MB por imagen
- Formatos: JPEG, PNG, WebP
- Lotes simultáneos por plan: Free 1 · Hobby 2 · Seller 3 · Brand 4 · Studio 6
- Solo polling — la API no envía webhooks.
Cinco pasos, una sola foto de producto
Elige un maniquí, envía el job, haz polling hasta que termine, descarga el resultado.
Paso 1
Genera una API key
Regístrate en ai.photta.app, abre la pestaña Developers y haz clic en Generate API key. Las claves de producción empiezan por `photta_live_`. Guarda la clave en `PHOTTA_API_KEY` — nunca la subas al repositorio.
Paso 2
Elige un maniquí y una pose
GET `/api/v1/mannequins` para listar las opciones disponibles. GET `/api/v1/poses` para el encuadre. Ambos IDs van en la petición de try-on.
Paso 3
Haz POST del job de try-on
Envía un POST a `/api/v1/tryon/apparel` con `product_type`, `product_images`, `mannequin_id`, `pose_id` y los parámetros opcionales `resolution` y `aspect_ratio`. La API devuelve 202 Accepted con un ID de generación.
Paso 4
Haz polling hasta que el job se complete
GET `/api/v1/tryon/apparel/:id` cada 3 segundos. Cuando `data.status` cambie a `completed`, el payload incluirá `output_url` y `thumbnail_url`. Establece un límite máximo para evitar que un job bloqueado congele tu petición.
Paso 5
Descarga y persiste
Obtén los bytes desde `output_url` y almacénalos en tu propio almacenamiento de objetos. La URL de la CDN es estable, pero tu producto no debería depender de ella para renderizar.
El mismo endpoint en Node.js, Python y cURL
Node.js
API de virtual try-on en Node.js
Llama a aPI de virtual try-on de Photta desde un backend de Node.js con fetch nativo. Sin SDKs: guarda tu key, envía el trabajo y haz polling para obtener el resultado.
LeerPython
API de virtual try-on en Python
Llama a aPI de virtual try-on de Photta en Python con la biblioteca requests. Wrapper de treinta líneas, compatible con async mediante httpx, funciona en Django, FastAPI y Celery.
LeercURL
API de virtual try-on con cURL
Llama a aPI de virtual try-on de Photta directamente desde la terminal con cURL. Envía, haz polling, descarga: cada fragmento de código se combina con jq para pipelines automatizados.
Leer
Preguntas que hacen los desarrolladores antes de integrar el try-on de ropa
¿Qué es la API de virtual try-on de Photta?
Un endpoint REST que recibe la foto de un producto en plano cenital (flat-lay) y un ID de maniquí, y devuelve una imagen fotorrealista sobre modelo. Es el mismo pipeline que utiliza la app para consumidores de Photta. Se admiten cuatro tipos de producto: top, bottom, top+bottom y one-piece.
¿Cuánto cuesta por llamada?
5 credits para un resultado en 2K, 6 credits para 4K. Los credits se incluyen con tu suscripción y se pueden recargar. Las generaciones fallidas no consumen credits — se reembolsan.
¿Cuánto tarda una generación?
El tiempo típico de finalización es de 1.5 a 4 minutos, medido de extremo a extremo. El POST devuelve un ID de generación en menos de un segundo; el procesamiento en GPU se realiza en segundo plano mientras haces polling.
¿Qué tipos de producto son compatibles?
Cuatro: `top`, `bottom`, `top_and_bottom`, `one_piece`. Cada uno espera una estructura distinta en `product_images` — por ejemplo, `top_and_bottom` requiere las URLs de `top_image` y `bottom_image`.
¿Puedo usar mi propio maniquí?
Sí. Sube la foto de un maniquí mediante `POST /api/v1/mannequins` o genera un nuevo maniquí con IA usando `POST /api/v1/mannequins/generate`. El ID devuelto se pasa directamente en la petición de try-on.
¿Cómo hago polling para obtener el resultado?
GET `/api/v1/tryon/apparel/:id` cada 3 a 5 segundos hasta que `data.status` sea `completed` o `failed`. Establece un límite máximo de intentos — 120 × 3s cubre la ventana documentada con margen de sobra.
Capacidades relacionadas
Capacidades
API de try-on de joyas para collares, anillos, pulseras y pendientes
Coloca collares, anillos, pulseras y pendientes en modelos de IA mediante REST. 5 credits en 2K, maniquíes en primer plano integrados y renderizado optimizado para reflejos según la documentación de Photta.
Ver el endpointCapacidades
API de maniquí invisible para fotos de producto con efecto maniquí invisible
Endpoint de maniquí invisible con IA. Elimina el maniquí de una foto de la prenda y preserva el detalle interior. 3D o flat-lay, procesamiento por lotes, 4 credits a 2K.
Ver el endpointConstruir
Crea una función de virtual try-on para tu aplicación
Receta de extremo a extremo para implementar una función de virtual try-on con la Photta API: subida, envío, polling desde un worker y renderizado del resultado. TypeScript + patrones exclusivos de servidor.
Ver el endpointConstruir
Añade virtual try-on a una app iOS o Android
Cómo añadir virtual try-on con IA a una app nativa de iOS o Android usando la API de Photta: nunca incluyas la clave en el dispositivo, usa tu backend como proxy y replica el estado del trabajo.
Ver el endpointComparar
Photta frente a FASHN: API de IA de moda, frente a frente
Comparativa de Photta y FASHN: endpoints, precios de créditos, niveles de planes, límites de concurrencia. Obtenido directamente de la página de precios de cada empresa el 2026-04-19. Sin cifras inventadas.
Ver el endpointComparar
Photta vs Fitroom — elige la opción adecuada para APIs de moda
Comparativa entre Photta y Fitroom en endpoints, coste en credits por llamada, modelo de precios y superficie de integración. Extraído de cada sitio el 2026-04-19. Sin cifras inventadas.
Ver el endpointGuía rápida
Tu primera imagen de Photta en menos de cinco minutos.
Regístrate, genera una API key, ejecuta tu primera llamada cURL, haz polling hasta que se complete y guarda el resultado. Cinco pasos, documentados de principio a fin.
Ver el endpointReferencia
Errores de Photta API
La lista completa de tipos de error de Photta API con sus status codes, la estructura del cuerpo de error y qué fallos merece la pena reintentar.
Ver el endpointReferencia
Rate limits de la API de Photta
El rate limit de la API de Photta, su ventana, la cabecera Retry-After, el intervalo de polling y los límites de concurrencia por plan, todo extraído directamente de la documentación de la API.
Ver el endpoint
Cada cifra de esta página proviene de la documentación de la API de Photta · verificado
Prueba la API en cinco minutos
Genera una API key de Photta, pega el snippet de cURL de arriba y tendrás tu primera imagen con modelo antes de que termine de prepararse el café.
- 1.5–4 min
- 5 credits a 2K · 6 credits a 4K
- asíncrono, polling
- 600 requests/min
- Bearer key