Сборка · Автоматизация Ghost Mannequin
Автоматизируйте удаление манекена для вашего каталога
В двух словах
Заберите дельту каталога с момента последнего запуска, отправьте POST-запрос с массивом product_images (каждый элемент — URL изображения плюс опциональный back_image) и одним стилем на /api/v1/ghost-mannequin/batch, опрашивайте batch ID каждые 3 секунды, пока каждый элемент не перейдет в статус completed или failed, а затем обновите каждую строку товара полученным output_url. Лимит параллельных батчей зависит от тарифного плана.
- Кредиты: 4 credits при 2K · 5 credits при 4K
- Типичное время: 1.5–4 min
- Обработка: async, polling
Все показатели на этой странице взяты из документации API Photta · проверено
Удаляйте манекен с каждого фото на PDP без привлечения дизайнеров. Эндпоинт ghost-mannequin в Photta изначально поддерживает пакетную обработку: ночной крон превратит фид на 50K-SKU в каталог с эффектом «невидимого манекена» за часы, а не за недели.
RESPONSE=$(curl -s -X POST https://api.photta.app/api/v1/ghost-mannequin \
-H "Authorization: Bearer $PHOTTA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"product_image": "https://cdn.yourstore.com/products/jacket-front.jpg",
"back_image": "https://cdn.yourstore.com/products/jacket-back.jpg",
"image_side": "front",
"angle": "side",
"style": "3d",
"background_color": "white",
"resolution": "2K",
"aspect_ratio": "3:4",
"user_instruction": "closed front, cream interior lining",
"brand_label_id": "7cc9f988-068b-44cd-8004-22f486b10e67"
}')
ID=$(echo "$RESPONSE" | jq -r '.data.id')const res = await fetch("https://api.photta.app/api/v1/ghost-mannequin", {
method: "POST",
headers: { Authorization: `Bearer ${process.env.PHOTTA_API_KEY}`, "Content-Type": "application/json" },
body: JSON.stringify({
"product_image": "https://cdn.yourstore.com/products/jacket-front.jpg",
"back_image": "https://cdn.yourstore.com/products/jacket-back.jpg",
"image_side": "front",
"angle": "side",
"style": "3d",
"background_color": "white",
"resolution": "2K",
"aspect_ratio": "3:4",
"user_instruction": "closed front, cream interior lining",
"brand_label_id": "7cc9f988-068b-44cd-8004-22f486b10e67"
}),
});
const { data } = await res.json(); // data.id, data.statusimport os, requests
res = requests.post(
"https://api.photta.app/api/v1/ghost-mannequin",
headers={"Authorization": f"Bearer {os.environ['PHOTTA_API_KEY']}"},
json={
"product_image": "https://cdn.yourstore.com/products/jacket-front.jpg",
"back_image": "https://cdn.yourstore.com/products/jacket-back.jpg",
"image_side": "front",
"angle": "side",
"style": "3d",
"background_color": "white",
"resolution": "2K",
"aspect_ratio": "3:4",
"user_instruction": "closed front, cream interior lining",
"brand_label_id": "7cc9f988-068b-44cd-8004-22f486b10e67"
},
)
data = res.json()["data"] # data["id"], data["status"]Как это работает
Ночной прогон по всему каталогу
Пять компонентов, необходимых для полностью автономной автоматизации.
Шаг 1
Разметьте структуру каталога
Определите, каким строкам товаров требуется изображение с эффектом невидимки, у каких оно уже есть, а какие относятся к закрытым категориям. Сохраняйте таймстемп last_photographed_at, чтобы ночная задача обрабатывала только дельту.
Шаг 2
Выберите 3D или flat-lay для каждой категории
`3d` для вещей, которым нужен объем: верхней одежды, денима, костюмов. `flat_lay` для аксессуаров и трикотажа, которые лучше выглядят в раскладке на плоскости. Сохраните стиль на уровне категории товаров, чтобы генератор батчей выбирал нужный вариант без ручной настройки.
Шаг 3
Отправьте дельту пакетом
Выполните POST на /api/v1/ghost-mannequin/batch с массивом product_images (каждый элемент содержит image, опциональные back_image и image_side), задав один style, background_color и resolution на весь батч. Сохраните собственную карту соответствия позиций массива и ID товаров: в ответе вернется по одному generation ID на каждый элемент в том же порядке.
Шаг 4
Опрашивайте родительский батч
Эндпоинт батча возвращает агрегированные счетчики (total, processing, completed, failed). Делайте поллинг каждые 3 секунды, пока completed + failed не станет равно total. Photta обрабатывает элементы внутри батча параллельно, поэтому опрашивать отдельные генерации не требуется.
Шаг 5
Сохраните данные в базу
Пройдитесь по status.data.items по порядку — батч сохраняет исходный порядок массива — и обновите каждую строку товара соответствующим output_url. Логируйте ошибки: они почти всегда связаны с некорректным исходным фото в фиде, которое можно исправить и отправить повторно при следующем запуске.
Три шага на Python
Выгрузка дельты, отправка батча, поллинг родительского процесса — минимально жизнеспособная автоматизация каталога.
from datetime import datetime, timedelta
yesterday = datetime.utcnow() - timedelta(days=1)
rows = db.execute(
"SELECT id, source_image_url FROM products WHERE updated_at > %s",
(yesterday,),
).fetchall()import os, requests
res = requests.post(
"https://api.photta.app/api/v1/ghost-mannequin/batch",
headers={"Authorization": f"Bearer {os.environ['PHOTTA_API_KEY']}"},
json={
"product_images": [
{
"image": "https://cdn.yourstore.com/products/jacket-front.jpg",
"back_image": "https://cdn.yourstore.com/products/jacket-back.jpg",
"image_side": "front"
},
{
"image": "https://cdn.yourstore.com/products/shirt-front.jpg",
"image_side": "front"
},
{
"image": "https://cdn.yourstore.com/products/trousers-front.jpg",
"image_side": "front"
}
],
"style": "3d",
"background_color": "white",
"resolution": "2K",
"aspect_ratio": "3:4",
"user_instruction": "closed front, buttoned up",
"brand_label_id": "7cc9f988-068b-44cd-8004-22f486b10e67"
},
)
data = res.json()["data"] # data["id"], data["status"]import os, time, requests
BASE = "https://api.photta.app/api/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['PHOTTA_API_KEY']}"}
# data["items"] comes back in the order of the product_images you submitted.
batch_id = data["batch_id"]
for _ in range(240): # 240 × 3s = 12 minutes
status = requests.get(f"{BASE}/ghost-mannequin/batch/{batch_id}", headers=HEADERS).json()["data"]
if status["completed"] + status["failed"] == status["total"]:
break
time.sleep(3)
for row, item in zip(rows, status["items"]):
if item["status"] == "completed":
db.execute(
"UPDATE products SET ghost_image_url = %s WHERE id = %s",
(item["output_url"], row.id),
)Частые вопросы разработчиков
Запуск ghost mannequin в масштабах каталога
Каким может быть максимальный размер одного батча?
Согласно документации, эндпоинт батча принимает до нескольких сотен элементов за один вызов. Для ночного прогона на 50K-SKU разбейте дельту на пачки по 100–200 элементов и запускайте их последовательно, чтобы с запасом укладываться в rate limit вашего плана.
Можно ли смешивать 3D и flat-lay в одном батче?
Да: style задается для каждого элемента отдельно, поэтому один батч может содержать оба варианта. На практике большинство команд все равно разделяют запросы по категориям, так как логика сохранения в базу проще, когда все строки батча пишутся в одну и ту же колонку.
Что происходит с элементами, завершившимися ошибкой?
За элементы батча, завершившиеся ошибкой, credits возвращаются автоматически, а в финальном payload элемента передаются error_code и error_message. Записывайте ошибки в лог и повторяйте попытку следующей ночью, когда у команды будет возможность поправить исходное фото или пометить строку как некорректные входные данные.
Как сопоставить результаты с моими ID товаров?
Сохраняйте собственную карту соответствия индексов массива и ID товаров при отправке: в ответе на батч возвращается по одному generation ID на каждый элемент в том же порядке, что и в product_images, и в статусе батча элементы перечисляются в том же порядке.
Можно ли запускать это как ежедневный cron?
Да — простой ежедневный cron, который забирает дельту за последние 24 часа, делит её на чанки, отправляет батчи и записывает результаты в базу данных, является проверенным паттерном для команд масштаба каталога. Сделайте раннер идемпотентным, чтобы неудачный ночной запуск можно было безопасно повторить.
Связанные страницы
Справочник
Возможности
API невидимого манекена (ghost mannequin) для фото товаров на невидимом манекене
AI-эндпоинт для эффекта невидимого манекена. Удаляет манекен с фото одежды с сохранением деталей внутренней части. 3D или раскладка, пакетная обработка, 4 credits в 2K.
ЧитатьБыстрый старт
Первое изображение в Photta менее чем за 5 минут.
Зарегистрируйтесь, сгенерируйте API-ключ, выполните первый вызов cURL, опрашивайте статус до завершения, сохраните результат. 5 шагов с полным описанием.
ЧитатьЯзыки
Python walkthrough
Читать
Все показатели на этой странице взяты из документации API Photta · проверено
Запустите ghost mannequin масштаба каталога уже сегодня вечером
Три функции на Python, один cron, 50K фото. Получите API-ключ и направьте его на свой каталог.