Перейти к навигации

Qwen Image 2.1

Создавайте или редактируйте изображение в 1K или 2K по тексту и с использованием до 10 референсных изображений. При необходимости результат можно получить в PNG или WebP с прозрачным фоном.

  • Асинхронная обработка: запрос создания быстро возвращает ID задачи. Изображение будет доступно после её успешного завершения.
  • Одна задача создаёт одно изображение. Для нескольких изображений создайте несколько задач.
  • Генерация по тексту либо редактирование и объединение до 10 референсных изображений по общедоступным HTTPS-ссылкам.
  • Для прозрачного фона задайте background: "transparent" и output_format со значением png или webp. JPEG не поддерживает прозрачность.
  • Переписывание промпта (enhance_prompt) по умолчанию включено для генерации по тексту и выключено для редактирования, если вы не указали иначе.
  • Цена за изображение зависит от resolution — 1K или 2K. Задача, завершившаяся ошибкой, не оплачивается.
POST/v1/images/tasksПопробовать

Открывает модель в API Explorer. Введите свой API-ключ BeatAPI, чтобы создать задачу. Это настоящий запрос: его стоимость спишется с вашего баланса.

Адрес API и авторизация

POST https://api.beatapi.io/v1/images/tasks

Authorization string Обязательно

Передавайте API-ключ BeatAPI как Bearer <BEATAPI_API_KEY>. Создать ключ можно в панели управления. Храните ключи на сервере, а не в коде браузерного или мобильного приложения.

Передавайте тело запроса в JSON с заголовком Content-Type: application/json. Idempotency-Key необязателен. Для каждого логического запроса используйте уникальное значение длиной не более 255 символов и повторно используйте его только для отправки точно такого же тела. В течение 24 часов повтор с тем же ключом и телом возвращает первый ответ с заголовком Idempotent-Replayed: true. Тот же ключ с другим телом возвращает 409 idempotency_conflict. Ответы, отличные от 2xx, не сохраняются, поэтому повтор после 400 или 402 выполняется заново.

Как выполняется запрос

1

Создайте задачу

Отправьте перечисленные ниже параметры методом POST на указанный адрес. Ответ 201 означает, что задача принята, а её стоимость зарезервирована на балансе. Обработка идёт в фоновом режиме. Сохраните data.id.

2

Дождитесь завершения

Вызывайте GET /v1/tasks/{task_id}, выдерживая между вызовами data.poll_after_seconds (5 с для изображений, 8 с для видео), пока status не станет succeeded или failed. Можно также настроить вебхук для событий task.succeeded и task.failed. Сохраняйте опрос как резервный способ проверки: задача, остановленная по тайм-ауту обработки, не отправляет событие.

3

Сохраните результат

При succeeded скачайте файлы по всем ссылкам data.output.media[].url и сохраните нужные результаты у себя. BeatAPI не гарантирует срок доступности этих ссылок. При failed прочитайте data.error_code и data.error_message: зарезервированная сумма возвращена на баланс, а data.retryable показывает, может ли повтор того же запроса завершиться успешно.

Режимы ввода

РежимОбязательные данныеПримечания
Изображение по текстуmodel, promptНе передавайте images.
Редактирование или объединение изображенийmodel, prompt, imagesОт 1 до 10 общедоступных HTTPS-ссылок на изображения. В prompt опишите, что изменить и что сохранить.

Параметры запроса

model string Обязательно

Модель, которую нужно вызвать.

Значение: qwen-image-2.1

Если значение неверно

  • Поле отсутствует: "model" is required
  • Неизвестный ID модели: "model" qwen-image-9 is not catalogued
  • На этот адрес API отправлена видеомодель: "model" seedance-2.5 is served by POST /v1/videos/tasks, not this endpoint

prompt string Обязательно

Что нарисовать либо изменить в референсных изображениях. Лучше писать обычным языком: объект, стиль, освещение, композиция и текст, который должен появиться на изображении.

Длина: 1–5000 символов

  • Длина измеряется в символах. Иероглиф CJK считается одним символом.
  • При передаче images укажите назначение каждого изображения и то, что должно остаться без изменений.
  • При включённом enhance_prompt модель переписывает промпт перед генерацией.

