Funkcja · Odzież
API wirtualnego try-on dla odzieży
W jednym zdaniu
API wirtualnego try-on od Photta przyjmuje zdjęcie odzieży typu flat-lay, ID manekina oraz ID pozy i zwraca zdjęcie na modelu w jakości 2K lub 4K. Wyślij zadanie przez POST, odpytuj co 3–5 sekund, pobierz wynik, gdy status to completed.
- Typowy czas: 1.5–4 min
- Credits: 5 credits w 2K · 6 credits w 4K
- Przetwarzanie: asynchroniczne, polling
- Limity: 600 requests/min
- Uwierzytelnianie: Klucz Bearer
Każda liczba na tej stronie pochodzi z dokumentacji API Photta · sprawdzono
RESPONSE=$(curl -s -X POST https://api.photta.app/api/v1/tryon/apparel \
-H "Authorization: Bearer $PHOTTA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"product_type": "top",
"product_images": [
"https://cdn.yourstore.com/products/shirt-front.jpg"
],
"product_back_image": "https://cdn.yourstore.com/products/shirt-back.jpg",
"product_category": "t_shirt",
"mannequin_id": "mnk_f3a9b1",
"pose_id": "pose_c2d4e5",
"background": "https://cdn.yourstore.com/backgrounds/studio-loft.jpg",
"lock_background": true,
"resolution": "2K",
"aspect_ratio": "3:4",
"body_size": "M",
"expression": "neutral",
"user_instruction": "Keep the collar pattern crisp and centered."
}')
ID=$(echo "$RESPONSE" | jq -r '.data.id')const res = await fetch("https://api.photta.app/api/v1/tryon/apparel", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.PHOTTA_API_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({
"product_type": "top",
"product_images": [
"https://cdn.yourstore.com/products/shirt-front.jpg"
],
"product_back_image": "https://cdn.yourstore.com/products/shirt-back.jpg",
"product_category": "t_shirt",
"mannequin_id": "mnk_f3a9b1",
"pose_id": "pose_c2d4e5",
"background": "https://cdn.yourstore.com/backgrounds/studio-loft.jpg",
"lock_background": true,
"resolution": "2K",
"aspect_ratio": "3:4",
"body_size": "M",
"expression": "neutral",
"user_instruction": "Keep the collar pattern crisp and centered."
}),
});
const { data } = await res.json(); // data.id, data.statusimport os, requests
res = requests.post(
"https://api.photta.app/api/v1/tryon/apparel",
headers={"Authorization": f"Bearer {os.environ['PHOTTA_API_KEY']}"},
json={
"product_type": "top",
"product_images": [
"https://cdn.yourstore.com/products/shirt-front.jpg"
],
"product_back_image": "https://cdn.yourstore.com/products/shirt-back.jpg",
"product_category": "t_shirt",
"mannequin_id": "mnk_f3a9b1",
"pose_id": "pose_c2d4e5",
"background": "https://cdn.yourstore.com/backgrounds/studio-loft.jpg",
"lock_background": True,
"resolution": "2K",
"aspect_ratio": "3:4",
"body_size": "M",
"expression": "neutral",
"user_instruction": "Keep the collar pattern crisp and centered."
},
)
data = res.json()["data"] # data["id"], data["status"]
W skrócie
W skrócie
- Endpoint
- POST /api/v1/tryon/apparel
- Uwierzytelnianie
- Klucz API Bearer
- Przetwarzanie
- Asynchroniczne — odpytuj endpoint statusu
- Typowy czas
- 1.5–4 min
- Credits
- 5 credits w 2K · 6 credits w 4K
- Proporcje obrazu
- 3:4 · 1:1 · 4:3 · 9:16 · 16:9
- Limity wejściowe
- Do 10 MB na obraz; JPEG, PNG, WebP
- Idempotentne
- Nie
Żądanie i odpowiedź
Żądanie
RESPONSE=$(curl -s -X POST https://api.photta.app/api/v1/tryon/apparel \
-H "Authorization: Bearer $PHOTTA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"product_type": "top",
"product_images": [
"https://cdn.yourstore.com/products/shirt-front.jpg"
],
"product_back_image": "https://cdn.yourstore.com/products/shirt-back.jpg",
"product_category": "t_shirt",
"mannequin_id": "mnk_f3a9b1",
"pose_id": "pose_c2d4e5",
"background": "https://cdn.yourstore.com/backgrounds/studio-loft.jpg",
"lock_background": true,
"resolution": "2K",
"aspect_ratio": "3:4",
"body_size": "M",
"expression": "neutral",
"user_instruction": "Keep the collar pattern crisp and centered."
}')
ID=$(echo "$RESPONSE" | jq -r '.data.id')const res = await fetch("https://api.photta.app/api/v1/tryon/apparel", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.PHOTTA_API_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({
"product_type": "top",
"product_images": [
"https://cdn.yourstore.com/products/shirt-front.jpg"
],
"product_back_image": "https://cdn.yourstore.com/products/shirt-back.jpg",
"product_category": "t_shirt",
"mannequin_id": "mnk_f3a9b1",
"pose_id": "pose_c2d4e5",
"background": "https://cdn.yourstore.com/backgrounds/studio-loft.jpg",
"lock_background": true,
"resolution": "2K",
"aspect_ratio": "3:4",
"body_size": "M",
"expression": "neutral",
"user_instruction": "Keep the collar pattern crisp and centered."
}),
});
const { data } = await res.json(); // data.id, data.statusimport os, requests
res = requests.post(
"https://api.photta.app/api/v1/tryon/apparel",
headers={"Authorization": f"Bearer {os.environ['PHOTTA_API_KEY']}"},
json={
"product_type": "top",
"product_images": [
"https://cdn.yourstore.com/products/shirt-front.jpg"
],
"product_back_image": "https://cdn.yourstore.com/products/shirt-back.jpg",
"product_category": "t_shirt",
"mannequin_id": "mnk_f3a9b1",
"pose_id": "pose_c2d4e5",
"background": "https://cdn.yourstore.com/backgrounds/studio-loft.jpg",
"lock_background": True,
"resolution": "2K",
"aspect_ratio": "3:4",
"body_size": "M",
"expression": "neutral",
"user_instruction": "Keep the collar pattern crisp and centered."
},
)
data = res.json()["data"] # data["id"], data["status"]202 Accepted / Completed
{
"data": {
"id": "try_abc123",
"status": "processing",
"product_type": "top",
"mannequin_id": "mnk_f3a9b1",
"pose_id": "pose_c2d4e5",
"lock_background": true,
"resolution": "2K",
"aspect_ratio": "3:4",
"credits_used": 5,
"created_at": "2026-04-10T12:00:00Z"
},
"request_id": "req_xyz789"
}{
"data": {
"id": "try_abc123",
"status": "completed",
"product_type": "top",
"mannequin_id": "mnk_f3a9b1",
"pose_id": "pose_c2d4e5",
"resolution": "2K",
"aspect_ratio": "3:4",
"output_url": "https://cdn.photta.app/generated/try_abc123.jpg",
"thumbnail_url": "https://cdn.photta.app/generated/try_abc123-thumb.jpg",
"credits_used": 5,
"created_at": "2026-04-10T12:00:00Z",
"completed_at": "2026-04-10T12:01:15Z",
"duration_ms": 75000
},
"request_id": "req_abc001"
}Parametry żądania
product_typeTyp: stringWymagane
Type of garment.
Wartości:topbottomtop_and_bottomone_pieceproduct_imagesTyp: array[string]Wymagane
Array of image URLs or base64 data URIs. The first entry is the FRONT image and is required. Not used when product_type is "top_and_bottom".
product_back_imageTyp: string
Optional URL or base64 data URI for the BACK of the garment. When supplied, the pipeline auto-switches to the back image whenever the selected pose is back-facing (Back / BackCloseUp). Not used when product_type is "top_and_bottom".
top_imageTyp: string
Front image of the top garment. Required when product_type is "top_and_bottom".
top_back_imageTyp: string
Optional back image of the top garment. Auto-selected on back-facing poses when present.
bottom_imageTyp: string
Front image of the bottom garment. Required when product_type is "top_and_bottom".
bottom_back_imageTyp: string
Optional back image of the bottom garment. Auto-selected on back-facing poses when present.
mannequin_idTyp: stringWymagane
ID of the mannequin to wear the garment. Use GET /api/v1/mannequins to list available options.
pose_idTyp: stringWymagane
ID of the pose. Use GET /api/v1/poses to list available options. The pose dictates the framing of the output — what's in frame, whether the face/feet are visible, full body vs half body, etc.
backgroundTyp: string
Optional URL or base64 data URI to a background photo. Anything that is not a URL or data: URI is rejected with HTTP 400. When omitted, an editorial neutral backdrop is used.
lock_backgroundTyp: boolean
When true, the supplied background image is reproduced faithfully (locked) instead of being treated as loose inspiration. Requires the background field — returns 400 if set without a background. Echoed back in the response object.
= false
resolutionTyp: string
Output resolution. 4K cannot be combined with aspect_ratio 1:1 — that combination returns 400.
= 2K
Wartości:2K4Kaspect_ratioTyp: string
Output aspect ratio. 1:1 cannot be combined with resolution 4K — that combination returns 400.
= 3:4
Wartości:3:41:14:39:1616:9body_sizeTyp: string
Body size of the mannequin.
= M
Wartości:XSSMLXLXXLexpressionTyp: string
Facial expression.
= neutral
Wartości:neutralhappyserioussmilingfootwear_urlTyp: string
URL or base64 of a custom footwear image. The pipeline always stages the footwear when supplied; the prompt's pose-authority block decides whether to render it (poses that don't show feet drop it cleanly).
user_instructionTyp: string
Free-form refinement, e.g. "preserve the seam pattern across the shoulder", "keep the collar contrast strong". Capped at 500 characters server-side; longer strings are silently truncated. Useful for brand-specific details that need an extra nudge.
product_categoryTyp: string
Optional silhouette anchor for the garment (e.g. "t_shirt", "jeans", "blazer", "midi_dress"). Helps disambiguate the structure of the garment when the silhouette is ambiguous from the photo alone. Used for product_type "top", "bottom", and "one_piece".
top_categoryTyp: string
Silhouette anchor for the top half. Only valid when product_type is "top_and_bottom".
bottom_categoryTyp: string
Silhouette anchor for the bottom half. Only valid when product_type is "top_and_bottom".
lengthTyp: string
Garment length key for product_type "top", "bottom", or "one_piece". List available values with GET /api/v1/garment-attributes?type=length&garment_type={product_type}.
fitTyp: string
Garment fit key for product_type "top", "bottom", or "one_piece". List available values with GET /api/v1/garment-attributes?type=fit&garment_type={product_type}.
top_lengthTyp: string
Top length key. Only valid when product_type is "top_and_bottom". List with GET /api/v1/garment-attributes?type=length&garment_type=top.
top_fitTyp: string
Top fit key. Only valid when product_type is "top_and_bottom". List with GET /api/v1/garment-attributes?type=fit&garment_type=top.
bottom_lengthTyp: string
Bottom length key. Only valid when product_type is "top_and_bottom". List with GET /api/v1/garment-attributes?type=length&garment_type=bottom.
bottom_fitTyp: string
Bottom fit key. Only valid when product_type is "top_and_bottom". List with GET /api/v1/garment-attributes?type=fit&garment_type=bottom.
Błędy
- 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.
Limity
- 600 żądań na minutę na klucz API (Stałe okno czasowe; limit jest taki sam w każdym planie)
- Odpowiedź 429 zawiera nagłówek Retry-After: 30 s
- Do 10 MB na obraz
- Formaty: JPEG, PNG, WebP
- Jednoczesne zadania wsadowe w zależności od planu: Free 1 · Hobby 2 · Seller 3 · Brand 4 · Studio 6
- Tylko polling — API nie wysyła webhooków.
Pięć kroków, jedno zdjęcie produktu
Wybierz manekina, prześlij zadanie, odpytuj do zakończenia, pobierz wynik.
Krok 1
Wygeneruj klucz API
Zarejestruj się na ai.photta.app, otwórz zakładkę Developers, kliknij Generate API key. Klucze produkcyjne zaczynają się od `photta_live_`. Umieść klucz w `PHOTTA_API_KEY` — nigdy go nie commituj.
Krok 2
Wybierz manekina i pozę
Wykonaj GET `/api/v1/mannequins`, aby wyświetlić dostępne opcje. Wykonaj GET `/api/v1/poses`, aby pobrać kadrowanie. Oba identyfikatory trafiają do żądania try-on.
Krok 3
Wyślij zadanie try-on metodą POST
Wyślij żądanie POST do `/api/v1/tryon/apparel` z polami `product_type`, `product_images`, `mannequin_id`, `pose_id` oraz opcjonalnymi `resolution` i `aspect_ratio`. API zwraca 202 Accepted wraz z identyfikatorem generowania.
Krok 4
Odpytuj, aż zadanie zostanie ukończone
Wykonuj GET `/api/v1/tryon/apparel/:id` co 3 sekundy. Gdy `data.status` zmieni się na `completed`, payload zawiera `output_url` i `thumbnail_url`. Ustaw górny limit, aby zawieszone zadanie nie blokowało Twojego żądania.
Krok 5
Pobierz i utrwal
Pobierz bajty z `output_url` i zapisz je we własnym magazynie obiektowym (object storage). Adres URL z CDN jest stabilny, ale Twój produkt nie powinien od niego zależeć przy renderowaniu.
Ten sam endpoint w Node.js, Pythonie i cURL
Node.js
API wirtualnego try-on w Node.js
Wywołaj aPI wirtualnego try-on od Photta z backendu Node.js za pomocą natywnego fetch. SDK nie jest wymagane: zapisz klucz, wyślij zadanie, odpytuj o wynik.
CzytajPython
API wirtualnego try-on w Pythonie
Wywołuj Photta aPI wirtualnego try-on w Pythonie za pomocą biblioteki requests. Trzydziestowierszowy wrapper, przyjazny dla async dzięki httpx, działa w Django, FastAPI i Celery.
CzytajcURL
API wirtualnego try-on z cURL
Wywołuj aPI wirtualnego try-on Photta bezpośrednio z powłoki za pomocą cURL. Wysyłaj, odpytuj, pobieraj — każdy fragment kodu współpracuje z jq w zautomatyzowanych potokach.
Czytaj
Pytania, które programiści zadają przed wdrożeniem try-on dla odzieży
Czym jest API wirtualnego try-on od Photta?
To endpoint REST, który przyjmuje zdjęcie produktu typu flat-lay oraz identyfikator manekina i zwraca fotorealistyczne zdjęcie na modelu. Ten sam potok, co w aplikacji konsumenckiej Photta. Obsługiwane są cztery typy produktów: top, bottom, top+bottom, one-piece.
Ile to kosztuje za wywołanie?
5 credits za wynik w 2K, 6 credits za 4K. Kredyty są dołączone do Twojej subskrypcji i można je doładowywać. Nieudane generowania nie kosztują credits — są zwracane.
Ile trwa generowanie?
Typowy czas realizacji to od 1.5 do 4 minut, mierzony end-to-end. POST zwraca identyfikator generowania w mniej niż sekundę; przetwarzanie na GPU odbywa się w tle podczas odpytywania.
Jakie typy produktów są obsługiwane?
Cztery: `top`, `bottom`, `top_and_bottom`, `one_piece`. Każdy z nich oczekuje innej struktury `product_images` — na przykład `top_and_bottom` wymaga adresów URL zarówno dla `top_image`, jak i `bottom_image`.
Czy mogę użyć własnego manekina?
Tak. Prześlij zdjęcie manekina za pomocą `POST /api/v1/mannequins` lub wygeneruj nowego manekina AI za pomocą `POST /api/v1/mannequins/generate`. Zwrócony identyfikator podłącza się bezpośrednio do żądania try-on.
Jak odpytywać o wynik?
Wykonuj GET `/api/v1/tryon/apparel/:id` co 3 do 5 sekund, aż `data.status` przyjmie wartość `completed` lub `failed`. Ustaw górny limit prób — 120 × 3s z zapasem pokrywa udokumentowane okno czasowe.
Powiązane możliwości
Możliwości
API try-on biżuterii dla naszyjników, pierścionków, bransoletek i kolczyków
Nakładaj naszyjniki, pierścionki, bransoletki i kolczyki na modele AI przez REST. 5 credits w 2K, wbudowane manekiny w zbliżeniu, renderowanie uwzględniające refleksy światła prosto z dokumentacji Photta.
Zobacz endpointMożliwości
Ghost mannequin API do zdjęć produktowych typu hollow-man
Endpoint AI ghost mannequin. Usuń manekina ze zdjęcia odzieży i zachowaj detale wnętrza. 3D lub flat-lay, przetwarzanie wsadowe, 4 credits w 2K.
Zobacz endpointTwórz
Zbuduj funkcję virtual try-on dla swojej aplikacji
Kompletny przewodnik po wdrożeniu funkcji virtual try-on z wykorzystaniem Photta API: przesyłanie, zlecanie, polling z poziomu workera, renderowanie wyniku. Wzorce oparte na TypeScript + wyłącznie po stronie serwera.
Zobacz endpointTwórz
Dodaj virtual try-on do aplikacji na iOS lub Androida
Jak dodać funkcję AI virtual try-on do natywnej aplikacji na iOS lub Androida przy użyciu Photta API: nigdy nie umieszczaj klucza na urządzeniu, stosuj proxy przez własny backend, odzwierciedlaj status zadań.
Zobacz endpointPorównaj
Photta vs FASHN — API AI dla branży fashion, zestawienie
Porównanie Photta i FASHN: endpointy, ceny credits, plany subskrypcyjne, limity współbieżności. Źródłem są oficjalne strony cenników obu firm z dnia 2026-04-19. Żadnych zmyślonych liczb.
Zobacz endpointPorównaj
Photta vs Fitroom — wybierz odpowiednie API fashion
Porównanie Photta i Fitroom pod kątem endpointów, kosztu credits za wywołanie, modelu rozliczeń i powierzchni integracji. Dane pobrane z obu stron 2026-04-19. Żadnych zmyślonych liczb.
Zobacz endpointSzybki start
Pierwszy obraz z Photta w mniej niż pięć minut.
Zarejestruj się, wygeneruj klucz API, wykonaj pierwsze wywołanie cURL, odpytuj aż do ukończenia, zapisz wynik. Pięć kroków opisanych od początku do końca.
Zobacz endpointDokumentacja
Błędy Photta API
Pełna lista typów błędów Photta API wraz z ich kodami statusu, strukturą treści błędu oraz informacją, które niepowodzenia warto ponowić.
Zobacz endpointDokumentacja
Rate limity Photta API
Rate limit Photta API, jego okno, nagłówek Retry-After, interwał dla pollingu oraz limity współbieżności według planu — wszystko prosto z dokumentacji API.
Zobacz endpoint
Każda liczba na tej stronie pochodzi z dokumentacji API Photta · sprawdzono
Wypróbuj API w 5 minut
Wygeneruj klucz Photta API, wklej powyższy snippet cURL, a otrzymasz swoje pierwsze zdjęcie na modelu, zanim zaparzy się kawa.
- 1.5–4 min
- 5 credits w 2K · 6 credits w 4K
- asynchroniczne, polling
- 600 requests/min
- Klucz Bearer