Kapabilitas · Apparel
Virtual try-on API untuk pakaian
Ringkasan singkat
Virtual try-on API dari Photta menerima gambar pakaian flat-lay, ID manekin, serta ID pose, dan mengembalikan foto on-model 2K atau 4K. POST job tersebut, lakukan polling setiap 3–5 detik, unduh saat status completed.
- Waktu umum: 1.5–4 min
- Credits: 5 credits pada 2K · 6 credits pada 4K
- Pemrosesan: async, polling
- Batasan: 600 requests/min
- Autentikasi: Bearer key
Setiap angka di halaman ini bersumber dari dokumentasi API Photta · diperiksa
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"]
Sekilas
Sekilas
- Endpoint
- POST /api/v1/tryon/apparel
- Autentikasi
- API key Bearer
- Pemrosesan
- Asinkron — lakukan polling ke endpoint status
- Waktu umum
- 1.5–4 min
- Credits
- 5 credits pada 2K · 6 credits pada 4K
- Rasio aspek
- 3:4 · 1:1 · 4:3 · 9:16 · 16:9
- Batas input
- Hingga 10 MB per gambar; JPEG, PNG, WebP
- Idempoten
- Tidak
Request dan response
Request
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"
}Parameter request
product_typeTipe: stringWajib
Type of garment.
Nilai:topbottomtop_and_bottomone_pieceproduct_imagesTipe: array[string]Wajib
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_imageTipe: 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_imageTipe: string
Front image of the top garment. Required when product_type is "top_and_bottom".
top_back_imageTipe: string
Optional back image of the top garment. Auto-selected on back-facing poses when present.
bottom_imageTipe: string
Front image of the bottom garment. Required when product_type is "top_and_bottom".
bottom_back_imageTipe: string
Optional back image of the bottom garment. Auto-selected on back-facing poses when present.
mannequin_idTipe: stringWajib
ID of the mannequin to wear the garment. Use GET /api/v1/mannequins to list available options.
pose_idTipe: stringWajib
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.
backgroundTipe: 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_backgroundTipe: 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
resolutionTipe: string
Output resolution. 4K cannot be combined with aspect_ratio 1:1 — that combination returns 400.
= 2K
Nilai:2K4Kaspect_ratioTipe: string
Output aspect ratio. 1:1 cannot be combined with resolution 4K — that combination returns 400.
= 3:4
Nilai:3:41:14:39:1616:9body_sizeTipe: string
Body size of the mannequin.
= M
Nilai:XSSMLXLXXLexpressionTipe: string
Facial expression.
= neutral
Nilai:neutralhappyserioussmilingfootwear_urlTipe: 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_instructionTipe: 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_categoryTipe: 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_categoryTipe: string
Silhouette anchor for the top half. Only valid when product_type is "top_and_bottom".
bottom_categoryTipe: string
Silhouette anchor for the bottom half. Only valid when product_type is "top_and_bottom".
lengthTipe: 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}.
fitTipe: 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_lengthTipe: 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_fitTipe: 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_lengthTipe: 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_fitTipe: 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.
Error
- 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.
Batasan
- 600 request per menit per API key (Fixed window; batasannya sama di setiap paket)
- Respons 429 menyertakan Retry-After: 30 detik
- Hingga 10 MB per gambar
- Format: JPEG, PNG, WebP
- Batch konkuren per paket: Free 1 · Hobby 2 · Seller 3 · Brand 4 · Studio 6
- Hanya polling — API tidak mengirim webhook.
Lima langkah, satu foto produk
Pilih manekin, kirim job, lakukan polling hingga selesai, unduh hasilnya.
Langkah 1
Buat API key
Daftar di ai.photta.app, buka tab Developers, klik Generate API key. Live key diawali dengan `photta_live_`. Simpan key di `PHOTTA_API_KEY` — jangan pernah di-commit.
Langkah 2
Pilih manekin dan pose
Lakukan GET ke `/api/v1/mannequins` untuk melihat opsi yang tersedia. GET ke `/api/v1/poses` untuk framing. Masukkan kedua ID tersebut ke dalam request try-on.
Langkah 3
Kirim job try-on via POST
Kirim POST ke `/api/v1/tryon/apparel` dengan `product_type`, `product_images`, `mannequin_id`, `pose_id`, serta `resolution` dan `aspect_ratio` opsional. API akan mengembalikan 202 Accepted beserta generation ID.
Langkah 4
Lakukan polling hingga job selesai
Lakukan GET ke `/api/v1/tryon/apparel/:id` setiap 3 detik. Saat `data.status` berubah menjadi `completed`, payload akan menyertakan `output_url` dan `thumbnail_url`. Tetapkan batas maksimal agar job yang macet tidak menggantung request Anda.
Langkah 5
Unduh dan simpan
Ambil byte dari `output_url` dan simpan di object storage milik Anda sendiri. URL CDN bersifat stabil, tetapi produk Anda sebaiknya tidak bergantung padanya untuk rendering.
Endpoint yang sama di Node.js, Python, dan cURL
Node.js
Virtual try-on API di Node.js
Panggil virtual try-on API Photta dari backend Node.js dengan fetch native. Tidak memerlukan SDK: simpan kunci Anda, kirim job, lakukan polling untuk hasilnya.
BacaPython
Virtual try-on API di Python
Panggil virtual try-on API Photta di Python dengan library requests. Wrapper tiga puluh baris, ramah asinkron via httpx, bekerja di Django, FastAPI, dan Celery.
BacacURL
Virtual try-on API dengan cURL
Panggil virtual try-on API Photta langsung dari shell menggunakan cURL. Kirim, lakukan polling, unduh — setiap cuplikan kode dapat dipadukan dengan jq untuk pipeline berbasis skrip.
Baca
Pertanyaan yang diajukan developer sebelum merilis try-on pakaian
Apa itu API virtual try-on Photta?
Endpoint REST yang menerima foto produk flat-lay serta ID manekin, lalu mengembalikan foto pada model yang fotorealistis. Pipeline yang sama dengan aplikasi konsumen Photta. Empat tipe produk didukung: top, bottom, top+bottom, one-piece.
Berapa biayanya per panggilan?
5 credits untuk hasil 2K, 6 credits untuk 4K. Credits disertakan dalam langganan Anda dan dapat di-top up. Generasi yang gagal tidak memotong credits — credits akan dikembalikan.
Berapa lama proses generasi berlangsung?
Penyelesaian tipikal berkisar antara 1.5 hingga 4 menit, diukur secara end-to-end. Request POST mengembalikan generation ID dalam waktu kurang dari satu detik; pemrosesan GPU berjalan di latar belakang selagi Anda melakukan polling.
Tipe produk apa saja yang didukung?
Empat: `top`, `bottom`, `top_and_bottom`, `one_piece`. Masing-masing membutuhkan struktur `product_images` yang berbeda — contohnya `top_and_bottom` membutuhkan URL `top_image` dan `bottom_image` sekaligus.
Bisakah saya menggunakan manekin saya sendiri?
Bisa. Unggah foto manekin dengan `POST /api/v1/mannequins` atau buat manekin AI baru dengan `POST /api/v1/mannequins/generate`. ID yang dikembalikan dapat langsung dimasukkan ke request try-on.
Bagaimana cara melakukan polling untuk mendapatkan hasil?
Lakukan GET ke `/api/v1/tryon/apparel/:id` setiap 3 hingga 5 detik sampai `data.status` bernilai `completed` atau `failed`. Tetapkan batas maksimal percobaan — 120 × 3s mencakup jendela waktu yang terdokumentasi dengan toleransi aman.
Kapabilitas terkait
Kapabilitas
API try-on perhiasan untuk kalung, cincin, gelang, dan anting
Posisikan kalung, cincin, gelang, dan anting pada model AI via REST. 5 credits pada 2K, manekin close-up bawaan, rendering dengan penanganan refleksi dari dokumentasi Photta.
Lihat endpointKapabilitas
Ghost mannequin API untuk foto produk hollow-man
Endpoint AI ghost mannequin. Hapus manekin dari foto pakaian dan pertahankan detail bagian dalam. 3D atau flat-lay, pemrosesan batch, 4 credits pada 2K.
Lihat endpointBangun
Bangun fitur virtual try-on untuk aplikasi Anda
Resep end-to-end untuk merilis fitur virtual try-on dengan Photta API: unggah, submit, lakukan polling dari worker, render hasilnya. Pola TypeScript + server-only.
Lihat endpointBangun
Tambahkan virtual try-on ke aplikasi iOS atau Android
Cara menambahkan AI virtual try-on ke aplikasi native iOS atau Android menggunakan Photta API: jangan pernah menyertakan key ke perangkat, lakukan proxy melalui backend Anda, mirror status job.
Lihat endpointBandingkan
Photta vs FASHN — API AI fashion, berdampingan
Perbandingan Photta dan FASHN: endpoint, harga credits, tingkatan paket, batas konkurensi. Bersumber dari halaman harga masing-masing perusahaan pada 2026-04-19. Tanpa angka rekayasa.
Lihat endpointBandingkan
Photta vs Fitroom — pilih yang tepat untuk API fashion
Perbandingan Photta dan Fitroom berdasarkan endpoint, biaya credit per panggilan, model penetapan harga, dan bidang integrasi. Diambil dari masing-masing situs pada 2026-04-19. Tanpa angka rekayasa.
Lihat endpointQuickstart
Gambar Photta pertama dalam waktu kurang dari lima menit.
Daftar, buat API key, jalankan pemanggilan cURL pertama Anda, lakukan polling hingga selesai, simpan hasilnya. Lima langkah, terdokumentasi end-to-end.
Lihat endpointReferensi
Error Photta API
Daftar lengkap tipe error Photta API beserta kode statusnya, format body error, dan kegagalan mana saja yang layak dicoba ulang.
Lihat endpointReferensi
Rate limit Photta API
Rate limit Photta API, window-nya, header Retry-After, interval polling, serta batas konkurensi per paket, seluruhnya dirujuk dari dokumentasi API.
Lihat endpoint
Setiap angka di halaman ini bersumber dari dokumentasi API Photta · diperiksa
Coba API dalam lima menit
Buat Photta API key, tempel cuplikan cURL di atas, dan Anda akan mendapatkan gambar on-model pertama sebelum kopi selesai diseduh.
- 1.5–4 min
- 5 credits pada 2K · 6 credits pada 4K
- async, polling
- 600 requests/min
- Bearer key