Bygg · Virtuell try-on för mobilen
Lägg till virtuell try-on i en iOS- eller Android-app
I en mening
Behåll Photta API-nyckeln på din backend; exponera en proxy-endpoint (/mobile/try-on) som tar emot produktbilden och dock-ID:t (mannequin ID), vidarebefordrar till /api/v1/tryon/apparel, sparar genererings-ID:t kopplat till användaren och exponerar en status-endpoint som mobilappen pollar var 3:e sekund tills bilden är klar. Telefonen får aldrig veta att Photta-nyckeln existerar.
- Credits: 5 credits vid 2K · 6 credits vid 4K
- Typisk tid: 1.5–4 min
- Bearbetning: asynkron, polling
Varje siffra på den här sidan kommer från Photter API-dokumentationen · kontrollerad
Din enhet kommunicerar aldrig direkt med Photta — den pratar med din backend, och din backend pratar med Photta. Den gränsdragningen ser till att API-nyckeln inte hamnar i användarens telefon, att dina rate limits förblir ditt eget problem och att appen godkänns vid appgranskning i alla appbutiker.
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"]Hur det fungerar
Enhet, backend, Photta — tre nivåer, ett flöde
Fem konkreta beslut du behöver fatta före den första inskickningen till App Store.
Steg 1
Behåll nyckeln på din server
Skicka inte med Photta-nyckeln i appens binärfil, info.plist, AndroidManifest eller i någon env-fil vid kompilering — det är trivialt att dekompilera binären och nyckeln kommer att läcka. Din backend är den enda platsen där nyckeln hör hemma.
Steg 2
Designa en ren proxy-endpoint
Exponera /mobile/try-on för din app. Autentisera anropet med din egen användarsession — skicka inte råa API-nycklar genom proxyn. Proxyn anropar sedan Photta å den autentiserade användarens vägnar.
Steg 3
Spegla Phottas jobbstatus i din databas
När Photta returnerar ett genererings-ID lägger du till en rad i din egen jobbtabell med user_id som nyckel. Din mobilapp pollar DIN /mobile/try-on/:id — inte Phottas — så att dina rate limits skalar med DITT abonnemang, inte med varje användares enhet.
Steg 4
Cacha resultat-URL:en
När Photta rapporterar completed kopierar du output_url till din jobbrad och laddar valfritt ned datan till ditt eget CDN. Mobilanvändare betalar per MB — hot-länka inte Phottas CDN under hela livslängden för en produktvisning.
Steg 5
Hantera offline-lägen snyggt
Mobilnät tappar anslutningen mitt under en polling. Visa ett ”försöker igen”-läge i stället för ett hårt fel, gör nya försök med exponentiell backoff och spara jobb-ID:t lokalt så att en kallstart kan fortsätta där den senaste sessionen slutade.
Integrationens tre lager
App-kontrakt, backend-proxy, polling på klientsidan — precis den avgränsning du behöver.
// Never ship your PHOTTA_API_KEY to the device. The mobile app
// calls YOUR API; your API calls Photta. Simple, safe, billable.
POST /mobile/try-on
{
"productImageUrl": "...",
"mannequinId": "...",
"poseId": "..."
}
// → returns { jobId } immediatelyconst 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// Store { id: data.id, user_id, status: "processing" } in your jobs table
// and return { jobId: data.id } to the device.
// App polls YOUR /mobile/try-on/:id — you poll Photta server-side
// and mirror status. This way rate limits are YOUR problem, not
// each device's, and you can add caching + analytics in one place.
async function pollJob(jobId: string) {
while (true) {
const { status, imageUrl } = await api.get(`/mobile/try-on/${jobId}`);
if (status === "completed") return imageUrl;
if (status === "failed") throw new Error("Try-on failed");
await sleep(3000);
}
}Vanliga utvecklarfrågor
Driftsätt en mobil funktion driven av Photta
Kan jag anropa Photta API direkt från enheten?
Tekniskt sett ja — men du skulle behöva baka in din API-nyckel i app-paketet, vilket gör att nyckeln skickas ut till varje enhet som installerar appen. Routa via din egen backend så att nyckeln stannar på en server du kontrollerar.
Hur hanterar jag långsamma mobilnät?
Två saker. För det första: skicka jobbet från din backend, inte från enheten — du laddar bara upp en produktbild från telefonen till ditt eget API. För det andra: polla din egen status-endpoint med 3-sekundersintervall och exponentiell backoff vid fel. Om användaren byter flik eller tappar täckningen, spara jobb-ID:t i lokal lagring så att de kan återuppta när de kommer tillbaka.
Stöder Photta webhooks?
Nej. Polling är den enda signalen för slutförande som API:et erbjuder, så behåll worker-loopen — och skicka en server-sent event till telefonen i samma ögonblick som din egen backend ser att jobbet är klart.
Kan jag använda Photta med React Native eller Flutter?
Ja — från JavaScript- / Dart-sidan anropar du bara ditt eget backend-API. Inga detaljer som är specifika för Photta läcker igenom. Flutter-appar gör anrop med fetch mot /mobile/try-on på exakt samma sätt som en app byggd med React Native eller nativ SwiftUI / Jetpack Compose.
Bryr sig Apples granskningsteam om den här integrationen?
Nej — eftersom din app inte anropar Photta. Den anropar din egen backend med din egen autentisering. Ur Apples perspektiv är du en helt vanlig REST-baserad app. Detsamma gäller för Google Play och Huawei AppGallery.
Relaterade sidor
Referens
Funktioner
API för virtuell try-on för apparel
REST API som placerar kläder på AI-mannekänger. Asynkron, 1,5–4 minuters generering, 5 credits vid 2K, 6 vid 4K. Exempel för cURL, Node.js och Python.
LäsSnabbstart
Första Photta-bilden på under fem minuter.
Skapa konto, generera en API-nyckel, kör ditt första cURL-anrop, polla tills det är klart, spara resultatet. Fem steg, dokumenterade från början till slut.
LäsSpråk
Node.js walkthrough
Läs
Varje siffra på den här sidan kommer från Photter API-dokumentationen · kontrollerad
Driftsätt virtuell try-on i din nästa appreleas
Tre tunna lager, noll SDK-avtryck på enheten. Hämta en API-nyckel och koppla upp proxyn på en eftermiddag.