Генерация изображений
OpenRouter- и OpenAI-совместимый Images API, параметры запросов и обработка ответов
Для image-only моделей используйте отдельный Images API. По умолчанию генерация выполняется синхронно, а готовое изображение возвращается как base64 в поле data[].b64_json.
Endpoint
/v1/imagesКанонический OpenRouter-совместимый путь
/v1/images/modelsOpenRouter-совместимый каталог image-моделей
/v1/images/generationsOpenAI-совместимый путь
/images/generationsСовместимый путь без префикса /v1
/imagesOpenRouter-совместимый путь без префикса /v1
gateway:write или admin:*. Если у ключа задан allowlist моделей, добавьте в него точный ID image-модели.Для долгой генерации используйте асинхронный режим: ответ 202, опрос задания и отдельное скачивание. Без Prefer: respond-async контракт не меняется.
Пример синхронного запроса
Параметры
modelreqpromptreqnsizeaspect_ratioresponse_formatseedqualityДополнительно поддерживаются resolution, output_format, background, output_compression, moderation, input_references и provider. Конкретные возможности зависят от выбранной модели.
Формат ответа
b64_json или не передавайте response_format — результат всё равно придёт в base64.Асинхронная генерация: 202 → polling → результат
Для долгих запросов добавьте Prefer: respond-async. Сервер сохранит задание и вернёт 202 Accepted с JSON, а не готовый результат. Клиент должен опрашивать статус и скачивать результат после завершения. Закрытие соединения не отменяет сохранённое задание.
Пример использует Bash, curl и jq. Выберите доступную вашему ключу модель; для речи также проверьте голос через /v1/audio/voices. Сохраните Idempotency-Key и тело запроса до отправки. Для нового намеренного задания задайте новый ключ; для повтора того же запроса оставьте прежний.
Ответ содержит id, status, polling_url, expires_at и request_id; content_url появляется при completed. Заголовки ответа: Location, Retry-After, Preference-Applied: respond-async и X-KodikRouter-Request-Id.
/v1/media/jobs/{id}Статус задания; используйте тот же API-ключ, что и при отправке
/v1/media/jobs/{id}/contentГотовый результат: JSON изображения или аудиобайты речи
Выполните следующий блок после получения job-id.txt. При временном сбое повторяйте этот блок с сохранённым ID, а не создавайте новое задание. При 429 соблюдайте Retry-After.
queued — в очереди; running — генерация; billing_pending / billing — ожидание или обработка стоимости; completed — результат доступен. В billing_pending звук уже может быть сохранён: сервер повторяет получение стоимости, не синтез. failed означает отказ, а needs_reconciliation — неизвестный исход платного запроса: обратитесь в поддержку с ID задания и request_id, не запускайте генерацию автоматически повторно.
Дневной или месячный лимит расходов блокирует новые генерации (402), но не polling и скачивание уже оплаченного результата. Ключ должен оставаться активным и неистёкшим; scope gateway:write, доступ к модели и rate limit продолжают действовать. Другой ключ не получает доступ к заданию. Повторные GET не запускают генерацию и не списывают стоимость задания снова. Async не отменяет сетевые таймауты скачивания больших файлов.
Типовые ошибки
Model must use the 'images' API surfaceImage-only модель отправлена в /chat/completions. Отправьте image-модель в /images/generations, а для /chat/completions используйте модель с API surface chat.
Not FoundПроверьте Base URL: он должен быть ровно https://api.kodikrouter.ru/v1. Полный путь вручную в это поле добавлять не нужно.
Server Connection ErrorПовторите запрос через cURL и проверьте сетевую доступность API. Убедитесь, что у ключа есть scope gateway:write, модель разрешена allowlist-ом, а на балансе достаточно средств.
