Build · Automazione Ghost Mannequin

Automatizza l'estrazione ghost mannequin per il tuo catalogo

In sintesi

Estrai il delta del catalogo rispetto all'ultima esecuzione, invia una richiesta POST con un array product_images (ogni elemento contiene l'URL dell'immagine più un'opzionale back_image) e uno stile a /api/v1/ghost-mannequin/batch, esegui il polling sul batch ID ogni 3 secondi finché ogni elemento non risulta completed o failed, quindi aggiorna la riga di ciascun prodotto con il relativo output_url. I batch simultanei sono limitati in base al piano.

  • Credits: 4 credits a 2K · 5 credits a 4K
  • Tempo tipico: 1.5–4 min
  • Elaborazione: asincrono, polling

Ogni dato in questa pagina proviene da la documentazione dell'API di Photta · verificato

Rimuovi il manichino da ogni foto delle schede prodotto senza l'intervento di un designer. L'endpoint ghost-mannequin di Photta gestisce l'elaborazione in batch in modo nativo: un cron notturno trasforma un feed di 50K-SKU in un catalogo con manichino invisibile in poche ore, anziché in settimane.

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')

Come funziona

Esecuzione notturna, sull'intero catalogo

Cinque elementi essenziali per un'automazione che funziona senza supervisione.

  1. Passaggio 1

    Mappa il tuo catalogo

    Identifica quali righe di prodotto necessitano di un'immagine ghost mannequin, quali ne hanno già una e quali appartengono a categorie escluse. Salva un timestamp last_photographed_at così che il job notturno elabori esclusivamente il delta.

  2. Passaggio 2

    Scegli 3D o flat-lay per categoria

    `3d` per i capi che richiedono volume: capispalla, denim, capi sartoriali. `flat_lay` per accessori e maglieria che risultano migliori fotografati in piano. Memorizza lo stile per ciascuna categoria di prodotto, così che il generatore di batch selezioni quello corretto senza regolazioni manuali.

  3. Passaggio 3

    Invia il delta in batch

    Esegui una POST a /api/v1/ghost-mannequin/batch con un array product_images — ogni elemento include image, e opzionalmente back_image e image_side — oltre a un singolo style, background_color e resolution per l'intero batch. Mantieni una mappatura interna tra la posizione nell'array e l'ID del prodotto; la risposta restituisce un ID di generazione per elemento nello stesso ordine.

  4. Passaggio 4

    Esegui il polling del batch genitore

    L'endpoint di batch restituisce contatori aggregati (total, processing, completed, failed). Esegui il polling ogni 3 secondi fino a quando la somma di completed + failed è uguale a total. Photta elabora gli elementi in parallelo all'interno del batch, quindi non è necessario eseguire il polling delle singole generazioni.

  5. Passaggio 5

    Salva i dati nel tuo database

    Itera su status.data.items in ordine — il batch mantiene l'ordine del tuo array — e aggiorna ogni riga di prodotto con il rispettivo output_url. Registra i fallimenti: indicano quasi sempre una foto sorgente non valida nel tuo feed, che potrai correggere e reinviare nell'esecuzione successiva.

Tre passaggi in Python

Estrazione del delta, invio del batch, polling del genitore: l'automazione catalogo minima funzionante.

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),
        )

Domande frequenti degli sviluppatori

Esecuzione di ghost mannequin su scala di catalogo

Quanto può essere grande un singolo batch?

In base alla documentazione, l'endpoint di batch supporta fino ad alcune centinaia di elementi per chiamata. Per un'esecuzione notturna su 50K-SKU, dividi il delta in batch da 100–200 elementi e inviali in sequenza per rimanere ampiamente sotto il rate limit del piano.

Un batch può combinare 3D e flat-lay?

Sì: style è un campo per singolo elemento, quindi un unico batch può contenere entrambi. In pratica, la maggior parte dei team preferisce comunque suddividere per categoria, poiché la logica di persistenza a valle è più semplice quando ogni riga di un batch viene mappata sulla stessa colonna del database.

Cosa succede agli elementi non riusciti?

I crediti degli elementi non riusciti all'interno di un batch vengono rimborsati automaticamente e restituiscono error_code + error_message nel payload finale dell'elemento. Registra gli errori ed esegui un nuovo tentativo la notte seguente, dopo che il tuo team ha potuto correggere la foto sorgente o contrassegnare la riga come input non valido in modo permanente.

Come riconduco i risultati ai miei ID prodotto?

Mantieni una mappatura interna tra la posizione nell'array e l'ID del prodotto al momento dell'invio: la risposta del batch restituisce un ID di generazione per elemento nello stesso ordine di product_images, e anche lo status del batch elenca gli elementi in tale sequenza.

Posso programmarlo come cron giornaliero?

Sì — un semplice cron giornaliero che estrae il delta delle ultime 24 ore, lo suddivide in blocchi, invia i batch e scrive i risultati nel database è un pattern fondamentale per i team che gestiscono cataloghi su larga scala. Mantieni il runner idempotente, così una notte fallita può essere rieseguita in sicurezza.

Distribuisci il manichino invisibile su scala di catalogo stasera

Tre funzioni Python, un cron, 50K foto. Prendi una chiave API e puntala verso il tuo catalogo.