Build · Automatisation ghost mannequin

Automatisez l'extraction ghost mannequin pour votre catalogue

En une phrase

Récupérez le delta du catalogue depuis votre dernière exécution, envoyez un POST avec un tableau product_images (chaque élément contenant une URL d'image et une optionnelle back_image) avec un style à /api/v1/ghost-mannequin/batch, interrogez l'ID du lot par polling toutes les 3 secondes jusqu'à ce que chaque élément soit completed ou failed, puis mettez à jour chaque ligne produit avec son output_url. Les lots concurrents sont limités selon votre forfait.

  • Crédits: 4 crédits en 2K · 5 crédits en 4K
  • Délai typique: 1.5–4 min
  • Traitement: asynchrone, polling

Chaque chiffre sur cette page provient de la documentation de l'API Photta · vérifié

Retirez le mannequin de chaque photo de vos fiches produit sans solliciter de graphiste. L'endpoint ghost-mannequin de Photta gère nativement le traitement par lots — un cron nocturne transforme un flux de 50K-SKU en un catalogue avec mannequin invisible en quelques heures, et non en plusieurs semaines.

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

Comment ça fonctionne

Exécution nocturne, à l'échelle du catalogue

Les cinq briques nécessaires pour une automatisation sans intervention humaine.

  1. Étape 1

    Mappez votre catalogue

    Identifiez quelles lignes de produits nécessitent une image ghost mannequin, lesquelles en ont déjà une et lesquelles appartiennent à des catégories restreintes. Stockez un horodatage last_photographed_at pour que la tâche nocturne ne traite que le delta.

  2. Étape 2

    Choisissez 3D ou à plat (flat-lay) par catégorie

    `3d` pour les vêtements nécessitant du volume — vêtements d'extérieur, denim, pièces de tailleur. `flat_lay` pour les accessoires et la maille qui rendent mieux photographiés à plat. Enregistrez le style par catégorie de produit pour que le générateur de lots sélectionne le bon sans ajustement manuel.

  3. Étape 3

    Soumettez le delta par lot

    Envoyez un POST à /api/v1/ghost-mannequin/batch avec un tableau product_images — chaque élément inclut image, les champs optionnels back_image et image_side — ainsi qu'un unique style, background_color et resolution pour l'ensemble du lot. Conservez votre propre mapping entre l'indice du tableau et l'ID du produit ; la réponse renvoie un ID de génération par élément dans le même ordre.

  4. Étape 4

    Interrogez le lot parent par polling

    L'endpoint de lot retourne des compteurs agrégés (total, processing, completed, failed). Effectuez un polling toutes les 3 secondes jusqu'à ce que completed + failed soit égal à total. Photta traite les éléments en parallèle au sein du lot, vous n'avez donc pas besoin d'interroger chaque génération individuellement.

  5. Étape 5

    Persistez les données dans votre base

    Parcourez status.data.items dans l'ordre — le lot préserve l'ordre de votre tableau — et mettez à jour chaque ligne produit avec son output_url. Journalisez les échecs — ils indiquent presque toujours une mauvaise photo source dans votre flux, que vous pourrez corriger et soumettre à nouveau lors de la prochaine exécution.

Trois étapes en Python

Extraction du delta, soumission par lot, polling parent — le minimum viable pour l'automatisation de catalogue.

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

Questions fréquentes des développeurs

Exécuter le ghost mannequin à l'échelle du catalogue

Quelle est la taille maximale d'un lot unique ?

Selon la documentation, l'endpoint de lot accepte jusqu'à quelques centaines d'éléments par appel. Pour une exécution nocturne de 50K-SKU, découpez le delta en lots de 100–200 éléments et envoyez-les séquentiellement afin de rester confortablement en dessous du rate limit de votre forfait.

Un lot peut-il mélanger 3D et flat-lay ?

Oui — style est un champ défini par élément, un même lot peut donc contenir les deux. En pratique, la plupart des équipes séparent tout de même par catégorie, car la logique de persistance en aval est plus simple lorsque chaque ligne d'un lot alimente la même colonne en base de données.

Qu'advient-il des éléments en échec ?

Les éléments en échec dans un lot remboursent automatiquement leurs crédits et renvoient un error_code + error_message dans le payload final de l'élément. Journalisez les erreurs et réessayez la nuit suivante, après que votre équipe a eu l'occasion de corriger la photo source ou de marquer la ligne comme entrée définitivement invalide.

Comment réassocier les résultats à mes ID de produits ?

Conservez votre propre mapping entre la position dans le tableau et l'ID produit lors de la soumission : la réponse du lot renvoie un ID de génération par élément dans le même ordre que product_images, et le statut du lot liste également les éléments dans cet ordre.

Puis-je planifier cela sous forme de cron quotidien ?

Oui — un cron quotidien simple qui extrait le delta des dernières 24 heures, le découpe en segments, soumet les lots et écrit les résultats dans votre base de données est un pattern éprouvé pour les équipes gérant des catalogues volumineux. Gardez le runner idempotent afin qu'une nuit en échec puisse être rejouée sans risque.

Déployez le mannequin fantôme à l'échelle catalogue ce soir

Trois fonctions Python, un cron, 50K photos. Récupérez une clé API et pointez-la vers votre catalogue.