API dành cho nhà phát triển vẫn đang ở giai đoạn beta và có thể thay đổi bất cứ lúc nào. Hiện tại, API phù hợp hơn cho việc thử nghiệm và trải nghiệm cá nhân và chưa được khuyến nghị sử dụng trong môi trường production.
Gọi 59 tính năng đã bật cho bản triển khai này qua REST, hoặc dùng trực tiếp trong công cụ AI tương thích MCP. Cần có gói đăng ký đang hoạt động.
Codex MCP, REST, Claude Code, Cursor và các ứng dụng MCP thủ công dùng khóa API chuyên dụng. Codex lưu tiêu đề Authorization tĩnh trong cấu hình người dùng; không bao giờ gửi khóa qua trò chuyện hoặc lịch sử shell.
Mỗi yêu cầu được xác thực bằng khóa API liên kết với gói đăng ký.
Authorization: Bearer YOUR_API_KEYKhi gói đăng ký hết hạn, yêu cầu trả về 403; Key hiện có hoạt động lại sau khi gia hạn. Chỉ ACCOUNT_SESSION_REFRESH_REQUIRED được khắc phục bằng cách đăng nhập VidMage một lần; với các lỗi 401 khác, hãy làm theo hành động khôi phục riêng.
Dùng URL có thời hạn ngắn và gắn với kích thước để tải ảnh, video hoặc âm thanh trực tiếp lên kho lưu trữ. Dữ liệu tệp không đi qua máy chủ ứng dụng 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.Gọi list_capabilities trước. Khi tạo nội dung, hãy dùng idempotencyKey mới và ổn định, chỉ gọi submit_task đúng một lần rồi thăm dò cùng taskId. Nếu mất phản hồi, hãy gọi get_recent_tasks trước; chỉ dùng lại khóa ban đầu cho lần thử truyền lại cùng một yêu cầu.
list_models → estimate_model_creditsMỗi yêu cầu được xác thực bằng khóa API liên kết với gói đăng ký.
list_capabilities (văn bản thành hình ảnh)
→ describe_capability
→ submit_task + idempotencyKey mới và ổn định (chỉ một lần)
→ get_task_result (thăm dò cùng tác vụ)
→ get_recent_tasks (chỉ khi mất phản hồi)
→ kết quả hình ảnh gốcTất cả tác vụ AI đều bất đồng bộ. Mỗi tính năng cung cấp hai endpoint:
| Endpoint | Mô tả |
|---|---|
| GET /api/v1/capabilities | Mỗi yêu cầu được xác thực bằng khóa API liên kết với gói đăng ký. |
| GET /api/v1/openapi.json | Mỗi yêu cầu được xác thực bằng khóa API liên kết với gói đăng ký. |
| POST /api/v1/files/upload | Tạo URL tải trực tiếp tạm thời có giới hạn cho tệp phương tiện cục bộ. |
| GET /api/v1/tasks/recent | Khôi phục ID tác vụ gần đây sau khi hết thời gian, mất kết nối hoặc mất phản hồi. |
| POST /api/v1/<capability>/submit | Bắt đầu tác vụ và trả về ngay ID tác vụ. |
| POST /api/v1/<capability>/query | Kiểm tra tác vụ theo ID và trả về trạng thái cùng URL kết quả khi hoàn tất. |
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://..." } }Danh mục tính năng và tài liệu OpenAPI 3.1 được tạo từ cùng một hợp đồng dùng để xác thực yêu cầu. Hãy nhập đặc tả vào Postman, Insomnia, Bruno hoặc trình tạo ứng dụng khách 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"Các ví dụ này chỉ gửi tác vụ một lần rồi truy vấn cùng ID tác vụ cho đến khi hoàn tất. Giữ nguyên idempotency key khi thử lại cùng một lần gửi.
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")Dùng trạng thái HTTP để điều khiển luồng và errorType để chọn cách khôi phục cụ thể. Mọi phản hồi REST đều có header X-Request-Id để truy vết và hỗ trợ.
| Trạng thái | errorType thường gặp | Hành động đề xuất |
|---|---|---|
| 400 | INVALID_JSON / VALIDATION_ERROR | Sửa các trường được liệt kê trong details; không thử lại với cùng dữ liệu đầu vào chưa thay đổi. |
| 401 | AUTHENTICATION_REQUIRED | VidMage không nhận được thông tin xác thực. Hãy thêm Authorization vào cấu hình người dùng Codex hoặc ứng dụng đích; không yêu cầu hoặc dán Key trong trò chuyện. |
| 401 | AUTHORIZATION_HEADER_INVALID | Sửa Authorization Header thành chính xác Bearer <API_KEY>; chưa có tác vụ nào được gửi. |
| 401 | API_KEY_INVALID_OR_REVOKED | Tạo khóa API mới và chỉ thay Authorization trong cấu hình hiện có; khởi động lại Codex rồi xác minh trong tác vụ mới. |
| 401 | API_KEY_INVALID_CREDENTIAL | Tạo khóa API mới và thay thông tin xác thực trong ứng dụng đích; không thể giải mã thông tin xác thực hiện có. |
| 401 | ACCOUNT_SESSION_REFRESH_REQUIRED | Đăng nhập VidMage một lần. Dịch vụ sẽ làm mới thông tin tài khoản phía sau được bọc trong các khóa API hiện có; cấu hình ứng dụng khách không thay đổi. |
| 401 REST | NEED_API_KEY | Chỉ để tương thích REST: cung cấp khóa API. |
| 402 | NEED_PURCHASE_CREDITS | Thêm tín dụng hoặc chọn thao tác ít tốn kém hơn. |
| 403 | NEED_SUBSCRIBE | Kích hoạt hoặc gia hạn gói đăng ký của tài khoản. |
| 404 | CAPABILITY_NOT_ENABLED | Làm mới dữ liệu khám phá tính năng. Tính năng đã bị tắt hoặc không có trong bản triển khai này. |
| 409 | UPLOAD_NOT_READY / IDEMPOTENCY_CONFLICT / IDEMPOTENCY_IN_PROGRESS | Nếu yêu cầu vẫn đang xử lý, hãy chờ khoảng thời gian được chỉ định và dùng lại cùng idempotencyKey. Chỉ tạo khóa mới cho một yêu cầu tạo nội dung khác. |
| 410 | UPLOAD_EXPIRED | Tạo lượt tải lên tạm thời mới; URL tệp trước đó đã hết hạn. |
| 429 | RATE_LIMITED | Chờ theo Retry-After, sau đó thử lại với exponential backoff có giới hạn. |
| 503 | CREDENTIAL_STORAGE_UNAVAILABLE | Tuân thủ Retry-After và chỉ thử lại một lần. Nếu vẫn lỗi, hãy dừng, báo requestId và yêu cầu vận hành khôi phục Developers MySQL readiness. Giữ nguyên khóa API và không gửi lại tác vụ. |
| 503 / MCP | SUBMISSION_OUTCOME_UNKNOWN / BILLING_OUTCOME_UNKNOWN / REFUND_OUTCOME_UNKNOWN | Trước tiên hãy làm theo recovery: GET_RECENT_TASKS nghĩa là gọi get_recent_tasks; QUERY_TASK_ID_OR_CONTACT_SUPPORT nghĩa là truy vấn cùng taskId hoặc liên hệ hỗ trợ; CONTACT_SUPPORT_WITH_IDEMPOTENCY_KEY_AND_BUSINESS_ID nghĩa là liên hệ hỗ trợ kèm idempotencyKey và businessId. Tuyệt đối không tạo idempotencyKey mới, gửi lại tác vụ hoặc thử hoàn tiền lần nữa. |
| 503 / MCP | TASK_PERSISTENCE_UNCERTAIN | Giữ taskId, không gửi lại tác vụ và liên hệ hỗ trợ kèm taskId nếu sự cố tiếp diễn. |
| MCP | TASK_QUERY_INTERRUPTED | Tiếp tục thăm dò cùng taskId; không gửi một tác vụ khác. |
| MCP | RESULT_MISSING | Tiếp tục thăm dò cùng taskId; không gửi lại tác vụ. |
| 404 / MCP | TASK_NOT_FOUND | Gọi get_recent_tasks trước khi thử lại; không gửi lại tác vụ trả phí. |
| 502 / MCP | BILLING_INVARIANT_FAILED | Không thử lại, đổi khóa API, thay đổi Idempotency-Key ban đầu hoặc gửi lại tác vụ. Liên hệ hỗ trợ kèm taskId nếu có, capability và Idempotency-Key ban đầu; với REST, cung cấp thêm X-Request-Id. |
| 5xx | *_SERVICE_UNAVAILABLE / UPSTREAM_* | Với lỗi 5xx khác, thử lại bằng exponential backoff có giới hạn và giữ ID tác vụ. Quy tắc này không áp dụng cho CREDENTIAL_STORAGE_UNAVAILABLE. |
Các tham số bên dưới tạo thành request body cho submit. Dùng cùng trường ID tác vụ khi polling bằng query.