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')

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.

  1. 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.

  2. 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.

  3. 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.

  4. 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.

  5. 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 } immediately
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
// 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.

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.