Джобы и результаты

.md

Жизненный цикл асинхронных задач — статусы queued/in_progress/completed/failed, опрос GET /v1/jobs/{id}, подписанные ссылки на файлы, хранение ~24 часа.

Картинки и видео создаются асинхронно: POST .../generations сразу возвращает джобу, а результат появляется в ней позже.

Статусы

queued → in_progress → completed
                      ↘ failed
Статус Значение
queued Принята, ждёт обработки
in_progress Генерируется у провайдера
completed Готово — ссылка в data[0].url
failed Не получилось — причина в error.code, резерв кредитов возвращён

Опрос

GET /v1/jobs/{id}
curl https://api.souz.ai/v1/jobs/job_a1b2c3 \
  -H "Authorization: Bearer sk-souz-..."

Ответ — всегда полный объект джобы:

{
  "id": "job_a1b2c3",
  "object": "image",
  "model": "souz/nano-banana-pro",
  "status": "completed",
  "price": 20,
  "created_at": 1781250000,
  "data": [{ "url": "https://api.souz.ai/v1/files/res_....png?exp=...&sig=..." }]
}

При failed вместо data приходит error:

{ "status": "failed", "error": { "code": "content_blocked", "message": "content_blocked", "type": "content_blocked" } }

Рекомендуемая частота опроса: картинки — раз в 2–5 сек, видео — раз в 5–10 сек. Чтобы не опрашивать вовсе — используй вебхуки.

Файлы результатов

data[0].urlподписанная ссылка (?exp=...&sig=...): её можно открывать в браузере и отдавать куда угодно без API-ключа, пока не истекла подпись. Если подпись истекла — просто запроси джобу ещё раз, получишь свежую ссылку.

Хранение — около 24 часов. Потом файл удаляется, и ссылка вернёт:

HTTP 410 Gone
{ "error": { "code": "file_expired", "message": "file has expired: generated files are kept for ~24 hours — download results right after completion, or generate again" } }

Поэтому правило простое: скачивай результат сразу после completed и храни у себя.

Идемпотентность

Передай заголовок Idempotency-Key: <твой-уникальный-id> при создании джобы — повторный запрос с тем же ключом вернёт ту же джобу, а не создаст (и не оплатит) новую. Полезно при ретраях по таймауту.

curl https://api.souz.ai/v1/images/generations \
  -H "Authorization: Bearer sk-souz-..." \
  -H "Idempotency-Key: order-42-avatar" \
  -H "Content-Type: application/json" \
  -d '{ "model": "souz/nano-banana", "prompt": "..." }'

Дедлайн

Если генерация зависла у провайдера — джоба автоматически помечается failed и кредиты возвращаются. Потолки с запасом: картинки — 15 минут, видео — 90 минут (реальные генерации укладываются в разы быстрее; долгие, но живые генерации не обрубаются). Бесконечного queued не бывает.