Python · Virtual Try-On API
Virtual Try-On API i Python
Ingen pip install photta er nødvendig — Photta-dokumentasjonen anbefaler offisielt requests-biblioteket. En wrapper på tretti linjer kan brukes i Django, FastAPI, Celery og Lambda uten videre seremoni.
Kort fortalt
Installer `requests`, last `PHOTTA_API_KEY` fra miljøvariabler, skriv en `photta_request()`-wrapper som sender `Authorization: Bearer photta_live_xxx` og kaster en `PhottaError` ved feil, send deretter POST til `/tryon/apparel` og poll `/tryon/apparel/:id` hvert 3 sekunder til `data.status == 'completed'` — vanligvis innen 1.5 to 4 minutes.
Oppdatert · 2026-04-19
Din første forespørsel
import time
from photta import photta_request, PhottaError
# 1. Submit the job
created = photta_request("POST", "/tryon/apparel", json={
"product_type": "dress",
"product_images": ["https://example.com/dress.jpg"],
"mannequin_id": "mnq_athena_ts",
"pose_id": "pose_standing_front",
"resolution": "2K",
"aspect_ratio": "3:4",
})
generation_id = created["data"]["id"]
# 2. Poll every 3 seconds. Upper bound: 120 attempts ≈ 6 minutes,
# comfortably above the documented 1.5–4 minute window.
for _ in range(120):
result = photta_request("GET", f"/tryon/apparel/{generation_id}")
status = result["data"]["status"]
if status == "completed":
print("Result:", result["data"]["output_url"])
break
if status == "failed":
raise RuntimeError(result["data"]["error_message"])
time.sleep(3)Hva du kan forvente
Typical completion
1.5–4min
2K / 4K credits
5 / 7
Jewelry types
4
Close-up mannequins
built-in
Slik fungerer det
Virtual Try-On API i Python
Fem steg, null Photta-spesifikke avhengigheter — requests dekker alt.
- 01
Steg 1
Registrer deg og generer en nøkkel
Samme vei som alle andre språk: ai.photta.app → Developers → Generate API key. Nøkler starter med `photta_live_` og fungerer på alle Photta-funksjoner.
- 02
Steg 2
Last nøkkelen fra miljøvariabler
Sett `PHOTTA_API_KEY` i miljøet og les den via `os.environ`. I FastAPI eller Django bør den lastes ved oppstart i en settings-modul. Ikke bygg nøkkelen inn i kildekoden eller offentlig Git-historikk.
- 03
Steg 3
Skriv en requests-wrapper
En tretti-linjers `photta_request()`-funksjon håndterer base-URL, Authorization-header, JSON-serialisering og feilhåndtering. Dette er alt du trenger til Python SDK lanseres.
- 04
Steg 4
Send inn og poll
POST til `/tryon/apparel` for å få en genererings-ID, og poll deretter `/tryon/apparel/:id` med 3 sekunders intervall. I Celery eller RQ bør pollingen deles opp i flere oppgaver slik at en 4-minutters jobb ikke blokkerer en worker.
- 05
Steg 5
Lagre resultatet
Responsen inkluderer `output_url` og `thumbnail_url`. Last ned bildedataene til din egen lagringsløsning — S3, GCS, Cloudflare R2 — slik at produktet ditt ikke er avhengig av Phottas CDN over tid.
Kode, ende-til-ende
Copy, paste, done.
Four snippets — install prerequisites, wrap the REST call, submit + poll, then handle the errors that actually happen in production.
# Photta doesn't ship an official Python SDK yet — requests is the
# recommended path in the docs. Standard library urllib works too if
# you need zero dependencies.
pip install requests
# Store your API key in env (dotenv optional but convenient)
echo "PHOTTA_API_KEY=photta_live_xxxxx" >> .env# photta.py
import os
import requests
PHOTTA_BASE_URL = "https://ai.photta.app/api/v1"
class PhottaError(Exception):
def __init__(self, status: int, code: str, message: str, retry_after: int | None = None):
super().__init__(message)
self.status = status
self.code = code
self.retry_after = retry_after
def photta_request(method: str, path: str, **kwargs):
headers = {
"Authorization": f"Bearer {os.environ['PHOTTA_API_KEY']}",
"Content-Type": "application/json",
**kwargs.pop("headers", {}),
}
response = requests.request(method, f"{PHOTTA_BASE_URL}{path}", headers=headers, **kwargs)
body = response.json()
if not response.ok:
err = body.get("error", {})
raise PhottaError(
status=response.status_code,
code=err.get("code", "unknown"),
message=err.get("message", response.reason),
retry_after=err.get("retry_after"),
)
return bodyimport time
from photta import photta_request, PhottaError
# 1. Submit the job
created = photta_request("POST", "/tryon/apparel", json={
"product_type": "dress",
"product_images": ["https://example.com/dress.jpg"],
"mannequin_id": "mnq_athena_ts",
"pose_id": "pose_standing_front",
"resolution": "2K",
"aspect_ratio": "3:4",
})
generation_id = created["data"]["id"]
# 2. Poll every 3 seconds. Upper bound: 120 attempts ≈ 6 minutes,
# comfortably above the documented 1.5–4 minute window.
for _ in range(120):
result = photta_request("GET", f"/tryon/apparel/{generation_id}")
status = result["data"]["status"]
if status == "completed":
print("Result:", result["data"]["output_url"])
break
if status == "failed":
raise RuntimeError(result["data"]["error_message"])
time.sleep(3)from photta import photta_request, PhottaError
import time
try:
photta_request("POST", "/tryon/apparel", json={ ... })
except PhottaError as err:
if err.status == 402:
# Out of credits — err.code == "insufficient_credits"
raise
elif err.status == 429:
# Rate-limited. Honour the Retry-After header.
time.sleep(err.retry_after or 30)
# then retry…
elif err.status >= 500:
# Server-side — retry with exponential backoff.
raise
else:
raiseHvorfor dette formatet
Hvorfor requests er det riktige valget i dag
- Zero Photta-specific dependencies — `requests` is already in most Python projects
- Works anywhere Python runs: Django, FastAPI, Flask, Celery workers, Lambda, scripts
- The client wrapper is ~30 lines — paste it into `photta.py` and move on
- Pairs naturally with asyncio via `httpx` if you need parallel submission
Hva det ikke gjør
Honest caveats
- No official @photta/python SDK yet — REST + requests is the documented pattern
- No async fetch helper shipped; swap `requests` for `httpx` when you need concurrency
- Bearer token auth only — no OAuth client credentials yet
Spørsmål andre utviklere stiller
Questions other developers ask
Finnes det en offisiell Photta Python SDK?+
Ikke ennå. Phottas veikart prioriterer Python SDK når ti betalende API-kunder er aktive. Inntil da er den støttede integrasjonsmetoden requests-biblioteket (synkront) eller httpx (asynkront) — begge fungerer med 30-linjers-wrapperen på denne siden.
Hvilke Python-versjoner støttes?+
Python 3.9 og nyere. Wrapperen bruker type hints og f-strings som fungerer utmerket på 3.10+. På 3.9 kan du bytte `str | None` med `Optional[str]`. requests støtter 3.8+, men 3.9+ er det praktiske minimumet for moderne Photta-prosjekter.
Bør jeg bruke requests eller httpx?+
Bruk requests hvis du gjør sekvensielle kall — det er enklere og finnes allerede i de fleste prosjekter. Bruk httpx hvis du trenger asynkron samtidighet (parallelle innsendinger) eller HTTP/2. Wrapperen er uansett minimal; bytt `requests.request` med `httpx.Client().request` og resten av koden forblir lik.
Kan jeg kalle det fra Django?+
Ja. Legg wrapperen i `services/photta.py`, og importer den fra en view eller en Celery-oppgave. Ikke gjør API-kallet inne i en synkron request-handler hvis jobben er lang — send inn fra view-en, returner genererings-ID-en, og poll fra en bakgrunnsoppgave.
Hvordan poller jeg fra en Celery-worker?+
Send inn jobben fra én oppgave, og planlegg deretter en oppfølgingsoppgave (via `apply_async(countdown=3)`) som poller én gang og re-planlegger seg selv til jobben er ferdig eller maksimalt antall forsøk er nådd. Dette holder workerne ledige.
Hvordan signaliserer API-et feil?+
Responser som ikke er 2xx inneholder et JSON-objekt med `error`: `type`, `code`, `message`, pluss `param` på 400-feil og `retry_after` på 429-feil. Wrapperen på denne siden kaster en `PhottaError` som inneholder alt dette slik at du enkelt kan håndtere ulike statuskoder.
Python · Virtual Try-On API
Opprett en konto og hent en API-nøkkel
Installer `requests`, last `PHOTTA_API_KEY` fra miljøvariabler, skriv en `photta_request()`-wrapper som sender `Authorization: Bearer photta_live_xxx` og kaster en `PhottaError` ved feil, send deretter POST til `/tryon/apparel` og poll `/tryon/apparel/:id` hvert 3 sekunder til `data.status == 'completed'` — vanligvis innen 1.5 to 4 minutes.