Задачи и результаты
Генерация видео, изображений и музыки асинхронная: вы создаёте задачу, а результат забираете, когда она готова.
Жизненный цикл задачи
Задача создаётся запросом POST /v1/tasks и проходит такие статусы:
queued- Задача принята и ждёт очереди у модели. Цена уже списана.
processing- Модель генерирует результат.
completed- Готово: ссылки на файлы — в поле output.
failed- Генерация не удалась: причина — в поле
error, деньги автоматически возвращены на баланс (price.refunded: true).
completed и failed — конечные статусы, дальше задача не меняется. Не все модели сообщают отдельный этап генерации, поэтому статус может сразу смениться с queued на completed — ориентируйтесь на конечные статусы. Изображения обычно готовы за 10–60 секунд, видео — за 1–10 минут, в зависимости от модели, длительности и разрешения.
Объект задачи
Один и тот же объект возвращают POST /v1/tasks, GET /v1/tasks/{id}, список задач и вебхук.
{
"id": "7e70388cf461f88d7149b1077e4ad098",
"object": "task",
"model": "kling-3.0",
"status": "completed",
"output": {
"urls": [
"https://tempfile.aiquickdraw.com/…/video.mp4"
],
"files": [
{
"url": "https://tempfile.aiquickdraw.com/…/video.mp4",
"kind": "video"
}
]
},
"error": null,
"price": {
"amount": "29.400000",
"currency": "RUB",
"refunded": false
},
"created_at": "2026-10-15T09:12:04.512Z",
"started_at": "2026-10-15T09:12:04.880Z",
"completed_at": "2026-10-15T09:14:47.203Z"
}idstringobjectstringtask.modelstringstatusstringoutputobject | nullerrorobject | nullcode и message — причина ошибки. Иначе null.priceobjectamount — списанная сумма (строка, 6 знаков после точки), currency — RUB, refunded — вернули ли деньги.created_atstringstarted_atstring | nullcompleted_atstring | nullРезультат и файлы
У готовой задачи в output.files — список файлов: url и kind (image, video, audio или file). В output.urls — те же ссылки простым списком. У моделей, которые возвращают несколько файлов (например, Suno — два трека), в списке больше одного элемента.
Опрос статуса
Запрашивайте GET /v1/tasks/{id}, пока статус не станет конечным. Разумная пауза между запросами: 3–5 секунд для изображений, 10–15 секунд для видео.
import os
import time
import requests
API = "https://api.apigrid.cloud/v1"
HEADERS = {"Authorization": f"Bearer {os.environ['APIGRID_KEY']}"}
def wait_task(task_id: str, every: float = 10, timeout: float = 900) -> dict:
"""Ждёт завершения задачи и возвращает её. every — пауза между запросами, с."""
deadline = time.monotonic() + timeout
while time.monotonic() < deadline:
task = requests.get(f"{API}/tasks/{task_id}", headers=HEADERS, timeout=30).json()
if task["status"] in ("completed", "failed"):
return task
time.sleep(every)
raise TimeoutError(f"Задача {task_id} не завершилась за {timeout} с")Повтор без дублей
Если ответ на POST /v1/tasks не дошёл (обрыв сети, таймаут), повторять запрос опасно — можно создать и оплатить две задачи. Чтобы этого не случилось, передайте заголовок Idempotency-Key — любую уникальную строку до 200 символов, например UUID:
curl -X POST https://api.apigrid.cloud/v1/tasks \
-H "Authorization: Bearer $APIGRID_KEY" \
-H "Idempotency-Key: order-1842-cover" \
-H "Content-Type: application/json" \
-d '{
"model": "nano-banana-2",
"input": {
"prompt": "Обложка для заказа №1842"
}
}'Повторный запрос с тем же ключом вернёт уже созданную задачу и ничего не спишет. Ключ действует для вашего аккаунта; для новой задачи используйте новый.
Список задач
GET /v1/tasks возвращает задачи аккаунта, новые сверху. limit — сколько вернуть (1–100, по умолчанию 20), before — вернуть задачи, созданные раньше этого времени (ISO 8601). Чтобы получить следующую страницу, передайте в before значение created_at последней задачи. Пока has_more равно true, есть ещё задачи.
curl https://api.apigrid.cloud/v1/tasks?limit=20 \
-H "Authorization: Bearer $APIGRID_KEY"{
"object": "list",
"data": [
{
"id": "7e70388cf461f88d7149b1077e4ad098",
"object": "task",
"model": "kling-3.0",
"status": "completed",
"…": "…"
}
],
"has_more": false
}В списке только задачи на генерацию медиа. Запросы к текстовым моделям видны в кабинете, на странице Задачи.