Если значение неверно

  • Поле отсутствует: "prompt" is required
  • Пустое значение или превышена допустимая длина: "prompt" has an unsupported length
  • Значение не является строкой: "prompt" must be a string

images string[] Необязательно

Референсные изображения для редактирования или объединения. Это поле переключает запрос с генерации по тексту на редактирование изображений.

Число элементов: 1–10
Каждый элемент — общедоступная ссылка https://. Если файл находится на вашем устройстве, сначала загрузите его через POST /v1/files, затем передайте полученный data.url.

  • Каждая ссылка должна возвращать сам файл PNG, JPEG или WebP по общедоступному HTTPS, не более 50 MB. До создания задачи шлюз скачивает первые байты по каждой ссылке.
  • Ссылки на веб-страницы, страницы входа, просроченные подписанные ссылки или серверы с защитой от прямого скачивания отклоняются, поскольку не возвращают изображение.
  • Индексы в сообщениях об ошибках начинаются с 0: images[0] — первая ссылка.

Если значение неверно

  • Превышено максимальное число элементов: "images" accepts at most 10 items
  • Пустой массив: "images" requires at least 1 item
  • Ссылка не начинается с https://: "images[0]" must be a public HTTPS URL
  • Закрытый или небезопасный адрес: "images[0]" must be a publicly reachable HTTPS image URL
  • Сервер возвращает ошибку 4xx: "images[0]" could not be downloaded: the URL returned HTTP 404
  • Ссылка возвращает не PNG, JPEG или WebP: "images[0]" is not a PNG, JPEG or WebP image: the URL returned text/html
  • Размер больше 50 MB: "images[2]" is 63.4 MB; images must be 50 MB or smaller

Пример

"images": [
"https://cdn.beatapi.io/samples/smart-bottle.png"
]

aspect_ratio string НеобязательноПо умолчанию: auto

Соотношение ширины и высоты изображения.

Допустимые значения: auto, 1:1, 4:3, 3:4, 3:2, 2:3, 16:9, 9:16, 21:9, 9:21
По умолчанию: auto

  • По умолчанию используется auto. С images результат сохраняет пропорции первого изображения; без images значение auto создаёт 1:1.
  • Чтобы зафиксировать пропорции при редактировании, задайте нужное соотношение сторон вместо auto.

Если значение неверно

  • Значение отсутствует в списке допустимых: "aspect_ratio" must be one of: [auto 1:1 4:3 3:4 3:2 2:3 16:9 9:16 21:9 9:21]

resolution string НеобязательноПо умолчанию: 1K

Класс размера изображения. 2K создаёт большее изображение и стоит дороже 1K.

Допустимые значения: 1K, 2K
По умолчанию: 1K

  • У модели доступны только 1K и 2K; 4K отклоняется. Выберите класс в этом поле: упоминание размера в промпте не меняет тарифный класс.
  • Используйте заглавную K: 2k отклоняется.

Если значение неверно

  • Недопустимое значение, например 4K: "resolution" must be one of: [1K 2K]

background string НеобязательноПо умолчанию: opaque

Нужен ли непрозрачный или прозрачный фон.

Допустимые значения: opaque, transparent
По умолчанию: opaque

  • По умолчанию — opaque. transparent возвращает изображение с альфа-каналом, поэтому требует output_format со значением png или webp.
  • Если передать transparent без output_format, используется стандартный png, и запрос принимается.

Если значение неверно

  • Недопустимое значение, например auto: "background" must be one of: [opaque transparent]
  • transparent вместе с output_format: "jpeg": Qwen Image 2.1 needs output_format png or webp for a transparent background

enhance_prompt boolean Необязательно

Позволяет модели переписать промпт перед генерацией.

  • Если поле не задано, оно включено для генерации по тексту и выключено при передаче images: при переписывании может потеряться указание, что нужно сохранить при редактировании.
  • Передайте true или false, чтобы явно переопределить значение по умолчанию.

Если значение неверно

  • Значение не является логическим, например строка "true": "enhance_prompt" must be a boolean

output_format string НеобязательноПо умолчанию: png

Формат файла результата.

