Неудачный запрос бесплатен: как устроена оплата за картинку
Деньги за картинку списываются при приёме запроса и возвращаются на баланс сами, если картинки нет. Как это видно в ответе API и в кабинете.
Редакция RendergridО редакции
Коротко
Цена картинки списывается с баланса, когда запрос принят. Если картинки не получилось, сумма возвращается на баланс сама — ничего просить не нужно. Это верно и для сбоя сервиса, и для отказа по правилам содержания. Запрос, отклонённый до приёма, ничего не списывает. Возврат видно в ответе API, в журнале операций и в аналитике личного кабинета.
Когда деньги списываются и когда возвращаются?
Сумма списывается при приёме запроса, до начала работы, и приходит в поле cost ответа 202. Для Nano Banana 2.1 в 2K это $0,03. Цены проверены . Ответ 202 значит «запрос принят», а не «картинка готова».
Если картинка не получилась, списание возвращается само: неудачный запрос бесплатен, сумма сразу возвращается на баланс.
Все три картинки в статье — обычные успешные результаты: у неудачного запроса картинки нет, показывать нечего.
Промпт этой картинки
Предметная фотография: один янтарный стеклянный флакон с гладкой чёрной крышкой стоит на низком круглом постаменте из светлого камня. Флакон по центру, полностью виден, вокруг много воздуха. Матовый бежевый фон и мягкий свет слева, тонкий блик на стекле. Без надписей, логотипов, людей и водяных знаков.
Nano Banana 2.1
nano-banana-2.1 · 2K · 1:1 · $0,03
Nano Banana 2.1, 2K, 1:1, одна попытка. Флакон виден целиком, вокруг много свободного места, фон матовый бежевый. Блик на стекле слабый: стекло выглядит почти сплошь тёмным. По форме это цилиндрическая банка с крышкой во всю ширину, а не флакон с узким горлышком. Надписей и логотипов нет.
Какие запросы ничего не списывают?
Возврат нужен только там, где деньги уже взяты.
- Запрос не принят. Ответ приходит до списания, баланс не меняется:
400 ERR_INVALID_REQUEST(например, пустой промпт или разрешение, которого нет у модели),422 ERR_INPUT_FETCH_FAILED, когда образец не удалось скачать, и503сoverloadedвdetails.reason. - Запрос принят, картинки нет. Списание уже прошло, задание получает статус
failed, сумма возвращается сама. - Сбой сервиса. При
500 ERR_GENERATION_FAILEDсписанная сумма возвращается сама. То же сказано проERR_INTERNAL, если запрос ничего не создал, и про503сprovider_unavailable, если деньги списывали.
Новая попытка после failed — отдельный запрос с новым ключом повтора: прежний ключ задание не перезапустит. Она оплачивается как обычно и возвращается, если и она не удалась. Ключ повтора описан в документации: повтор без двойного списания.
Как это видно в ответе API?
Принятый запрос и итог задания — два разных ответа. Сначала приходит 202 с полями id, status, task_id и cost; результат вы забираете запросом GET /creations/{id} или вебхуком.
{
"id": "5b0214ae-9e39-460a-820a-f6ae3e24400b",
"status": "queued",
"task_id": "5b0214ae-9e39-460a-820a-f6ae3e24400b",
"cost": 0.03
}
{
"id": "5b0214ae-9e39-460a-820a-f6ae3e24400b",
"status": "failed",
"error": "The image or prompt was rejected by the safety filter. Try a different image or rephrase the prompt.",
"failure": {
"type": "declined",
"code": "content_policy",
"retryable": false
}
}
Если картинки нет, GET /creations/{id} отвечает 200 со статусом failed: это итог задания, а не ошибка запроса статуса. Текст error — для показа, на английском. Логику стройте по объекту failure: тип declined значит, что причина в самом запросе и тот же запрос даст тот же результат, а тип error — что причина на стороне сервиса и запрос можно отправить снова, если retryable не равен false. Деньги возвращаются при обоих типах. Тот же объект failure приходит в вебхуке creation.failed.
В коде это выглядит так:
CREATION_ID="5b0214ae-9e39-460a-820a-f6ae3e24400b" curl --fail-with-body --max-time 20 \ "https://api.rendergrid.io/ api/ public/ v1/ creations/ $CREATION_ID" \ -H "Authorization: Bearer $RENDERGRID_API_KEY"
import os import requests API = "https://api.rendergrid.io/ api/ public/ v1" KEY = os.environ["RENDERGRID_API_KEY"] creation_id = "5b0214ae-9e39-460a-820a-f6ae3e24400b" response = requests.get( f"{API}/creations/{creation_id}", headers={"Authorization": f"Bearer {KEY}"}, timeout=(5, 20), ) response.raise_for_status() creation = response.json() if creation["status"] == "failed": # failure может отсутствовать, поэтому читаем его осторожно failure = creation.get("failure") or {} print(failure.get("type"), failure.get("code"), failure.get("retryable"))
// Node.js 22+, файл .mjs const API = "https://api.rendergrid.io/ api/ public/ v1"; const id = "5b0214ae-9e39-460a-820a-f6ae3e24400b"; const key = process.env.RENDERGRID_API_KEY; const response = await fetch(`${API}/creations/${id}`, { headers: { Authorization: `Bearer ${key}` }, signal: AbortSignal.timeout(20_000), }); if (!response.ok) { const body = await response.text(); throw new Error(`HTTP ${response.status}: ${body}`); } const creation = await response.json(); if (creation.status === "failed") { const { type, code, retryable } = creation.failure ?? {}; console.log(type, code, retryable); }
Промпт этой картинки
Два керамических флакона с дозаторами, один белый, другой песочный, стоят на соседних невысоких блоках. Дозаторы повёрнуты в одну сторону. Ракурс три четверти, светлый фон, мягкие раздельные тени. Оба предмета целиком видны, между ними небольшой зазор. Без надписей, логотипов, людей и водяных знаков.
Nano Banana 2.1
nano-banana-2.1 · 2K · 1:1 · $0,03
Nano Banana 2.1, 2K, 1:1, одна попытка. Оба флакона видны целиком, между блоками небольшой зазор, справа на поверхности лежит длинная тень. Блоки разные: левый пористый, правый гладкий и светлее. Ракурс почти фронтальный, а не «три четверти», как просили в промпте. Левый контур песочного флакона слегка неровный. Надписей и логотипов нет.
Как это видно в личном кабинете?
В кабинете возврат виден в двух местах. В разделе «Баланс и пополнение» журнал операций показывает списание с типом «Списание» и описанием «Генерация»; у успешной генерации его статус «Завершена». Если запрос не удался, у списания статус «Возвращена», а отдельная строка с типом «Возврат» и описанием «Возврат за неудачный запрос» показывает вернувшуюся сумму.
В разделе «Аналитика» под ошибками по типам указано, сколько вернулось на баланс за выбранный период.
Промпт этой картинки
Вид строго сверху: деревянная щётка, овальное мыло и аккуратно сложенное белое полотенце лежат на бежевой поверхности. Предметы не касаются друг друга, расстояния между ними равные. Рассеянный дневной свет подчёркивает щетину и петли ткани, края кадра свободны. Без надписей, логотипов, людей и водяных знаков.
Nano Banana 2.1
nano-banana-2.1 · 2K · 1:1 · $0,03
Nano Banana 2.1, 2K, 1:1, одна попытка. Предметы не касаются друг друга, края кадра свободны, свет рассеянный, щетина и петли махровой ткани хорошо видны. В промпте просили равные расстояния, но промежутки неравные: между щёткой и мылом зазор заметно шире, чем между мылом и полотенцем. Надписей и логотипов нет.
Где автоматический возврат не помогает?
- Ответ с ошибкой не подтверждает возврат. Сумму видно на балансе и в журнале операций кабинета: сверяйтесь с ними.
- Ответ
500не говорит, принят ли запрос. Не создавайте новое задание: повторите тот же запрос с тем же ключом повтора, чтобы не заплатить дважды. - Новая попытка — новая оплата. Она оплачивается как обычный запрос и возвращается, только если и она не удалась.
Неудачный запрос бесплатен
Проверьте оплату на своём первом запросе
Отправьте запрос и посмотрите, как списание и возврат выглядят в ответе и в журнале операций.
Попробовать модельВопросы и ответы
Платят ли за неудачный запрос?
Когда вернутся деньги за неудачную картинку?
Как проверить, что возврат прошёл?
GET /balance, но его меняют и другие ваши запросы.Вернутся ли деньги, если промпт отклонили правила содержания?
failed, а в failure.type будет declined; сумма возвращается так же, как при сбое. Что делать с отказом — в статье «Картинка не пришла: отказ по содержанию и что с ним делать».Источники
- Документация Rendergrid: создание картинкиЦена и списание, поле
cost. - Документация Rendergrid: задачи и статусыСтатус
failedи ответ на него. - Документация Rendergrid: балансКогда деньги списываются и возвращаются.
- Документация Rendergrid: коды ошибокЧто списывается при каждой ошибке, объект
failure. - Кабинет RendergridЖурнал операций в разделе «Баланс и пополнение», итог возвратов в «Аналитике».




