De ontwikkelaars-API's bevinden zich nog in de bètafase en kunnen op elk moment wijzigen. Op dit moment zijn ze vooral geschikt voor persoonlijke tests en experimenten en worden ze nog niet aanbevolen voor productiegebruik.
Roep de 59 mogelijkheden die voor deze implementatie zijn ingeschakeld aan via REST, of gebruik ze rechtstreeks in MCP-compatibele AI-tools. Een actief abonnement is vereist.
Codex MCP, REST, Claude Code, Cursor en handmatige MCP-clients gebruiken speciale API-sleutels. Codex bewaart de statische Authorization-header in de gebruikersconfiguratie; stuur een sleutel nooit via chat of shellgeschiedenis.
Elk verzoek wordt geauthenticeerd met een API-sleutel die aan je abonnement is gekoppeld.
Authorization: Bearer YOUR_API_KEYEen verlopen abonnement geeft 403 terug en bestaande API-sleutels werken weer na verlenging. Alleen ACCOUNT_SESSION_REFRESH_REQUIRED wordt opgelost door eenmaal bij VidMage aan te melden; volg voor andere 401-fouten de specifieke herstelactie.
Gebruik een kort geldige, aan de grootte gebonden URL om lokale afbeeldingen, video of audio rechtstreeks naar de opslag te uploaden. De bestandsbytes gaan niet via de VidMage-applicatieserver.
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.Roep eerst list_capabilities aan. Gebruik voor generatie een nieuwe, stabiele idempotencyKey, roep submit_task precies één keer aan en blijf daarna dezelfde taskId opvragen. Roep bij een verloren antwoord eerst get_recent_tasks aan; hergebruik de oorspronkelijke sleutel alleen voor een transportherhaling van dezelfde inzending.
list_models → estimate_model_creditsElk verzoek wordt geauthenticeerd met een API-sleutel die aan je abonnement is gekoppeld.
list_capabilities (tekst naar afbeelding)
→ describe_capability
→ submit_task + nieuwe stabiele idempotencyKey (precies één keer)
→ get_task_result (dezelfde taak opvragen)
→ get_recent_tasks (alleen bij verloren antwoord)
→ oorspronkelijk afbeeldingsresultaatAlle AI-taken zijn asynchroon. Elke mogelijkheid biedt twee endpoints:
| Endpoint | Beschrijving |
|---|---|
| GET /api/v1/capabilities | Elk verzoek wordt geauthenticeerd met een API-sleutel die aan je abonnement is gekoppeld. |
| GET /api/v1/openapi.json | Elk verzoek wordt geauthenticeerd met een API-sleutel die aan je abonnement is gekoppeld. |
| POST /api/v1/files/upload | Maakt een beperkte tijdelijke URL voor directe upload van een lokaal mediabestand. |
| GET /api/v1/tasks/recent | Herstelt recente taak-ID's na een time-out, verbroken verbinding of verloren antwoord. |
| POST /api/v1/<capability>/submit | Start een taak en geeft het taak-ID direct terug. |
| POST /api/v1/<capability>/query | Vraagt een taak op via het ID en geeft na voltooiing de status en resultaat-URL terug. |
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://..." } }De catalogus met mogelijkheden en het OpenAPI 3.1-document worden gegenereerd uit hetzelfde contract dat verzoeken valideert. Importeer de specificatie in Postman, Insomnia, Bruno of een 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"Deze voorbeelden dienen een taak één keer in en pollen dezelfde taak-ID tot deze klaar is. Behoud dezelfde idempotency key wanneer je dezelfde inzending opnieuw probeert.
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")Gebruik de HTTP-status voor de besturingsstroom en errorType voor gericht herstelgedrag. Elk REST-antwoord bevat de header X-Request-Id voor tracering en ondersteuning.
| Status | Veelvoorkomend errorType | Aanbevolen actie |
|---|---|---|
| 400 | INVALID_JSON / VALIDATION_ERROR | Corrigeer de velden in details; probeer dezelfde ongewijzigde invoer niet opnieuw. |
| 401 | AUTHENTICATION_REQUIRED | VidMage heeft geen referentie ontvangen. Voeg Authorization toe aan de Codex-gebruikersconfiguratie of doelclient; vraag of plak nooit een API-sleutel in de chat. |
| 401 | AUTHORIZATION_HEADER_INVALID | Corrigeer de Authorization Header naar exact Bearer <API_KEY>; er is geen taak ingediend. |
| 401 | API_KEY_INVALID_OR_REVOKED | Maak een nieuwe API-sleutel en vervang alleen Authorization in de bestaande configuratie; herstart Codex en controleer in een nieuwe taak. |
| 401 | API_KEY_INVALID_CREDENTIAL | Maak een nieuwe API-sleutel en vervang de aanmeldgegevens in de doelclient; de bestaande aanmeldgegevens kunnen niet worden ontsleuteld. |
| 401 | ACCOUNT_SESSION_REFRESH_REQUIRED | Meld je één keer aan bij VidMage. De service vernieuwt de achterliggende accountreferentie in bestaande API-sleutels; de clientconfiguratie blijft ongewijzigd. |
| 401 REST | NEED_API_KEY | Alleen voor REST-compatibiliteit: geef een API-sleutel op. |
| 402 | NEED_PURCHASE_CREDITS | Voeg credits toe of kies een goedkopere bewerking. |
| 403 | NEED_SUBSCRIBE | Activeer of verleng het accountabonnement. |
| 404 | CAPABILITY_NOT_ENABLED | Vernieuw de discovery van mogelijkheden. De mogelijkheid is uitgeschakeld of niet beschikbaar in deze implementatie. |
| 409 | UPLOAD_NOT_READY / IDEMPOTENCY_CONFLICT / IDEMPOTENCY_IN_PROGRESS | Als de inzending nog wordt verwerkt, wacht je de aangegeven tijd en hergebruik je dezelfde idempotencyKey. Maak alleen voor een ander generatieverzoek een nieuwe sleutel. |
| 410 | UPLOAD_EXPIRED | Maak een nieuwe tijdelijke upload; de vorige bestands-URL is verlopen. |
| 429 | RATE_LIMITED | Wacht gedurende Retry-After en probeer opnieuw met begrensde exponentiële back-off. |
| 503 | CREDENTIAL_STORAGE_UNAVAILABLE | Volg Retry-After en probeer slechts één keer opnieuw. Blijft de fout bestaan, stop dan, meld requestId en vraag operations om Developers MySQL readiness te herstellen. Bewaar de API-sleutel en dien niet opnieuw in. |
| 503 / MCP | SUBMISSION_OUTCOME_UNKNOWN / BILLING_OUTCOME_UNKNOWN / REFUND_OUTCOME_UNKNOWN | Volg eerst recovery: GET_RECENT_TASKS betekent get_recent_tasks aanroepen; QUERY_TASK_ID_OR_CONTACT_SUPPORT betekent dezelfde taskId opvragen of ondersteuning benaderen; CONTACT_SUPPORT_WITH_IDEMPOTENCY_KEY_AND_BUSINESS_ID betekent ondersteuning benaderen met idempotencyKey en businessId. Maak nooit een nieuwe idempotencyKey, dien niet opnieuw in en probeer geen tweede terugbetaling. |
| 503 / MCP | TASK_PERSISTENCE_UNCERTAIN | Bewaar taskId, dien de taak niet opnieuw in en neem bij een aanhoudend probleem contact op met ondersteuning onder vermelding van taskId. |
| MCP | TASK_QUERY_INTERRUPTED | Hervat het opvragen van dezelfde taskId; dien geen andere taak in. |
| MCP | RESULT_MISSING | Blijf dezelfde taskId opvragen; dien de taak niet opnieuw in. |
| 404 / MCP | TASK_NOT_FOUND | Roep vóór een nieuwe poging get_recent_tasks aan; dien een betaalde taak niet opnieuw in. |
| 502 / MCP | BILLING_INVARIANT_FAILED | Probeer niet opnieuw, vervang de API-sleutel niet, wijzig de oorspronkelijke Idempotency-Key niet en dien niet opnieuw in. Neem contact op met ondersteuning met taskId indien aanwezig, capability en de oorspronkelijke Idempotency-Key; voeg voor REST ook X-Request-Id toe. |
| 5xx | *_SERVICE_UNAVAILABLE / UPSTREAM_* | Gebruik voor andere 5xx-fouten begrensde exponentiële back-off en bewaar het taak-ID. Dit geldt niet voor CREDENTIAL_STORAGE_UNAVAILABLE. |
De onderstaande parameters vormen de requestbody voor submit. Gebruik hetzelfde taak-ID-veld wanneer je pollt met query.