Допустимые значения: png, webp, jpeg
По умолчанию: png

  • BeatAPI конвертирует только между PNG и JPEG. Если модель возвращает другой из этих двух форматов, изображение обычно преобразуется перед сохранением; прозрачные области в JPEG становятся белыми. При ошибке конвертации файл сохраняется как получен. Конвертация в WebP или из него не выполняется.
  • Фактический сохранённый тип всегда указан в output.media[].mime_type. Проверяйте его при запросе webp.
  • Пишите jpeg, а не jpg.

Если значение неверно

  • Недопустимое значение, например jpg: "output_format" must be one of: [png webp jpeg]

seed integer Необязательно

Целое число, передаваемое модели как seed генератора случайных чисел. Для случайного seed не задавайте поле.

Диапазон: 0–2147483647

  • BeatAPI не гарантирует одинаковый результат при одинаковых seed и промпте.

Если значение неверно

  • Число нецелое, отрицательное или больше 2147483647: "seed" is outside its supported range

Перед созданием задачи шлюз также проверяет следующие сочетания параметров:

  • aspect_ratio: auto сохраняет пропорции первого изображения; без изображений создаётся 1:1.
  • enhance_prompt переписывает промпт перед генерацией. Без изображений по умолчанию включён, с изображениями — выключен: при редактировании переписывание может потерять указание, что сохранить.
  • background: transparent требует output_format со значением png или webp.

Ограничения входных материалов

До создания задачи шлюз проверяет каждый входной материал. Если ограничение нарушено, возвращается 400 bad_request с указанием материала. Средства не списываются.

  • Референсные изображения: PNG, JPEG или WebP с определением формата по содержимому, а не имени файла или Content-Type; до 50 MB каждый (десятичные мегабайты; проверяется, если сервер сообщает размер), от 1 до 10 ссылок. GIF, HEIC и SVG отклоняются.
  • Для этой модели ограничения числа пикселей и соотношения сторон не проверяются.
  • Если сервер не ответил вовремя, ссылка не отклоняется при создании. Если скачать её не удастся и позже, задача завершится ошибкой с возвратом средств.
  • Файл находится на вашем устройстве? Загрузите его через POST /v1/files и передайте полученный data.url.

Параметры, которые модель не принимает

API изображений знает несколько полей других моделей. Здесь они не игнорируются, а отклоняются, чтобы вы не платили за настройку без эффекта:

  • quality, size → field "quality" is not supported by model qwen-image-2.1 (с именем переданного поля).
  • Любое другое неизвестное поле, например n → unknown field: n. Поля n нет: одна задача создаёт одно изображение.

Если неверных полей несколько, сообщение указывает только одно. Исправьте его и повторите запрос.

Прозрачные изображения

Передайте "background": "transparent" и output_format со значением png или webp. У JPEG нет альфа-канала, поэтому transparent вместе с jpeg отклоняется при создании, до резервирования средств. Одного упоминания прозрачного фона в промпте недостаточно для установки background.

BeatAPI не конвертирует в WebP или из него. Фактический формат проверяйте в output.media[].mime_type завершённой задачи.

Примеры запросов

curl --request POST \
--url https://api.beatapi.io/v1/images/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "qwen-image-2.1",
"prompt": "A white porcelain crane above misty mountains, ink-wash style, no text"
}'

Изображение по тексту

Изображение в 1K по промпту со значениями по умолчанию: aspect_ratio со значением auto даёт 1:1, переписывание промпта включено.

curl --request POST \
--url https://api.beatapi.io/v1/images/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "qwen-image-2.1",
"prompt": "A white porcelain crane above misty mountains, ink-wash style, no text"
}'

Редактирование одного изображения

Для редактирования переписывание по умолчанию выключено, поэтому указание сохранить бутылку передаётся без изменений. auto сохраняет пропорции референса.

curl --request POST \
--url https://api.beatapi.io/v1/images/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "qwen-image-2.1",
"prompt": "Keep the bottle shape and label exactly as they are. Place it on a pale stone counter under soft morning light.",
"images": [
"https://cdn.beatapi.io/samples/smart-bottle.png"
],
"aspect_ratio": "auto"
}'

Прозрачный WebP

Отдельный объект на прозрачном фоне, в 2K.

curl --request POST \
--url https://api.beatapi.io/v1/images/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "qwen-image-2.1",
"prompt": "A single green glass perfume bottle, isolated, studio lighting, no text",
"resolution": "2K",
"aspect_ratio": "1:1",
"background": "transparent",
"output_format": "webp"
}'

