Construir · Mobile Try-On
Adicione virtual try-on a um app iOS ou Android
Em uma frase
Mantenha a chave da API Photta no seu backend; exponha um endpoint de proxy (/mobile/try-on) que aceita a imagem do produto e o ID do manequim, encaminha para /api/v1/tryon/apparel, armazena o ID da geração associado ao usuário e expõe um endpoint de status que o app mobile consulta via polling a cada 3 segundos até que a imagem esteja pronta. O telefone nunca sabe que a chave da Photta existe.
- Credits: 5 credits em 2K · 6 credits em 4K
- Tempo típico: 1.5–4 min
- Processamento: assíncrono, polling
Todos os números nesta página vêm de a documentação da API da Photta · verificado
Seu dispositivo nunca fala diretamente com a Photta — ele se comunica com o seu backend, e o seu backend fala com a Photta. Essa separação é o que mantém sua chave de API fora do telefone do usuário, seus rate limits sob seu controle e seu app aprovável em qualquer loja.
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"]Como funciona
Dispositivo, backend, Photta — três camadas, um fluxo
Cinco decisões concretas que você precisa tomar antes do primeiro envio para a App Store.
Passo 1
Mantenha a chave no seu servidor
Não envie a chave da Photta dentro do binário do app, info.plist, AndroidManifest ou qualquer arquivo de env de build — decompilar o binário é trivial e a chave vazará. Seu backend é o único lugar onde a chave deve residir.
Passo 2
Projete um endpoint de proxy limpo
Exponha /mobile/try-on para o seu app. Autentique a requisição com a sua própria sessão de usuário — não repasse chaves de API brutas pelo proxy. O proxy então chama a Photta em nome do usuário autenticado.
Passo 3
Espelhe o status do job da Photta no seu banco de dados
Quando a Photta retornar um ID de geração, insira uma linha na sua própria tabela de jobs indexada por user_id. Seu app mobile faz polling no SEU /mobile/try-on/:id — não no da Photta — para que os rate limits escalem com o SEU plano, e não com o dispositivo de cada usuário.
Passo 4
Faça cache da URL de resultado
Quando a Photta reportar completed, copie output_url para a linha correspondente de jobs e, opcionalmente, baixe os bytes para a sua própria CDN. Usuários mobile pagam por MB — não faça hot-link na CDN da Photta durante todo o tempo de exibição de uma PDP.
Passo 5
Lide com o modo offline com elegância
Redes móveis caem no meio do polling. Exiba um estado de 'tentando novamente' em vez de um erro fatal, tente novamente com backoff exponencial e persista o ID do job localmente para que uma reinicialização a frio continue de onde a última sessão parou.
Três camadas da integração
Contrato do app, proxy do backend, polling no client — exatamente o limite de separação que você precisa.
// 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);
}
}Dúvidas frequentes de desenvolvedores
Implementando uma funcionalidade mobile baseada na Photta
Posso chamar a API da Photta diretamente do dispositivo?
Tecnicamente sim — mas você teria que incluir sua chave de API dentro do bundle do app, o que distribui sua chave para todos os dispositivos que instalarem o aplicativo. Roteie pelo seu próprio backend para que a chave permaneça em um servidor controlado por você.
Como eu lido com redes móveis lentas?
Duas coisas. Primeira: envie o job a partir do backend, não do dispositivo — você está apenas fazendo upload da imagem do produto do telefone para a sua própria API. Segunda: faça polling no seu próprio endpoint de status com intervalos de 3 segundos e backoff exponencial em caso de falha. Se o usuário mudar de aba ou perder o sinal, persista o ID do job no armazenamento local para que ele possa retomar quando voltar.
A Photta suporta webhooks?
Não. O polling é o único sinal de conclusão que a API oferece, então mantenha o loop do worker — e envie um server-sent event para o telefone no momento em que seu próprio backend identificar que o job terminou.
Posso usar a Photta com React Native ou Flutter?
Sim — do lado do JavaScript / Dart você está apenas chamando a API do seu próprio backend. Nenhuma especificidade da Photta vaza para o cliente. Apps em Flutter chamam /mobile/try-on da mesma forma que um app em React Native ou SwiftUI / Jetpack Compose nativo.
A equipe de revisão da Apple se importa com essa integração?
Não — porque seu app não está chamando a Photta. Ele está chamando seu próprio backend com sua própria autenticação. Do ponto de vista da Apple, você é um app comum integrado a uma API REST. O mesmo se aplica à Google Play e Huawei AppGallery.
Páginas relacionadas
Referência
Recursos
API de try-on virtual para roupas
API REST que veste roupas em manequins de IA. Assíncrona, geração em 1.5–4 minutos, 5 credits em 2K, 6 em 4K. Exemplos em cURL, Node.js e Python.
LerInício rápido
Primeira imagem no Photta em menos de cinco minutos.
Cadastre-se, gere uma chave de API, execute sua primeira chamada cURL, faça polling até a conclusão, persista o resultado. Cinco etapas, documentadas de ponta a ponta.
LerLinguagens
Node.js walkthrough
Ler
Todos os números nesta página vêm de a documentação da API da Photta · verificado
Lance virtual try-on no seu próximo release do app
Três camadas finas, pegada zero de SDK no dispositivo. Obtenha uma chave de API e conecte o proxy em uma tarde.