ממשקי ה-API למפתחים עדיין נמצאים בגרסת בטא ועשויים להשתנות בכל עת. בשלב זה הם מתאימים יותר לבדיקות ולהתנסות אישיות, ועדיין אינם מומלצים לשימוש בסביבת ייצור.
הפעילו באמצעות REST את 59 היכולות שהופעלו בפריסה זו, או השתמשו בהן ישירות בכלי AI תואמי MCP. נדרש מינוי פעיל.
Codex MCP, REST, Claude Code, Cursor ולקוחות MCP ידניים משתמשים במפתחות API ייעודיים. Codex שומר את כותרת Authorization הקבועה בהגדרת המשתמש; לעולם אל תשלחו מפתח בצ׳אט או בהיסטוריית המעטפת.
כל בקשה מאומתת באמצעות מפתח API המשויך למינוי שלכם.
Authorization: Bearer YOUR_API_KEYמינוי שפג מחזיר 403, ומפתחות API קיימים חוזרים לפעול לאחר חידוש. רק ACCOUNT_SESSION_REFRESH_REQUIRED נפתר בהתחברות אחת ל-VidMage; עבור שגיאות 401 אחרות פעלו לפי פעולת השחזור המתאימה.
השתמשו בכתובת קצרת־תוקף ומוגבלת לגודל כדי להעלות תמונות, סרטונים או שמע ישירות לאחסון. נתוני הקובץ אינם עוברים דרך שרת היישום של 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 הן אסינכרוניות. כל יכולת מספקת שתי נקודות קצה:
| נקודת קצה | תיאור |
|---|---|
| GET /api/v1/capabilities | כל בקשה מאומתת באמצעות מפתח API המשויך למינוי שלכם. |
| GET /api/v1/openapi.json | כל בקשה מאומתת באמצעות מפתח API המשויך למינוי שלכם. |
| POST /api/v1/files/upload | יוצר כתובת מוגבלת וזמנית להעלאה ישירה של קובץ מדיה מקומי. |
| GET /api/v1/tasks/recent | משחזר מזהי משימות אחרונות לאחר פסק זמן, ניתוק או אובדן תגובה. |
| POST /api/v1/<capability>/submit | מתחילה משימה ומחזירה מיד את מזהה המשימה. |
| POST /api/v1/<capability>/query | בודקת משימה לפי מזהה ומחזירה את המצב ואת כתובת התוצאה לאחר השלמתה. |
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"דוגמאות אלה שולחות משימה פעם אחת ובודקות את אותו מזהה משימה עד להשלמה. בעת ניסיון חוזר של אותה שליחה, שמרו על אותו מפתח idempotency.
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 כוללת כותרת 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 | צרו העלאה זמנית חדשה; כתובת הקובץ הקודמת פגה. |
| 429 | RATE_LIMITED | המתינו למשך הזמן המצוין ב-Retry-After ולאחר מכן נסו שוב עם השהיה מעריכית מוגבלת. |
| 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 אחרות נסו שוב בהשהיה מעריכית מוגבלת ושמרו את מזהה המשימה. כלל זה אינו חל על CREDENTIAL_STORAGE_UNAVAILABLE. |
הפרמטרים שלהלן מרכיבים את גוף הבקשה עבור submit. השתמשו באותו שדה מזהה משימה בעת בדיקה באמצעות query.