Воспроизводимый запрос

Фиксированный seed с выключенным переписыванием промпта для сравнения небольших изменений текста.

curl --request POST \
--url https://api.beatapi.io/v1/images/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "qwen-image-2.1",
"prompt": "A lighthouse on a cliff at dawn, flat illustration, limited palette",
"aspect_ratio": "3:4",
"enhance_prompt": false,
"seed": 42
}'

Ответы

Создание задачи (201)

Объект задачи. Поле output равно null, пока задача не завершится успешно. Поля с пометкой «во время выполнения» исчезают после завершения задачи.

{
"data": {
"id": "task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ",
"object": "task",
"task_kind": "image",
"capability_id": "qwen-image-2.1",
"capability_version": 1,
"media_type": "image",
"model": "qwen-image-2.1",
"status": "queued",
"stage": "queued",
"created_at": 1791993600,
"updated_at": 1791993600,
"completed_at": null,
"poll_after_seconds": 5,
"output": null,
"usage": {
"credits_reserved": 0.03,
"credits_settled": 0,
"credits_refunded": 0,
"credits_charged": 0.03
},
"request_id": "req_5f0c2a9e4b7d4e31",
"error_code": null,
"error_message": null
}
}
ПолеТипОписание
data.idstringID задачи: префикс task_ и 32 буквы или цифры. Используется для опроса и сопоставления событий вебхука.
data.objectstringВсегда task.
data.task_kindstringimage или video.
data.capability_idstringID модели из вашего запроса.
data.capability_versionintegerВерсия контракта модели, сейчас 1.
data.media_typestringimage или video.
data.modelstringID модели из запроса, совпадает с capability_id.
data.statusstringqueued, processing, succeeded или failed. Только последние два состояния являются конечными.
data.stagestringПовторяет status; сохранено для совместимости со старыми клиентами.
data.created_atintegerВремя создания задачи, в секундах Unix.
data.updated_atintegerВремя последнего изменения, в секундах Unix.
data.completed_atinteger | nullВремя завершения, в секундах Unix. Во время выполнения равно null.
data.poll_after_secondsintegerВо время выполнения: сколько секунд ждать перед следующей проверкой (5 для изображений, 8 для видео).
data.typical_secondsobjectВо время выполнения, при достаточном числе недавних задач: время завершения p50 и p90 в секундах за последний период window, рассчитанное по samples задачам.
data.outputobject | nullРезультат. Равно null, пока status не станет succeeded. Поля результата описаны ниже.
data.usage.credits_reservednumberСумма USD, зарезервированная на балансе при создании задачи.
data.usage.credits_chargednumberСтоимость задачи в USD; 0, если задача завершилась ошибкой.
data.usage.credits_settlednumberОкончательно списанная сумма USD. Устанавливается после успешного завершения, иначе 0.
data.usage.credits_refundednumberСумма USD, возвращённая на баланс. После регистрации возврата по неудачной задаче равна зарезервированной сумме.
data.usage.billable_duration_secondsintegerТолько для видео: длительность в секундах, по которой рассчитана цена. Отсутствует, если модель не сообщает длительность.
data.request_idstringID запроса. Укажите его при обращении в поддержку.
data.error_codestring | nullКод ошибки; null, если задача не завершилась ошибкой.
data.error_messagestring | nullОписание проблемы и способа её исправить; null, если задача не завершилась ошибкой.

Успешно завершённая задача

GET /v1/tasks/{task_id} возвращает HTTP 200 со status: "succeeded" и результатом в data.output.

{
"data": {
"id": "task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ",
"object": "task",
"task_kind": "image",
"capability_id": "qwen-image-2.1",
"capability_version": 1,
"media_type": "image",
"model": "qwen-image-2.1",
"status": "succeeded",
"stage": "succeeded",
"created_at": 1791993600,
"updated_at": 1791993690,
"completed_at": 1791993690,
"output": {
"media": [
{
"type": "image",
"url": "https://media.beatapi.io/outputs/task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ/0.png",
"mime_type": "image/png"
}
],
"r2_url": "https://media.beatapi.io/outputs/task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ/0.png"
},
"usage": {
"credits_reserved": 0.03,
"credits_settled": 0.03,
"credits_refunded": 0,
"credits_charged": 0.03
},
"request_id": "req_5f0c2a9e4b7d4e31",
"error_code": null,
"error_message": null
}
}

