API สำหรับนักพัฒนายังคงอยู่ในช่วงเบต้าและอาจเปลี่ยนแปลงได้ทุกเมื่อ ในขณะนี้เหมาะสำหรับการทดสอบและทดลองใช้ส่วนบุคคลมากกว่า และยังไม่แนะนำให้นำไปใช้ในระบบจริง
เรียกใช้ความสามารถ 59 รายการที่เปิดใช้งานในการติดตั้งนี้ผ่าน REST หรือใช้โดยตรงในเครื่องมือ AI ที่รองรับ MCP ต้องมีการสมัครสมาชิกที่ยังใช้งานอยู่
Codex MCP, REST, Claude Code, Cursor และไคลเอนต์ MCP แบบกำหนดเองใช้คีย์ API เฉพาะ Codex เก็บส่วนหัว Authorization แบบคงที่ไว้ในการตั้งค่าระดับผู้ใช้ ห้ามส่งคีย์ผ่านแชตหรือประวัติ shell
ทุกคำขอได้รับการยืนยันด้วยคีย์ API ที่เชื่อมโยงกับการสมัครสมาชิกของคุณ
Authorization: Bearer YOUR_API_KEYเมื่อการสมัครสมาชิกหมดอายุจะส่งคืน 403 และคีย์ API เดิมจะกลับมาใช้ได้หลังต่ออายุ เฉพาะ ACCOUNT_SESSION_REFRESH_REQUIRED เท่านั้นที่แก้ได้ด้วยการเข้าสู่ระบบ VidMage หนึ่งครั้ง ส่วน 401 อื่นให้ทำตามวิธีกู้คืนเฉพาะ
ใช้ URL อายุสั้นที่ผูกกับขนาดเพื่ออัปโหลดรูปภาพ วิดีโอ หรือเสียงไปยังพื้นที่จัดเก็บโดยตรง ไบต์ของไฟล์จะไม่ผ่านเซิร์ฟเวอร์แอปพลิเคชัน 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.เรียก list_capabilities ก่อน สำหรับการสร้างให้ใช้ idempotencyKey ใหม่ที่คงที่ เรียก submit_task เพียงครั้งเดียว แล้วติดตาม taskId เดิม หากคำตอบสูญหายให้เรียก get_recent_tasks ก่อน และใช้คีย์เดิมซ้ำเฉพาะการลองส่งข้อมูลเดิมอีกครั้ง
list_models → estimate_model_creditsทุกคำขอได้รับการยืนยันด้วยคีย์ API ที่เชื่อมโยงกับการสมัครสมาชิกของคุณ
list_capabilities (ข้อความเป็นภาพ)
→ describe_capability
→ submit_task + idempotencyKey ใหม่ที่คงที่ (ครั้งเดียว)
→ get_task_result (ติดตามงานเดิม)
→ get_recent_tasks (เฉพาะเมื่อคำตอบสูญหาย)
→ ผลลัพธ์ภาพต้นฉบับงาน AI ทั้งหมดทำงานแบบอะซิงโครนัส แต่ละความสามารถมี endpoint สองรายการ:
| Endpoint | คำอธิบาย |
|---|---|
| GET /api/v1/capabilities | ทุกคำขอได้รับการยืนยันด้วยคีย์ API ที่เชื่อมโยงกับการสมัครสมาชิกของคุณ |
| GET /api/v1/openapi.json | ทุกคำขอได้รับการยืนยันด้วยคีย์ API ที่เชื่อมโยงกับการสมัครสมาชิกของคุณ |
| POST /api/v1/files/upload | สร้าง URL อัปโหลดโดยตรงแบบชั่วคราวที่มีข้อจำกัดสำหรับไฟล์สื่อในเครื่อง |
| GET /api/v1/tasks/recent | กู้คืนรหัสงานล่าสุดหลังหมดเวลา การเชื่อมต่อขาด หรือการตอบกลับสูญหาย |
| POST /api/v1/<capability>/submit | เริ่มงานและส่งคืน ID งานทันที |
| POST /api/v1/<capability>/query | ตรวจสอบงานด้วย ID และส่งคืนสถานะกับ URL ผลลัพธ์เมื่องานเสร็จ |
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://..." } }แค็ตตาล็อกความสามารถและเอกสาร OpenAPI 3.1 สร้างจากสัญญาเดียวกับที่ใช้ตรวจสอบคำขอ นำเข้าข้อกำหนดไปยัง Postman, Insomnia, Bruno หรือเครื่องมือสร้างไคลเอนต์ 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"ตัวอย่างเหล่านี้ส่งงานเพียงครั้งเดียวและตรวจสอบ ID งานเดิมจนเสร็จสิ้น เมื่อส่งคำขอเดิมซ้ำ ให้ใช้ idempotency key เดิมเสมอ
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")ใช้สถานะ HTTP เพื่อควบคุมโฟลว์ และใช้ errorType เพื่อเลือกวิธีแก้ไขที่เหมาะสม ทุกการตอบกลับ REST มี header X-Request-Id สำหรับการติดตามและการสนับสนุน
| สถานะ | errorType ที่พบบ่อย | การดำเนินการที่แนะนำ |
|---|---|---|
| 400 | INVALID_JSON / VALIDATION_ERROR | แก้ไขฟิลด์ที่ระบุใน details อย่าลองอีกครั้งด้วยข้อมูลเดิมที่ยังไม่ได้แก้ไข |
| 401 | AUTHENTICATION_REQUIRED | VidMage ไม่ได้รับข้อมูลรับรอง ให้เพิ่ม Authorization ในการตั้งค่าระดับผู้ใช้ของ Codex หรือไคลเอนต์เป้าหมาย และห้ามขอหรือวางคีย์ API ในแชต |
| 401 | AUTHORIZATION_HEADER_INVALID | แก้ Authorization Header ให้เป็น Bearer <API_KEY> อย่างถูกต้อง โดยยังไม่มีงานถูกส่ง |
| 401 | API_KEY_INVALID_OR_REVOKED | สร้างคีย์ API ใหม่และแทนที่เฉพาะ Authorization ในการตั้งค่าเดิม จากนั้นรีสตาร์ต Codex และตรวจสอบในงานใหม่ |
| 401 | API_KEY_INVALID_CREDENTIAL | สร้างคีย์ API ใหม่และแทนที่ข้อมูลรับรองในไคลเอนต์เป้าหมาย เนื่องจากไม่สามารถถอดรหัสข้อมูลรับรองเดิมได้ |
| 401 | ACCOUNT_SESSION_REFRESH_REQUIRED | เข้าสู่ระบบ VidMage หนึ่งครั้ง บริการจะรีเฟรชข้อมูลรับรองบัญชีเบื้องหลังที่อยู่ในคีย์ API เดิม โดยไม่เปลี่ยนการตั้งค่าไคลเอนต์ |
| 401 REST | NEED_API_KEY | สำหรับความเข้ากันได้กับ REST เท่านั้น: ระบุคีย์ API |
| 402 | NEED_PURCHASE_CREDITS | เพิ่มเครดิตหรือเลือกการดำเนินการที่ใช้เครดิตน้อยกว่า |
| 403 | NEED_SUBSCRIBE | เปิดใช้งานหรือต่ออายุการสมัครสมาชิกของบัญชี |
| 404 | CAPABILITY_NOT_ENABLED | รีเฟรชการค้นหาความสามารถ ความสามารถถูกปิดหรือไม่มีให้ใช้ในการติดตั้งนี้ |
| 409 | UPLOAD_NOT_READY / IDEMPOTENCY_CONFLICT / IDEMPOTENCY_IN_PROGRESS | หากการส่งยังประมวลผลอยู่ ให้รอตามเวลาที่ระบุและใช้ idempotencyKey เดิมซ้ำ สร้างคีย์ใหม่เฉพาะคำขอสร้างที่ต่างกัน |
| 410 | UPLOAD_EXPIRED | สร้างการอัปโหลดชั่วคราวใหม่ URL ไฟล์เดิมหมดอายุแล้ว |
| 429 | RATE_LIMITED | รอตามระยะเวลา Retry-After แล้วลองใหม่ด้วย exponential backoff ที่กำหนดเพดาน |
| 503 | CREDENTIAL_STORAGE_UNAVAILABLE | ทำตาม Retry-After และลองใหม่เพียงครั้งเดียว หากยังผิดพลาดให้หยุด รายงาน requestId และขอให้ผู้ดูแลกู้คืน Developers MySQL readiness เก็บคีย์ API เดิมไว้และห้ามส่งงานซ้ำ |
| 503 / MCP | SUBMISSION_OUTCOME_UNKNOWN / BILLING_OUTCOME_UNKNOWN / REFUND_OUTCOME_UNKNOWN | ทำตาม recovery ก่อน: GET_RECENT_TASKS หมายถึงเรียก get_recent_tasks; QUERY_TASK_ID_OR_CONTACT_SUPPORT หมายถึงติดตาม taskId เดิมหรือติดต่อฝ่ายสนับสนุน; CONTACT_SUPPORT_WITH_IDEMPOTENCY_KEY_AND_BUSINESS_ID หมายถึงติดต่อฝ่ายสนับสนุนพร้อม idempotencyKey และ businessId ห้ามสร้าง idempotencyKey ใหม่ ส่งงานซ้ำ หรือลองคืนเงินอีกครั้ง |
| 503 / MCP | TASK_PERSISTENCE_UNCERTAIN | เก็บ taskId ไว้ ห้ามส่งงานซ้ำ และหากปัญหายังคงอยู่ให้ติดต่อฝ่ายสนับสนุนพร้อม taskId |
| MCP | TASK_QUERY_INTERRUPTED | กลับมาติดตาม taskId เดิมต่อ อย่าส่งงานอื่น |
| MCP | RESULT_MISSING | ติดตาม taskId เดิมต่อและอย่าส่งงานซ้ำ |
| 404 / MCP | TASK_NOT_FOUND | เรียก get_recent_tasks ก่อนลองใหม่ และอย่าส่งงานที่มีค่าใช้จ่ายซ้ำ |
| 502 / MCP | BILLING_INVARIANT_FAILED | อย่าลองใหม่ เปลี่ยนคีย์ API แก้ไข Idempotency-Key เดิม หรือส่งงานซ้ำ ติดต่อฝ่ายสนับสนุนพร้อม taskId หากมี capability และ Idempotency-Key เดิม สำหรับ REST ให้แนบ X-Request-Id ด้วย |
| 5xx | *_SERVICE_UNAVAILABLE / UPSTREAM_* | สำหรับข้อผิดพลาด 5xx อื่น ให้ใช้ exponential backoff ที่มีเพดานและเก็บ ID งานไว้ กฎนี้ไม่ใช้กับ CREDENTIAL_STORAGE_UNAVAILABLE |
พารามิเตอร์ด้านล่างประกอบเป็น request body สำหรับ submit ใช้ฟิลด์ ID งานเดียวกันเมื่อ polling ด้วย query