API429 / Генерация изображений

Image API: выбор модели и первый запрос

Выберите модель для конкретного изображения, отправьте один короткий запрос и проверьте полученный файл до запуска серии. Этот маршрут соединяет выбор семейства с первым клиентским запросом: Nano Banana 2, GPT Image 2 и FLUX.2 Pro используют один метод Images, но настройки и единицы расчёта различаются.

Контракт сверен . Опубликовано ; обновлено . Проверены публичные источники и примеры с искусственными ответами. Успешное платное выполнение под клиентским ключом здесь не заявляется.

Как выбрать семейство для своей задачи

Начните с задания, которое можно проверить: предметная сцена для карточки товара, иллюстрация к статье или несколько вариантов композиции. Запишите требуемую форму кадра, наличие текста, допустимые лишние объекты и критерии приёмки. Сравнивайте результаты на одном задании, сохраняя исходный текст и настройки. Название модели и размер версии сами по себе не устанавливают качество на вашем материале.

Для Nano Banana 2 используйте точный ID gemini-3.1-flash-image и явный уровень resolution. Для GPT Image 2 задайте size и quality: эти параметры определяют условие тарификации прямого запроса. Для FLUX.2 Pro различайте выходные мегапиксели и использование исходных изображений. Показанные примеры создают изображение по тексту без референсов; они не подтверждают формат загрузки для редактирования. Подробности каждой модели и тарифные сравнения находятся в отдельных руководствах ниже.

Первое подключение без лишних запросов

Сохраните API-ключ в окружении серверного процесса. Не вставляйте его в код страницы, общую коллекцию запросов или браузерный JavaScript. Сначала получите GET /v1/models и найдите точный ID под своим ключом: публичный каталог показывает опубликованные модели, но не устанавливает права конкретного клиента. Если ID отсутствует, остановитесь до генерации.

Python и JavaScript ниже проверяют каталог ключа, затем один раз вызывают POST /v1/images/generations. Каждый пример запрашивает n=1, квадратный размер и b64_json; у Nano Banana явно выбран 1K, у GPT Image — low. Выберите один пример для одной модели. Запуск всех примеров создаст несколько платных запросов. Для первого опыта используйте несекретное короткое описание, а не весь производственный набор.

Как принять изображение и обнаружить неполный результат

Успешный HTTP-ответ ещё не означает, что изображение подходит для публикации. Проверьте количество элементов data, наличие b64_json и сигнатуру декодированного файла. Примеры распознают PNG, JPEG и WebP, выбирают соответствующее расширение и останавливаются при неизвестном формате или неполном наборе. Затем самостоятельно проверьте размеры, композицию и текст в просмотрщике.

Отдельно прочитайте warnings, api429.parameter_mismatches и сведения api429.outputs. Предупреждение или несоответствие параметров требует проверки до принятия файла. Не считайте автоматически каждый возвращённый элемент подходящим результатом. При таймауте либо частичном ответе сначала выясните судьбу исходной попытки; новый платный запрос не должен быть безусловной реакцией приложения.

Как читать тарифы и перейти к серии

Ниже выводятся только свежие однозначные ставки API429 для проверенных ID, с исходными условиями и единицами. У Nano Banana строка image с размером относится к прямому Images; общие токенные строки не следует механически прибавлять к ней. У GPT Image стоимость выходного изображения зависит от выбранных размеров и качества, а входные токены имеют отдельную ставку. У FLUX условие без референсов нельзя применять к редактированию с исходниками.

Сначала подтвердите один результат, затем оцените бюджет серии по соответствующему руководству. Записывайте число отправленных запросов, полученных файлов и принятых изображений отдельно. Руководство массовой генерации владеет процессом серии, а семейные страницы цен — сопоставлением тарифов. Здесь вы выбираете модель и проверяете первое подключение, поэтому общий рейтинг качества и одинаковая цена для всех изображений не приводятся.

Проверенные ID и текущие единицы API429

Свежая публикация каталога, доступ вашего ключа и выполненная генерация — отдельные проверки. Список ниже ограничен рассмотренными ID. Ставки не сравнивают качество моделей и не включают неподтверждённые компоненты расчёта.

