07Основы API
Картинки-образцы
Покажите модели свою картинку и скажите, что с ней сделать: сохранить товар, сменить фон, продолжить стиль. Образец можно загрузить файлом или передать ссылкой.
Эта модель рисует не все разрешения и форматы кадра: в примерах стоят те, что ей доступны.
Как передать образец
Образцы необязательны: без них модель рисует по одному тексту. Если они нужны, выберите одно семейство полей: файл, который вы загрузили заранее, или адрес картинки.
| Способ | Поле запроса | Когда выбрать |
|---|---|---|
| Без образцов | не передавайте | Рисуем с нуля по описанию |
| Загруженный файл | image_file_ids (до 14) или image_file_id | Файл лежит у вас на диске; один образец нужен в нескольких запросах |
| Адрес картинки | image_urls (до 14) | Картинка уже доступна по публичной ссылке |
{
"model": "nano-banana-pro",
"prompt": "Оставь лампу, поставь её на светлый подоконник",
"resolution": "2K",
"image_file_ids": ["ea7b3c89972d3657"]
}{
"model": "nano-banana-pro",
"prompt": "Оставь лампу, поставь её на светлый подоконник",
"resolution": "2K",
"image_urls": ["https:// cdn.example.com/ products/ lamp.png"]
}Не смешивайте способы. Если в одном запросе есть и image_urls, и file_id, API ответит 400 ERR_INVALID_REQUEST до списания. Поля image, image_url, image_input и input_urls не принимаются.
Загрузка файла
/uploadsОтправьте файл как multipart/form-data: поле file — сам файл, поле kind со значением image. В ответ придёт file_id: его и подставляйте в запрос генерации.
curl --fail-with-body --connect-timeout 10 --max-time 120 \ -X POST https://api.rendergrid.io/ api/ public/ v1/ uploads \ -H "Authorization: Bearer $RENDERGRID_API_KEY" \ -F "file=@lamp.png;type=image/png" \ -F "kind=image"
import os import requests key = os.environ["RENDERGRID_API_KEY"] with open("lamp.png", "rb") as image: response = requests.post( "https://api.rendergrid.io/ api/ public/ v1/ uploads", headers={"Authorization": f"Bearer {key}"}, files={"file": ("lamp.png", image, "image/png")}, data={"kind": "image"}, timeout=(10, 120), ) response.raise_for_status() upload = response.json() print(upload["file_id"], upload["expires_at"])
// Node.js 22+, файл .mjs import { readFile } from "node:fs/promises"; const bytes = await readFile("lamp.png"); const file = new Blob([bytes], { type: "image/png" }); const form = new FormData(); form.append("file", file, "lamp.png"); form.append("kind", "image"); const API = "https://api.rendergrid.io/ api/ public/ v1"; const key = process.env.RENDERGRID_API_KEY; const response = await fetch(`${API}/uploads`, { method: "POST", headers: { Authorization: `Bearer ${key}` }, body: form, signal: AbortSignal.timeout(120_000), }); if (!response.ok) { const body = await response.text(); throw new Error(`HTTP ${response.status}: ${body}`); } const upload = await response.json(); console.log(upload.file_id, upload.expires_at);
{
"file_id": "ea7b3c89972d3657",
"url": "https:// cdn.rendergrid.io/ user_uploads/ example.png",
"expires_at": "2026-10-14T12:00:00+00:00"
}- file_id
- Идентификатор файла. Принадлежит аккаунту, который его загрузил.
- url
- Адрес копии файла. Это не постоянное хранилище: после
expires_atим пользоваться нельзя. - expires_at
- Когда
file_idперестанет работать: через 24 часа после загрузки.
| Что | Правило |
|---|---|
| Форматы | PNG, JPEG и WebP. GIF и BMP не принимаются |
| Размер | до 25 МиБ (26 214 400 байт) на файл |
| Срок | file_id живёт 24 часа. Использование в запросе срок не продлевает |
| Повторная загрузка | Тот же файл, загруженный снова, получит новый file_id ещё на 24 часа |
| Деньги | За загрузку из баланса ничего не списывается |
| Дневной лимит | Аккаунт, который зарегистрировался сам и ещё не пополнял баланс, использует не больше 100 образцов в сутки по UTC: загруженные файлы и адреса в image_urls считаются вместе. После первого пополнения лимита нет |
Проверьте файл до отправки
Так API ответит на самые частые файлы. Все отказы приходят сразу, ещё до генерации.
Адрес вместо файла
Если картинка уже лежит в интернете, не загружайте её: передайте ссылку в image_urls. Скачивает картинку наш сервер, поэтому ссылка должна открываться снаружи без входа.
- Публичный адрес
http://илиhttps://на порту 80 или 443. Адреса внутренних сетей и ссылки с логином и паролем внутри не подходят. - Переадресации не выполняются: укажите конечный адрес картинки.
- Ответ должен быть картинкой PNG, JPEG или WebP не больше 25 МиБ.
- Источник должен отвечать быстро: время скачивания ограничено. Если источник медленный или закрыт паролем, скачайте файл у себя и загрузите через
POST /uploads.
Как подготовить образцы
- Опишите в
prompt, что сохранить и что изменить. Модель видит образец, но не знает, чего вы от него хотите. - В одном запросе — до 14 образцов.
- Образец тяжелее 7 МиБ или длиннее 4096 пикселей по длинной стороне может быть уменьшен или пережат перед работой. У больших картинок с прозрачным фоном фон может стать белым.
- Храните оригиналы у себя:
file_idдействует 24 часа после загрузки, а сам файл удаляется через 48 часов после последней загрузки. - Маски (inpainting) не поддерживаются. Передайте исходную картинку образцом и опишите правку словами.
Что может пойти не так
Эти отказы приходят до списания: баланс не меняется.
| Что случилось | Ответ API | Что делать |
|---|---|---|
| Файл больше 25 МиБ | 400 ERR_INVALID_REQUEST, «File exceeds the maximum allowed size», details.max_bytes | Сожмите файл или уменьшите картинку |
| GIF, BMP или другой формат | 400 ERR_INVALID_REQUEST, «Unsupported image format. Supported formats: PNG, JPEG, WebP.» | Сохраните картинку как PNG, JPEG или WebP |
| Файл пустой или это не картинка | 400 ERR_INVALID_REQUEST, «Uploaded file is empty» или «File content does not match the declared media kind» | Проверьте файл: расширение .png ещё не делает его картинкой |
file_id истёк или недоступен | 400 ERR_INVALID_REQUEST, details.reason: reference_unavailable, details.input_index, details.retryable: false | Загрузите файл заново и подставьте новый file_id |
| Ссылку не удалось скачать | 422 ERR_INPUT_FETCH_FAILED, details.retryable, details.input_index | Повторите, только если retryable: true. Иначе исправьте ссылку или загрузите файл сами |
| Больше 14 образцов или два способа сразу | 400 ERR_INVALID_REQUEST, details.errors | Оставьте до 14 образцов и одно семейство полей |
| В запросе есть маска | 400 ERR_INVALID_REQUEST, details.fields: ["mask_file_id"] | Уберите маску, передайте исходную картинку образцом и опишите правку словами |
| Дневной лимит загрузок исчерпан | 429 ERR_RATE_LIMIT, «Daily upload limit reached. Add funds to your account to lift it.», details.limit, details.window = "1d", details.retry_after и заголовок Retry-After | Пополните баланс — лимит снимется — или дождитесь следующих суток по UTC |
Если образец стал недоступен уже после приёма запроса, задание завершится статусом failed с failure.code: reference_unavailable или reference_fetch_failed. Подробнее — «Коды ошибок».
Неудачный запрос бесплатен: сумма сразу возвращается на баланс.
Частые вопросы
Сколько образцов можно передать?
image_file_ids и image_urls от 1 до 14 значений.Можно ли использовать один file_id в нескольких запросах?
file_id.Принимаете ли вы GIF?
image_urls.Почему загрузка образца отвечает 429?
image_urls. Пополните баланс, и лимит исчезнет; иначе дождитесь следующих суток. Подробнее — «Лимиты».