Le API per sviluppatori sono ancora in versione beta e possono cambiare in qualsiasi momento. In questa fase sono più adatte a test ed esperimenti personali e non sono ancora consigliate per l'uso in produzione.
Richiama tramite REST le 59 funzionalità abilitate per questa installazione oppure usale direttamente dagli strumenti IA compatibili con MCP. È necessario un abbonamento attivo.
Codex MCP, REST, Claude Code, Cursor e i client MCP manuali usano chiavi API dedicate. Codex conserva l’header Authorization statico nella configurazione utente; non inviare mai una chiave via chat o nella cronologia della shell.
Ogni richiesta viene autenticata con una chiave API associata al tuo abbonamento.
Authorization: Bearer YOUR_API_KEYUn abbonamento scaduto restituisce 403 e le chiavi API esistenti funzionano di nuovo dopo il rinnovo. Solo ACCOUNT_SESSION_REFRESH_REQUIRED si risolve accedendo una volta a VidMage; per gli altri errori 401 segui l’azione specifica.
Usa un URL di breve durata e vincolato alla dimensione per caricare immagini, video o audio locali direttamente nello spazio di archiviazione. I byte del file non passano dal server applicativo VidMage.
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.Chiama prima list_capabilities. Per una generazione usa un idempotencyKey nuovo e stabile, chiama submit_task una sola volta, quindi interroga lo stesso taskId. Se la risposta viene persa, chiama prima get_recent_tasks; riutilizza la chiave originale solo per un nuovo tentativo di trasporto dello stesso invio.
list_models → estimate_model_creditsOgni richiesta viene autenticata con una chiave API associata al tuo abbonamento.
list_capabilities (testo in immagine)
→ describe_capability
→ submit_task + idempotencyKey nuovo e stabile (una sola volta)
→ get_task_result (interroga la stessa attività)
→ get_recent_tasks (solo se la risposta è stata persa)
→ risultato immagine nativoTutte le attività IA sono asincrone. Ogni funzionalità fornisce due endpoint:
| Endpoint | Descrizione |
|---|---|
| GET /api/v1/capabilities | Ogni richiesta viene autenticata con una chiave API associata al tuo abbonamento. |
| GET /api/v1/openapi.json | Ogni richiesta viene autenticata con una chiave API associata al tuo abbonamento. |
| POST /api/v1/files/upload | Crea un URL temporaneo e limitato per il caricamento diretto di un file multimediale locale. |
| GET /api/v1/tasks/recent | Recupera gli ID dei task recenti dopo un timeout, una disconnessione o una risposta persa. |
| POST /api/v1/<capability>/submit | Avvia un'attività e ne restituisce immediatamente l'ID. |
| POST /api/v1/<capability>/query | Verifica un'attività tramite ID e, al termine, ne restituisce stato e URL del risultato. |
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://..." } }Il catalogo delle funzionalità e il documento OpenAPI 3.1 vengono generati dallo stesso contratto usato per convalidare le richieste. Importa la specifica in Postman, Insomnia, Bruno o in un generatore di client API.
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"Questi esempi inviano un’attività una sola volta e interrogano lo stesso ID fino al completamento. Mantieni invariata la chiave di idempotenza quando riprovi lo stesso invio.
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")Usa lo stato HTTP per il flusso di controllo ed errorType per il comportamento di ripristino specifico. Ogni risposta REST include l'header X-Request-Id per tracciamento e assistenza.
| Stato | errorType comune | Azione consigliata |
|---|---|---|
| 400 | INVALID_JSON / VALIDATION_ERROR | Correggi i campi elencati in details; non riprovare con lo stesso input invariato. |
| 401 | AUTHENTICATION_REQUIRED | VidMage non ha ricevuto credenziali. Aggiungi Authorization alla configurazione utente di Codex o al client di destinazione; non chiedere né incollare mai una chiave API in chat. |
| 401 | AUTHORIZATION_HEADER_INVALID | Correggi l’Authorization Header in modo che sia esattamente Bearer <API_KEY>; non è stata inviata alcuna attività. |
| 401 | API_KEY_INVALID_OR_REVOKED | Crea una nuova chiave API e sostituisci solo Authorization nella configurazione esistente; riavvia Codex e verifica in una nuova attività. |
| 401 | API_KEY_INVALID_CREDENTIAL | Crea una nuova chiave API e sostituisci la credenziale nel client di destinazione; la credenziale esistente non può essere decifrata. |
| 401 | ACCOUNT_SESSION_REFRESH_REQUIRED | Accedi una volta a VidMage. Il servizio aggiorna la credenziale dell’account inclusa nelle chiavi API esistenti; la configurazione del client non cambia. |
| 401 REST | NEED_API_KEY | Solo per compatibilità REST: fornisci una chiave API. |
| 402 | NEED_PURCHASE_CREDITS | Aggiungi crediti o scegli un'operazione meno costosa. |
| 403 | NEED_SUBSCRIBE | Attiva o rinnova l'abbonamento dell'account. |
| 404 | CAPABILITY_NOT_ENABLED | Aggiorna il rilevamento delle funzionalità. La funzionalità è disabilitata o non è disponibile in questa installazione. |
| 409 | UPLOAD_NOT_READY / IDEMPOTENCY_CONFLICT / IDEMPOTENCY_IN_PROGRESS | Se l’invio è ancora in elaborazione, attendi il tempo indicato e riutilizza lo stesso idempotencyKey. Crea una nuova chiave solo per una diversa richiesta di generazione. |
| 410 | UPLOAD_EXPIRED | Crea un nuovo caricamento temporaneo; l’URL precedente è scaduto. |
| 429 | RATE_LIMITED | Attendi il valore di Retry-After, quindi riprova con backoff esponenziale limitato. |
| 503 | CREDENTIAL_STORAGE_UNAVAILABLE | Rispetta Retry-After e riprova una sola volta. Se persiste, fermati, segnala requestId e chiedi agli operatori di ripristinare Developers MySQL readiness. Conserva la chiave API e non inviare di nuovo. |
| 503 / MCP | SUBMISSION_OUTCOME_UNKNOWN / BILLING_OUTCOME_UNKNOWN / REFUND_OUTCOME_UNKNOWN | Segui prima recovery: GET_RECENT_TASKS significa chiamare get_recent_tasks; QUERY_TASK_ID_OR_CONTACT_SUPPORT significa interrogare lo stesso taskId o contattare l’assistenza; CONTACT_SUPPORT_WITH_IDEMPOTENCY_KEY_AND_BUSINESS_ID significa contattare l’assistenza indicando idempotencyKey e businessId. Non creare mai un nuovo idempotencyKey, non inviare di nuovo e non tentare un altro rimborso. |
| 503 / MCP | TASK_PERSISTENCE_UNCERTAIN | Conserva taskId, non inviare di nuovo l’attività e, se il problema persiste, contatta l’assistenza indicando taskId. |
| MCP | TASK_QUERY_INTERRUPTED | Riprendi a interrogare lo stesso taskId; non inviare un’altra attività. |
| MCP | RESULT_MISSING | Continua a interrogare lo stesso taskId; non inviare di nuovo l’attività. |
| 404 / MCP | TASK_NOT_FOUND | Chiama get_recent_tasks prima di riprovare; non inviare di nuovo un’attività a pagamento. |
| 502 / MCP | BILLING_INVARIANT_FAILED | Non riprovare, non sostituire la chiave API, non modificare l’Idempotency-Key originale e non inviare di nuovo. Contatta l’assistenza indicando taskId se presente, capability e l’Idempotency-Key originale; per REST includi anche X-Request-Id. |
| 5xx | *_SERVICE_UNAVAILABLE / UPSTREAM_* | Per gli altri errori 5xx usa un backoff esponenziale limitato e conserva l’ID attività. Non si applica a CREDENTIAL_STORAGE_UNAVAILABLE. |
I parametri seguenti compongono il corpo della richiesta submit. Usa lo stesso campo ID attività durante il polling con query.