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

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)

Hva du kan forvente

Typical completion

1–3min

2K / 4K credits

4 / 6

Styles

2

Batch-ready

yes

Slik fungerer det

Virtual Try-On API i Python

Fem steg, null Photta-spesifikke avhengigheter — requests dekker alt.

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

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

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

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

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

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

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

Virtual Try-On API for Python — Photta | Photta