Utvecklar-API:erna är fortfarande i betaversion och kan ändras när som helst. För närvarande lämpar de sig bäst för personlig testning och utvärdering och rekommenderas ännu inte för produktionsbruk.
Anropa de 59 funktioner som är aktiverade i den här driftsättningen via REST, eller använd dem direkt i MCP-kompatibla AI-verktyg. En aktiv prenumeration krävs.
Codex MCP, REST, Claude Code, Cursor och manuella MCP-klienter använder särskilda API-nycklar. Codex sparar den statiska Authorization-headern i användarkonfigurationen; skicka aldrig en nyckel via chatt eller skalhistorik.
Varje begäran autentiseras med en API-nyckel som är kopplad till din prenumeration.
Authorization: Bearer YOUR_API_KEYEn utgången prenumeration returnerar 403 och befintliga API-nycklar fungerar igen efter förnyelse. Endast ACCOUNT_SESSION_REFRESH_REQUIRED löses genom en inloggning på VidMage; följ den särskilda åtgärden för andra 401-fel.
Använd en kortlivad, storleksbunden URL för att ladda upp lokala bilder, videor eller ljud direkt till lagringen. Filens byte passerar inte VidMages applikationsserver.
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.Anropa list_capabilities först. Använd en ny, stabil idempotencyKey för generering, anropa submit_task exakt en gång och fortsätt sedan att hämta samma taskId. Om svaret förloras anropar du först get_recent_tasks; återanvänd bara den ursprungliga nyckeln för ett transportförsök av samma inskickning.
list_models → estimate_model_creditsVarje begäran autentiseras med en API-nyckel som är kopplad till din prenumeration.
list_capabilities (text till bild)
→ describe_capability
→ submit_task + ny stabil idempotencyKey (exakt en gång)
→ get_task_result (hämta samma uppgift)
→ get_recent_tasks (endast om svaret förlorades)
→ ursprungligt bildresultatAlla AI-uppgifter är asynkrona. Varje funktion har två endpoints:
| Endpoint | Beskrivning |
|---|---|
| GET /api/v1/capabilities | Varje begäran autentiseras med en API-nyckel som är kopplad till din prenumeration. |
| GET /api/v1/openapi.json | Varje begäran autentiseras med en API-nyckel som är kopplad till din prenumeration. |
| POST /api/v1/files/upload | Skapar en begränsad tillfällig direktuppladdnings-URL för en lokal mediefil. |
| GET /api/v1/tasks/recent | Återställer nya uppgifts-ID:n efter timeout, frånkoppling eller förlorat svar. |
| POST /api/v1/<capability>/submit | Startar en uppgift och returnerar dess uppgifts-ID direkt. |
| POST /api/v1/<capability>/query | Söker efter en uppgift med dess ID och returnerar status och resultat-URL när den är klar. |
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://..." } }Funktionskatalogen och OpenAPI 3.1-dokumentet genereras från samma kontrakt som används för validering av begäranden. Importera specifikationen i Postman, Insomnia, Bruno eller en API-klientgenerator.
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"Exemplen skickar en uppgift en gång och pollar samma uppgifts-ID tills den är klar. Behåll samma idempotency-nyckel när du försöker skicka samma begäran igen.
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")Använd HTTP-status för styrflödet och errorType för specifik återställning. Varje REST-svar innehåller headern X-Request-Id för spårning och support.
| Status | Vanlig errorType | Rekommenderad åtgärd |
|---|---|---|
| 400 | INVALID_JSON / VALIDATION_ERROR | Korrigera fälten i details. Försök inte igen med samma oförändrade indata. |
| 401 | AUTHENTICATION_REQUIRED | VidMage tog inte emot någon autentiseringsuppgift. Lägg till Authorization i Codex användarkonfiguration eller målklienten; be aldrig om eller klistra in en API-nyckel i chatten. |
| 401 | AUTHORIZATION_HEADER_INVALID | Korrigera Authorization Header till exakt Bearer <API_KEY>; ingen uppgift skickades in. |
| 401 | API_KEY_INVALID_OR_REVOKED | Skapa en ny API-nyckel och ersätt endast Authorization i den befintliga konfigurationen; starta om Codex och verifiera i en ny uppgift. |
| 401 | API_KEY_INVALID_CREDENTIAL | Skapa en ny API-nyckel och ersätt autentiseringsuppgifterna i målklienten; de befintliga uppgifterna kan inte dekrypteras. |
| 401 | ACCOUNT_SESSION_REFRESH_REQUIRED | Logga in på VidMage en gång. Tjänsten uppdaterar de underliggande kontouppgifterna i befintliga API-nycklar; klientkonfigurationen ändras inte. |
| 401 REST | NEED_API_KEY | Endast för REST-kompatibilitet: ange en API-nyckel. |
| 402 | NEED_PURCHASE_CREDITS | Lägg till krediter eller välj en billigare åtgärd. |
| 403 | NEED_SUBSCRIBE | Aktivera eller förnya kontots prenumeration. |
| 404 | CAPABILITY_NOT_ENABLED | Uppdatera funktionsidentifieringen. Funktionen är inaktiverad eller inte tillgänglig i den här driftsättningen. |
| 409 | UPLOAD_NOT_READY / IDEMPOTENCY_CONFLICT / IDEMPOTENCY_IN_PROGRESS | Om inskickningen fortfarande behandlas väntar du angiven tid och återanvänder samma idempotencyKey. Skapa endast en ny nyckel för en annan genereringsbegäran. |
| 410 | UPLOAD_EXPIRED | Skapa en ny tillfällig uppladdning; den tidigare fil-URL:en har upphört att gälla. |
| 429 | RATE_LIMITED | Vänta enligt Retry-After och försök sedan igen med begränsad exponentiell backoff. |
| 503 | CREDENTIAL_STORAGE_UNAVAILABLE | Följ Retry-After och försök bara en gång till. Om felet kvarstår, stoppa, rapportera requestId och be drift återställa Developers MySQL readiness. Behåll API-nyckeln och skicka inte in igen. |
| 503 / MCP | SUBMISSION_OUTCOME_UNKNOWN / BILLING_OUTCOME_UNKNOWN / REFUND_OUTCOME_UNKNOWN | Följ recovery först: GET_RECENT_TASKS betyder att anropa get_recent_tasks; QUERY_TASK_ID_OR_CONTACT_SUPPORT betyder att hämta samma taskId eller kontakta support; CONTACT_SUPPORT_WITH_IDEMPOTENCY_KEY_AND_BUSINESS_ID betyder att kontakta support med idempotencyKey och businessId. Skapa aldrig en ny idempotencyKey, skicka inte in igen och försök inte göra en ny återbetalning. |
| 503 / MCP | TASK_PERSISTENCE_UNCERTAIN | Behåll taskId, skicka inte in uppgiften igen och kontakta support med taskId om problemet kvarstår. |
| MCP | TASK_QUERY_INTERRUPTED | Fortsätt hämta samma taskId; skicka inte in en ny uppgift. |
| MCP | RESULT_MISSING | Fortsätt hämta samma taskId; skicka inte in uppgiften igen. |
| 404 / MCP | TASK_NOT_FOUND | Anropa get_recent_tasks före ett nytt försök; skicka inte in en betald uppgift igen. |
| 502 / MCP | BILLING_INVARIANT_FAILED | Försök inte igen, byt inte API-nyckel, ändra inte den ursprungliga Idempotency-Key och skicka inte in igen. Kontakta support med taskId om den visas, capability och den ursprungliga Idempotency-Key; för REST tar du även med X-Request-Id. |
| 5xx | *_SERVICE_UNAVAILABLE / UPSTREAM_* | För andra 5xx-fel använder du begränsad exponentiell backoff och behåller uppgifts-ID:t. Detta gäller inte CREDENTIAL_STORAGE_UNAVAILABLE. |
Parametrarna nedan utgör request body för submit. Använd samma uppgifts-ID-fält vid polling med query.