Асинхронное API для генерации изображений
Полное руководство по интеграции с CyberPhotoBooth API
Async API позволяет отправлять задачи на генерацию в очередь и получать результаты позже, избегая долгих ожиданий и таймаутов.
Для доступа к API необходим API ключ. Получите его через Telegram бота
Заголовок авторизации:
/async/submitОтправляет задачу на генерацию в очередь
style принимает либо название стиля, либо его style_id. Например: "SteamPunk" или 1029 — выбирайте то, что удобнее.style используйте user_style_id (UUID) — см. раздел «Кастомные стили» ниже.Тело запроса:
{
"mode": "style_sdxl_zero",
"style": "SteamPunk",
"return_s3_link": false,
"params": {
"Sex": "man",
"Face": "base64_image_data",
"Fon": "base64_image_data"
}
}Ответ:
{
"job_id": "uuid-of-task",
"status": "queued",
"estimated_wait_time_seconds": 30
}/async/status/{job_id}Проверяет статус задачи и возвращает результат
Возможные статусы:
queued— в очередиprocessing— обрабатываетсяcompleted— готовоfailed— ошибкаnot_found— не найдено / истеклоУспешный результат:
{
"job_id": "uuid",
"status": "completed",
"processing_time_ms": 15000,
"results": {
"images": ["base64_image_1", "base64_image_2"],
"videos": []
}
}/public/stylesПубличный список стилей (без аутентификации). Возвращает полную информацию: название, style_id, локализованные display_name, превью (общее + male/female), список assets (ассеты воркфлоу), галерею examples и связанные modes.
Ответ:
[
{
"name": "SteamPunk",
"style_id": 1029,
"display_name_en": "Steampunk",
"display_name_ru": "Стимпанк",
"preview_url": "https://.../preview.jpg?v=...",
"preview_url_male": "https://.../preview_male.jpg?v=...",
"preview_url_female": "https://.../preview_female.jpg?v=...",
"assets": [
{ "name": "ref_portrait.png", "url": "https://.../...", "gender": null },
{ "name": "ref_portrait.png", "url": "https://.../male/...", "gender": "male" }
],
"examples": [
"https://.../examples/0.jpg?v=...",
"https://.../examples/1.jpg?v=..."
],
"modes": [
{ "id": "...", "name": "style_sdxl_zero", "display_name": "SDXL" }
]
},
...
]Загружайте свои стили с промптами, превью, ассетами воркфлоу и примерами. Полученный user_style_id передавайте в запросе генерации вместо поля style.
/my/stylesВозвращает ваши кастомные стили с media (preview, assets, examples).
Ответ:
[
{
"id": "5b7e8a1c-...-...",
"owner_user_id": "...",
"name": "my_cool_style",
"display_name_en": "My Cool Style",
"display_name_ru": "Мой стиль",
"positive_prompt": "cinematic portrait, dramatic light",
"negative_prompt": "blurry",
"preview_url": "https://.../preview.jpg?v=...",
"media": {
"previews": { "male": "...", "female": "..." },
"assets": [
{ "name": "ref_portrait.png", "url": "...", "gender": null }
],
"examples": ["https://.../examples/0.jpg?v=..."]
},
"modes": [{ "id": "...", "name": "rerih", "display_name": "Rerih" }],
"is_active": true,
"created_at": "2026-04-22T12:00:00Z",
"updated_at": "2026-04-22T12:00:00Z"
}
]/my/stylesСоздаёт новый стиль. Режимы можно указывать через mode_ids (UUID) или mode_names (слаги).
Тело запроса:
{
"name": "my_cool_style",
"positive_prompt": "cinematic portrait, dramatic light",
"negative_prompt": "blurry, low quality",
"display_name_en": "My Cool Style",
"display_name_ru": "Мой стиль",
"mode_names": ["rerih"]
}Ответ:
{
"id": "5b7e8a1c-...-...",
"name": "my_cool_style",
"positive_prompt": "cinematic portrait, dramatic light",
"negative_prompt": "blurry, low quality",
"preview_url": null,
"media": null,
"modes": [{ "id": "...", "name": "rerih", "display_name": "Rerih" }],
"is_active": true,
"created_at": "...",
"updated_at": "..."
}/my/styles/{id}/previewmultipart/form-data. Поле file — картинка (jpg/png/webp). Опционально gender=male|female для гендерного превью. Повторная загрузка в тот же слот заменяет предыдущую.
curl -X POST https://api.cyberphotobooth.ru/api/my/styles/{id}/preview \
-H "Authorization: Bearer YOUR_API_KEY" \
-F file=@preview.png \
-F gender=male/my/styles/{id}/assetsmultipart/form-data. Имя файла сохраняется как ключ — клиент передаёт его в параметрах генерации. Пара (name, gender) уникальна: один и тот же файл может существовать как common + male + female.
curl -X POST https://api.cyberphotobooth.ru/api/my/styles/{id}/assets \
-H "Authorization: Bearer YOUR_API_KEY" \
-F file=@ref_portrait.png \
-F gender=female/my/styles/{id}/examplesmultipart/form-data. Добавляет картинку в конец галереи стиля. Порядок меняется через POST /my/styles/{id}/examples/reorder.
curl -X POST https://api.cyberphotobooth.ru/api/my/styles/{id}/examples \
-H "Authorization: Bearer YOUR_API_KEY" \
-F file=@example1.jpgimport httpx
import asyncio
async def generate_async():
async with httpx.AsyncClient() as client:
# 1. Submit task
response = await client.post(
"https://api.cyberphotobooth.ru/api/async/submit",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={
"mode": "style_sdxl_zero",
"style": "SteamPunk",
"return_s3_link": False,
"params": {"Sex": "man", "Face": "...", "Fon": "..."}
}
)
job_data = response.json()
job_id = job_data["job_id"]
print(f"Task submitted: {job_id}")
# 2. Wait for result
while True:
await asyncio.sleep(2) # Check every 2 seconds
status_response = await client.get(
f"https://api.cyberphotobooth.ru/api/async/status/{job_id}"
)
result = status_response.json()
status = result.get("status")
if status == "completed":
print("Done!")
images = result["results"]["images"]
return images
elif status == "failed":
print(f"Error: {result.get('error')}")
break
else:
print(f"Status: {status}")
# Run
asyncio.run(generate_async())Поля изображений (например, Face и Fon) передаётся как base64-строку без префикса Data URI (то есть без data:image/png;base64,).
Получите API ключ через Telegram бота и начните интеграцию