Точный IDСтатус и единицы
gemini-3.1-flash-imageОпубликована в свежем каталоге
$0.020100000000 / 1 изображение · size=1KУсловие: size=1K
$0.03030000000000000000000000000 / 1 изображение · size=2KУсловие: size=2K
$0.04530000000000000000000000000 / 1 изображение · size=4KУсловие: size=4K
gpt-image-2Опубликована в свежем каталоге
$0.253200000600000000 / 1 изображение · size=A_2KУсловие: size=A_2K
$0.500892188400000000 / 1 изображение · size=A_4KУсловие: size=A_4K
$0.0495000000000 / 1 изображение · size=A_NSУсловие: size=A_NS
$0.063300000600000000 / 1 изображение · size=A_SQУсловие: size=A_SQ
$0.253200000600000000 / 1 изображение · size=H_2KУсловие: size=H_2K
$0.500892188400000000 / 1 изображение · size=H_4KУсловие: size=H_4K
$0.0495000000000 / 1 изображение · size=H_NSУсловие: size=H_NS
$0.063300000600000000 / 1 изображение · size=H_SQУсловие: size=H_SQ
$0.007200000000 / 1 изображение · size=L_2KУсловие: size=L_2K
$0.014238280800000000 / 1 изображение · size=L_4KУсловие: size=L_4K
$0.001499999400000000 / 1 изображение · size=L_NSУсловие: size=L_NS
$0.001800000000 / 1 изображение · size=L_SQУсловие: size=L_SQ
$0.063599999400000000 / 1 изображение · size=M_2KУсловие: size=M_2K
$0.125767969200000000 / 1 изображение · size=M_4KУсловие: size=M_4K
$0.012299999400000000 / 1 изображение · size=M_NSУсловие: size=M_NS
$0.015899999400000000 / 1 изображение · size=M_SQУсловие: size=M_SQ
$1.500000000000 / 1 000 000 входящих токенов
FLUX.2-proОпубликована в свежем каталоге
$0.009000000 / 1 изображение · Выход 1 МП, без референсов (1 МП = 1024 × 1024)Условие: output_mp=1;reference_mp=0
$0.013500000 / 1 изображение · Выход 2 МП, без референсов (1 МП = 1024 × 1024)Условие: output_mp=2;reference_mp=0
$0.022500000 / 1 изображение · Выход 4 МП, без референсов (1 МП = 1024 × 1024)Условие: output_mp=4;reference_mp=0

Дата каталога: . Числовые ставки скрываются при устаревших, неоднозначных или неподтверждённых данных; внешние цены производителей здесь не приводятся.

Первый запрос: Python и JavaScript

Выберите один пример и запускайте его на сервере. Установите API429_API_KEY через защищённое окружение; для ElevenLabs также нужен подтверждённый API429_VOICE_ID. Код сначала проверяет доступ через GET /v1/models, затем выполняет один платный запрос. Повторный запуск файла создаёт новую попытку: сначала разберите предыдущую.

gemini-3.1-flash-image → изображение

Python 3 — gemini-3.1-flash-image
import base64
import json
import os
import urllib.request
from pathlib import Path

key = os.environ["API429_API_KEY"]
base = "https://gateway.api429.com/v1"
headers = {"Authorization": "Bearer " + key, "Content-Type": "application/json"}
model = "gemini-3.1-flash-image"
with urllib.request.urlopen(urllib.request.Request(base + "/models", headers=headers), timeout=30) as response:
    available = {item["id"] for item in json.load(response)["data"]}
if model not in available:
    raise ValueError("Model unavailable to this key")
payload = json.loads("{\"model\":\"gemini-3.1-flash-image\",\"prompt\":\"Синяя керамическая чашка на светлом столе, мягкий дневной свет, без надписей\",\"n\":1,\"size\":\"1024x1024\",\"response_format\":\"b64_json\",\"resolution\":\"1K\"}")
request = urllib.request.Request(base + "/images/generations",
    data=json.dumps(payload).encode("utf-8"), headers=headers, method="POST")
