cURL · Ghost mannequin API
Ghost mannequin API med cURL
I én sætning
Eksportér PHOTTA_API_KEY, send en POST til https://api.photta.app/api/v1/api/v1/ghost-mannequin med den dokumenterede JSON-body, opsnap genererings-ID'et, og kør derefter et GET-loop på /api/v1/ghost-mannequin/{id} hvert 3. sekund, indtil data.status er completed. Kombinér med jq for at udtrække output-URL'en.
- Typisk tid: 1.5–4 min
- Credits: 4 credits ved 2K · 5 credits ved 4K
- Behandling: async, polling
- Grænser: 600 requests/min
- Autentifikation: Bearer key
Hvert tal på denne side stammer fra Photta API-dokumentationen · tjekket
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'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.status
async function waitFor(id) {
for (let attempt = 0; attempt < 120; attempt++) {
const res = await fetch(`https://api.photta.app/api/v1/ghost-mannequin/${id}`, { headers: { Authorization: `Bearer ${process.env.PHOTTA_API_KEY}` } });
const { data } = await res.json();
if (data.status === "completed") return data.output_url;
if (data.status === "failed") throw new Error(data.error_message ?? "generation failed");
await new Promise((r) => setTimeout(r, 3000));
}
throw new Error("timed out after 6 minutes");
}import 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"]
import time
def wait_for(job_id):
for _ in range(120):
res = requests.get(f"https://api.photta.app/api/v1/ghost-mannequin/{job_id}", headers={"Authorization": f"Bearer {os.environ['PHOTTA_API_KEY']}"})
data = res.json()["data"]
if data["status"] == "completed":
return data["output_url"]
if data["status"] == "failed":
raise RuntimeError(data.get("error_message", "generation failed"))
time.sleep(3)
raise TimeoutError("timed out after 6 minutes")Kort fortalt
Kort fortalt
- Endpoint
- POST /api/v1/ghost-mannequin
- Autentifikation
- Bearer API-nøgle
- Behandling
- Asynkron — poll status-endpointet
- Typisk tid
- 1.5–4 min
- Credits
- 4 credits ved 2K · 5 credits ved 4K
- Billedformater
- 3:4 · 1:1 · 4:3 · 9:16 · 16:9
- Inputgrænser
- Op til 10 MB pr. billede; JPEG, PNG, WebP
- Idempotent
- Nej
Sådan virker det
Fem shell-trin, nul afhængigheder ud over curl og jq.
Trin 1
Opret en konto og generér en nøgle
Gå til ai.photta.app, åbn fanen Developers, og klik på Generate API key. Live-nøgler starter med `photta_live_`.
Trin 2
Eksportér nøglen
Tilføj `export PHOTTA_API_KEY="photta_live_xxx"` i din shell-profil eller en `.envrc`-fil, så hvert efterfølgende curl-kald automatisk samler den op.
curl --version # macOS, Linux, WSL and Windows 10+ ship it export PHOTTA_API_KEY="photta_live_xxxxx"Trin 3
Fastlås base-URL'en
`export PHOTTA_BASE_URL="https://api.photta.app/api/v1"` holder curl-kommandoerne korte.
export PHOTTA_BASE_URL="https://api.photta.app/api/v1" export AUTH_HEADER="Authorization: Bearer $PHOTTA_API_KEY"Trin 4
Indsend og foretag polling
Lav en POST til `$PHOTTA_BASE_URL/api/v1/ghost-mannequin` for at hente et ID, og kør derefter et loop med `curl $PHOTTA_BASE_URL/api/v1/ghost-mannequin/{id}` hvert 3. sekund. Send svaret videre til jq for at udtrække `.data.status` rent.
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'Trin 5
Gem resultatet
Når jobbet er færdigt, trækker du `.data.output_url` ud med jq og kører `curl -o` for at gemme bytes på lokalt lager — klar til næste trin i din pipeline.
Fejl
- 400
invalid_request_error - The request is malformed or contains invalid parameters.
- 401
authentication_error - The API key is missing, invalid, or expired.
- 402
insufficient_credits_error - Your account does not have enough credits.
- 404
not_found_error - The requested resource does not exist.
- 409
conflict_error - The request conflicts with current state — e.g. your concurrent-batch cap is reached.
- 429
rate_limit_error - Too many requests. Slow down and retry.Retry-After: 30
- 500
api_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" ;;
esacGrænser
- 600 anmodninger i minuttet pr. API-nøgle (Fast vindue; grænsen er den samme på alle planer)
- En 429 indeholder Retry-After: 30 sekunder
- Op til 10 MB pr. billede
- Formater: JPEG, PNG, WebP
- Samtidige batches pr. plan: Free 1 · Hobby 2 · Seller 3 · Brand 4 · Studio 6
- Kun polling — API'et sender ingen webhooks.
Hvorfor cURL stadig er den hurtigste måde at teste en API på
- Nul installation — cURL følger med alle større operativsystemer
- Fungerer perfekt med jq til scriptede pipelines (CI, cron, shell hooks)
- Den hurtigste måde at smoke-teste et endpoint på, før du integrerer det i koden
- Hver kommando på denne side kan indsættes direkte i enhver POSIX-shell
Hvad det ikke gør
- Polling-loopet blokerer terminalen — skift til Node eller Python for parallelle workers
- Polling er det eneste signal om fuldførelse; API'et sender ingen webhooks
- Brugere af Windows Command Prompt bør køre WSL eller PowerShells curl.exe
Spørgsmål udviklere stiller
Findes der et Photta CLI-værktøj?
Ikke endnu — men cURL plus en bash-wrapper på femten linjer bringer dig det meste af vejen. Dokumentationen prioriterer cURL-først-eksempler, fordi alle sprog kan køre en subprocess, og shellen er den fælles nævner i CI-pipelines.
Behøver jeg jq for at bruge API'et?
Ikke strengt taget — men scriptede pipelines er meget nemmere med det. Med jq kan du trække `.data.id`, `.data.status` og `.data.output_url` ud af JSON-svaret uden at parse det manuelt. Installer med `brew install jq` på macOS eller `apt install jq` på Debian/Ubuntu.
Hvordan autentificerer jeg med curl?
Tilføj `-H "Authorization: Bearer $PHOTTA_API_KEY"` til hver forespørgsel. Gem nøglen i en miljøvariabel, og indsæt den aldrig direkte i et script, du committer. `curl --oauth2-bearer` fungerer også, men den eksplicitte header-form er tydeligere i dokumentation og logs.
Kan jeg bruge curl-baserede scripts i produktion?
Til enkeltstående batch-backfills og cron-jobs, ja — tusindvis af teams leverer katalog-backfills på denne måde. Til en langtidsholdbar applikation er et rigtigt programmeringssprog normalt bedre, da du får ordentlig fejlhåndtering, genforsøg og observerbarhed. curl-eksemplerne på denne side forbliver retvisende, selv efter du porterer til Node eller Python; forespørgslens struktur er den samme.
Hvordan poller jeg fra et bash-loop?
Brug `for i in $(seq 1 120); do … ; sleep 3; done` med status-tjekket i loopets krop. Afbryd, når `.data.status` er `completed` eller `failed`. Kodeeksemplet på denne side viser det præcise mønster, inklusive en hård øvre grænse, så et fastlåst job ikke blokerer scriptet for evigt.
Hvordan læser jeg fejlsvar i curl?
Brug `curl -w "\n%{http_code}"` til at hente HTTP-statuskoden sammen med JSON-bodyen. Forgren baseret på statussen: 402 for utilstrækkelige credits, 429 for rate limits (respekter Retry-After-værdien), 5xx for midlertidige serverfejl. Fejl-bodyen indeholder altid felterne `error.code` og `error.message`.
Relaterede sider
Node.js
Ghost mannequin API i Node.js
Kald Phottas ghost mannequin API fra en Node.js-backend med indbygget fetch. Ingen SDK påkrævet: gem din nøgle, indsend jobbet, foretag polling for resultatet.
LæsPython
Ghost mannequin API i Python
Kald Phottas ghost mannequin API i Python med requests-biblioteket. Tredive-linjers wrapper, async-venlig via httpx, fungerer i Django, FastAPI og Celery.
LæsFunktioner
Ghost mannequin API til hollow-man-produktfotos
AI ghost mannequin-endpoint. Fjern mannequinen fra et tøjbillede og bevar indvendige detaljer. 3D eller flat-lay, batchbehandling, 4 credits ved 2K.
LæsByg
Automatiser udtræk af ghost mannequin til dit katalog
Opskrift på natlig katalogautomatisering: hent gårsdagens produktopdateringer, send dem som batch til Phottas ghost-mannequin-API, lav polling på overordnet batch, gem data i din database.
LæsHurtig start
Første Photta-billede på under fem minutter.
Opret en konto, generer en API-nøgle, kør dit første cURL-kald, foretag polling indtil det er fuldført, gem resultatet. Fem trin, dokumenteret fra start til slut.
LæsReference
Photta API-priser
Hvad hvert Photta API-endpoint koster i credits ved 2K og 4K, hvordan debitering og refundering fungerer, og hvilke endpoints der er gratis. Ingen faste pengepriser pr. billede.
Læs
Hvert tal på denne side stammer fra Photta API-dokumentationen · tjekket
Prøv API'et på fem minutter
Generér en Photta API-nøgle, indsæt cURL-kodestykket ovenfor, og du har dit første billede på en model, før kaffen er færdigbrygget.
- 1.5–4 min
- 4 credits ved 2K · 5 credits ved 4K
- async, polling
- 600 requests/min
- Bearer key