Production API Referenzkarte
Menschliche Orientierung; generierte Referenz und OpenAPI bleiben die exakte Maschinenautorität.
Die Dokumentation ist öffentlich teilbar; Verfügbarkeit von API/MCP wird jedoch vom Live-Manifest und Kontozugriff bestimmt. Foundation oder experimental sind keine Stabilitätszusagen.
| Methode | Endpoint | Autorität | Zweck |
|---|---|---|---|
| GET | /api/v1/product/manifest | read | Produktwahrheit und Reifegrad |
| GET | /api/v1/openapi | read | Maschinenlesbarer API-Vertrag |
| GET | /api/v1/production/capabilities | read | Verfügbare Produktionsfähigkeiten entdecken |
| GET | /api/v1/production/verticals | read | Produktionsrezepte auflisten |
| POST | /api/v1/production/plans | plan | Einen Produktionsplan ohne Ausgaben erstellen |
| POST | /api/v1/production/plans/:planId/preflight | read | Bereitschaft vor der Ausführung prüfen |
| POST | /api/v1/production/plans/:planId/storyboard/apply | mutate | Ein freigegebenes Storyboard anwenden |
| POST | /api/v1/production/plans/:planId/steps/:stepId/execute | spend | Einen bestätigten Planschritt ausführen |
| POST | /api/v1/production/plans/:planId/generate | spend | Bestätigte dauerhafte Produktion starten |
| GET | /api/v1/production/jobs/:jobId | read | Dauerhaften Jobstatus lesen |
| GET | /api/v1/production/plans/:planId/ledger | read | Ausführungs-Ledger lesen |
| POST | /api/v1/production/snapshots/generate-scene | spend | Eine bestätigte Szene mit zugelassenen FPS generieren |
| POST | /api/v1/production/snapshots/preflight-scene | read | Exakte Szenen-FPS und Kosten ohne Ausgaben prüfen |
Für Felddetails den generierten Vertrag verwenden
Diese Seite erklärt Bedeutung und Autorität. Exakte Schemas: /api/v1/docs und /api/v1/openapi.
Fehler als Zustand behandeln
Maschinenlesbare Codes und HTTP-Status für Auth, Forbidden, ungültige IDs, fehlende Idempotenz, Credits, Preflight, Rate Limit und Infrastruktur behandeln.
Leseoperationen vorsichtig wiederholen
Retrybare Leseprobleme sind von mutierenden oder bezahlten Operationen getrennt, die nie blind wiederholt werden dürfen.
24, 30 und 60 FPS in Studio, API und MCP
Alle drei Schnittstellen verwenden denselben bestätigten Szenen-Snapshot und dieselbe Zulassung. Die angeforderten FPS bleiben erhalten; kein automatischer Wechsel zu 24 FPS. Verfügbarkeit hängt vom freigegebenen Worker und der konkreten Szene ab.
START/END-Bildflächen: 704×1280, 1280×704 oder 960×960. I2V erlaubt generiertes oder kein Audio. A2V benötigt autorisiertes Quellaudio und behält dessen gewählten Zeitversatz. Diese Tabelle aktiviert keine hohen FPS für Ingredients oder V2V. Seeds sind Ganzzahlen von 0 bis 2147483647. I2V und A2V erlauben END ohne START bei 24, 30 und 60 FPS nur nach ausdrücklicher Freigabe des bereitgestellten Dienstes. END führt das letzte Bild; der Anfang entsteht aus dem Prompt. start bleibt leer, das Bild bleibt in end. Pixelidentität oder eine Umkehrung des Videos werden nicht zugesagt. A2V benötigt immer autorisiertes Quellaudio und mindestens ein START- oder END-Bild; Audio allein ist nicht zulässig.
| FPS | Zugelassene Klasse | Physische Grenzen |
|---|---|---|
| 24 | Standard; eigene Zulassung der gewählten Modalität | Dauer, Audio und Referenzen hängen von der nativen Klasse ab |
| 30 | Nur freigegebenes I2V / A2V | 720p · 2–10 ganze Sekunden · 9:16 / 16:9 / 1:1 · I2V/A2V: START und/oder END; A2V benötigt zusätzlich Quellaudio |
| 60 | Nur freigegebenes I2V / A2V | 720p · 2–10 ganze Sekunden · 9:16 / 16:9 / 1:1 · I2V/A2V: START und/oder END; A2V benötigt zusätzlich Quellaudio |
Speichern, Kosten prüfen, eine Szene bestätigen
Autorisiertes Projekt erstellen oder lesen, Szene mit PATCH expectedVersion speichern. Denselben Snapshot und targetSceneId an /api/v1/production/snapshots/preflight-scene senden. data.ready, issues und estimatedCredits prüfen; kein Job und keine Kreditreservierung. Mit confirm=true und stabilem Idempotency-Key über /api/v1/production/snapshots/generate-scene generieren, danach jobId abfragen. MCP verwendet myeq.video.preflight_scene und myeq.video.generate_scene mit demselben Snapshot; bezahlte Übermittlung wird nie automatisch wiederholt. Szeneneinstellungen überschreiben Projektstandards; passende bestätigte sceneContracts erhalten.
Die alten /video/start-, /video/create-, /video/create-job- und /video/preflight-Routen sind eingestellt: Standard/24 liefert 410, 30/60 erfordert Snapshot-Migration mit 422. 25/48/50 werden nicht unterstützt. Preflight-Fehler ändern keine FPS und berechnen keine Credits. Eine erfolgreiche Prüfung reserviert weder Verfügbarkeit noch Guthaben.
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'));
}