Поля результата

ПолеТипОписание
output.mediaobject[]Созданные файлы. Для этой модели — один элемент.
output.media[].typestringВсегда image.
output.media[].urlstringHTTPS-ссылка на сохранённое изображение. Скачайте его и храните у себя: срок доступности ссылки не гарантируется.
output.media[].mime_typestringСохранённый тип файла: image/png, image/jpeg или image/webp, обычно соответствующий output_format.
output.r2_urlstringПовтор первой ссылки на материал для старых клиентов. Вместо этого используйте media.

Задача, завершившаяся ошибкой

Если задача завершилась ошибкой, GET /v1/tasks/{task_id} всё равно возвращает HTTP 200: сведения об ошибке находятся в теле ответа. Зарезервированная сумма возвращается полностью, поэтому списания нет.

{
"data": {
"id": "task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ",
"object": "task",
"task_kind": "image",
"capability_id": "qwen-image-2.1",
"capability_version": 1,
"media_type": "image",
"model": "qwen-image-2.1",
"status": "failed",
"stage": "failed",
"created_at": 1791993600,
"updated_at": 1791993690,
"completed_at": 1791993690,
"output": null,
"usage": {
"credits_reserved": 0.03,
"credits_settled": 0,
"credits_refunded": 0.03,
"credits_charged": 0
},
"retryable": true,
"request_id": "req_5f0c2a9e4b7d4e31",
"error_code": "processing_failed",
"error_message": "The task failed during processing on our side. Retry; a failed task is refunded."
}
}
ПолеТипОписание
data.error_codestringbad_request или content_policy_violation означают, что запрос нужно изменить. При processing_unavailable, processing_timeout, processing_failed или result_transfer_failed можно повторить позже. См. ошибки.
data.error_messagestringСообщение с причиной ошибки и рекомендацией по исправлению.
data.retryablebooleanПрисутствует только у неудачной задачи. Значение true означает, что повтор того же запроса может завершиться успешно.
data.usageobjectПосле регистрации возврата (обычно сразу при ошибке): credits_charged и credits_settled равны 0, а credits_refunded равно credits_reserved.

Полный пример

Создайте задачу, дождитесь её завершения с интервалом опроса, указанным сервером, и выведите ссылки на результаты. Задайте BEATAPI_API_KEY в переменной окружения и установите requests.

import os
import time
import uuid
import requests
API = "https://api.beatapi.io"
HEADERS = {"Authorization": f"Bearer {os.environ['BEATAPI_API_KEY']}"}
def create_task(body: dict) -> dict:
# One Idempotency-Key per logical request: a retry with the same key cannot create a second task.
headers = {**HEADERS, "Idempotency-Key": str(uuid.uuid4())}
for attempt in range(3):
response = requests.post(f"{API}/v1/images/tasks", headers=headers, json=body, timeout=60)
if response.status_code in (429, 503) and attempt < 2:
time.sleep(int(response.headers.get("Retry-After", 10)))
continue
break
try:
payload = response.json()
except ValueError: # an edge error page is not JSON
response.raise_for_status()
raise
if not response.ok:
error = payload["error"]
raise RuntimeError(f"{response.status_code} {error['code']}: {error['message']} (request_id={error.get('request_id')})")
return payload["data"]
def wait_for_task(task_id: str, timeout_seconds: int = 1800) -> dict:
deadline = time.monotonic() + timeout_seconds
while time.monotonic() < deadline:
response = requests.get(f"{API}/v1/tasks/{task_id}", headers=HEADERS, timeout=30)
if response.status_code == 429 or response.status_code >= 500:
time.sleep(int(response.headers.get("Retry-After", 10)))
continue
response.raise_for_status()
task = response.json()["data"]
if task["status"] in ("succeeded", "failed"):
return task
time.sleep(task.get("poll_after_seconds", 5))
raise TimeoutError(f"task {task_id} is still running; keep polling later")
task = create_task({
"model": "qwen-image-2.1",
"prompt": "A white porcelain crane above misty mountains, ink-wash style, no text"
})
print("created", task["id"])
task = wait_for_task(task["id"])
if task["status"] == "failed":
raise SystemExit(f"{task['error_code']}: {task['error_message']}")
for item in task["output"]["media"]:
print(item["url"])

