Les API pour développeurs sont encore en version bêta et peuvent changer à tout moment. À ce stade, elles conviennent davantage aux tests et expérimentations personnels et ne sont pas encore recommandées pour une utilisation en production.
Appelez via REST les 59 fonctionnalités activées pour ce déploiement, ou utilisez-les dans un outil IA compatible MCP. Un abonnement actif est requis.
Codex MCP, REST, Claude Code, Cursor et les clients MCP manuels utilisent des clés API dédiées. Codex conserve l’en-tête Authorization statique dans la configuration utilisateur ; n’envoyez jamais une clé par chat ni dans l’historique du shell.
Chaque requête est authentifiée par une clé API liée à votre abonnement.
Authorization: Bearer YOUR_API_KEYUn abonnement expiré renvoie 403 et les clés API existantes refonctionnent après renouvellement. Seul ACCOUNT_SESSION_REFRESH_REQUIRED se corrige en se reconnectant une fois à VidMage ; suivez l’action propre aux autres erreurs 401.
Utilisez une URL à durée courte et liée à la taille pour téléverser des images, vidéos ou fichiers audio directement vers le stockage. Les octets du fichier ne transitent pas par le serveur applicatif 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.Appelez d’abord list_capabilities. Pour une génération, utilisez un idempotencyKey nouveau et stable, appelez submit_task exactement une fois, puis interrogez le même taskId. Si la réponse est perdue, appelez d’abord get_recent_tasks ; ne réutilisez la clé d’origine que pour une nouvelle tentative de transport du même envoi.
list_models → estimate_model_creditsChaque requête est authentifiée par une clé API liée à votre abonnement.
list_capabilities (texte vers image)
→ describe_capability
→ submit_task + idempotencyKey nouveau et stable (une seule fois)
→ get_task_result (interroger la même tâche)
→ get_recent_tasks (uniquement si la réponse est perdue)
→ résultat d’image natifToutes les tâches IA sont asynchrones. Chaque fonctionnalité propose deux endpoints :
| Endpoint | Description |
|---|---|
| GET /api/v1/capabilities | Chaque requête est authentifiée par une clé API liée à votre abonnement. |
| GET /api/v1/openapi.json | Chaque requête est authentifiée par une clé API liée à votre abonnement. |
| POST /api/v1/files/upload | Crée une URL de téléversement direct temporaire et restreinte pour un fichier multimédia local. |
| GET /api/v1/tasks/recent | Récupère les ID de tâches récentes après un délai dépassé, une déconnexion ou une réponse perdue. |
| POST /api/v1/<capability>/submit | Démarre une tâche et renvoie immédiatement son identifiant. |
| POST /api/v1/<capability>/query | Interroge une tâche par son identifiant et renvoie son état, puis l’URL du résultat une fois terminée. |
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://..." } }Le catalogue des fonctionnalités et le document OpenAPI 3.1 sont générés depuis le même contrat que la validation des requêtes. Importez la spécification dans Postman, Insomnia, Bruno ou un générateur de 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"Ces exemples soumettent une tâche une seule fois, puis interrogent le même identifiant jusqu’à la fin. Conservez la même clé d’idempotence lorsque vous réessayez la même soumission.
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")Utilisez le statut HTTP pour piloter le flux et errorType pour appliquer la bonne reprise. Chaque réponse REST contient un X-Request-Id pour le suivi et l’assistance.
| Statut | errorType courant | Action recommandée |
|---|---|---|
| 400 | INVALID_JSON / VALIDATION_ERROR | Corrigez les champs indiqués dans details ; ne renvoyez pas la même entrée sans modification. |
| 401 | AUTHENTICATION_REQUIRED | VidMage n’a reçu aucun identifiant. Ajoutez Authorization à la configuration utilisateur de Codex ou au client cible ; ne demandez et ne collez jamais de clé API dans le chat. |
| 401 | AUTHORIZATION_HEADER_INVALID | Corrigez l’Authorization Header pour qu’il soit exactement Bearer <API_KEY> ; aucune tâche n’a été envoyée. |
| 401 | API_KEY_INVALID_OR_REVOKED | Créez une nouvelle clé API et remplacez uniquement Authorization dans la configuration existante ; redémarrez Codex et vérifiez dans une nouvelle tâche. |
| 401 | API_KEY_INVALID_CREDENTIAL | Créez une nouvelle clé API et remplacez l’identifiant dans le client cible ; l’identifiant actuel ne peut pas être déchiffré. |
| 401 | ACCOUNT_SESSION_REFRESH_REQUIRED | Reconnectez-vous une fois à VidMage. Le service actualise l’identifiant de compte encapsulé par les clés API existantes ; la configuration du client ne change pas. |
| 401 REST | NEED_API_KEY | Compatibilité REST uniquement : fournissez une clé API. |
| 402 | NEED_PURCHASE_CREDITS | Ajoutez des crédits ou choisissez une opération moins coûteuse. |
| 403 | NEED_SUBSCRIBE | Activez ou renouvelez l’abonnement du compte. |
| 404 | CAPABILITY_NOT_ENABLED | Actualisez la découverte des fonctionnalités. Cette fonctionnalité est désactivée ou absente de ce déploiement. |
| 409 | UPLOAD_NOT_READY / IDEMPOTENCY_CONFLICT / IDEMPOTENCY_IN_PROGRESS | Si l’envoi est toujours en cours, attendez le délai indiqué et réutilisez le même idempotencyKey. Créez une nouvelle clé uniquement pour une autre demande de génération. |
| 410 | UPLOAD_EXPIRED | Créez un nouveau téléversement temporaire ; l’URL précédente a expiré. |
| 429 | RATE_LIMITED | Attendez la durée Retry-After, puis réessayez avec une temporisation exponentielle plafonnée. |
| 503 | CREDENTIAL_STORAGE_UNAVAILABLE | Respectez Retry-After et ne réessayez qu’une fois. Si l’erreur persiste, arrêtez, signalez requestId et demandez aux opérations de restaurer Developers MySQL readiness. Conservez la clé API et ne renvoyez pas la tâche. |
| 503 / MCP | SUBMISSION_OUTCOME_UNKNOWN / BILLING_OUTCOME_UNKNOWN / REFUND_OUTCOME_UNKNOWN | Suivez d’abord recovery : GET_RECENT_TASKS signifie appeler get_recent_tasks ; QUERY_TASK_ID_OR_CONTACT_SUPPORT signifie interroger le même taskId ou contacter l’assistance ; CONTACT_SUPPORT_WITH_IDEMPOTENCY_KEY_AND_BUSINESS_ID signifie contacter l’assistance avec idempotencyKey et businessId. Ne créez jamais de nouvel idempotencyKey et ne renvoyez pas la tâche. |
| 503 / MCP | TASK_PERSISTENCE_UNCERTAIN | Conservez taskId, ne renvoyez pas la tâche et, si le problème persiste, contactez l’assistance en indiquant taskId. |
| MCP | TASK_QUERY_INTERRUPTED | Reprenez l’interrogation du même taskId ; n’envoyez pas une autre tâche. |
| MCP | RESULT_MISSING | Continuez à interroger le même taskId ; ne renvoyez pas la tâche. |
| 404 / MCP | TASK_NOT_FOUND | Appelez get_recent_tasks avant toute nouvelle tentative ; ne renvoyez pas une tâche payante. |
| 502 / MCP | BILLING_INVARIANT_FAILED | Ne réessayez pas, ne remplacez pas la clé API, ne modifiez pas l’Idempotency-Key d’origine et ne renvoyez pas la tâche. Contactez l’assistance avec taskId s’il est présent, capability et l’Idempotency-Key d’origine ; pour REST, ajoutez aussi X-Request-Id. |
| 5xx | *_SERVICE_UNAVAILABLE / UPSTREAM_* | Pour les autres erreurs 5xx, réessayez avec une temporisation exponentielle plafonnée et conservez l’ID de tâche. Cette règle ne couvre pas CREDENTIAL_STORAGE_UNAVAILABLE. |
Les paramètres ci-dessous constituent le corps de la requête submit. Utilisez le même champ d’identifiant pour interroger query.