Сборка · Мобильный try-on

Добавьте виртуальный try-on в приложение для iOS или Android

В двух словах

Храните API-ключ Photta на своем бэкенде; откройте прокси-endpoint (/mobile/try-on), который принимает изображение товара и ID манекена, пересылает их на /api/v1/tryon/apparel, привязывает ID генерации к пользователю и предоставляет endpoint статуса, который мобильное приложение опрашивает каждые 3 секунды, пока изображение не будет готово. Телефон никогда не узнает о существовании ключа Photta.

  • Кредиты: 5 credits при 2K · 6 credits при 4K
  • Типичное время: 1.5–4 min
  • Обработка: async, polling

Все показатели на этой странице взяты из документации API Photta · проверено

Ваше устройство никогда не обращается к Photta напрямую — оно отправляет запросы на ваш бэкенд, а бэкенд общается с Photta. Эта граница сохраняет API-ключ вне телефона пользователя, делает rate limits вашей внутренней заботой и позволяет приложению без проблем проходить ревью в любых сторах.

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

Как это работает

Устройство, бэкенд, Photta — три уровня, один процесс

Пять конкретных решений, которые необходимо принять перед первой отправкой в App Store.

  1. Шаг 1

    Храните ключ на своем сервере

    Не включайте ключ Photta в бинарник приложения, info.plist, AndroidManifest или любые env-файлы сборки — декомпилировать бинарник элементарно, и ключ утечет. Единственное место, где должен жить ключ, — это ваш бэкенд.

  2. Шаг 2

    Спроектируйте чистый прокси-endpoint

    Откройте /mobile/try-on для вашего приложения. Аутентифицируйте запрос через собственную пользовательскую сессию — не передавайте сырые API-ключи через прокси. Затем прокси вызывает Photta от имени аутентифицированного пользователя.

  3. Шаг 3

    Дублируйте статус задачи Photta в своей базе данных

    Когда Photta возвращает ID генерации, вставьте строку в свою таблицу задач с ключом user_id. Ваше мобильное приложение опрашивает ВАШ /mobile/try-on/:id, а не Photta, поэтому rate limits масштабируются в рамках ВАШЕГО тарифного плана, а не каждого отдельного устройства пользователя.

  4. Шаг 4

    Кэшируйте URL результата

    Когда Photta сообщает completed, скопируйте output_url в строку задачи и при необходимости загрузите байты в собственный CDN. Мобильные пользователи платят за каждый МБ — не используйте CDN Photta напрямую для постоянных показов на карточке товара.

  5. Шаг 5

    Корректно обрабатывайте офлайн

    Мобильная сеть может оборваться прямо во время polling. Показывайте состояние «повторная попытка» вместо критической ошибки, используйте экспоненциальную задержку (exponential backoff) и сохраняйте ID задачи локально, чтобы холодный запуск продолжал с того места, где завершилась прошлая сессия.

Три уровня интеграции

Контракт приложения, прокси на бэкенде, polling на клиенте — именно то разделение зон ответственности, которое вам нужно.

// 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);
  }
}

Частые вопросы разработчиков

Релиз мобильной фичи на базе Photta

Могу ли я вызывать Photta API прямо с устройства?

Технически да — но вам придется зашить API-ключ внутрь бандла приложения, что передаст ваш ключ на каждое устройство, установившее приложение. Направляйте запросы через собственный бэкенд, чтобы ключ оставался на сервере под вашим контролем.

Как справляться с медленным мобильным интернетом?

Два шага. Первый: создавайте задачу с бэкенда, а не с устройства — с телефона вы просто загружаете изображение товара в свой API. Второй: опрашивайте собственный endpoint статуса с интервалом в 3 секунды и экспоненциальной задержкой при сбоях. Если пользователь переключает вкладки или теряет сигнал, сохраните ID задачи в local storage, чтобы он мог продолжить по возвращении.

Поддерживает ли Photta вебхуки?

Нет. Polling — единственный сигнал о завершении, который предоставляет API, поэтому сохраняйте цикл воркера и отправляйте server-sent event на телефон в тот момент, когда ваш бэкенд видит завершение задачи.

Могу ли я использовать Photta с React Native или Flutter?

Да — со стороны JavaScript / Dart вы просто вызываете API собственного бэкенда. Специфика Photta наружу не выходит. Приложения на Flutter вызывают /mobile/try-on точно так же, как приложения на React Native или нативных SwiftUI / Jetpack Compose.

Обращает ли команда ревью Apple внимание на эту интеграцию?

Нет — потому что ваше приложение не обращается к Photta. Оно делает запросы к вашему бэкенду с вашей собственной авторизацией. С точки зрения Apple вы — обычное приложение со стандартным REST-бэкендом. То же самое относится к Google Play и Huawei AppGallery.

Выпустите виртуальный try-on в следующем релизе приложения

Три тонких слоя, нулевой след SDK на устройстве. Получите API-ключ и настройте прокси за один вечер.