Перейти к содержимому
GPT Image 2.5
GPT Image 2.5

API для разработчиков

V1 использует модели, материалы, восстановление задач и учёт кредитов Studio. Храните ключ на сервере.

Управление ключами API

Передавайте Authorization: Bearer YOUR_API_KEY. Cookie сайта не подходят для API. Каждый запрос проверяет подписку и разрешения ключа.

Получите модели, при необходимости загрузите изображение, запросите стоимость и подтвердите её. Отправьте задачу со стабильным Idempotency-Key, опрашивайте раз в две секунды и скачайте результат через защищённый API.

Кредиты расходуются только при отправке генерации. Расчёт и создание ключа бесплатны. Действуют существующие возвраты и сверка. Не меняйте ключ идемпотентности, пока исход предыдущего запроса неизвестен.

До 60 запросов в минуту на ключ. Ответ 429 содержит Retry-After. Срок действия — 1–365 дней, отзыв доступен в любой момент.

HTTPURLРазрешения
GET/api/v1/modelsmodels:read
GET/api/v1/assetsassets:read
GET/api/v1/assets/{id}/downloadassets:read
POST/api/v1/uploadsassets:write
PUT/api/v1/uploads/{id}assets:write
POST/api/v1/uploads/{id}/completeassets:write
POST/api/v1/quotesgenerations:write
POST/api/v1/generationsgenerations:write
GET/api/v1/generations/{kind}/{id}generations:read
GET/api/v1/generations/{kind}/{id}/outputs/{index}generations:read

Три шага: объявить MIME и размер, передать файл через PUT, завершить загрузку. Сервер проверяет JPEG, PNG и WebP до 10 МБ. Используйте полученный ID материала. Внешние URL и чужие материалы запрещены.

// Node.js 22+; keep API_KEY on your server.
const base = process.env.API_BASE_URL;
const headers = {
  Authorization: `Bearer ${process.env.API_KEY}`,
  'Content-Type': 'application/json',
};
const modelsResponse = await fetch(base + '/api/v1/models', { headers });
if (!modelsResponse.ok) throw new Error('Read models failed');
const models = await modelsResponse.json();

const draft = {
  "kind": "image",
  "modelPreset": "gpt-image-2",
  "mode": "text-to-image",
  "prompt": "A yellow ceramic mug on a pale blue background",
  "aspectRatio": "1:1",
  "resolution": "1k",
  "outputCount": 1
};
const quoteResponse = await fetch(base + '/api/v1/quotes', {
  method: 'POST', headers, body: JSON.stringify({ draft }),
});
if (!quoteResponse.ok) throw new Error('Quote failed');
const quote = await quoteResponse.json();

// Review quote.quote before submitting. Persist this operation ID first.
const operationId = process.env.OPERATION_ID;
if (!operationId) throw new Error('A stable operation ID is required');
const submitted = await fetch(base + '/api/v1/generations', {
  method: 'POST',
  headers: { ...headers, 'Idempotency-Key': operationId },
  body: JSON.stringify({
    draft: quote.normalizedDraft,
    quoteAcknowledgement: quote.quote,
  }),
});
if (!submitted.ok) throw new Error('Check response before retrying');
const { task } = await submitted.json();
const taskResponse = await fetch(
  base + '/api/v1/generations/' + task.kind + '/' + task.id, { headers },
);
if (!taskResponse.ok) throw new Error('Read task failed');
const detail = await taskResponse.json();
// Poll at two-second intervals until terminal. Download detail.outputs[].downloadUrl
// with the same Authorization header. Never change the ID to retry an unknown outcome.

401: ключ недействителен, истёк или отозван. 403: недостаточно прав или нет подписки. 409: конфликт идемпотентности или новая стоимость; запросите и подтвердите новый расчёт. 422: неверные параметры. 429: лимит. 503: временно недоступно. Проверяйте код ошибки и не повторяйте платную отправку автоматически с новым ключом.