Build · Automatización de Ghost Mannequin
Automatiza la extracción de ghost mannequin para tu catálogo
En una frase
Extrae el delta del catálogo desde tu última ejecución, haz un POST con un array product_images (cada elemento con la URL de la imagen más un back_image opcional) y un style a /api/v1/ghost-mannequin/batch, haz polling del ID del lote cada 3 segundos hasta que cada elemento esté completed o failed, y luego actualiza cada fila de producto con su output_url. Los lotes simultáneos están limitados según el plan.
- Credits: 4 credits a 2K · 5 credits a 4K
- Tiempo típico: 1.5–4 min
- Procesamiento: asíncrono, polling
Cada cifra de esta página proviene de la documentación de la API de Photta · verificado
Elimina el maniquí de cada foto de PDP sin recurrir a un diseñador. El endpoint de ghost-mannequin de Photta procesa por lotes de forma natural: un cron nocturno transforma un feed de 50K SKU en un catálogo con maniquí invisible en horas, no semanas.
RESPONSE=$(curl -s -X POST https://api.photta.app/api/v1/ghost-mannequin \
-H "Authorization: Bearer $PHOTTA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"product_image": "https://cdn.yourstore.com/products/jacket-front.jpg",
"back_image": "https://cdn.yourstore.com/products/jacket-back.jpg",
"image_side": "front",
"angle": "side",
"style": "3d",
"background_color": "white",
"resolution": "2K",
"aspect_ratio": "3:4",
"user_instruction": "closed front, cream interior lining",
"brand_label_id": "7cc9f988-068b-44cd-8004-22f486b10e67"
}')
ID=$(echo "$RESPONSE" | jq -r '.data.id')const res = await fetch("https://api.photta.app/api/v1/ghost-mannequin", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.PHOTTA_API_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({
"product_image": "https://cdn.yourstore.com/products/jacket-front.jpg",
"back_image": "https://cdn.yourstore.com/products/jacket-back.jpg",
"image_side": "front",
"angle": "side",
"style": "3d",
"background_color": "white",
"resolution": "2K",
"aspect_ratio": "3:4",
"user_instruction": "closed front, cream interior lining",
"brand_label_id": "7cc9f988-068b-44cd-8004-22f486b10e67"
}),
});
const { data } = await res.json(); // data.id, data.statusimport os, requests
res = requests.post(
"https://api.photta.app/api/v1/ghost-mannequin",
headers={"Authorization": f"Bearer {os.environ['PHOTTA_API_KEY']}"},
json={
"product_image": "https://cdn.yourstore.com/products/jacket-front.jpg",
"back_image": "https://cdn.yourstore.com/products/jacket-back.jpg",
"image_side": "front",
"angle": "side",
"style": "3d",
"background_color": "white",
"resolution": "2K",
"aspect_ratio": "3:4",
"user_instruction": "closed front, cream interior lining",
"brand_label_id": "7cc9f988-068b-44cd-8004-22f486b10e67"
},
)
data = res.json()["data"] # data["id"], data["status"]Cómo funciona
Ejecución nocturna para todo el catálogo
Cinco componentes necesarios para una automatización que funcione sin supervisión.
Paso 1
Mapea tu catálogo
Identifica qué filas de productos necesitan una imagen con ghost mannequin, cuáles ya la tienen y cuáles tienen categorías restringidas. Guarda una marca de tiempo last_photographed_at para que el trabajo nocturno solo procese el delta.
Paso 2
Elige 3D o flat-lay por categoría
`3d` para prendas que requieren volumen: ropa de abrigo, denim, sastrería. `flat_lay` para accesorios y punto que se fotografían mejor en plano. Almacena el style por categoría de producto para que el generador de lotes seleccione el adecuado sin ajustes manuales.
Paso 3
Envía el delta por lotes
Haz POST a /api/v1/ghost-mannequin/batch con un array product_images —cada elemento contiene image, opcionalmente back_image y image_side— más un style, background_color y resolution para todo el lote. Mantén tu propio mapeo de la posición del array al ID del producto; la respuesta devuelve un ID de generación por elemento en el mismo orden.
Paso 4
Haz polling del lote principal
El endpoint de lotes devuelve contadores agregados (total, processing, completed, failed). Haz polling cada 3 segundos hasta que completed + failed sea igual a total. Photta procesa los elementos en paralelo dentro del lote, por lo que no necesitas hacer polling de generaciones individuales.
Paso 5
Persiste en tu base de datos
Itera status.data.items en orden —el lote mantiene el orden de tu array— y actualiza cada fila de producto con su output_url. Registra los fallos: casi siempre apuntan a una foto de origen defectuosa en tu feed, que puedes corregir y volver a enviar en la siguiente ejecución.
Tres pasos en Python
Extracción de delta, envío por lotes y polling principal: la automatización de catálogo mínima viable.
from datetime import datetime, timedelta
yesterday = datetime.utcnow() - timedelta(days=1)
rows = db.execute(
"SELECT id, source_image_url FROM products WHERE updated_at > %s",
(yesterday,),
).fetchall()import os, requests
res = requests.post(
"https://api.photta.app/api/v1/ghost-mannequin/batch",
headers={"Authorization": f"Bearer {os.environ['PHOTTA_API_KEY']}"},
json={
"product_images": [
{
"image": "https://cdn.yourstore.com/products/jacket-front.jpg",
"back_image": "https://cdn.yourstore.com/products/jacket-back.jpg",
"image_side": "front"
},
{
"image": "https://cdn.yourstore.com/products/shirt-front.jpg",
"image_side": "front"
},
{
"image": "https://cdn.yourstore.com/products/trousers-front.jpg",
"image_side": "front"
}
],
"style": "3d",
"background_color": "white",
"resolution": "2K",
"aspect_ratio": "3:4",
"user_instruction": "closed front, buttoned up",
"brand_label_id": "7cc9f988-068b-44cd-8004-22f486b10e67"
},
)
data = res.json()["data"] # data["id"], data["status"]import os, time, requests
BASE = "https://api.photta.app/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['PHOTTA_API_KEY']}"}
# data["items"] comes back in the order of the product_images you submitted.
batch_id = data["batch_id"]
for _ in range(240): # 240 × 3s = 12 minutes
status = requests.get(f"{BASE}/ghost-mannequin/batch/{batch_id}", headers=HEADERS).json()["data"]
if status["completed"] + status["failed"] == status["total"]:
break
time.sleep(3)
for row, item in zip(rows, status["items"]):
if item["status"] == "completed":
db.execute(
"UPDATE products SET ghost_image_url = %s WHERE id = %s",
(item["output_url"], row.id),
)Preguntas frecuentes de desarrolladores
Ejecución de ghost mannequin a escala de catálogo
¿De qué tamaño puede ser un solo lote?
El endpoint de lotes acepta hasta unos cientos de elementos por llamada según la documentación. Para una ejecución nocturna de 50K SKU, divide el delta en lotes de 100 a 200 y lánzalos secuencialmente para mantenerte cómodamente por debajo del rate limit de tu plan.
¿Puede un lote mezclar 3D y flat-lay?
Sí: style es un campo por elemento, por lo que un solo lote puede contener ambos. En la práctica, la mayoría de los equipos dividen por categoría de todos modos, ya que la lógica de persistencia downstream es más simple cuando cada fila de un lote va a la misma columna de la base de datos.
¿Qué sucede con los elementos fallidos?
Los elementos fallidos en un lote reembolsan sus credits automáticamente e incluyen un error_code + error_message en el payload final del elemento. Registra los fallos y vuelve a intentarlos la noche siguiente, después de que tu equipo pueda corregir la foto de origen o marcar la fila como entrada permanentemente defectuosa.
¿Cómo mapeo los resultados de vuelta a mis IDs de producto?
Mantén tu propio mapeo de la posición en el array al ID del producto al enviar: la respuesta del lote devuelve un ID de generación por elemento en el mismo orden que product_images, y el estado del lote también lista los elementos en ese orden.
¿Puedo programar esto como un cron diario?
Sí — un cron diario simple que extrae el delta de las últimas 24 horas, lo divide en fragmentos, envía los lotes y escribe los resultados en tu base de datos es un patrón fundamental para equipos con catálogos a gran escala. Mantén el ejecutor idempotente para poder reintentar de forma segura si falla una noche.
Páginas relacionadas
Referencia
Capacidades
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.
LeerGuí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.
LeerLenguajes
Python walkthrough
Leer
Cada cifra de esta página proviene de la documentación de la API de Photta · verificado
Implementa ghost mannequin a escala de catálogo esta noche
Tres funciones de Python, un cron, 50K fotos. Obtén una API key y apúntala a tu catálogo.