Production API リファレンスマップ
人向けの案内です。正確な機械契約は生成 API Reference と OpenAPI です。
ドキュメントは公開できますが、API/MCP の利用可否はライブの製品マニフェストとアカウント権限で決まります。foundation / experimental は安定性保証ではありません。
| Method | Endpoint | 権限 | 目的 |
|---|---|---|---|
| GET | /api/v1/product/manifest | read | 製品の事実と成熟度 |
| GET | /api/v1/openapi | read | 機械可読 API 契約 |
| GET | /api/v1/production/capabilities | read | 利用可能な制作 capability を確認 |
| GET | /api/v1/production/verticals | read | 制作 recipe を一覧表示 |
| POST | /api/v1/production/plans | plan | 課金なしの production plan を作成 |
| POST | /api/v1/production/plans/:planId/preflight | read | 実行前の readiness を検証 |
| POST | /api/v1/production/plans/:planId/storyboard/apply | mutate | 承認済み Storyboard を適用 |
| POST | /api/v1/production/plans/:planId/steps/:stepId/execute | spend | 確認済み plan step を実行 |
| POST | /api/v1/production/plans/:planId/generate | spend | 確認済み durable production を開始 |
| GET | /api/v1/production/jobs/:jobId | read | durable job status を取得 |
| GET | /api/v1/production/plans/:planId/ledger | read | execution ledger を取得 |
| POST | /api/v1/production/snapshots/generate-scene | spend | 確認済みシーンを受付可能な FPS で生成 |
| POST | /api/v1/production/snapshots/preflight-scene | read | 課金せずにシーンの正確な FPS と費用を確認 |
正確なフィールドは生成契約を参照
ここでは意味と権限を説明します。厳密な schema は /api/v1/docs と /api/v1/openapi。
エラーは状態として扱う
auth、forbidden、invalid id、missing idempotency、credits、preflight、rate limit、infra の machine-readable code / HTTP status を処理します。
Read retry は慎重に
再試行可能な read と、盲目的に再実行してはいけない mutate/spend を区別します。
Studio・API・MCP の 24 / 30 / 60 FPS
3つのインターフェースは同じ確定済みシーン snapshot と受付判定を使います。指定 FPS は保持され、24 FPS への自動変更はありません。利用可否は承認済み worker とシーンの正確な条件で決まります。
START/END の画像サイズは 704×1280、1280×704、960×960 です。I2V は生成音声または音声なし。A2V は使用権限のある元音声が必要で、選択した開始位置を保持します。この表は ingredients や V2V の高 FPS 対応を意味しません。seed は 0~2147483647 の整数です。 I2V と A2V の END のみの指定は、24 / 30 / 60 FPS で配備済みサービスが明示的に承認した場合に利用できます。END は最終フレームを導き、冒頭はプロンプトから生成されます。start を空にして画像を end に置きます。画素の完全一致や動画の逆再生を保証するものではありません。 A2V には使用権限のある元音声と、少なくとも START または END の画像1枚が必要です。音声だけでは生成できません。
| FPS | 受付対象 | 物理的な制約 |
|---|---|---|
| 24 | 既定値。選択した各モダリティの受付判定が必要 | 長さ・音声・参照は選択した native class に依存 |
| 30 | 承認済み I2V / A2V のみ | 720p・整数 2~10 秒・9:16 / 16:9 / 1:1・I2V/A2V: START または END、両方も可。A2V は元音声も必須 |
| 60 | 承認済み I2V / A2V のみ | 720p・整数 2~10 秒・9:16 / 16:9 / 1:1・I2V/A2V: START または END、両方も可。A2V は元音声も必須 |
保存・料金確認・1シーンの実行確認
権限のある project を作成または取得し、PATCH expectedVersion でシーンを保存します。同じ snapshot と targetSceneId を /api/v1/production/snapshots/preflight-scene に送り、data.ready・issues・estimatedCredits を確認します。job 作成や credit 予約は行いません。confirm=true と固定 Idempotency-Key を付けて /api/v1/production/snapshots/generate-scene へ送り、返された jobId を確認します。MCP は myeq.video.preflight_scene と myeq.video.generate_scene を使用し、有料送信は自動再試行しません。シーン設定が全体設定より優先されます。対応する確定 sceneContracts を保持してください。
旧 /video/start、/video/create、/video/create-job、/video/preflight は廃止済みです。既定/24 は 410、30/60 は snapshot への移行が必要で 422 を返します。25/48/50 は非対応です。preflight 失敗時に FPS 変更や課金はありません。成功しても空き枠や残高は予約されません。
const base = process.env.MYEQ_BASE_URL || 'https://myeq.pro';
const headers = { Authorization: 'Bearer ' + process.env.MYEQ_API_KEY, 'Content-Type': 'application/json' };
async function api(path, method, body, extra = {}) {
const response = await fetch(base + path, { method, headers: { ...headers, ...extra },
...(body === undefined ? {} : { body: JSON.stringify(body) }) });
const value = await response.json();
if (!response.ok) throw new Error(JSON.stringify(value));
return value;
}
const project = await api('/api/v1/projects', 'POST', { title: '60 FPS', aspectRatio: '9:16', duration: 4 });
const sourceAudioUrl = process.env.SOURCE_AUDIO_URL;
const generationInputs = { videoProvider: 'myeq_v2', videoModelSelection: 'myeq_v2',
inputModality: sourceAudioUrl ? 'audio_to_video' : 'image_to_video', durationSeconds: 4,
fps: 60, outputResolution: '720p', includeAudio: Boolean(sourceAudioUrl), seed: 12345,
...(sourceAudioUrl ? { sourceAudioUrl, sourceAudioStartTime: 0 } : {}) };
const scene = { id: 'scene-1', prompt: 'A slow camera move. Preserve the subject.',
settings: { fps: 60, durationSeconds: 4 },
start: process.env.START_URL ? [{ name: 'START', url: process.env.START_URL }] : [],
end: process.env.END_URL ? [{ name: 'END', url: process.env.END_URL }] : [], context: [], avatar: [] };
const snapshot = { id: crypto.randomUUID(), version: 1, projectId: project.id,
ownerId: project.ownerUserId, sourceEditorStateVersion: project.version + 1,
createdAt: new Date().toISOString(), projectTitle: project.title,
aspectRatio: '9:16', resolution: '720p', durationSeconds: 4, fps: 60,
generationInputs, scenes: [scene], avatars: [], assetsSummary: [],
sourceAudio: sourceAudioUrl ? { url: sourceAudioUrl, durationSeconds: null } : null, provenance: { source: 'ui' } };
await api('/api/v1/projects/' + project.id, 'PATCH', { expectedVersion: project.version,
editorState: { ...project.editorState, generationInputs,
sceneStoryboard: { scenes: [scene] }, productionSnapshot: snapshot } });
const input = { snapshot, targetSceneId: scene.id };
const quote = await api('/api/v1/production/snapshots/preflight-scene', 'POST', input);
console.log(quote);
if (quote.data?.ready && process.env.CONFIRM_PAID === 'true') {
const idempotencyKey = process.env.SAVED_IDEMPOTENCY_KEY;
if (!idempotencyKey) throw new Error('Persist one stable key before submitting');
const result = await api('/api/v1/production/snapshots/generate-scene', 'POST',
{ ...input, confirm: true }, { 'Idempotency-Key': idempotencyKey });
console.log(result);
const jobId = result.data?.pendingTake?.orchestrationJobId || result.data?.asset?.metadata?.jobId;
if (jobId) console.log(await api('/api/v1/production/jobs/' + encodeURIComponent(jobId), 'GET'));
}