Bouwen · Ghost Mannequin Automatisering

Automatiseer ghost mannequin-extractie voor je catalogus

In één zin

Haal het catalogusdelta op sinds je laatste run, POST een product_images-array (elk item een afbeeldings-URL plus optionele back_image) met één stijl naar /api/v1/ghost-mannequin/batch, poll het batch-ID elke 3 seconden totdat elk item completed of failed is, en werk vervolgens elke productrij bij met de bijbehorende output_url. Gelijktijdige batches zijn gemaximeerd per abonnement.

  • Credits: 4 credits bij 2K · 5 credits bij 4K
  • Typische duur: 1.5–4 min
  • Verwerking: async, polling

Elk getal op deze pagina is afkomstig uit de Photta-API-documentatie · gecontroleerd

Verwijder de paspop uit elke PDP-foto zonder tussenkomst van een ontwerper. Photta's ghost-mannequin-endpoint verwerkt batches van nature — een nachtelijke cron verandert een feed van 50K-SKU's binnen enkele uren in een catalogus met onzichtbare paspoppen, in plaats van weken.

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

Hoe het werkt

Nachtelijke run, catalogusbreed

Vijf onderdelen die je nodig hebt voor een automatisering die onbemand draait.

  1. Stap 1

    Breng je catalogus in kaart

    Weet welke productrijen een ghost mannequin-afbeelding nodig hebben, welke er al een hebben, en welke afgeschermde categorieën bevatten. Sla een last_photographed_at-tijdstempel op zodat de nachtelijke job alleen het delta verwerkt.

  2. Stap 2

    Kies 3D of flat-lay per categorie

    `3d` voor kledingstukken die volume nodig hebben — bovenkleding, denim, maatwerk. `flat_lay` voor accessoires en gebreide kleding die plat neergelegd beter fotograferen. Sla de stijl op per productcategorie, zodat de batchbouwer automatisch de juiste kiest zonder handmatig afstellen.

  3. Stap 3

    Verzend het delta in batch

    POST /api/v1/ghost-mannequin/batch met een product_images-array — elk item bevat image, optionele back_image en image_side — plus één style, background_color en resolution voor de gehele batch. Houd je eigen mapping bij van arraypositie naar product-ID; het antwoord retourneert één generatie-ID per item in dezelfde volgorde.

  4. Stap 4

    Poll de bovenliggende batch

    Het batch-endpoint retourneert geaggregeerde tellers (total, processing, completed, failed). Poll elke 3 seconden totdat completed + failed gelijk is aan total. Photta verwerkt items binnen de batch parallel, dus je hoeft individuele generaties niet te pollen.

  5. Stap 5

    Opslaan in je database

    Itereer over status.data.items op volgorde — de batch behoudt je arrayvolgorde — en werk elke productrij bij met de bijbehorende output_url. Log fouten — deze wijzen vrijwel altijd op een ondeugdelijke bronfoto in je feed, die je kunt herstellen en opnieuw kunt verzenden bij de volgende run.

Drie stappen in Python

Delta ophalen, batch verzenden, bovenliggende batch pollen — de minimaal levensvatbare catalogusautomatisering.

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

Veelgestelde vragen van developers

Ghost mannequin draaien op catalogusschaal

Hoe groot kan een enkele batch zijn?

Het batch-endpoint accepteert volgens de documentatie tot enkele honderden items per call. Voor een nachtelijke run van 50K-SKU's splits je het delta op in batches van 100–200 en verzend je deze sequentieel, zodat je ruim onder de rate limit van je abonnement blijft.

Kan een batch 3D en flat-lay combineren?

Ja — style is een veld per item, dus een enkele batch kan beide bevatten. In de praktijk splitsen de meeste teams toch per categorie, omdat de downstream-opslaglogica eenvoudiger is wanneer elke rij in een batch in dezelfde databasekolom terechtkomt.

Wat gebeurt er met mislukte items?

Voor mislukte items in een batch worden de credits automatisch gerestitueerd en ze bevatten een error_code + error_message in de uiteindelijke itempayload. Log de fouten en probeer ze de volgende nacht opnieuw, nadat je team de kans heeft gehad de bronfoto te herstellen of de rij te markeren als permanent ongeldige invoer.

Hoe koppel ik resultaten terug aan mijn product-ID's?

Houd bij het verzenden je eigen mapping bij van arraypositie naar product-ID: de batchrespons retourneert één generatie-ID per item in dezelfde volgorde als product_images, en de batchstatus vermeldt items eveneens in die volgorde.

Kan ik dit inplannen als een dagelijkse cron?

Ja — een simpele dagelijkse cron die het delta van de afgelopen 24 uur ophaalt, opdeelt in chunks, batches verstuurt en resultaten wegschrijft naar je database is een dragend patroon voor teams die op catalogusschaal werken. Houd de runner idempotent, zodat een mislukte nacht veilig opnieuw kan worden uitgevoerd.

Lever vanavond nog ghost mannequin op catalogusschaal op

Drie Python-functies, één cron, 50K foto's. Vraag een API key aan en richt hem op je catalogus.