Udvikler-API'erne er stadig i beta og kan ændres når som helst. På nuværende tidspunkt egner de sig bedst til personlig test og afprøvning og anbefales endnu ikke til produktionsbrug.
Kald de 59 funktioner, der er aktiveret i denne installation, via REST, eller brug dem direkte i MCP-kompatible AI-værktøjer. Der kræves et aktivt abonnement.
Codex MCP, REST, Claude Code, Cursor og manuelle MCP-klienter bruger dedikerede API-nøgler. Codex gemmer den statiske Authorization-header i brugerkonfigurationen; send aldrig en nøgle via chat eller shellhistorik.
Hver anmodning godkendes med en API-nøgle, der er knyttet til dit abonnement.
Authorization: Bearer YOUR_API_KEYEt udløbet abonnement returnerer 403, og eksisterende API-nøgler virker igen efter fornyelse. Kun ACCOUNT_SESSION_REFRESH_REQUIRED løses ved at logge ind på VidMage én gang; følg den specifikke handling for andre 401-fejl.
Brug en kortlivet, størrelsesbundet URL til at uploade lokale billeder, videoer eller lyd direkte til lageret. Filens bytes passerer ikke gennem VidMage-applikationsserveren.
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.Kald list_capabilities først. Brug en ny, stabil idempotencyKey til generering, kald submit_task præcis én gang, og hent derefter den samme taskId. Hvis svaret mistes, skal du først kalde get_recent_tasks; genbrug kun den oprindelige nøgle til en transportgentagelse af samme indsendelse.
list_models → estimate_model_creditsHver anmodning godkendes med en API-nøgle, der er knyttet til dit abonnement.
list_capabilities (tekst til billede)
→ describe_capability
→ submit_task + ny stabil idempotencyKey (præcis én gang)
→ get_task_result (hent samme opgave)
→ get_recent_tasks (kun hvis svaret gik tabt)
→ oprindeligt billedresultatAlle AI-opgaver er asynkrone. Hver funktion har to endpoints:
| Endpoint | Beskrivelse |
|---|---|
| GET /api/v1/capabilities | Hver anmodning godkendes med en API-nøgle, der er knyttet til dit abonnement. |
| GET /api/v1/openapi.json | Hver anmodning godkendes med en API-nøgle, der er knyttet til dit abonnement. |
| POST /api/v1/files/upload | Opretter en begrænset, midlertidig direkte upload-URL til en lokal mediefil. |
| GET /api/v1/tasks/recent | Gendanner nylige opgave-id'er efter timeout, afbrydelse eller et mistet svar. |
| POST /api/v1/<capability>/submit | Starter en opgave og returnerer straks dens opgave-id. |
| POST /api/v1/<capability>/query | Slår en opgave op efter id og returnerer status og resultat-URL, når den er færdig. |
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://..." } }Funktionskataloget og OpenAPI 3.1-dokumentet genereres fra den samme kontrakt, som bruges til validering af anmodninger. Importér 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"Disse eksempler indsender en opgave én gang og poller det samme opgave-id, indtil den er færdig. Behold den samme idempotency-nøgle, når du prøver den samme indsendelse 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")Brug HTTP-status til styringsflow og errorType til den konkrete gendannelse. Hvert REST-svar indeholder headeren X-Request-Id til sporing og support.
| Status | Almindelig errorType | Anbefalet handling |
|---|---|---|
| 400 | INVALID_JSON / VALIDATION_ERROR | Ret felterne i details; prøv ikke igen med de samme uændrede data. |
| 401 | AUTHENTICATION_REQUIRED | VidMage modtog ingen legitimationsoplysninger. Føj Authorization til Codex-brugerkonfigurationen eller målklienten; bed eller indsæt aldrig en API-nøgle i chatten. |
| 401 | AUTHORIZATION_HEADER_INVALID | Ret Authorization Header til præcis Bearer <API_KEY>; ingen opgave blev indsendt. |
| 401 | API_KEY_INVALID_OR_REVOKED | Opret en ny API-nøgle, og erstat kun Authorization i den eksisterende konfiguration; genstart Codex, og bekræft i en ny opgave. |
| 401 | API_KEY_INVALID_CREDENTIAL | Opret en ny API-nøgle, og erstat legitimationsoplysningerne i målklienten; de eksisterende legitimationsoplysninger kan ikke dekrypteres. |
| 401 | ACCOUNT_SESSION_REFRESH_REQUIRED | Log ind på VidMage én gang. Tjenesten opdaterer de bagvedliggende kontooplysninger i eksisterende API-nøgler; klientkonfigurationen ændres ikke. |
| 401 REST | NEED_API_KEY | Kun REST-kompatibilitet: angiv en API-nøgle. |
| 402 | NEED_PURCHASE_CREDITS | Tilføj kreditter, eller vælg en billigere handling. |
| 403 | NEED_SUBSCRIBE | Aktivér eller forny kontoens abonnement. |
| 404 | CAPABILITY_NOT_ENABLED | Opdater funktionsregistreringen. Funktionen er deaktiveret eller ikke tilgængelig i denne installation. |
| 409 | UPLOAD_NOT_READY / IDEMPOTENCY_CONFLICT / IDEMPOTENCY_IN_PROGRESS | Hvis indsendelsen stadig behandles, skal du vente den angivne tid og genbruge samme idempotencyKey. Opret kun en ny nøgle til en anden genereringsanmodning. |
| 410 | UPLOAD_EXPIRED | Opret en ny midlertidig upload; den tidligere fil-URL er udløbet. |
| 429 | RATE_LIMITED | Vent i tidsrummet angivet af Retry-After, og prøv igen med begrænset eksponentiel backoff. |
| 503 | CREDENTIAL_STORAGE_UNAVAILABLE | Følg Retry-After, og prøv kun én gang igen. Fortsætter fejlen, skal du stoppe, rapportere requestId og bede en operatør gendanne Developers MySQL readiness. Behold API-nøglen, og indsend ikke igen. |
| 503 / MCP | SUBMISSION_OUTCOME_UNKNOWN / BILLING_OUTCOME_UNKNOWN / REFUND_OUTCOME_UNKNOWN | Følg først recovery: GET_RECENT_TASKS betyder, at du skal kalde get_recent_tasks; QUERY_TASK_ID_OR_CONTACT_SUPPORT betyder, at du skal hente samme taskId eller kontakte support; CONTACT_SUPPORT_WITH_IDEMPOTENCY_KEY_AND_BUSINESS_ID betyder, at du skal kontakte support med idempotencyKey og businessId. Opret aldrig en ny idempotencyKey, og indsend ikke igen. |
| 503 / MCP | TASK_PERSISTENCE_UNCERTAIN | Behold taskId, indsend ikke opgaven igen, og kontakt support med taskId, hvis problemet fortsætter. |
| MCP | TASK_QUERY_INTERRUPTED | Fortsæt med at hente samme taskId; indsend ikke en ny opgave. |
| MCP | RESULT_MISSING | Fortsæt med at hente samme taskId; indsend ikke opgaven igen. |
| 404 / MCP | TASK_NOT_FOUND | Kald get_recent_tasks før et nyt forsøg; indsend ikke en betalt opgave igen. |
| 502 / MCP | BILLING_INVARIANT_FAILED | Prøv ikke igen, udskift ikke API-nøglen, ændr ikke den oprindelige Idempotency-Key, og indsend ikke igen. Kontakt support med taskId, hvis den vises, capability og den oprindelige Idempotency-Key; medtag også X-Request-Id for REST. |
| 5xx | *_SERVICE_UNAVAILABLE / UPSTREAM_* | Ved andre 5xx-fejl bruges begrænset eksponentiel backoff, og opgave-id'et bevares. Dette gælder ikke CREDENTIAL_STORAGE_UNAVAILABLE. |
Parametrene nedenfor udgør request body for submit. Brug samme opgave-id-felt ved polling med query.