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

PythonNode.jscURLcURL
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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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.

01Use the battle-tested requests library
bash
# 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
02A 30-line client wrapper you can drop into any project
python
# 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 body
03Submit a try-on and poll until the result is ready
python
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)
04Handle 402 credit exhaustion and 429 rate limits
python
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:
        raise

Varfö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.

Virtual Try-On API för Python — Photta | Photta