На главную
REST API

API Документация

Асинхронное API для генерации изображений

Полное руководство по интеграции с CyberPhotoBooth API

Описание

Async API позволяет отправлять задачи на генерацию в очередь и получать результаты позже, избегая долгих ожиданий и таймаутов.

Базовый URL
https://api.cyberphotobooth.ru/api
Аутентификация

Для доступа к API необходим API ключ. Получите его через Telegram бота

Заголовок авторизации:

Authorization: Bearer YOUR_API_KEY
Эндпоинты
POST/async/submit

1. Отправка задачи

Отправляет задачу на генерацию в очередь

Поле 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
}
GET/async/status/{job_id}

2. Проверка статуса

Проверяет статус задачи и возвращает результат

Возможные статусы:

queuedв очереди
processingобрабатывается
completedготово
failedошибка
not_foundне найдено / истекло

Успешный результат:

{
  "job_id": "uuid",
  "status": "completed",
  "processing_time_ms": 15000,
  "results": {
    "images": ["base64_image_1", "base64_image_2"],
    "videos": []
  }
}
GET/public/styles

3. Получение списка стилей

Публичный список стилей (без аутентификации). Возвращает полную информацию: название, 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.

В запросе генерации используйте поле user_style_id (UUID) вместо style. Workflow-ассеты не подставляются автоматически — передавайте их в параметрах генерации.
GET/my/styles

4. Список ваших стилей

Возвращает ваши кастомные стили с 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"
  }
]
POST/my/styles

5. Создание стиля

Создаёт новый стиль. Режимы можно указывать через 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": "..."
}
POST/my/styles/{id}/preview

6. Загрузка превью

multipart/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
POST/my/styles/{id}/assets

7. Загрузка ассета воркфлоу

multipart/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
POST/my/styles/{id}/examples

8. Примеры (showcase)

multipart/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.jpg
Пример кода (Python)Python
import 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 бота и начните интеграцию