Сборка · SaaS для AI-фотографии
Создайте сервис AI-фотографии товаров
В двух словах
Выделите API-ключ Photta на каждого тенанта (или используйте общий пул при небольших объемах), распределяйте каталог каждого клиента по очереди, вызывайте /api/v1/tryon/apparel для каждого товара, опрашивайте полученные ID генераций через пул воркеров, сохраняйте результаты в бакет клиента и выставляйте счета за каждую оплачиваемую единицу (credit или сгенерированное изображение) со своей наценкой к стоимости credit в Photta.
- Кредиты: 5 credits при 2K · 6 credits при 4K
- Типичное время: 1.5–4 min
- Обработка: async, polling
Все показатели на этой странице взяты из документации API Photta · проверено
Распараллеливайте обработку каталогов ваших клиентов, запускайте try-on задачи для каждого товара, выставляйте счета за credits. Базовые примитивы, которые Photta предоставляет отдельным разработчикам, легко объединяются в white-label SaaS — если грамотно выстроить границы системы.
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"]Как это работает
От одного ключа к мультиарендой архитектуре
Пять архитектурных решений, которые необходимо принять до написания продакшн-кода.
Шаг 1
Определите продуктовый контракт
Решите, что именно клиент получает за расчетную единицу: одно сгенерированное изображение? Пакет? Ежемесячный пул credits? От этого зависит все остальное — глубина очереди, политика повторов, формулировки на странице с ценами.
Шаг 2
Выделяйте ключи Photta под каждого тенанта
Небольшой масштаб: один общий ключ с отслеживанием расхода по тенантам в вашей базе данных. Крупный масштаб: отдельный ключ Photta на каждого тенанта, управляемый через дашборд Photta — более прозрачная атрибуция расходов и меньшая зона поражения в случае утечки.
Шаг 3
Распараллеливайте задачи через очередь
Для каждого товара в фиде клиента ставьте задачу на генерацию фото в очередь. Никогда не отправляйте запросы синхронно во время импорта CSV — вы упретесь в rate limit в 600 запросов в минуту и потеряете задачи из-за ошибок 429.
Шаг 4
Наценка поверх стоимости credit
Каждый рендер одежды в разрешении 4K обходится вам в 6 credits. В каждый выставляемый счет должна закладываться формула: credits × ваша наценка. Фиксируйте чистую себестоимость в credits в своем журнале учета, чтобы бухгалтерия могла сопоставлять счета Photta с вашей выручкой.
Шаг 5
Отслеживайте задержки и процент ошибок
Контролируйте время выполнения и процент ошибок по каждому тенанту. Если генерация фото у клиента стабильно занимает более 4 минут или регулярно завершается сбоем, дело почти всегда в некорректных входных данных (битый URL, неподдерживаемый product_type), а не в проблеме на стороне Photta.
Три паттерна, которые вам понадобятся
Fanout, отправка задач по тенантам, журнал биллинга — несущие конструкции SaaS-сервиса фотографии.
// For each product in the customer's feed, kick off a try-on.
for (const product of catalog) {
await photoQueue.add("photo", {
customerId: product.customer_id,
productUrl: product.image,
productType: product.type, // "top" | "bottom" | "top_and_bottom" | "one_piece"
});
}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// A completed apparel job costs 5 credits at 2K and 6 at 4K.
// Record it to your billing pipeline so you can margin on top of it.
await billingLedger.append({
customer: data.customerId,
sku: "photo-4k",
quantity: 1,
wholesaleCost: 6, // credits, = your Photta spend
});Частые вопросы разработчиков
Запуск сервиса поверх Photta
Нужен ли мне отдельный API-ключ Photta для каждого тенанта?
Нет, но это помогает при масштабировании. Пока клиентов немного, достаточно одного общего ключа с отслеживанием использования по тенантам в собственной базе данных. При дальнейшем росте ключ на каждого тенанта обеспечивает более прозрачный учет расходов, упрощает ротацию и снижает риски при утечке.
Что делать, когда заканчиваются credits?
API возвращает 402 insufficient_credits с указанием требуемого и доступного количества. Задайте минимальный порог (например, 100 credits) и пополняйте баланс автоматически до того, как задачи начнут падать с ошибкой. За упавшие задачи credits возвращаются, поэтому серия ошибок 402 не усугубит потери.
Как формировать цены на мой сервис?
Photta списывает 5 credits за 2K и 6 credits за 4K. Пересчитайте это в вашу розничную валюту (себестоимость × ваша маржа × курс credits) и решите, как тарифицировать: за изображение, за пакет или помесячно. Большинство SaaS-сервисов для фотосъемки в итоге берут оплату за изображение с ежемесячным минимумом.
Какие SLA предоставляет Photta?
Задокументированное время выполнения задачи в Photta составляет от 1.5 до 4 минут. Жесткий SLA по аптайму не опубликован. Если ваш SaaS обещает собственные сроки, закладывайте запас в свои договоры (например, «фото готовы в течение 1 часа» дает 10-кратный запас) и отслеживайте задержки по каждому клиенту, чтобы вовремя заметить просадки.
Могу ли я использовать white-label для результатов?
Да. На возвращаемых изображениях нет брендинга Photta. Вы можете сохранять их в бакет клиента и раздавать через собственный CDN-домен — клиенту незачем знать, что их обработал пайплайн Photta. Сам API не является white-label: ключ и дашборд оформлены в бренде Photta.
Связанные страницы
Справочник
Возможности
API виртуального try-on для одежды
REST API, примеряющий одежду на AI-манекены. Асинхронно, генерация за 1.5–4 минуты, 5 credits для 2K, 6 для 4K. Примеры для cURL, Node.js и Python.
ЧитатьБыстрый старт
Первое изображение в Photta менее чем за 5 минут.
Зарегистрируйтесь, сгенерируйте API-ключ, выполните первый вызов cURL, опрашивайте статус до завершения, сохраните результат. 5 шагов с полным описанием.
ЧитатьВозможности
API невидимого манекена (ghost mannequin) для фото товаров на невидимом манекене
AI-эндпоинт для эффекта невидимого манекена. Удаляет манекен с фото одежды с сохранением деталей внутренней части. 3D или раскладка, пакетная обработка, 4 credits в 2K.
Читать
Все показатели на этой странице взяты из документации API Photta · проверено
Запустите SaaS для фотосъемки на базе Photta
Тот же API, ваш бренд, ваша маржа. Получите API-ключ, внедрите три паттерна выше в свои воркеры — и вы уже на полпути к запуску.