開発者 API
V1 は Studio とモデル、素材、タスク復旧、クレジット台帳を共有します。キーはサーバーに保管してください。
API キーの管理Authorization: Bearer YOUR_API_KEY を送信してください。サイトの Cookie は API 認証に使えません。各リクエストで有料会員資格と権限を確認します。
モデルを取得し、必要なら参照画像をアップロードして見積もりを取得します。確認済み見積もりと固定 Idempotency-Key で送信し、2 秒間隔で照会して保護された出力 API から取得します。
生成送信のみクレジットを消費します。見積もりとキー作成は無料です。失敗時は既存の返金・照合処理を使用します。結果不明のまま別の冪等キーで再送信しないでください。
キーごとに毎分 60 リクエストまでです。429 には Retry-After が含まれます。有効期限は 1–365 日で、随時失効できます。
| HTTP | URL | 権限 |
|---|---|---|
| GET | /api/v1/models | models:read |
| GET | /api/v1/assets | assets:read |
| GET | /api/v1/assets/{id}/download | assets:read |
| POST | /api/v1/uploads | assets:write |
| PUT | /api/v1/uploads/{id} | assets:write |
| POST | /api/v1/uploads/{id}/complete | assets:write |
| POST | /api/v1/quotes | generations:write |
| POST | /api/v1/generations | generations:write |
| GET | /api/v1/generations/{kind}/{id} | generations:read |
| GET | /api/v1/generations/{kind}/{id}/outputs/{index} | generations:read |
MIME とサイズを宣言、PUT で送信、完了の 3 手順です。サーバーは 10 MB 以下の JPEG・PNG・WebP を検証します。返された素材 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:一時利用不可。エラーコードを確認し、有料送信を別のキーで自動再試行しないでください。