Оплата

  • Одна задача создаёт одно изображение с ценой по resolution, см. таблицу ниже. В прайс-листе отдельная строка для каждого разрешения, без доплаты за референсные изображения, прозрачность или переписывание промпта.
  • Стоимость резервируется при создании задачи на балансе и в лимите ключа, если он установлен. Запрос, отклонённый до создания задачи, не оплачивается.
  • При успешном завершении резерв списывается. При ошибке возвращается полностью: credits_refunded равно credits_reserved, а credits_charged и credits_settled равны 0.

Текущие базовые цены совпадают с указанными на странице цен. Если для аккаунта согласована скидка, стоимость будет ниже. Фактически списанная сумма всегда указана в data.usage задачи.

ВариантБазовая цена (USD)
1 изображение · 1K$0.03
1 изображение · 2K$0.06

Частые ошибки

Ошибка или признак проблемыПричинаЧто делать
400 Qwen Image 2.1 needs output_format png or webp for a transparent backgroundbackground: "transparent" вместе с output_format: "jpeg".Используйте png или webp либо не задавайте output_format.
400 "resolution" must be one of: [1K 2K]Передано 4K или строчное 2k.Передайте 1K или 2K.
400 "seed" is outside its supported rangeПередано отрицательное число, например -1 для случайного seed, дробное число, строка либо значение больше 2147483647.Передайте целое число от 0 до 2147483647 либо не задавайте seed для случайного значения.
400 "enhance_prompt" must be a booleanСтрока "true" или "false" вместо логического значения JSON.Передайте true или false без кавычек.
400 "background" must be one of: [opaque transparent]Для Qwen Image 2.1 передано auto или другое значение.Передайте opaque или transparent.
400 field "quality" is not supported by model qwen-image-2.1Передан параметр другой модели изображений: quality или size.Удалите этот параметр.
400 unknown field: nЗапрошено несколько изображений в одной задаче.Удалите n и создайте отдельную задачу на каждое изображение.
400 "images[1]" is not a PNG, JPEG or WebP image: the URL returned text/htmlВместо файла ссылка открывает веб-страницу, страницу входа или просроченный подписанный URL.Укажите прямую ссылку на файл изображения.
400 "images[0]" could not be downloaded: the URL returned HTTP 403Сервер блокирует скачивание с других серверов: защита от прямых ссылок или закрытое хранилище.Откройте публичный доступ к файлу либо загрузите его через POST /v1/files.
400 aspect_ratio "21:9" is not available for this model right now; available: …Сейчас ни один доступный маршрут этой модели не принимает такое сочетание параметров.Используйте значение из списка либо повторите позже.
Результат генерации по тексту квадратный, хотя aspect_ratio не заданоЗначение по умолчанию auto создаёт 1:1, если нет референсного изображения.Задайте нужное соотношение сторон, например 16:9.
При редактировании потерялись детали, которые промпт требовал сохранитьПередано enhance_prompt: true, поэтому промпт был переписан перед генерацией.Не задавайте enhance_prompt, чтобы для редактирования он был выключен по умолчанию, либо передайте false.
Задача failed с content_policy_violationПромпт, референсное или созданное изображение отклонены модерацией.Измените промпт или изображение. Повтор без изменений снова завершится ошибкой; средства не списаны.
Задача failed с processing_timeoutГенерация изображения не завершилась за отведённое время.Повторите запрос: за неудачную задачу средства возвращены.
403 forbidden на аккаунте без пополненийБонус можно использовать только с некоторыми моделями.Пополните баланс один раз либо выберите модель, доступную за счёт бонуса.

Краткий справочник HTTP-ошибок

Ошибки до создания задачи возвращаются с HTTP-статусом, отличным от 2xx, без списания средств. Обрабатывайте error.code или error.retryable; причина указана в message. Полный список и правила повторов приведены в разделе ошибок.

