Build · Mobile Try-On
Ajouter le virtual try-on à une application iOS ou Android
En une phrase
Conservez la clé API Photta sur votre backend ; exposez un endpoint proxy (/mobile/try-on) qui accepte l'image du produit et l'ID du mannequin, la transmet à /api/v1/tryon/apparel, stocke l'ID de génération associé à l'utilisateur, et expose un endpoint de statut que l'application mobile interroge en polling toutes les 3 secondes jusqu'à ce que l'image soit prête. Le téléphone n'a jamais connaissance de l'existence de la clé Photta.
- Crédits: 5 crédits en 2K · 6 crédits en 4K
- Délai typique: 1.5–4 min
- Traitement: asynchrone, polling
Chaque chiffre sur cette page provient de la documentation de l'API Photta · vérifié
Votre appareil ne communique jamais directement avec Photta — il communique avec votre backend, et votre backend communique avec Photta. C'est cette frontière qui maintient votre clé API hors du téléphone de l'utilisateur, fait de vos rate limits votre propre affaire et assure la validation de votre application sur chaque store.
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"]Comment ça fonctionne
Appareil, backend, Photta — trois niveaux, un seul flux
Cinq décisions concrètes à prendre avant la première soumission sur l'App Store.
Étape 1
Conservez la clé sur votre serveur
Ne livrez pas la clé Photta dans le binaire de votre application, info.plist, AndroidManifest ou tout fichier d'environnement au build — décompiler le binaire est trivial et la clé fuira. Votre backend est le seul endroit où la clé doit résider.
Étape 2
Concevez un endpoint proxy propre
Exposez /mobile/try-on à votre application. Authentifiez la requête avec votre propre session utilisateur — ne transmettez pas de clés API brutes via le proxy. Le proxy appelle ensuite Photta pour le compte de l'utilisateur authentifié.
Étape 3
Répliquez l'état des jobs Photta dans votre base de données
Quand Photta renvoie un ID de génération, insérez une ligne dans votre propre table de jobs indexée par user_id. Votre application mobile interroge VOTRE /mobile/try-on/:id — pas celui de Photta — afin que les rate limits dépendent de VOTRE plan, pas de l'appareil de chaque utilisateur.
Étape 4
Mettez en cache l'URL de résultat
Quand Photta indique completed, copiez output_url dans votre ligne de job et téléchargez éventuellement les octets sur votre propre CDN. Les utilisateurs mobiles paient au Mo — ne créez pas de liens directs vers le CDN de Photta pendant toute la durée de vie d'une impression PDP.
Étape 5
Gérez le mode hors ligne proprement
Les réseaux mobiles coupent en plein polling. Affichez un état « nouvelle tentative en cours » plutôt qu'une erreur bloquante, réessayez avec un backoff exponentiel, et persistez l'ID du job localement pour qu'un démarrage à froid reprenne là où la dernière session s'est arrêtée.
Trois couches d'intégration
Contrat de l'application, proxy backend, polling côté client — exactement la frontière qu'il vous faut.
// 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);
}
}Questions fréquentes des développeurs
Déployer une fonctionnalité mobile basée sur Photta
Puis-je appeler l'API Photta directement depuis l'appareil ?
Techniquement oui — mais vous devriez intégrer votre clé API dans le bundle de l'application, ce qui distribue votre clé à chaque appareil qui l'installe. Passez par votre propre backend pour que la clé reste sur un serveur que vous contrôlez.
Comment gérer les réseaux mobiles lents ?
Deux choses. Premièrement : soumettez le job depuis le backend, pas depuis l'appareil — vous uploadez simplement une image produit depuis le téléphone vers votre propre API. Deuxièmement : interrogez votre propre endpoint de statut avec des intervalles de 3 secondes et un backoff exponentiel en cas d'échec. Si l'utilisateur change d'onglet ou perd le signal, persistez l'ID du job dans le stockage local pour qu'il puisse reprendre à son retour.
Photta prend-il en charge les webhooks ?
Non. Le polling est le seul signal de complétion offert par l'API, conservez donc la boucle de worker — et poussez un événement server-sent vers le téléphone dès que votre propre backend voit le job se terminer.
Puis-je utiliser Photta avec React Native ou Flutter ?
Oui — côté JavaScript / Dart, vous appelez simplement votre propre API backend. Aucune spécificité de Photta ne transparaît. Les applications Flutter appellent fetch sur /mobile/try-on de la même manière qu'une application React Native ou native SwiftUI / Jetpack Compose.
L'équipe de validation d'Apple s'intéresse-t-elle à cette intégration ?
Non — parce que votre application n'appelle pas Photta. Elle appelle votre propre backend avec votre propre auth. Du point de vue d'Apple, vous êtes une application standard adossée à une API REST. La même règle s'applique à Google Play et Huawei AppGallery.
Pages associées
Référence
Fonctionnalités
API de try-on virtuel pour les vêtements
API REST qui positionne des vêtements sur des mannequins générés par IA. Traitement asynchrone, génération en 1.5–4 minutes, 5 crédits en 2K, 6 en 4K. Exemples en cURL, Node.js et Python.
LireDémarrage rapide
Première image Photta en moins de cinq minutes.
Inscrivez-vous, générez une clé d'API, lancez votre premier appel cURL, effectuez le polling jusqu'à la complétion, persistez le résultat. Cinq étapes documentées de bout en bout.
LireLangages
Node.js walkthrough
Lire
Chaque chiffre sur cette page provient de la documentation de l'API Photta · vérifié
Déployez le virtual try-on dans votre prochaine version d'application
Trois couches légères, aucune empreinte de SDK sur l'appareil. Récupérez une clé API et câblez le proxy en une après-midi.