with urllib.request.urlopen(request, timeout=180) as response:
    result = json.load(response)
if result.get("warnings") or result.get("api429", {}).get("parameter_mismatches"):
    print("Inspect output warnings:", result.get("warnings"), result.get("api429"))
items = result.get("data", [])
if len(items) != 1 or not items[0].get("b64_json"):
    raise ValueError("Missing image or partial result; inspect before retrying")
raw = base64.b64decode(items[0]["b64_json"], validate=True)
if raw.startswith(b"\x89PNG\r\n\x1a\n"):
    extension = "png"
elif raw.startswith(b"\xff\xd8\xff"):
    extension = "jpg"
elif raw.startswith(b"RIFF") and raw[8:12] == b"WEBP":
    extension = "webp"
else:
    raise ValueError("Unknown image MIME; inspect before saving")
Path("image." + extension).write_bytes(raw)
print(result.get("api429", {}).get("outputs"))
JavaScript для Node.js — gemini-3.1-flash-image
import { writeFile } from "node:fs/promises";
const key = process.env.API429_API_KEY;
if (!key) throw new Error("Set API429_API_KEY");
const base = "https://gateway.api429.com/v1";
const headers = { Authorization: "Bearer " + key, "Content-Type": "application/json" };
const model = "gemini-3.1-flash-image";
const available = await fetch(base + "/models", { headers, signal: AbortSignal.timeout(30000) });
if (!available.ok) throw new Error("Models HTTP " + available.status);
if (!(await available.json()).data.some(item => item.id === model)) throw new Error("Model unavailable to this key");
const payload = {"model":"gemini-3.1-flash-image","prompt":"Синяя керамическая чашка на светлом столе, мягкий дневной свет, без надписей","n":1,"size":"1024x1024","response_format":"b64_json","resolution":"1K"};
const response = await fetch(base + "/images/generations", {
 method: "POST", headers, body: JSON.stringify(payload), signal: AbortSignal.timeout(180000)
});
if (!response.ok) throw new Error("Generation HTTP " + response.status);
const result = await response.json();
if (result.warnings || result.api429?.parameter_mismatches) console.warn("Inspect warnings", result.warnings, result.api429);
if (result.data?.length !== 1 || !result.data[0].b64_json) throw new Error("Missing image or partial result; inspect before retrying");
const bytes = Buffer.from(result.data[0].b64_json, "base64");
const hex = bytes.subarray(0, 8).toString("hex");
const extension = hex === "89504e470d0a1a0a" ? "png" : hex.startsWith("ffd8ff") ? "jpg" : bytes.toString("ascii", 0, 4) === "RIFF" && bytes.toString("ascii", 8, 12) === "WEBP" ? "webp" : undefined;
if (!extension) throw new Error("Unknown image MIME; inspect before saving");
await writeFile("image." + extension, bytes);
console.log(result.api429?.outputs);

gpt-image-2 → изображение

Python 3 — gpt-image-2
import base64
import json
import os
import urllib.request
from pathlib import Path

key = os.environ["API429_API_KEY"]
base = "https://gateway.api429.com/v1"
headers = {"Authorization": "Bearer " + key, "Content-Type": "application/json"}
model = "gpt-image-2"
with urllib.request.urlopen(urllib.request.Request(base + "/models", headers=headers), timeout=30) as response:
    available = {item["id"] for item in json.load(response)["data"]}
if model not in available:
    raise ValueError("Model unavailable to this key")
payload = json.loads("{\"model\":\"gpt-image-2\",\"prompt\":\"Синяя керамическая чашка на светлом столе, мягкий дневной свет, без надписей\",\"n\":1,\"size\":\"1024x1024\",\"response_format\":\"b64_json\",\"quality\":\"low\"}")
request = urllib.request.Request(base + "/images/generations",
    data=json.dumps(payload).encode("utf-8"), headers=headers, method="POST")
with urllib.request.urlopen(request, timeout=180) as response:
    result = json.load(response)
if result.get("warnings") or result.get("api429", {}).get("parameter_mismatches"):
    print("Inspect output warnings:", result.get("warnings"), result.get("api429"))
