Создание изображений через APIVN API
Создавайте изображения по описанию или редактируйте исходное изображение через два JSON-эндпоинта. Начните с простого запроса, затем добавьте параметры, которые поддерживает модель.
К документацииПодключение к API
Отправляйте запросы на API URL сайта с заголовками Content-Type: application/json и Authorization: Bearer YOUR_API_KEY. Также поддерживается x-api-key.
Храните API key на сервере. В примерах используются переменные окружения; сами примеры не отправляют запросы от вашего имени.
Base URLhttps://apivn.dev/v1
AuthorizationBearer $STALI_API_KEY
read -r -s -p "STALI_API_KEY: " STALI_API_KEY
export STALI_API_KEY
printf '\n'
curl -fsS https://apivn.dev/v1/models -H "Authorization: Bearer ${STALI_API_KEY:?STALI_API_KEY}"Выберите модель изображений
Используйте req/gpt-image-2 или req/gemini-3.0-pro-image. Если model отсутствует или пуст, оба эндпоинта изображений используют req/gpt-image-2.
| Модель | Цена за запрос |
|---|---|
req/gpt-image-2GPT Image 2 | $0.0455 |
req/gemini-3.0-pro-imageGemini 3.0 Pro Image | $0.0455 |
Вызовите GET /v1/models, чтобы получить текущий каталог и pricing.per_request. API key должен разрешать выбранную модель.
Актуальные ценыСоздание по описанию
/v1/images/generationsapplication/jsonОтправьте POST /v1/images/generations с model и описанием изображения в prompt. В примере используются n: 1 и size: 1024x1024. После завершения обработки эндпоинт возвращает JSON. stream принудительно установлен в false; SSE-поток не возвращается.
Примеры cURL рассчитаны на Bash в macOS, Linux или WSL. Для Python установите библиотеку командой pip install requests. Для Node.js используйте версию 18 или новее, сохраните код в файл .mjs и используйте встроенный fetch.
curl --fail-with-body --dump-header image-response-headers.txt "https://apivn.dev/v1/images/generations" \
-H "Authorization: Bearer ${STALI_API_KEY:?STALI_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"model": "req/gpt-image-2",
"prompt": "A small botanical robot tending a seedling, studio product photography, soft natural light, clean ivory background, no text",
"n": 1,
"size": "1024x1024"
}'Редактирование исходного изображения
/v1/images/editsapplication/jsonОтправьте POST /v1/images/edits в формате JSON с непустым prompt и image. Изображение можно передать как data URL, строку base64 или общедоступный http(s) URL. В cURL замените https://example.com/reference.png реальным общедоступным URL изображения. Для Python или Node.js поместите reference.png в каталог, из которого запускаете пример.
Вместо image можно использовать image_url, reference_image, ref_image или refImage. Значение — строка или объект {url: ...}; рекомендуется передавать только одно поле изображения. Эндпоинт редактирования принимает JSON, а не multipart/form-data. URL изображения должен быть общедоступным и не содержать учетных данных; внутренние адреса блокируются. Для исходных изображений поддерживаются PNG, JPEG, WebP и GIF. Не вызывайте images.edit из SDK напрямую, если метод отправляет multipart/form-data. Этот эндпоинт требует JSON; примеры Python requests и Node.js fetch используют нужный формат.
curl --fail-with-body --dump-header image-response-headers.txt "https://apivn.dev/v1/images/edits" \
-H "Authorization: Bearer ${STALI_API_KEY:?STALI_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"model": "req/gpt-image-2",
"prompt": "Keep the subject and composition, change the background to a warm ivory studio",
"image": "https://example.com/reference.png",
"n": 1,
"size": "1024x1024"
}'Параметры и ограничения
Размер всего JSON-запроса, включая закодированные изображения, не должен превышать 20 MiB. Base64 увеличивает объем данных. Ограничения Playground применяются отдельно.
| Параметр | Обязательный | Описание |
|---|---|---|
model | Необязательный | model: ID модели изображений. По умолчанию req/gpt-image-2. |
prompt | Обязательный | prompt: описание изображения или инструкция по редактированию. Для редактирования требуется непустая строка. |
image | Обязательно для edits | Отправьте POST /v1/images/edits в формате JSON с непустым prompt и image. Изображение можно передать как data URL, строку base64 или общедоступный http(s) URL. Для исходных изображений поддерживаются PNG, JPEG, WebP и GIF. |
size | Необязательный | size: в примерах используется 1024x1024. Поддерживаемые размеры зависят от модели и провайдера. |
n | Необязательный | n: в примерах запрашивается 1 изображение. Значение передается провайдеру; допустимое количество зависит от модели. |
quality / response_format / output_format | Необязательный | quality, response_format и дополнительные параметры передаются провайдеру. Указывайте только параметры, которые поддерживает модель: шлюз не гарантирует применение каждой опции. |
Чтение и сохранение изображений
Читайте массив data в JSON-ответе. В зависимости от провайдера изображение находится в b64_json, b64Json или url. Дополнительные поля могут различаться у разных моделей.
{
"data": [
{
"b64_json": "<base64 image bytes>"
}
]
}Если получен base64, декодируйте его в файл изображения или создайте data URL с MIME-типом фактического формата. Не считайте, что любой результат имеет формат PNG. Полученный URL можно использовать для загрузки или показа изображения. Срок действия и условия доступа зависят от провайдера.
Сохраняйте x-apivn-request-id для диагностики. Успешный ответ также содержит заголовки x-apivn-model, x-apivn-price-vnd-per-request и x-apivn-cost-vnd.
Оплата за запрос
Модели изображений оплачиваются за request. Перед запуском проверьте pricing.per_request в GET /v1/models: баланс или лимит расходов API key могут блокировать запрос. Количество токенов в ответе или заголовках не является основой для пересчета цены модели изображений. Новый запрос может привести к новому списанию.
Не повторяйте запрос автоматически после тайм-аута или разрыва соединения: предыдущий запрос мог быть обработан. Перед новым вызовом проверьте историю Usage и сохраните request ID для сверки или обращения в поддержку.
ОплатаОсторожная обработка ошибок
Ошибки шлюза имеют вид {type: "error", error: {type, message, ...}}. Проверяйте HTTP-статус и error.message, сохраняйте request ID, если он доступен.
| HTTP | Ошибка | Действие |
|---|---|---|
| 400 | invalid_request_error | проверьте JSON, модель, эндпоинт, prompt и исходное изображение. |
| 401 | authentication_error | проверьте API key. |
| 402 | insufficient_balance / api_key_monthly_limit / outstanding_undercharge | проверьте баланс, месячный лимит или задолженность. |
| 403 | model_not_allowed | проверьте разрешение на модель. |
| 413 | request_too_large | Уменьшите общий размер запроса, включая данные base64. Провайдер или модель могут устанавливать лимит ниже ограничения JSON на шлюзе. |
| 429 | rate_limit_error | снизьте частоту и следуйте Retry-After или retry_after_ms, если они указаны. |
| 502 / 503 | api_error / service_unavailable | провайдер или сервис может быть временно недоступен. |
Перед отправкой запроса
Проверьте API key, разрешение на модель и текущую цену. Отправляйте JSON на правильный эндпоинт, ограничивайте объем данных и начните с одного изображения. Обрабатывайте base64 и URL, сохраняйте request ID и проверяйте результат перед повторным вызовом.
- Проверьте API key и разрешения на модель.
- Уточните модель и цену в /v1/models.
- Проверьте JSON, prompt и данные изображения.
- Поддерживайте результаты в base64 и по URL.
- Проверьте историю Usage; сохраните request ID для сверки или обращения в поддержку.