{
"error": {
"code": "bad_request",
"message": "\"prompt\" is required",
"retryable": false,
"request_id": "req_5f0c2a9e4b7d4e31"
}
}
HTTP-статусerror.codeЧто делать
400bad_request, content_policy_violationИсправьте запрос: поле указано в сообщении. Не повторяйте запрос без изменений.
401missing_api_key, invalid_api_key (старые клиенты могут показывать unauthorized)Передайте действующий ключ в Authorization: Bearer <key>.
402insufficient_creditsПополните баланс или увеличьте лимит ключа, затем повторите запрос.
403forbiddenМодель недоступна для ключа или аккаунта; например, бонус можно использовать только с некоторыми моделями. Не повторяйте запрос без изменений.
404not_foundДля GET /v1/tasks/{task_id}: у аккаунта этого ключа нет такой задачи. Проверьте ID.
409idempotency_conflictИспользуйте новый Idempotency-Key или дождитесь завершения первого запроса с этим ключом.
429rate_limit_exceededПодождите число секунд из Retry-After (оно также указано в error.retry_after_seconds), затем повторите запрос.
500internal_errorПовторите запрос с увеличивающейся задержкой. Если ошибка сохраняется, обратитесь в поддержку и укажите request_id.
503processing_unavailable, processing_timeout, processing_failed, result_transfer_failedСредства не списаны. Повторите запрос с экспоненциальным увеличением задержки.

Аутентификация

AuthorizationBearer

Передавайте API-ключ в виде Authorization: Bearer <BEATAPI_API_KEY>.

Заголовки

Idempotency-KeystringОпциональный<=255 characters

Передавайте тело запроса в JSON с заголовком Content-Type: application/json. Idempotency-Key необязателен. Для каждого логического запроса используйте уникальное значение длиной не более 255 символов и повторно используйте его только для отправки точно такого же тела. В течение 24 часов повтор с тем же ключом и телом возвращает первый ответ с заголовком Idempotent-Replayed: true. Тот же ключ с другим телом возвращает 409 idempotency_conflict. Ответы, отличные от 2xx, не сохраняются, поэтому повтор после 400 или 402 выполняется заново.

Запрос

This endpoint expects an object.
modelenumОбязательный

Модель, которую нужно вызвать.

Значение: qwen-image-2.1

Если значение неверно

  • Поле отсутствует: "model" is required
  • Неизвестный ID модели: "model" qwen-image-9 is not catalogued
  • На этот адрес API отправлена видеомодель: "model" seedance-2.5 is served by POST /v1/videos/tasks, not this endpoint
Допустимые значения:
promptstringОбязательный1-5000 characters

Что нарисовать либо изменить в референсных изображениях. Лучше писать обычным языком: объект, стиль, освещение, композиция и текст, который должен появиться на изображении.

Длина: 1–5000 символов

  • Длина измеряется в символах. Иероглиф CJK считается одним символом.
  • При передаче images укажите назначение каждого изображения и то, что должно остаться без изменений.
  • При включённом enhance_prompt модель переписывает промпт перед генерацией.

Если значение неверно

  • Поле отсутствует: "prompt" is required
  • Пустое значение или превышена допустимая длина: "prompt" has an unsupported length
  • Значение не является строкой: "prompt" must be a string
aspect_ratioenumОпциональныйПо умолчанию auto

Соотношение ширины и высоты изображения.

Допустимые значения: auto, 1:1, 4:3, 3:4, 3:2, 2:3, 16:9, 9:16, 21:9, 9:21

По умолчанию: auto

  • По умолчанию используется auto. С images результат сохраняет пропорции первого изображения; без images значение auto создаёт 1:1.
  • Чтобы зафиксировать пропорции при редактировании, задайте нужное соотношение сторон вместо auto.

Если значение неверно

  • Значение отсутствует в списке допустимых: "aspect_ratio" must be one of: [auto 1:1 4:3 3:4 3:2 2:3 16:9 9:16 21:9 9:21]
backgroundenumОпциональныйПо умолчанию opaque

Нужен ли непрозрачный или прозрачный фон.

Допустимые значения: opaque, transparent

По умолчанию: opaque

  • По умолчанию — opaque. transparent возвращает изображение с альфа-каналом, поэтому требует output_format со значением png или webp.
  • Если передать transparent без output_format, используется стандартный png, и запрос принимается.

