Сборка · Мобильный 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')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"]Как это работает
Устройство, бэкенд, Photta — три уровня, один процесс
Пять конкретных решений, которые необходимо принять перед первой отправкой в App Store.
Шаг 1
Храните ключ на своем сервере
Не включайте ключ Photta в бинарник приложения, info.plist, AndroidManifest или любые env-файлы сборки — декомпилировать бинарник элементарно, и ключ утечет. Единственное место, где должен жить ключ, — это ваш бэкенд.
Шаг 2
Спроектируйте чистый прокси-endpoint
Откройте /mobile/try-on для вашего приложения. Аутентифицируйте запрос через собственную пользовательскую сессию — не передавайте сырые API-ключи через прокси. Затем прокси вызывает Photta от имени аутентифицированного пользователя.
Шаг 3
Дублируйте статус задачи Photta в своей базе данных
Когда Photta возвращает ID генерации, вставьте строку в свою таблицу задач с ключом user_id. Ваше мобильное приложение опрашивает ВАШ /mobile/try-on/:id, а не Photta, поэтому rate limits масштабируются в рамках ВАШЕГО тарифного плана, а не каждого отдельного устройства пользователя.
Шаг 4
Кэшируйте URL результата
Когда Photta сообщает completed, скопируйте output_url в строку задачи и при необходимости загрузите байты в собственный CDN. Мобильные пользователи платят за каждый МБ — не используйте CDN Photta напрямую для постоянных показов на карточке товара.
Шаг 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 } 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);
}
}Частые вопросы разработчиков
Релиз мобильной фичи на базе 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.
Связанные страницы
Справочник
Возможности
API виртуального try-on для одежды
REST API, примеряющий одежду на AI-манекены. Асинхронно, генерация за 1.5–4 минуты, 5 credits для 2K, 6 для 4K. Примеры для cURL, Node.js и Python.
ЧитатьБыстрый старт
Первое изображение в Photta менее чем за 5 минут.
Зарегистрируйтесь, сгенерируйте API-ключ, выполните первый вызов cURL, опрашивайте статус до завершения, сохраните результат. 5 шагов с полным описанием.
ЧитатьЯзыки
Node.js walkthrough
Читать
Все показатели на этой странице взяты из документации API Photta · проверено
Выпустите виртуальный try-on в следующем релизе приложения
Три тонких слоя, нулевой след SDK на устройстве. Получите API-ключ и настройте прокси за один вечер.