Die Entwickler-APIs befinden sich weiterhin in der Beta-Phase und können jederzeit geändert werden. Derzeit eignen sie sich eher für persönliche Tests und Experimente und werden noch nicht für den Produktionseinsatz empfohlen.
Rufe die 59 in diesem Deployment aktivierten Funktionen über REST auf oder nutze sie direkt in MCP-kompatiblen KI-Tools. Ein aktives Abonnement ist erforderlich.
Codex MCP, REST, Claude Code, Cursor und manuelle MCP-Clients verwenden eigene API-Schlüssel. Codex speichert den statischen Authorization-Header in der Benutzerkonfiguration; sende einen Schlüssel niemals per Chat oder Shell-Verlauf.
Jede Anfrage wird mit einem API-Schlüssel authentifiziert, der an dein Abonnement gebunden ist.
Authorization: Bearer YOUR_API_KEYEin abgelaufenes Abonnement gibt 403 zurück; nach der Verlängerung funktionieren bestehende API-Schlüssel wieder. Nur ACCOUNT_SESSION_REFRESH_REQUIRED wird durch einmaliges Anmelden bei VidMage behoben; folge bei anderen 401-Typen der jeweiligen Wiederherstellungsaktion.
Verwende eine kurzlebige, größengebundene URL, um lokale Bilder, Videos oder Audiodateien direkt in den Speicher hochzuladen. Die Dateidaten laufen nicht über den VidMage-Anwendungsserver.
curl -X POST "https://vidmage.ai/api/v1/files/upload" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "capability": "video-upscaler", "parameter": "videoURL", "duration": 7.25, "fileName": "input.mp4", "localPath": "./input.mp4", "contentType": "video/mp4", "fileSize": 12345678 }'
# -> { "uploadCommand": "curl ...", "fileUrl": "https://..." }
# Run uploadCommand once, then use fileUrl in the generation request.# ~/.codex/config.toml
# Direct, persistent user-level MCP registration; this is not a plugin install.
# Replace any existing [mcp_servers.vidmage] table; do not append a duplicate.
[mcp_servers.vidmage]
url = "https://vidmage.ai/api/mcp"
http_headers = { Authorization = "Bearer YOUR_API_KEY" }
enabled = true
required = true
startup_timeout_sec = 30
tool_timeout_sec = 120
# Save this file, then confirm persistence with: codex mcp get vidmage
# Restrict the user-level file after saving: chmod 600 ~/.codex/config.toml
# Diagnose this direct server from VidMage startup errors; a remote Plugins catalog 401 is unrelated.
# Fully restart Codex, create a new task, and call list_capabilities.Rufe zuerst list_capabilities auf. Verwende für eine Generierung einen neuen, stabilen idempotencyKey, rufe submit_task genau einmal auf und frage danach dieselbe taskId ab. Geht die Antwort verloren, rufe zuerst get_recent_tasks auf; verwende den ursprünglichen Schlüssel nur für einen Transportwiederholungsversuch derselben Übermittlung.
list_models → estimate_model_creditsJede Anfrage wird mit einem API-Schlüssel authentifiziert, der an dein Abonnement gebunden ist.
list_capabilities (Text zu Bild)
→ describe_capability
→ submit_task + neuer stabiler idempotencyKey (genau einmal)
→ get_task_result (denselben Task abfragen)
→ get_recent_tasks (nur bei verlorener Submit-Antwort)
→ natives BildergebnisAlle KI-Tasks laufen asynchron. Jede Funktion stellt zwei Endpunkte bereit:
| Endpunkt | Beschreibung |
|---|---|
| GET /api/v1/capabilities | Jede Anfrage wird mit einem API-Schlüssel authentifiziert, der an dein Abonnement gebunden ist. |
| GET /api/v1/openapi.json | Jede Anfrage wird mit einem API-Schlüssel authentifiziert, der an dein Abonnement gebunden ist. |
| POST /api/v1/files/upload | Erstellt eine eingeschränkte temporäre Direkt-Upload-URL für eine lokale Mediendatei. |
| GET /api/v1/tasks/recent | Stellt aktuelle Task-IDs nach Zeitüberschreitung, Verbindungsabbruch oder verlorener Antwort wieder her. |
| POST /api/v1/<capability>/submit | Startet einen Task und gibt dessen Task-ID sofort zurück. |
| POST /api/v1/<capability>/query | Fragt einen Task per ID ab und liefert nach Abschluss Status und Ergebnis-URL. |
curl -X POST "https://vidmage.ai/api/v1/face-swap/submit" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"targetImageUrl":"https://vidmage.ai/assets/images/samples/blue-eyed-woman-sunlight.webp","referenceFaceImageUrl":"https://vidmage.ai/assets/images/samples/smiling-man-sweater.webp"}'
# -> { "success": true, "taskId": "...", "creditsRequired": ..., "creditsConsumed": 0, "usageDeferred": true }curl -X POST "https://vidmage.ai/api/v1/face-swap/query" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "taskId": "TASK_ID_FROM_SUBMIT" }'
# -> { "success": true, "data": { "status": "...", "imageUrl": "https://..." } }Funktionskatalog und OpenAPI 3.1-Dokument werden aus demselben Vertrag wie die Laufzeitvalidierung erzeugt. Importiere die Spezifikation in Postman, Insomnia, Bruno oder einen API-Clientgenerator.
curl -H "Authorization: Bearer YOUR_API_KEY" "https://vidmage.ai/api/v1/capabilities"curl -H "Authorization: Bearer YOUR_API_KEY" "https://vidmage.ai/api/v1/openapi.json" --output vidmage-openapi.jsoncurl -H "Authorization: Bearer YOUR_API_KEY" "https://vidmage.ai/api/v1/tasks/recent?limit=10"Diese Beispiele senden einen Task einmal ab und fragen dieselbe Task-ID bis zum Abschluss ab. Verwende bei einem erneuten Versuch derselben Übermittlung denselben Idempotency-Key.
const submitResponse = await fetch('https://vidmage.ai/api/v1/face-swap/submit', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.VIDMAGE_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"targetImageUrl": "https://vidmage.ai/assets/images/samples/blue-eyed-woman-sunlight.webp",
"referenceFaceImageUrl": "https://vidmage.ai/assets/images/samples/smiling-man-sweater.webp"
}),
})
const submitted = await submitResponse.json()
if (!submitResponse.ok || !submitted.success) {
throw new Error(submitted.message ?? submitted.error ?? 'Task submission failed')
}
const taskId = submitted["taskId"]
if (!taskId) throw new Error('Submit succeeded without a task id')
while (true) {
await new Promise(resolve => setTimeout(resolve, 5000))
const queryResponse = await fetch('https://vidmage.ai/api/v1/face-swap/query', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.VIDMAGE_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({ taskId: taskId }),
})
const queried = await queryResponse.json()
if (!queryResponse.ok || !queried.success) {
throw new Error(queried.message ?? queried.error ?? 'Task query failed')
}
const data = queried.data ?? queried
const status = String(data.status ?? '').toLowerCase()
if (['success', 'succeeded', 'completed'].includes(status)) {
console.log(queried.result ?? queried["imageUrl"] ?? data["imageUrl"])
break
}
if (['failed', 'error'].includes(status)) {
throw new Error(data.errorDetail ?? data.error ?? 'Task failed')
}
}import os
import time
import requests
submit_response = requests.post(
"https://vidmage.ai/api/v1/face-swap/submit",
headers={
"Authorization": f"Bearer {os.environ['VIDMAGE_API_KEY']}",
},
json={
"targetImageUrl": "https://vidmage.ai/assets/images/samples/blue-eyed-woman-sunlight.webp",
"referenceFaceImageUrl": "https://vidmage.ai/assets/images/samples/smiling-man-sweater.webp",
},
timeout=60,
)
submitted = submit_response.json()
if not submit_response.ok or not submitted.get("success"):
raise RuntimeError(submitted.get("message") or submitted.get("error") or "Task submission failed")
task_id = submitted["taskId"]
if not task_id:
raise RuntimeError("Submit succeeded without a task id")
while True:
time.sleep(5)
query_response = requests.post(
"https://vidmage.ai/api/v1/face-swap/query",
headers={"Authorization": f"Bearer {os.environ['VIDMAGE_API_KEY']}"},
json={"taskId": task_id},
timeout=60,
)
queried = query_response.json()
if not query_response.ok or not queried.get("success"):
raise RuntimeError(queried.get("message") or queried.get("error") or "Task query failed")
data = queried.get("data") or queried
status = str(data.get("status") or "").lower()
if status in {"success", "succeeded", "completed"}:
print(queried.get("result") or queried.get("imageUrl") or data.get("imageUrl"))
break
if status in {"failed", "error"}:
raise RuntimeError(data.get("errorDetail") or data.get("error") or "Task failed")Nutze den HTTP-Status für die Ablaufsteuerung und errorType für gezielte Wiederherstellung. Jede REST-Antwort enthält eine X-Request-Id für Nachverfolgung und Support.
| Status | Häufiger errorType | Empfohlene Maßnahme |
|---|---|---|
| 400 | INVALID_JSON / VALIDATION_ERROR | Korrigiere die unter details aufgeführten Felder; wiederhole die Anfrage nicht unverändert. |
| 401 | AUTHENTICATION_REQUIRED | VidMage hat keine Anmeldedaten erhalten. Füge Authorization zur Codex-Benutzerkonfiguration oder zum Zielclient hinzu; fordere oder sende niemals einen API-Schlüssel im Chat. |
| 401 | AUTHORIZATION_HEADER_INVALID | Korrigiere den Authorization Header exakt zu Bearer <API_KEY>; es wurde kein Task übermittelt. |
| 401 | API_KEY_INVALID_OR_REVOKED | Erstelle einen neuen API-Schlüssel und ersetze nur Authorization in der vorhandenen Konfiguration; starte Codex neu und prüfe in einem neuen Task. |
| 401 | API_KEY_INVALID_CREDENTIAL | Erstelle einen neuen API-Schlüssel und ersetze die Anmeldedaten im Ziel-Client; die bisherigen Anmeldedaten können nicht entschlüsselt werden. |
| 401 | ACCOUNT_SESSION_REFRESH_REQUIRED | Melde dich einmal bei VidMage an. Der Dienst aktualisiert die in vorhandenen API-Schlüsseln hinterlegten Kontoanmeldedaten; die Client-Konfiguration bleibt unverändert. |
| 401 REST | NEED_API_KEY | Nur für REST-Kompatibilität: Gib einen API-Schlüssel an. |
| 402 | NEED_PURCHASE_CREDITS | Füge Guthaben hinzu oder wähle eine günstigere Operation. |
| 403 | NEED_SUBSCRIBE | Aktiviere oder verlängere das Abonnement des Kontos. |
| 404 | CAPABILITY_NOT_ENABLED | Lade die Funktions-Discovery neu. Die Funktion ist deaktiviert oder in diesem Deployment nicht verfügbar. |
| 409 | UPLOAD_NOT_READY / IDEMPOTENCY_CONFLICT / IDEMPOTENCY_IN_PROGRESS | Wird eine Übermittlung noch verarbeitet, warte die angegebene Zeit und verwende denselben idempotencyKey. Erstelle nur für eine andere Generierungsanfrage einen neuen Schlüssel. |
| 410 | UPLOAD_EXPIRED | Erstelle einen neuen temporären Upload; die vorherige Datei-URL ist abgelaufen. |
| 429 | RATE_LIMITED | Warte gemäß Retry-After und versuche es anschließend mit begrenztem exponentiellem Backoff erneut. |
| 503 | CREDENTIAL_STORAGE_UNAVAILABLE | Beachte Retry-After und versuche es nur einmal erneut. Bleibt der Fehler bestehen, stoppe, melde requestId und bitte den Betrieb, Developers MySQL readiness wiederherzustellen. Behalte den API-Schlüssel und sende nicht erneut. |
| 503 / MCP | SUBMISSION_OUTCOME_UNKNOWN / BILLING_OUTCOME_UNKNOWN / REFUND_OUTCOME_UNKNOWN | Befolge zuerst recovery: GET_RECENT_TASKS bedeutet get_recent_tasks aufzurufen; QUERY_TASK_ID_OR_CONTACT_SUPPORT bedeutet dieselbe taskId abzufragen oder den Support zu kontaktieren; CONTACT_SUPPORT_WITH_IDEMPOTENCY_KEY_AND_BUSINESS_ID bedeutet den Support mit idempotencyKey und businessId zu kontaktieren. Erstelle niemals eine neue idempotencyKey und übermittle nicht erneut. |
| 503 / MCP | TASK_PERSISTENCE_UNCERTAIN | Bewahre taskId auf, übermittle den Task nicht erneut und kontaktiere bei anhaltendem Problem den Support mit taskId. |
| MCP | TASK_QUERY_INTERRUPTED | Setze die Abfrage derselben taskId fort; übermittle keinen weiteren Task. |
| MCP | RESULT_MISSING | Frage dieselbe taskId weiter ab; übermittle den Task nicht erneut. |
| 404 / MCP | TASK_NOT_FOUND | Rufe vor jedem Wiederholungsversuch get_recent_tasks auf; übermittle keinen kostenpflichtigen Task erneut. |
| 502 / MCP | BILLING_INVARIANT_FAILED | Versuche es nicht erneut, tausche den API-Schlüssel nicht aus, ändere die ursprüngliche Idempotency-Key nicht und übermittle nicht erneut. Kontaktiere den Support mit taskId, falls vorhanden, capability und der ursprünglichen Idempotency-Key; bei REST zusätzlich mit X-Request-Id. |
| 5xx | *_SERVICE_UNAVAILABLE / UPSTREAM_* | Bei anderen 5xx-Fehlern nutze begrenzten exponentiellen Backoff und behalte die Task-ID. Dies gilt nicht für CREDENTIAL_STORAGE_UNAVAILABLE. |
Die folgenden Parameter bilden den Request-Body für submit. Verwende beim Polling von query dasselbe Task-ID-Feld.