Если значение неверно

  • Недопустимое значение, например auto: "background" must be one of: [opaque transparent]
  • transparent вместе с output_format: "jpeg": Qwen Image 2.1 needs output_format png or webp for a transparent background
Допустимые значения:
enhance_promptbooleanОпциональный

Позволяет модели переписать промпт перед генерацией.

  • Если поле не задано, оно включено для генерации по тексту и выключено при передаче images: при переписывании может потеряться указание, что нужно сохранить при редактировании.
  • Передайте true или false, чтобы явно переопределить значение по умолчанию.

Если значение неверно

  • Значение не является логическим, например строка "true": "enhance_prompt" must be a boolean
imageslist of stringsОпциональный

Референсные изображения для редактирования или объединения. Это поле переключает запрос с генерации по тексту на редактирование изображений.

Число элементов: 1–10

Каждый элемент — общедоступная ссылка https://. Если файл находится на вашем устройстве, сначала загрузите его через POST /v1/files, затем передайте полученный data.url.

  • Каждая ссылка должна возвращать сам файл PNG, JPEG или WebP по общедоступному HTTPS, не более 50 MB. До создания задачи шлюз скачивает первые байты по каждой ссылке.
  • Ссылки на веб-страницы, страницы входа, просроченные подписанные ссылки или серверы с защитой от прямого скачивания отклоняются, поскольку не возвращают изображение.
  • Индексы в сообщениях об ошибках начинаются с 0: images[0] — первая ссылка.

Если значение неверно

  • Превышено максимальное число элементов: "images" accepts at most 10 items
  • Пустой массив: "images" requires at least 1 item
  • Ссылка не начинается с https://: "images[0]" must be a public HTTPS URL
  • Закрытый или небезопасный адрес: "images[0]" must be a publicly reachable HTTPS image URL
  • Сервер возвращает ошибку 4xx: "images[0]" could not be downloaded: the URL returned HTTP 404
  • Ссылка возвращает не PNG, JPEG или WebP: "images[0]" is not a PNG, JPEG or WebP image: the URL returned text/html
  • Размер больше 50 MB: "images[2]" is 63.4 MB; images must be 50 MB or smaller

Пример

"images": [
  "https://cdn.beatapi.io/samples/smart-bottle.png"
]
output_formatenumОпциональныйПо умолчанию png

Формат файла результата.

Допустимые значения: png, webp, jpeg

По умолчанию: png

  • BeatAPI конвертирует только между PNG и JPEG. Если модель возвращает другой из этих двух форматов, изображение обычно преобразуется перед сохранением; прозрачные области в JPEG становятся белыми. При ошибке конвертации файл сохраняется как получен. Конвертация в WebP или из него не выполняется.
  • Фактический сохранённый тип всегда указан в output.media[].mime_type. Проверяйте его при запросе webp.
  • Пишите jpeg, а не jpg.

Если значение неверно

  • Недопустимое значение, например jpg: "output_format" must be one of: [png webp jpeg]
Допустимые значения:
resolutionenumОпциональныйПо умолчанию 1K

Класс размера изображения. 2K создаёт большее изображение и стоит дороже 1K.

Допустимые значения: 1K, 2K

По умолчанию: 1K

  • У модели доступны только 1K и 2K; 4K отклоняется. Выберите класс в этом поле: упоминание размера в промпте не меняет тарифный класс.
  • Используйте заглавную K: 2k отклоняется.

Если значение неверно

  • Недопустимое значение, например 4K: "resolution" must be one of: [1K 2K]
Допустимые значения:
seedintegerОпциональный0-2147483647

Целое число, передаваемое модели как seed генератора случайных чисел. Для случайного seed не задавайте поле.

Диапазон: 0–2147483647

  • BeatAPI не гарантирует одинаковый результат при одинаковых seed и промпте.

Если значение неверно

  • Число нецелое, отрицательное или больше 2147483647: "seed" is outside its supported range

Ответ

Объект задачи. Поле output равно null, пока задача не завершится успешно. Поля с пометкой «во время выполнения» исчезают после завершения задачи.

Ошибки

400
Bad Request Error
401
Unauthorized Error
402
Payment Required Error
403
Forbidden Error
409
Conflict Error
429
Too Many Requests Error
500
Internal Server Error
503
Service Unavailable Error