Python · Virtual Try-On API
Virtual Try-On API i Python
Ingen pip install photta behövs — Phottas dokumentation rekommenderar officiellt biblioteket requests. En wrapper på trettio rader kan pluggas in i Django, FastAPI, Celery-workers och Lambda-handlers utan vidare ceremonier.
I en mening
Installera requests, läs in PHOTTA_API_KEY från env, skriv en photta_request()-wrapper som skickar Authorization: Bearer photta_live_xxx och kastar ett typat PhottaError vid svar som inte är 2xx. Skicka sedan POST till /tryon/apparel och polla /tryon/apparel/:id var 3:e sekund tills data.status == 'completed' — vanligtvis inom 1.5 till 4 minuter.
Uppdaterad · 2026-04-19
Din första förfrågan
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)Vad du kan förvänta dig
Typical completion
1.5–4min
2K / 4K credits
5 / 7
Aspect ratios
5
Product types
6
Så fungerar det
Virtual Try-On API i Python
Fem steg, noll Photta-specifika beroenden — requests täcker allt.
- 01
Steg 1
Registrera dig och generera en nyckel
Samma väg som för alla andra språk: ai.photta.app → Developers → Generate API key. Nycklar börjar med photta_live_ och fungerar för alla Phottas funktioner.
- 02
Steg 2
Läs in nyckeln från env
Spara PHOTTA_API_KEY i miljön och läs den via os.environ. I FastAPI eller Django, läs in den en gång vid start till en inställningsmodul. Bädda inte in nyckeln i källkoden eller i publik Git-historik.
- 03
Steg 3
Skriv en requests-wrapper
En funktion på trettio rader, photta_request(), hanterar bas-URL, Authorization-header, JSON-serialisering och felöversättning. Det är den enda abstraktion du behöver tills Python SDK lanseras.
- 04
Steg 4
Skicka och polla
Skicka POST till /tryon/apparel för att få ett generations-ID, polla sedan /tryon/apparel/:id med 3 sekunders intervall. I Celery eller RQ bör du dela upp polling-loopen över flera tasks så att ett 4-minutersjobb inte låser upp en worker.
- 05
Steg 5
Spara resultatet
Svaret vid slutfört jobb inkluderar output_url och thumbnail_url. Ladda ner rådatan till din egen lagring — S3, GCS, Cloudflare R2 — så att din produkt inte är låst till Phottas CDN för långsiktig rendering.
Kod, hela vägen
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:
raiseVarför denna struktur
Varför requests är det rätta valet idag
- 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
Vad den inte gö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
Frågor från andra utvecklare
Questions other developers ask
Finns det ett officiellt Photta Python SDK?+
Inte ännu. Phottas roadmap prioriterar ett Python SDK när 10 betalande API-kunder är igång. Fram tills dess är den rekommenderade vägen biblioteket requests (synkront) eller httpx (asynkront) — båda är dokumenterade i den officiella dokumentationen och båda fungerar med wrappern på trettio rader på denna sida.
Vilka Python-versioner stöds?+
Python 3.9 och senare. Wrappern använder type hints, f-strängar och str | None-syntax, vilket fungerar utmärkt på 3.10+. På 3.9 kan du byta str | None mot Optional[str]. requests i sig stöder officiellt 3.8+, men 3.9+ är det praktiska minimikravet för moderna Photta-projekt.
Ska jag använda requests eller httpx?+
Använd requests om du gör ett fåtal sekventiella anrop — det är enklare och finns redan i de flesta kodbaser. Använd httpx om du behöver asynkron exekvering (parallella anrop, stora batch-körningar) eller HTTP/2. Wrappern är liten i båda fallen; byt bara requests.request mot httpx.Client().request så förblir resten av koden identisk.
Kan jag anropa det från Django?+
Ja. Lägg wrappern i services/photta.py, importera den från en view eller en Celery-task. Anropa inte API:et inuti en synkron request-handler om jobbet är långt — skicka från vyn, returnera generations-ID:t och polla från en bakgrundstask eller en Channels-consumer.
Hur pollar jag från en Celery-worker?+
Skicka jobbet från en task och schemalägg sedan en uppföljande task (via apply_async(countdown=3)) som pollar en gång och schemalägger sig själv igen tills jobbet är klart eller en gräns för max-retries nås. Detta håller workers lediga och undviker långkörande tasks som stör autoscalers.
Hur signalerar API:et fel?+
Svar som inte är 2xx innehåller en JSON-body med ett error-objekt: type, code, message, plus param vid 400-fel och retry_after vid 429-fel. Wrappern på denna sida kastar ett PhottaError som innehåller allt detta så att anroparen kan agera utifrån statuskod utan att själv behöva parsa svaret.
Python · Virtual Try-On API
Skapa ett konto och hämta en API-nyckel
Installera requests, läs in PHOTTA_API_KEY från env, skriv en photta_request()-wrapper som skickar Authorization: Bearer photta_live_xxx och kastar ett typat PhottaError vid svar som inte är 2xx. Skicka sedan POST till /tryon/apparel och polla /tryon/apparel/:id var 3:e sekund tills data.status == 'completed' — vanligtvis inom 1.5 till 4 minuter.