Rakenna · Virtuaalinen try-on
Rakenna virtuaalinen try-on -ominaisuus sovellukseesi
Yhdellä lauseella
Vastaanota tuotekuva backendissäsi, tee POST-pyyntö osoitteeseen /api/v1/tryon/apparel mannekiini-ID:n kanssa, tee palautetulle generointi-ID:lle pollingia taustaworkerista (älä koskaan HTTP-pyyntösäikeestä), kunnes tilaksi vaihtuu completed, tallenna sitten output_url omaan objektitallennustilaasi ja renderöi se käyttöliittymässä.
- Credits: 5 credits resoluutiolla 2K · 6 credits resoluutiolla 4K
- Tyypillinen kesto: 1.5–4 min
- Käsittely: asynkroninen, polling
Jokainen luku tällä sivulla on peräisin Photta-rajapinnan dokumentaatiosta · tarkistettu
Tuotantovalmis toteutusmalli: asiakas lataa tuotekuvan, backendisi asettaa Photta-try-on-työn jonoon, worker tekee pollingia kunnes työ valmistuu, frontend näyttää on-model-lopputuloksen. Ei blokkaavia pyyntöjä, ei vuotaneita API-avaimia, ei feikkiä SDK:ta.
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"]Miten se toimii
Latauksesta on-model-kuvaksi
Kuusi konkreettista vaihetta. Varaa kymmenestä viiteentoista minuuttia integraatiotyöhön ensimmäisellä kerralla.
Vaihe 1
Hahmottele datavirta
Asiakkaan laite → backendisi (lataus) → Photta API (lähetys) → Photta API (polling) → tietokantasi (tilapeilaus) → asiakkaan laite (renderöinti). Piirrä tämä paperille ennen ensimmäisen rivin kirjoittamista — rajapinta backendisi ja Photta:n välillä on ainoa asia, jolla on merkitystä.
Vaihe 2
Luo ja tallenna API-avain
Tuotantoavaimet alkavat etuliitteellä photta_live_. Tallenna se ympäristömuuttujaan. Älä koskaan lähetä sitä selaimeen. Yksi avain kattaa kaikki Photta:n toiminnot, joten et tarvitse erillisiä avaimia try-on-, koru- tai ghost mannequin -toiminnoille.
Vaihe 3
Kytke lataus-endpoint toimintaan
Vastaanota asiakkaan tuotekuva ensin objektitallennustilaan. Julkisen URL-osoitteen antaminen Photta:lle on yksinkertaisempaa kuin base64 ja tarjoaa lokitiedot jokaisesta pyynnöstä.
Vaihe 4
Lähetä työ palvelimelta
Tee POST-pyyntö osoitteeseen /api/v1/tryon/apparel sisältäen tuotteen URL:n, mannequin_id:n, resoluution ja kuvasuhteen. API palauttaa 202 Accepted + generointi-ID:n. Tallenna ID tietokantaasi, jotta asiakasohjelmasi voi pollailla omaa endpointiasi, ei Photta:n.
Vaihe 5
Tee polling taustaworkerista
Älä tee pollingia HTTP-pyynnön sisällä — työ kestää 1.5–4 minuuttia, mikä ylittää useimmat serverless-aikakatkaisut. Käytä Trigger.dev-, Inngest-, BullMQ-, Vercel Cron -ratkaisua tai omaa jonoasi ajastamaan uusi poll 3 sekunnin välein, kunnes työ on valmis.
Vaihe 6
Renderöi lopputulos
Kun tilaksi vaihtuu completed, kopioi data.output_url tietokantaasi ja lähetä reaaliaikainen tapahtuma (websocket, SSE tai long-poll) asiakkaan laitteelle. Käyttöliittymä korvaa latausluurangon kuvalla. Valmista.
Kolme koodiesimerkkiä, päästä päähän
Latauksen käsittelijä, työn välittäjä, worker-puolen pollaaja — jokainen osa, jonka tarvitset ominaisuuden julkaisemiseen.
// POST /app/try-on → your backend upload handler
import { put } from "@vercel/blob";
export async function uploadProduct(file: File) {
const { url } = await put(`products/${crypto.randomUUID()}.jpg`, file, {
access: "public",
});
return url;
}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.status// Trigger.dev / Inngest / BullMQ task
const BASE = "https://api.photta.app/api/v1";
export const pollTryOnTask = task({
id: "poll-try-on",
run: async ({ generationId, attempt = 0 }) => {
const res = await fetch(`${BASE}/tryon/apparel/${generationId}`, {
headers: { Authorization: `Bearer ${process.env.PHOTTA_API_KEY}` },
});
const { data } = await res.json();
if (data.status === "completed") return data.output_url;
if (data.status === "failed") throw new Error(data.error_message);
if (attempt >= 120) throw new Error("try-on timed out");
// Re-schedule this same task after 3 seconds.
return ctx.retry.after(3000, { generationId, attempt: attempt + 1 });
},
});Kehittäjien usein kysymää
Kysymyksiä ennen julkaisua
Voinko tehdä tämän ilman backendia?
Et. Photta API -avaimesi on pysyttävä palvelinpuolella. Jopa kevyt Next.js-reittikäsittelijä tai Cloudflare Worker lasketaan tähän tarkoitukseen backendiksi — avaimen on vain sijaittava paikassa, josta user-agent ei pääse lukemaan sitä.
Miten vältän roikkumaan jäävät HTTP-pyynnöt?
Älä koskaan tee pollingia pyyntökäsittelijän sisällä. Lähetä työ synkronisesti, palauta generation ID asiakkaalle ja hoida polling taustatyöntekijästä (background worker). Asiakas tekee pollingia SINUN status endpointiisi, ei Phottan — näin rate limitit ovat sinun hallinnoitavissasi, eivät yksittäisten käyttäjien vastuulla.
Mitä tapahtuu, jos työ epäonnistuu kesken suorituksen?
Photta palauttaa credits-yksiköt automaattisesti virhetilanteessa, ja vastaus sisältää kentät data.error_code + data.error_message. Näytä käyttäjälle selkeä virheilmoitus ja tarjoa uudelleenyrityspainike, joka käynnistää uuden työn.
Voinko näyttää todellisen edistymisen?
Photta ei lähetä väliaikatietoja edistymisestä — status on joko processing, completed tai failed. Hyvä ratkaisu on ajastettu edistymispalkki, joka on kalibroitu 1.5–4 minuutin aikaikkunaan, tai yksinkertainen skeleton loader. Älä valehtele prosenttilukuja.
Onko tuloksen URL pysyvä?
CDN-URL on vakaa, mutta tuotteesi ei pitäisi nojata siihen pitkäaikaisessa renderöinnissä. Lataa tavut kerran ja tallenna ne omaan S3/GCS/R2-bucketiisi — tällöin tuotesivusi (PDP) toimii edelleen, vaikka Phottan CDN muuttuisi.
Liittyvät sivut
Referenssi
Ominaisuudet
Virtuaalinen try-on API vaatteille
REST API, joka asettaa vaatteet tekoälymallinukkejen päälle. Asynkroninen, 1.5–4 minuutin generointi, 5 credits resoluutiolla 2K, 6 resoluutiolla 4K. cURL-, Node.js- ja Python-esimerkit.
LuePikaopas
Ensimmäinen Photta-kuva alle viidessä minuutissa.
Rekisteröidy, luo API-avain, suorita ensimmäinen cURL-kutsusi, tee pollingia valmistumiseen asti ja tallenna tulos. Viisi vaihetta, dokumentoitu alusta loppuun.
LueKielet
Node.js walkthrough
LueKielet
Python walkthrough
Lue
Jokainen luku tällä sivulla on peräisin Photta-rajapinnan dokumentaatiosta · tarkistettu
Toteuta virtuaalinen try-on yhdessä iltapäivässä
Jokainen tämän sivun koodiesimerkki vastaa Phottan virallista dokumentaatiota. Hanki API-avain, niin sinulla on toimiva prototyyppi ennen kuin kahvi ehtii tippua.