APIAPI

Production API リファレンスマップ

人向けの案内です。正確な機械契約は生成 API Reference と OpenAPI です。

API / MCP の成熟度

ドキュメントは公開できますが、API/MCP の利用可否はライブの製品マニフェストとアカウント権限で決まります。foundation / experimental は安定性保証ではありません。

MethodEndpoint権限目的
GET/api/v1/product/manifestread製品の事実と成熟度
GET/api/v1/openapiread機械可読 API 契約
GET/api/v1/production/capabilitiesread利用可能な制作 capability を確認
GET/api/v1/production/verticalsread制作 recipe を一覧表示
POST/api/v1/production/plansplan課金なしの production plan を作成
POST/api/v1/production/plans/:planId/preflightread実行前の readiness を検証
POST/api/v1/production/plans/:planId/storyboard/applymutate承認済み Storyboard を適用
POST/api/v1/production/plans/:planId/steps/:stepId/executespend確認済み plan step を実行
POST/api/v1/production/plans/:planId/generatespend確認済み durable production を開始
GET/api/v1/production/jobs/:jobIdreaddurable job status を取得
GET/api/v1/production/plans/:planId/ledgerreadexecution ledger を取得
POST/api/v1/production/snapshots/generate-scenespend確認済みシーンを受付可能な FPS で生成
POST/api/v1/production/snapshots/preflight-sceneread課金せずにシーンの正確な 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'));
}
Workspace · Project · Asset · Entity · Storyboard · Plan · Job生成済み ≠ 認証済み