cURL · Ghost mannequin-API

Ghost mannequin-API med cURL

I en mening

Exportera PHOTTA_API_KEY, gör en POST till https://api.photta.app/api/v1/api/v1/ghost-mannequin med den dokumenterade JSON-bodyn, fånga generations-ID:t och kör sedan en GET-loop mot /api/v1/ghost-mannequin/{id} var 3:e sekund tills data.status är completed. Kombinera med jq för att extrahera utdata-URL:en.

  • Typisk tid: 1.5–4 min
  • Credits: 4 credits vid 2K · 5 credits vid 4K
  • Bearbetning: asynkron, polling
  • Gränser: 600 requests/min
  • Autentisering: Bearer-nyckel

Varje siffra på den här sidan kommer från Photter API-dokumentationen · kontrollerad

POST/api/v1/ghost-mannequin
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')

# $ID is data.id from the POST response. Poll every 3 seconds until status is "completed" or "failed".
for i in $(seq 1 120); do
  RESULT=$(curl -s "https://api.photta.app/api/v1/ghost-mannequin/$ID" -H "Authorization: Bearer $PHOTTA_API_KEY")
  STATUS=$(echo "$RESULT" | jq -r '.data.status')
  [ "$STATUS" = "completed" ] && break
  [ "$STATUS" = "failed" ] && echo "generation failed" && exit 1
  sleep 3
done
echo "$RESULT" | jq -r '.data.output_url'

I korthet

I korthet

Endpoint
POST /api/v1/ghost-mannequin
Autentisering
Bearer API-nyckel
Bearbetning
Asynkron — polla status-endpointen
Typisk tid
1.5–4 min
Credits
4 credits vid 2K · 5 credits vid 4K
Bildförhållanden
3:4 · 1:1 · 4:3 · 9:16 · 16:9
Indatagränser
Upp till 10 MB per bild; JPEG, PNG, WebP
Idempotent
Nej

Hur det fungerar

Fem steg i skalet, noll beroenden utöver curl och jq.

  1. Steg 1

    Registrera dig och generera en nyckel

    Gå till ai.photta.app, öppna fliken Developers och klicka på Generate API key. Live-nycklar börjar med `photta_live_`.

  2. Steg 2

    Exportera nyckeln

    Lägg `export PHOTTA_API_KEY="photta_live_xxx"` i din skalprofil eller en `.envrc`-fil så att alla efterföljande curl-anrop plockar upp den automatiskt.

    curl --version   # macOS, Linux, WSL and Windows 10+ ship it
    export PHOTTA_API_KEY="photta_live_xxxxx"
  3. Steg 3

    Lås bas-URL:en

    `export PHOTTA_BASE_URL="https://api.photta.app/api/v1"` håller curl-kommandona korta.

    export PHOTTA_BASE_URL="https://api.photta.app/api/v1"
    export AUTH_HEADER="Authorization: Bearer $PHOTTA_API_KEY"
  4. Steg 4

    Skicka och polla

    POST:a till `$PHOTTA_BASE_URL/api/v1/ghost-mannequin` för att få ett ID, och loopa sedan `curl $PHOTTA_BASE_URL/api/v1/ghost-mannequin/{id}` var 3:e sekund. Pipe:a svaret till jq för att snyggt extrahera `.data.status`.

    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')
    
    # $ID is data.id from the POST response. Poll every 3 seconds until status is "completed" or "failed".
    for i in $(seq 1 120); do
      RESULT=$(curl -s "https://api.photta.app/api/v1/ghost-mannequin/$ID" -H "Authorization: Bearer $PHOTTA_API_KEY")
      STATUS=$(echo "$RESULT" | jq -r '.data.status')
      [ "$STATUS" = "completed" ] && break
      [ "$STATUS" = "failed" ] && echo "generation failed" && exit 1
      sleep 3
    done
    echo "$RESULT" | jq -r '.data.output_url'
  5. Steg 5

    Spara resultatet

    När jobbet är klart hämtar du ut `.data.output_url` med jq och kör `curl -o` för att spara bytsen till lokal lagring — redo för nästa steg i din pipeline.

Fel