items = result.get("data", [])
if len(items) != 1 or not items[0].get("b64_json"):
    raise ValueError("Missing image or partial result; inspect before retrying")
raw = base64.b64decode(items[0]["b64_json"], validate=True)
if raw.startswith(b"\x89PNG\r\n\x1a\n"):
    extension = "png"
elif raw.startswith(b"\xff\xd8\xff"):
    extension = "jpg"
elif raw.startswith(b"RIFF") and raw[8:12] == b"WEBP":
    extension = "webp"
else:
    raise ValueError("Unknown image MIME; inspect before saving")
Path("image." + extension).write_bytes(raw)
print(result.get("api429", {}).get("outputs"))
JavaScript для Node.js — gpt-image-2
import { writeFile } from "node:fs/promises";
const key = process.env.API429_API_KEY;
if (!key) throw new Error("Set API429_API_KEY");
const base = "https://gateway.api429.com/v1";
const headers = { Authorization: "Bearer " + key, "Content-Type": "application/json" };
const model = "gpt-image-2";
const available = await fetch(base + "/models", { headers, signal: AbortSignal.timeout(30000) });
if (!available.ok) throw new Error("Models HTTP " + available.status);
if (!(await available.json()).data.some(item => item.id === model)) throw new Error("Model unavailable to this key");
const payload = {"model":"gpt-image-2","prompt":"Синяя керамическая чашка на светлом столе, мягкий дневной свет, без надписей","n":1,"size":"1024x1024","response_format":"b64_json","quality":"low"};
const response = await fetch(base + "/images/generations", {
 method: "POST", headers, body: JSON.stringify(payload), signal: AbortSignal.timeout(180000)
});
if (!response.ok) throw new Error("Generation HTTP " + response.status);
const result = await response.json();
if (result.warnings || result.api429?.parameter_mismatches) console.warn("Inspect warnings", result.warnings, result.api429);
if (result.data?.length !== 1 || !result.data[0].b64_json) throw new Error("Missing image or partial result; inspect before retrying");
const bytes = Buffer.from(result.data[0].b64_json, "base64");
const hex = bytes.subarray(0, 8).toString("hex");
const extension = hex === "89504e470d0a1a0a" ? "png" : hex.startsWith("ffd8ff") ? "jpg" : bytes.toString("ascii", 0, 4) === "RIFF" && bytes.toString("ascii", 8, 12) === "WEBP" ? "webp" : undefined;
if (!extension) throw new Error("Unknown image MIME; inspect before saving");
await writeFile("image." + extension, bytes);
console.log(result.api429?.outputs);

FLUX.2-pro → изображение

Python 3 — FLUX.2-pro
import base64
import json
import os
import urllib.request
from pathlib import Path

key = os.environ["API429_API_KEY"]
base = "https://gateway.api429.com/v1"
headers = {"Authorization": "Bearer " + key, "Content-Type": "application/json"}
model = "FLUX.2-pro"
with urllib.request.urlopen(urllib.request.Request(base + "/models", headers=headers), timeout=30) as response:
    available = {item["id"] for item in json.load(response)["data"]}
if model not in available:
    raise ValueError("Model unavailable to this key")
payload = json.loads("{\"model\":\"FLUX.2-pro\",\"prompt\":\"Синяя керамическая чашка на светлом столе, мягкий дневной свет, без надписей\",\"n\":1,\"size\":\"1024x1024\",\"response_format\":\"b64_json\"}")
request = urllib.request.Request(base + "/images/generations",
    data=json.dumps(payload).encode("utf-8"), headers=headers, method="POST")
with urllib.request.urlopen(request, timeout=180) as response:
    result = json.load(response)
if result.get("warnings") or result.get("api429", {}).get("parameter_mismatches"):
    print("Inspect output warnings:", result.get("warnings"), result.get("api429"))
items = result.get("data", [])
if len(items) != 1 or not items[0].get("b64_json"):
    raise ValueError("Missing image or partial result; inspect before retrying")
raw = base64.b64decode(items[0]["b64_json"], validate=True)
if raw.startswith(b"\x89PNG\r\n\x1a\n"):
    extension = "png"
