API Pembangun masih dalam peringkat beta dan boleh berubah pada bila-bila masa. Pada peringkat ini, API lebih sesuai untuk ujian dan percubaan peribadi dan belum disyorkan untuk kegunaan produksi.
Panggil 59 keupayaan yang didayakan untuk penggunaan ini melalui REST, atau gunakannya terus melalui alat AI yang serasi dengan MCP. Langganan aktif diperlukan.
Codex MCP, REST, Claude Code, Cursor dan klien MCP manual menggunakan kunci API khusus. Codex menyimpan pengepala Authorization statik dalam konfigurasi pengguna; jangan hantar kunci melalui sembang atau sejarah shell.
Setiap permintaan disahkan dengan kunci API yang dipautkan kepada langganan anda.
Authorization: Bearer YOUR_API_KEYLangganan tamat tempoh mengembalikan 403 dan Key sedia ada berfungsi semula selepas diperbaharui. Hanya ACCOUNT_SESSION_REFRESH_REQUIRED dipulihkan dengan log masuk sekali ke VidMage; ikut tindakan khusus untuk 401 lain.
Gunakan URL jangka pendek yang terikat pada saiz untuk memuat naik imej, video atau audio terus ke storan. Bait fail tidak melalui pelayan aplikasi 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.Panggil list_capabilities dahulu. Untuk penjanaan, gunakan idempotencyKey baharu yang stabil, panggil submit_task tepat sekali, kemudian tinjau taskId yang sama. Jika respons hilang, panggil get_recent_tasks dahulu; guna semula kunci asal hanya untuk percubaan semula pengangkutan bagi penyerahan yang sama.
list_models → estimate_model_creditsSetiap permintaan disahkan dengan kunci API yang dipautkan kepada langganan anda.
list_capabilities (teks kepada imej)
→ describe_capability
→ submit_task + idempotencyKey baharu yang stabil (tepat sekali)
→ get_task_result (tinjau tugasan yang sama)
→ get_recent_tasks (hanya jika respons hilang)
→ hasil imej asliSemua tugasan AI adalah tak segerak. Setiap keupayaan menyediakan dua endpoint:
| Endpoint | Penerangan |
|---|---|
| GET /api/v1/capabilities | Setiap permintaan disahkan dengan kunci API yang dipautkan kepada langganan anda. |
| GET /api/v1/openapi.json | Setiap permintaan disahkan dengan kunci API yang dipautkan kepada langganan anda. |
| POST /api/v1/files/upload | Mencipta URL muat naik terus sementara yang terhad untuk fail media setempat. |
| GET /api/v1/tasks/recent | Memulihkan ID tugasan terkini selepas tamat masa, terputus sambungan atau respons hilang. |
| POST /api/v1/<capability>/submit | Memulakan tugasan dan mengembalikan ID tugasan dengan serta-merta. |
| POST /api/v1/<capability>/query | Menyemak tugasan mengikut ID dan mengembalikan status serta URL hasil apabila selesai. |
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://..." } }Katalog keupayaan dan dokumen OpenAPI 3.1 dijana daripada kontrak yang sama yang digunakan untuk mengesahkan permintaan. Import spesifikasi ke Postman, Insomnia, Bruno atau penjana klien 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"Contoh ini menghantar tugasan sekali dan menyemak ID tugasan yang sama sehingga selesai. Kekalkan idempotency key yang sama apabila mencuba semula penghantaran yang sama.
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")Gunakan status HTTP untuk aliran kawalan dan errorType untuk tindakan pemulihan khusus. Setiap respons REST menyertakan pengepala X-Request-Id untuk penjejakan dan sokongan.
| Status | errorType lazim | Tindakan disyorkan |
|---|---|---|
| 400 | INVALID_JSON / VALIDATION_ERROR | Betulkan medan yang disenaraikan dalam details; jangan cuba lagi dengan input sama tanpa perubahan. |
| 401 | AUTHENTICATION_REQUIRED | VidMage tidak menerima bukti kelayakan. Tambahkan Authorization pada konfigurasi pengguna Codex atau klien sasaran; jangan minta atau tampal Key dalam sembang. |
| 401 | AUTHORIZATION_HEADER_INVALID | Betulkan Authorization Header kepada tepat Bearer <API_KEY>; tiada tugasan dihantar. |
| 401 | API_KEY_INVALID_OR_REVOKED | Cipta kunci API baharu dan gantikan hanya Authorization dalam konfigurasi sedia ada; mula semula Codex dan sahkan dalam tugasan baharu. |
| 401 | API_KEY_INVALID_CREDENTIAL | Cipta kunci API baharu dan gantikan kelayakan dalam klien sasaran; kelayakan sedia ada tidak dapat dinyahsulit. |
| 401 | ACCOUNT_SESSION_REFRESH_REQUIRED | Log masuk ke VidMage sekali. Perkhidmatan menyegarkan kelayakan akaun bahagian belakang yang dibalut oleh kunci API sedia ada; konfigurasi klien tidak berubah. |
| 401 REST | NEED_API_KEY | Untuk keserasian REST sahaja: berikan kunci API. |
| 402 | NEED_PURCHASE_CREDITS | Tambah kredit atau pilih operasi yang lebih rendah kosnya. |
| 403 | NEED_SUBSCRIBE | Aktifkan atau perbaharui langganan akaun. |
| 404 | CAPABILITY_NOT_ENABLED | Muat semula penemuan keupayaan. Keupayaan dinyahdayakan atau tidak tersedia dalam penggunaan ini. |
| 409 | UPLOAD_NOT_READY / IDEMPOTENCY_CONFLICT / IDEMPOTENCY_IN_PROGRESS | Jika penyerahan masih diproses, tunggu tempoh yang dinyatakan dan guna semula idempotencyKey yang sama. Cipta kunci baharu hanya untuk permintaan penjanaan yang berbeza. |
| 410 | UPLOAD_EXPIRED | Cipta muat naik sementara baharu; URL fail sebelumnya telah tamat tempoh. |
| 429 | RATE_LIMITED | Tunggu tempoh Retry-After, kemudian cuba lagi dengan exponential backoff yang dihadkan. |
| 503 | CREDENTIAL_STORAGE_UNAVAILABLE | Patuhi Retry-After dan cuba semula sekali sahaja. Jika berterusan, berhenti, laporkan requestId dan minta operator memulihkan Developers MySQL readiness. Kekalkan kunci API dan jangan hantar semula. |
| 503 / MCP | SUBMISSION_OUTCOME_UNKNOWN / BILLING_OUTCOME_UNKNOWN / REFUND_OUTCOME_UNKNOWN | Ikut recovery terlebih dahulu: GET_RECENT_TASKS bermaksud memanggil get_recent_tasks; QUERY_TASK_ID_OR_CONTACT_SUPPORT bermaksud meninjau taskId yang sama atau menghubungi sokongan; CONTACT_SUPPORT_WITH_IDEMPOTENCY_KEY_AND_BUSINESS_ID bermaksud menghubungi sokongan dengan idempotencyKey dan businessId. Jangan cipta idempotencyKey baharu, hantar semula atau cuba bayaran balik lagi. |
| 503 / MCP | TASK_PERSISTENCE_UNCERTAIN | Simpan taskId, jangan hantar semula tugasan dan hubungi sokongan dengan taskId jika masalah berterusan. |
| MCP | TASK_QUERY_INTERRUPTED | Teruskan meninjau taskId yang sama; jangan hantar tugasan lain. |
| MCP | RESULT_MISSING | Terus tinjau taskId yang sama; jangan hantar semula tugasan. |
| 404 / MCP | TASK_NOT_FOUND | Panggil get_recent_tasks sebelum mencuba lagi; jangan hantar semula tugasan berbayar. |
| 502 / MCP | BILLING_INVARIANT_FAILED | Jangan cuba semula, tukar kunci API, ubah Idempotency-Key asal atau hantar semula. Hubungi sokongan dengan taskId jika ada, capability dan Idempotency-Key asal; untuk REST sertakan juga X-Request-Id. |
| 5xx | *_SERVICE_UNAVAILABLE / UPSTREAM_* | Untuk ralat 5xx lain, cuba semula dengan exponential backoff terhad dan simpan ID tugasan. Ini tidak terpakai kepada CREDENTIAL_STORAGE_UNAVAILABLE. |
Parameter di bawah membentuk request body untuk submit. Gunakan medan ID tugasan yang sama ketika membuat polling melalui query.