400invalid_request_error
The request is malformed or contains invalid parameters.
401authentication_error
The API key is missing, invalid, or expired.
402insufficient_credits_error
Your account does not have enough credits.
404not_found_error
The requested resource does not exist.
409conflict_error
The request conflicts with current state — e.g. your concurrent-batch cap is reached.
429rate_limit_error
Too many requests. Slow down and retry.Retry-After: 30
500api_error
An internal server error occurred. Retry later.
case "$STATUS_CODE" in
  402) echo "insufficient_credits_error — top up before retrying" ;;
  429) echo "rate_limit_error — wait the Retry-After seconds (30 by default)" ;;
  4??) echo "$BODY" | jq '.error.type, .error.message' ;;
  5??) echo "api_error — retry with backoff" ;;
esac

Gränser

  • 600 anrop per minut per API-nyckel (Fast fönster; gränsen är densamma på alla planer)
  • En 429 innehåller Retry-After: 30 sekunder
  • Upp till 10 MB per bild
  • Format: JPEG, PNG, WebP
  • Samtidiga batcher per plan: Free 1 · Hobby 2 · Seller 3 · Brand 4 · Studio 6
  • Endast polling — API:et skickar inga webhooks.

Varför cURL fortfarande är det snabbaste sättet att verifiera ett API

  • Noll installation — cURL skeppas med alla större operativsystem
  • Passar ihop med jq för skriptade pipelines (CI, cron, shell hooks)
  • Det snabbaste sättet att röktesta en endpoint innan den kopplas in i kod
  • Varje kommando på denna sida kan klistras in i valfritt POSIX-skal

Vad det inte gör

  • Polling-loopen blockerar terminalen — gå över till Node eller Python för parallella workers
  • Polling är den enda signalen på att jobbet är klart; API:et skickar inga webhooks
  • Användare av Windows Kommandotolken bör köra WSL eller PowerShells curl.exe

Vanliga utvecklarfrågor

Finns det ett Photta CLI-verktyg?

Inte än — men cURL plus en bash-wrapper på femton rader tar dig nästan hela vägen. Dokumentationen prioriterar cURL-exempel eftersom alla språk kan köra en underprocess, och skalet är den gemensamma nämnaren i CI-pipelines.

Måste jag använda jq för att använda API:et?

Inte strikt — men skriptade pipelines blir mycket enklare med det. Med jq kan du plocka ut `.data.id`, `.data.status` och `.data.output_url` ur JSON-svaret utan att parsa det för hand. Installera med `brew install jq` på macOS eller `apt install jq` på Debian/Ubuntu.

Hur autentiserar jag med curl?

Lägg till `-H "Authorization: Bearer $PHOTTA_API_KEY"` i varje anrop. Spara nyckeln i en miljövariabel, hårdkoda den aldrig i ett skript du checkar in. `curl --oauth2-bearer` fungerar också, men den explicita header-formen är tydligare i dokumentation och loggar.

Kan jag använda curl-baserade skript i produktion?

För enstaka batch-backfills och cron-jobb, ja — tusentals team kör katalog-backfills på detta sätt. För en långlivad applikation är ett riktigt språk oftast bättre eftersom du får ordentlig felhantering, retries och observerbarhet. Curl-exemplen på den här sidan förblir relevanta även efter att du porterat till Node eller Python; anropets struktur är densamma.

Hur pollar jag från en bash-loop?

Använd `for i in $(seq 1 120); do … ; sleep 3; done` med statuskontrollen inuti loopen. Avbryt när `.data.status` är `completed` eller `failed`. Kodexemplet på den här sidan visar det exakta mönstret, inklusive en hård övre gräns så att ett jobb som fastnat inte hänger skriptet för alltid.

Hur läser jag felsvar i curl?

Använd `curl -w "\n%{http_code}"` för att fånga HTTP-statuskoden tillsammans med JSON-bodyn. Förgrena logiken baserat på status: 402 för otillräckliga credits, 429 för rate limits (respektera Retry-After-värdet), 5xx för transienta serverfel. Felfältet i bodyn innehåller alltid fälten `error.code` och `error.message`.

Testa API:et på fem minuter

Generera en Photta API-nyckel, klistra in cURL-kodfragmentet ovan, och du har din första bild på en modell innan kaffet har bryggts klart.

  • 1.5–4 min
  • 4 credits vid 2K · 5 credits vid 4K
  • asynkron, polling
  • 600 requests/min
  • Bearer-nyckel