لا تزال واجهات API للمطورين في المرحلة التجريبية وقد تتغير في أي وقت. في الوقت الحالي، هي أنسب للاختبار والتجربة الشخصية ولا يُنصح بعد باستخدامها في بيئات الإنتاج.
استدعِ عبر REST الإمكانات الـ 59 المفعّلة في هذا النشر، أو استخدمها داخل أدوات الذكاء الاصطناعي المتوافقة مع MCP. يلزم اشتراك نشط.
يستخدم Codex MCP وREST وClaude Code وCursor وعملاء MCP اليدويون مفاتيح API مخصصة. يحفظ Codex ترويسة Authorization الثابتة في إعداد المستخدم؛ لا ترسل المفتاح مطلقًا عبر الدردشة أو سجل shell.
تتم مصادقة كل طلب باستخدام مفتاح API مرتبط باشتراكك.
Authorization: Bearer YOUR_API_KEYيعيد الاشتراك المنتهي 403، وتعود المفاتيح للعمل بعد التجديد. وحده 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 (فقط عند فقد رد الإرسال)
→ نتيجة الصورة الأصليةجميع مهام الذكاء الاصطناعي غير متزامنة. توفر كل إمكانية نقطتي نهاية:
| نقطة النهاية | الوصف |
|---|---|
| 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.