elif raw.startswith(b"\xff\xd8\xff"):
    extension = "jpg"
elif raw.startswith(b"RIFF") and raw[8:12] == b"WEBP":
    extension = "webp"
else:
    raise ValueError("Unknown image MIME; inspect before saving")
Path("image." + extension).write_bytes(raw)
print(result.get("api429", {}).get("outputs"))
JavaScript для Node.js — FLUX.2-pro
import { writeFile } from "node:fs/promises";
const key = process.env.API429_API_KEY;
if (!key) throw new Error("Set API429_API_KEY");
const base = "https://gateway.api429.com/v1";
const headers = { Authorization: "Bearer " + key, "Content-Type": "application/json" };
const model = "FLUX.2-pro";
const available = await fetch(base + "/models", { headers, signal: AbortSignal.timeout(30000) });
if (!available.ok) throw new Error("Models HTTP " + available.status);
if (!(await available.json()).data.some(item => item.id === model)) throw new Error("Model unavailable to this key");
const payload = {"model":"FLUX.2-pro","prompt":"Синяя керамическая чашка на светлом столе, мягкий дневной свет, без надписей","n":1,"size":"1024x1024","response_format":"b64_json"};
const response = await fetch(base + "/images/generations", {
 method: "POST", headers, body: JSON.stringify(payload), signal: AbortSignal.timeout(180000)
});
if (!response.ok) throw new Error("Generation HTTP " + response.status);
const result = await response.json();
if (result.warnings || result.api429?.parameter_mismatches) console.warn("Inspect warnings", result.warnings, result.api429);
if (result.data?.length !== 1 || !result.data[0].b64_json) throw new Error("Missing image or partial result; inspect before retrying");
const bytes = Buffer.from(result.data[0].b64_json, "base64");
const hex = bytes.subarray(0, 8).toString("hex");
const extension = hex === "89504e470d0a1a0a" ? "png" : hex.startsWith("ffd8ff") ? "jpg" : bytes.toString("ascii", 0, 4) === "RIFF" && bytes.toString("ascii", 8, 12) === "WEBP" ? "webp" : undefined;
if (!extension) throw new Error("Unknown image MIME; inspect before saving");
await writeFile("image." + extension, bytes);
console.log(result.api429?.outputs);

Дальнейший маршрут

Каталог моделей · Документация · Условия и тарифы

Оплата и тест $10

  • Карта российского банка. Пополнение баланса в личном кабинете.
  • Счёт для юрлиц. Безналичная оплата с закрывающими документами.
  • USDT и TON. Пополнение криптовалютой.

Тест $10. Подпишитесь на наш Telegram-канал через бота — получите $10 на баланс для первых запросов. Получить $10 в боте

Частые вопросы

Какой метод нужен для генерации по тексту?

Проверенные примеры используют POST /v1/images/generations с точным model, prompt и n=1. Перед запуском GET /v1/models проверяет доступ ID для вашего ключа. Поддержка других режимов требует отдельной сверки клиентского контракта.

Можно ли считать все строки каталога ценой одной картинки?

Нет. Сохраняйте единицу, условие размера, качество и назначение метода. Прямой Images и общий токенный контракт нельзя складывать без проверки. У GPT Image входные токены считаются отдельно от выходного изображения.

Что делать с warnings и частичным результатом?

Сохраните исходные параметры и ответ, изучите warnings, parameter_mismatches и outputs. Если нужного файла нет или формат неизвестен, остановитесь и проверьте попытку до нового платного запроса.

Доказывает ли пример качество генерации?

Нет. Примеры проверяются офлайн по структуре и обработке ответов; платная генерация здесь не заявляется. Пригодность изображения, читаемость надписей и соответствие заданию проверяйте на собственном разрешённом материале.

Источники и границы проверки

Клиентский справочник определяет параметры и ответы; каталог — опубликованные точные ID и единицы. Сокращённая OpenAPI не содержит всех разделов полного справочника. Анонимная сверка источников от не подтверждает права ключа или запуск генерации.

Telegram