cURL · Ghost mannequin-API
Ghost mannequin-API med cURL
I én setning
Eksporter PHOTTA_API_KEY, POST til https://api.photta.app/api/v1/api/v1/ghost-mannequin med den dokumenterte JSON-bodyen, fang opp generasjons-ID-en, og kjør deretter en GET-løkke mot /api/v1/ghost-mannequin/{id} hvert 3. sekund inntil data.status er completed. Kombiner med jq for å hente ut output-URL-en.
- Typisk tidsbruk: 1.5–4 min
- Credits: 4 credits ved 2K · 5 credits ved 4K
- Prosessering: asynkron, polling
- Grenser: 600 forespørsler/min
- Autentisering: Bearer-nøkkel
Hvert tall på denne siden er hentet fra dokumentasjonen for Photta-API-et · verifisert
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 oppsummert
Kort oppsummert
- Endepunkt
- POST /api/v1/ghost-mannequin
- Autentisering
- Bearer API-nøkkel
- Prosessering
- Asynkron – poll status-endepunktet
- Typisk tidsbruk
- 1.5–4 min
- Credits
- 4 credits ved 2K · 5 credits ved 4K
- Bildeformater
- 3:4 · 1:1 · 4:3 · 9:16 · 16:9
- Inndatagrenser
- Opptil 10 MB per bilde; JPEG, PNG, WebP
- Idempotent
- Nei
Slik fungerer det
Fem steg i terminalen, null avhengigheter utover curl og jq.
Trinn 1
Registrer deg og generer en nøkkel
Gå til ai.photta.app, åpne Developers-fanen og klikk på Generate API key. Live-nøkler starter med `photta_live_`.
Trinn 2
Eksporter nøkkelen
Legg `export PHOTTA_API_KEY="photta_live_xxx"` i shell-profilen din eller i en `.envrc`-fil, slik at alle påfølgende curl-kall fanger den opp automatisk.
curl --version # macOS, Linux, WSL and Windows 10+ ship it export PHOTTA_API_KEY="photta_live_xxxxx"Trinn 3
Lås base-URL-en
`export PHOTTA_BASE_URL="https://api.photta.app/api/v1"` holder curl-kommandoene korte.
export PHOTTA_BASE_URL="https://api.photta.app/api/v1" export AUTH_HEADER="Authorization: Bearer $PHOTTA_API_KEY"Trinn 4
Send inn og utfør polling
Gjør en POST til `$PHOTTA_BASE_URL/api/v1/ghost-mannequin` for å hente en ID, og kjør deretter `curl $PHOTTA_BASE_URL/api/v1/ghost-mannequin/{id}` i en løkke hvert 3. sekund. Send responsen videre til jq for å hente ut `.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'Trinn 5
Lagre resultatet
Når jobben er ferdig, henter du ut `.data.output_url` med jq og bruker `curl -o` for å lagre bytene til lokal lagring — klart for neste steg i pipelinen din.
Feil
- 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" ;;
esacGrenser
- 600 forespørsler per minutt per API-nøkkel (Fast tidsvindu; grensen er lik for alle abonnementer)
- En 429 inneholder Retry-After: 30 sekunder
- Opptil 10 MB per bilde
- Formater: JPEG, PNG, WebP
- Samtidige batcher per abonnement: Free 1 · Hobby 2 · Seller 3 · Brand 4 · Studio 6
- Kun polling – API-et sender ikke webhooks.
Hvorfor cURL fortsatt er den raskeste måten å verifisere et API på
- Null installasjon — cURL følger med alle store operativsystemer
- Fungerer sømløst med jq for skriptede pipelines (CI, cron, shell hooks)
- Den raskeste måten å røykteste et endpoint på før du integrerer det i koden
- Hver kommando på denne siden kan limes rett inn i ethvert POSIX-skall
Hva den ikke gjør
- Polling-løkken blokkerer terminalen — gå over til Node eller Python for parallelle workers
- Polling er det eneste signalet på fullføring; API-et sender ingen webhooks
- Brukere av Windows Command Prompt bør kjøre WSL eller PowerShells curl.exe
Spørsmål utviklere stiller
Finnes det et CLI-verktøy for Photta?
Ikke ennå — men cURL pluss en bash-wrapper på femten linjer tar deg nesten hele veien. Dokumentasjonen prioriterer cURL-først-eksempler fordi alle språk kan kjøre en subprosess, og skallet er den felles nevneren i CI-pipelines.
Trenger jeg jq for å bruke API-et?
Ikke strengt tatt — men skriptede pipelines er mye enklere med det. jq lar deg hente ut `.data.id`, `.data.status` og `.data.output_url` fra JSON-responsen uten manuell parsing. Installer med `brew install jq` på macOS eller `apt install jq` på Debian/Ubuntu.
Hvordan autentiserer jeg med curl?
Legg til `-H "Authorization: Bearer $PHOTTA_API_KEY"` på hver forespørsel. Behold nøkkelen i en miljøvariabel, og aldri legg den direkte inn i et skript du committer. `curl --oauth2-bearer` fungerer også, men den eksplisitte header-formen er tydeligere i dokumentasjon og logger.
Kan jeg bruke curl-baserte skript i produksjon?
For enkeltstående batch-backfills og cron-jobber, ja — tusenvis av team leverer katalog-backfills på denne måten. For en langvarig applikasjon er et ekte programmeringsspråk vanligvis bedre, ettersom du får ordentlig feilhåndtering, retries og observerbarhet. curl-eksemplene på denne siden forblir nøyaktige selv etter at du porterer til Node eller Python; strukturen på forespørselen er den samme.
Hvordan gjør jeg polling fra en bash-løkke?
Bruk `for i in $(seq 1 120); do … ; sleep 3; done` med statussjekken inne i løkken. Avbryt når `.data.status` er `completed` eller `failed`. Kodeeksempelet på denne siden viser det nøyaktige mønsteret, inkludert en hard øvre grense slik at en jobb som henger seg ikke låser skriptet for alltid.
Hvordan leser jeg feilresponser i curl?
Bruk `curl -w "\n%{http_code}"` for å fange opp HTTP-statuskoden sammen med JSON-kroppen. Forgren basert på statusen: 402 for utilstrekkelige credits, 429 for rate limits (respekter Retry-After-verdien), 5xx for forbigående serverfeil. Feilresponskroppen inneholder alltid feltene `error.code` og `error.message`.
Relaterte sider
Node.js
Ghost mannequin-API i Node.js
Kall Phottas ghost mannequin-API fra en Node.js-backend med native fetch. Ingen SDK nødvendig: lagre nøkkelen din, send inn jobben, poll etter resultatet.
LesPython
Ghost mannequin-API i Python
Kall Phottas ghost mannequin-API i Python med requests-biblioteket. Tretti linjers wrapper, async-vennlig via httpx, fungerer i Django, FastAPI og Celery.
LesFunksjoner
Ghost mannequin-API for hollow-man-produktbilder
AI ghost mannequin-endepunkt. Fjern mannekengen fra et klesbilde og bevar innvendige detaljer. 3D eller flat-lay, batch-prosessering, 4 credits i 2K.
LesBygg
Automatiser uthenting av usynlig dukke for katalogen din
Oppskrift for nattlig katalogautomatisering: hent gårsdagens produktoppdateringer, send i batch til Phottas ghost-mannequin-API, poll overordnet batch, lagre i databasen din.
LesHurtigstart
Første Photta-bilde på under fem minutter.
Registrer deg, generer en API-nøkkel, kjør ditt første cURL-kall, utfør polling til det er fullført, lagre resultatet. Fem trinn, dokumentert fra start til slutt.
LesReferanse
Photta API-priser
Hva hvert Photta API-endepunkt koster i credits ved 2K og 4K, hvordan trekk og refusjoner fungerer, og hvilke endepunkter som er gratis. Ingen pengepris per bilde.
Les
Hvert tall på denne siden er hentet fra dokumentasjonen for Photta-API-et · verifisert
Prøv API-et på fem minutter
Generer en Photta API-nøkkel, lim inn cURL-kodesnutten ovenfor, og du har ditt første bilde på modell før kaffen er ferdig traktet.
- 1.5–4 min
- 4 credits ved 2K · 5 credits ved 4K
- asynkron, polling
- 600 forespørsler/min
- Bearer-nøkkel