1. نظرة عامة
تتيح Eyivo REST API التحكم برمجيًا في المواقع المنظمة. تستخدم HTTPS وJSON، وتحمل إصدارًا تحت /api/v1، وتطبق حدود الملكية والخطط والتحقق والتدقيق نفسها المطبقة في لوحة التحكم.
JSON وmultipart
Accept: application/json. Content-Type: application/json; الملفات: multipart/form-data.
مواقع المستخدم فقط
تقتصر كل عملية على المواقع التي يملكها المستخدم المصادَق عليه.
المسودة أولًا
احفظ مسودة وتحقق من جاهزيتها ثم انشر العنصر باللغة المطلوبة عندما يريد المستخدم إتاحته للزوار. لا تُنشر المسودات الأخرى.
الإصدارات: تتطلب التغييرات التي تكسر عقد الواجهة إصدارًا أساسيًا جديدًا. قد تُضاف حقول إلى كائنات JSON الحالية، لذا ينبغي للبرامج العميلة تجاهل الحقول غير المعروفة.
2. البدء السريع
- 1أنشئ رمزًا.
سجّل الدخول إلى التطبيق، وافتح رموز API، واختر أقل الصلاحيات اللازمة، ثم انسخ
ey_السري عند ظهوره. - 2اعرض مواقعك.
تحقق من المصادقة واحصل على معرّف الموقع الرقمي الذي تستخدمه نقاط النهاية المتفرعة.
- 3أرسل عمليات كتابة آمنة عند التكرار.
أعطِ كل طلب POST وPATCH وDELETE مفتاحًا فريدًا من نوع
Idempotency-Key.
curl --request GET \
--url https://app.eyivo.com/api/v1/sites \
--header 'Accept: application/json' \
--header 'Authorization: Bearer ey_your_token'
تحتوي استجابة القائمة الناجحة على السجلات ضمن data:
{
"data": [
{
"id": 42,
"platform_subdomain_key": "7kr9mp2x",
"template_key": "corporate-01",
"status": "active",
"native_locale": "en",
"english_enabled": false,
"content_version": 1,
"search_visibility": "platform_noindex"
}
]
}
3. المصادقة
يتطلب كل طلب إلى /api/v1 رمز حامل:
Authorization: Bearer <token>
رموز API الشخصية
تناسب النصوص البرمجية وتكاملات الخوادم وأتمتة الحساب مباشرة. تبدأ الرموز بـey_، وتُحفظ بصيغة تجزئة، ولا تُعرض إلا مرة واحدة.
- أنشئ الرموز وألغِها من https://app.eyivo.com/tokens.
- اختر صلاحية واحدة أو أكثر.
- يمكنك تقييد الرمز بموقع واحد تملكه.
- تبقى الرموز غير المنتهية صالحة حتى إلغائها.
OAuth 2.0 + PKCE
يناسب التطبيقات التي تعمل نيابة عن مستخدمي Eyivo. استخدم مسار رمز التفويض مع PKCE، ولا تستخدم منح كلمة المرور أو المنح الضمني.
- التفويض:
https://app.eyivo.com/oauth/authorize - الرمز والتحديث:
https://app.eyivo.com/oauth/token - تنتهي صلاحية رموز الوصول بعد ساعتين.
- تنتهي صلاحية رموز التحديث بعد سنة.
مسار التفويض باستخدام PKCE
- أنشئ
code_verifierعشوائيًا عالي العشوائية، ثم احسبcode_challengeالمقابل بخوارزمية SHA-256. - وجّه المستخدم إلى
/oauth/authorizeمعresponse_type=codeوclient_idالعام وredirect_uriالمسجّل بدقة وscopeالمطلوب مفصولًا بمسافات وstateوcode_challengeوcode_challenge_method=S256. - تحقق من
stateبعد إعادة التوجيه، ثم استبدل رمز التفويض المعاد لدى/oauth/tokenباستخدامcode_verifierالأصلي. - احفظ رموز الوصول والتحديث بأمان. حدّثها قبل انتهاء صلاحيتها واستبدل بيانات الاعتماد الدوّارة بصورة ذرّية.
4. الصلاحيات
يحتاج كل طلب إلى الصلاحية المحددة أدناه. يجيز الرمز الشخصي الذي يحتوي على * جميع فحوص الصلاحيات، لكن ينبغي للتطبيقات طلب أقل مجموعة ممكنة.
| الصلاحية | إمكانات REST |
|---|---|
sites:read | سرد المواقع المملوكة واسترجاع موقع واحد. |
sites:write | إنشاء مواقع باستخدام رمز وصول صالح للحساب بالكامل. |
content:read | قراءة المحتوى والمخططات والقوائم والنماذج والإعدادات. |
content:write | إنشاء المحتوى وتعديله وحذفه ونشره صراحةً وتشغيل إجراءات اللوحات المعلنة. |
media:read | GET /sites/{site}/media, GET /sites/{site}/media/stock-photos |
media:write | POST /sites/{site}/media, DELETE /sites/{site}/media/{media} |
domains:read | سرد نطاقات الموقع. |
domains:write | طلب النطاقات المخصصة وتفعيلها واختيارها. |
يتطلب REST صلاحية نقطة النهاية وليس mcp:use. تستخدم الوسائط media:read أو media:write.
5. عمليات كتابة آمنة عند التكرار
أرسل Idempotency-Key مع تعديلات JSON لإعادة الطلب نفسه بأمان. يُستثنى رفع الوسائط بصيغة multipart وإصدار تذاكر الرفع؛ تحقق من نتيجة النقل قبل المحاولة مجددًا.
Idempotency-Key: site-42-page-create-01J7M6Y8RRF3ZE6WB4Z0Y9XJXC
| الحالة | النتيجة |
|---|---|
| الطلب الأول | تُنفذ العملية ويُحفظ رمز الحالة ومحتوى JSON للاستجابة. |
| المفتاح والطريقة والمسار ومعلمات الاستعلام والمحتوى نفسها | تُعاد الاستجابة المحفوظة دون تكرار العملية. |
| المفتاح نفسه مع طلب مختلف | 422 — يُرفض استخدام المفتاح نفسه مع حمولة مختلفة. |
| المفتاح نفسه بينما الطلب الأول قيد التنفيذ | 409 — الطلب قيد التنفيذ بالفعل. |
| دون مفتاح | يُنفذ الطلب، لكن لا تتوفر إمكانية إعادة المحاولة بأمان. |
تشمل مطابقة الطلب طريقة HTTP ومساره ومحتواه الخام كما أُرسل تمامًا. أعد استخدام JSON المتسلسل نفسه عند إعادة المحاولة.
6. الاستجابات وبنية الموارد
تُرجع عمليات المحتوى غلاف data. يوفر MCP كائن structuredContent ونسخة نصية من JSON؛ ويُرجع REST بيانات JSON. اقرأ مخططات المخرجات للمعرفات وجاهزية النشر وتقسيم النتائج. تابع معلومات الصفحات في المدونات والوسائط والإرسالات.
مورد فردي
{ "data": { "id": 42, "status": "active" } }قائمة موارد
{ "data": [{ "id": 42 }, { "id": 43 }] }تختلف أشكال المجموعات. اتبع بيانات تقسيم النتائج لكل نقطة نهاية ولا تفترض أن كل نتيجة قائمة بسيطة أو غير مقسمة.
7. المواقع
/sitesسرد المواقع المملوكة · sites:read
/sitesإنشاء موقع · sites:write
/sites/{site}استرجاع موقع مملوك · sites:read
إنشاء موقع
curl --request POST \
--url https://app.eyivo.com/api/v1/sites \
--header 'Accept: application/json' \
--header 'Authorization: Bearer ey_your_token' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: site-create-01J7M6Y8' \
--data '{
"display_name": "Northstar Studio",
"template_key": "corporate-01",
"native_locale": "en"
}'
| الحقل | القواعد |
|---|---|
display_name | نص مطلوب، بحد أقصى 200 حرف. |
template_key | مفتاح قالب مدمج مطلوب. تتوفر القائمة الحالية الكاملة في OpenAPI. |
native_locale | رمز لغة مدعومة مطلوب. |
الاستجابة: 201 Created مع مورد الموقع. قد تظهر حالة غير نشطة أولًا أثناء اكتمال التخصيص. وتُرجع حدود المواقع والخطط 422.
حقول مورد الموقع: id وplatform_subdomain_key وtemplate_key وstatus وnative_locale وenglish_enabled وcontent_version وsearch_visibility وruntime الاختياري والطوابع الزمنية.
8. الصفحات
/sites/{site}/pagesسرد الصفحات · content:read
/sites/{site}/pagesإنشاء مسودة · content:write
/sites/{site}/pages/{page}استرجاع صفحة · content:read
/sites/{site}/pages/{page}تحديث مسودة · content:write
/sites/{site}/pages/{page}حذف صفحة · content:write
/sites/{site}/pages/{page}/publicationcontent:write · locale
إنشاء صفحة
{
"type": "page",
"sort_order": 300,
"locale": "en",
"slug": "our-story",
"title": "Our story",
"body": "<p>How the company began.</p>",
"meta_title": "Our story | Northstar Studio",
"meta_description": "Learn about Northstar Studio."
}
| الحقل | قواعد الإنشاء والتحديث |
|---|---|
type | استخدم page للمحتوى العادي. تتوفر الأنواع المدعومة ومخططات المكونات في قدرات الموقع. |
sort_order | عدد صحيح اختياري من 0 إلى 9999 أو قيمة فارغة؛ القيمة الافتراضية عند الإنشاء هي 0. |
locale | مطلوب عند الإنشاء، وعند تغيير title أو slug أو body أثناء التحديث. |
slug | مطلوب عند الإنشاء. أحرف ASCII وأرقام وشرطات وشرطات سفلية؛ بحد أقصى 160 حرفًا. |
title | نص مطلوب عند الإنشاء؛ بحد أقصى 200 حرف. |
body | نص اختياري أو قيمة فارغة؛ بحد أقصى 50,000 حرف. |
meta_title | نص اختياري أو قيمة فارغة؛ بحد أقصى 200 حرف. |
meta_description | نص اختياري أو قيمة فارغة؛ بحد أقصى 500 حرف. |
استجابة الإنشاء: 201. استجابة التحديث: 200. استجابة الحذف: 204 دون محتوى.
احفظ مسودة وتحقق من جاهزيتها ثم انشر العنصر باللغة المطلوبة عندما يريد المستخدم إتاحته للزوار. لا تُنشر المسودات الأخرى.
9. عناصر الكتالوج
/sites/{site}/catalog-itemsسرد العناصر · content:read
/sites/{site}/catalog-itemsإنشاء عنصر كمسودة · content:write
/sites/{site}/catalog-items/{catalogItem}استرجاع عنصر · content:read
/sites/{site}/catalog-items/{catalogItem}حذف عنصر · content:write
/sites/{site}/catalog-items/{catalogItem}content:write · locale, slug, title
/sites/{site}/catalog-items/{catalogItem}/publicationcontent:write · locale
إنشاء عنصر كتالوج
{
"sort_order": 100,
"locale": "en",
"slug": "strategy-advisory",
"title": "Strategy advisory",
"summary": "Focused advice for consequential decisions.",
"body": "Talk to our senior advisory team."
}
| الحقل | القواعد |
|---|---|
sort_order | عدد صحيح اختياري من 0 إلى 9999 أو قيمة فارغة؛ الافتراضي 0. |
locale | رمز لغة مدعومة مطلوب. |
slug | معرّف رابط بأحرف ASCII مطلوب؛ بحد أقصى 160 حرفًا. |
title | نص مطلوب؛ بحد أقصى 200 حرف. |
summary | نص اختياري أو قيمة فارغة؛ بحد أقصى 1,000 حرف. |
body | نص اختياري أو قيمة فارغة؛ بحد أقصى 50,000 حرف. |
احفظ مسودة وتحقق من جاهزيتها ثم انشر العنصر باللغة المطلوبة عندما يريد المستخدم إتاحته للزوار. لا تُنشر المسودات الأخرى.
هذه أمثلة حسب نوع المحتوى. اكتشف جميع مخططات الإدخال والإخراج والصلاحيات في tools/list أو OpenAPI. مسارات REST أدناه نسبية إلى /api/v1/sites/{site}.
اكتشاف المواقع والقدرات
GET /capabilities · GET /readiness
الصفحات والمكونات والروابط الداخلية
/pages · /pages/{page_id}/components · POST /pages/{page_id}/publication
المنتجات والمعارض والفيديوهات
/catalog-items · /galleries · /videos · POST /{collection}/{id}/publication
مسودات المدونة والفئات والجدولة
/blog/posts · /blog/categories · /blog/links · /blog/posts/{post_id}/publication · /blog/posts/{post_id}/schedule
التنقل الرئيسي والقوائم الإضافية
/menus · /menus/destinations · /menu-assignments/{type}/{target_id} · /menus/{menu_key}/publication
مكتبة الوسائط والصور الجاهزة
/media · /media/transfers · /media/stock-photos
النماذج والإرسالات ولوحات الإضافات
/forms · /submissions · /plugins · /plugins/panel · /plugins/panel/actions
الشركة والقالب واللغات والتكاملات
/company · /theme · /theme/settings · /locales · /integrations · /demo · /demo/drafts · /cache/reset
القدرات وعقد تحرير المحتوى
اختر موقعًا ثم اقرأ قدراته: اللغات المفعلة وحقول القالب ومخططات المكونات ومواضع القوائم ولوحات الإضافات المثبتة. اقرأ مورد content-workflow قبل التعديل. يمكن للعملاء الذين لا يدعمون الموارد استخدام get-site-capabilities-tool. تابع nextCursor في tools/list حتى يكتمل الاكتشاف.
GET /api/v1/sites/{site}/capabilities
GET /api/v1/sites/{site}/pages/{page_id}/components/schema?locale=en
استخدم اللغة المطلوبة وقيمة version أو revision الحالية. حفظ المقال يستبدل المستند كاملًا ويلغي جدولته. تستخدم القوائم revision رقمية وتستخدم تعيينات المحتوى بصمة menu_revision منفصلة. احتفظ بعناصر المصفوفات المستبدلة. عند التعارض أعد القراءة وادمج التعديلات قبل المحاولة.
يبقى التنقل الرئيسي تلقائيًا. للقوائم الإضافية مسوداتها ونشرها المستقل. يحضّر حفظ المحتوى تعييناته للقوائم ويطبقها نشر العنصر دون نشر مسودات قوائم أخرى. نشر القائمة لا ينشر المحتوى المرتبط بها. يرفض source_hash ترجمات مبنية على نص مصدر قديم.
يقبل محتوى الصفحة وحقول richtext لغة HTML منقاة. استخدم list-page-links-tool لروابط ثابتة /__eyivo/pages/{id} تُحل بلغة الزائر بعد النشر. تستخدم المدونات document بتنسيق JSON منظم مع media_id من الموقع نفسه وأهداف صفحات أو مقالات، وليس body_html.
{
"type": "doc",
"content": [{
"type": "paragraph",
"content": [{ "type": "text", "text": "Our story" }]
}]
}
رفع الصور والفيديوهات
يفتح upload-media-tool منتقي ملفات في عملاء MCP Apps مثل Claude. يمكن لـ ChatGPT توفير مرجع مرفق خاص به؛ مرفق محادثة Claude ليس مرجع ملف OpenAI. لا تختلق روابط تنزيل ولا ترسل ملفات base64 ضمن معاملات الأدوات.
يمكن لـ Codex وClaude Code استدعاء prepare-media-upload-tool ثم إرسال الملف بصيغة multipart إلى upload_url باستخدام upload_token لمرة واحدة خلال خمس دقائق. أبقِ الرمز سريًا. يمكن لعملاء REST استخدام رمز media:write الخاص بهم. لا يُرجع معرّف الوسائط إلا رفع مكتمل؛ إصدار تذكرة لا يرفع ملفًا.
POST /api/v1/sites/{site}/media
Authorization: Bearer <media:write token>
Content-Type: multipart/form-data; boundary=<generated by HTTP client>
file: <original file bytes>
10. النطاقات المخصصة
/sites/{site}/domainsسرد النطاقات · domains:read
/sites/{site}/domainsطلب نطاق · domains:write
/sites/{site}/domains/{domain}/activateالتفعيل بعد التحقق · domains:write
/sites/{site}/domains/{domain}/primaryاختيار اسم المضيف الأساسي · domains:write
طلب نطاق
curl --request POST \
--url https://app.eyivo.com/api/v1/sites/42/domains \
--header 'Accept: application/json' \
--header 'Authorization: Bearer ey_your_token' \
--header 'Content-Type: application/json' \
--header 'Idempotency-Key: domain-request-example-com' \
--data '{"domain":"www.example.com"}'
يتضمن مورد النطاق المعلّق verification_token. أضف سجل DNS المطلوب لإثبات الملكية بالقيمة المعادة لنطاقك، وانتظر انتشار DNS، ثم استدعِ نقطة نهاية التفعيل. بعد التفعيل، استدعِ نقطة النهاية الخاصة بالاسم الأساسي إذا أردت أن يصبح اسم المضيف العام المعتمد.
حقول مورد النطاق: id وdomain وsite_id وis_primary وstatus وverification_token عند الاقتضاء والطوابع الزمنية. تُرجع حدود الخطة للنطاقات المخصصة وأخطاء التحقق من النطاق 422.
11. الأخطاء
| الحالة | المعنى | الإجراء المعتاد |
|---|---|---|
401 | رمز الحامل مفقود أو غير صالح أو منتهي الصلاحية أو ملغى. | استبدل بيانات الاعتماد أو جدّدها. |
403 | نطاق صلاحية مفقود، أو قيد على الموقع، أو محاولة تعديل من مستخدم ليس مالك الموقع. | استخدم صلاحية وموقعًا مصرحًا بهما؛ لا تكرر الطلب دون تغيير. |
404 | المورد غير موجود أو لا يملكه المستخدم. | تحقق من المعرّفات والملكية. |
409 | يتطلب تعارض الإصدار قراءة جديدة ودمج التعديلات. لا تعاود إرسال البيانات القديمة دون تغيير. | اقرأ مسودة اللغة المختارة ومراجعتها الحالية قبل التعديل. |
422 | خطأ تحقق أو حد خطة أو قاعدة نطاق أو عدم تطابق في طلب مكرر. | اقرأ errors أو message وصحح الطلب، واستخدم مفتاحًا جديدًا إذا تغير محتواه. |
5xx | فشل غير متوقع في المنصة أو خدمة سابقة لها. | أعد طلبات القراءة الآمنة؛ ولا تكرر طلبات الكتابة إلا بمفتاح تكرار الطلب نفسه. |
استجابة التحقق
{
"message": "The title field is required.",
"errors": {
"title": ["The title field is required."]
}
}
استجابة فشل المصادقة أو التفويض
{
"message": "Missing required scope [content:write]."
}
12. الحدود الحالية وقائمة فحص التكامل
تتيح REST v1 جزءًا محددًا من Eyivo عمدًا. غياب نقطة نهاية يعني حدًا للعقد، وليس إذنًا باستدعاء واجهات داخلية.
متاح
- سرد المواقع وفحصها وإنشاؤها
- الصفحات والمكونات والروابط الداخلية
- أدر الصفحات والمكونات والمدونات والمنتجات والمعارض والفيديوهات والقوائم والوسائط والنماذج وإعدادات الموقع عبر أدوات ونقاط REST محمية بالصلاحيات.
- سرد النطاقات وطلبها وتفعيلها واختيار النطاق الأساسي
غير متاح في REST v1
- تغييرات الفوترة والاشتراكات
- كلمات المرور وإدارة رموز الوصول
- الوصول المباشر للتخزين وواجهات API الداخلية
- تثبيت شيفرة قالب عشوائية أو تنفيذها
قبل التشغيل الفعلي
- استخدم HTTPS وتحقق من المضيف المتوقع
app.eyivo.com. - احتفظ برموز الحامل على الخادم واحذف ترويسات التفويض من السجلات.
- اطلب الصلاحيات اللازمة فقط، وفضّل الرموز الشخصية المقيدة بموقع عند الإمكان.
- استخدم مفتاحًا فريدًا لكل عملية كتابة منطقية، واحتفظ به عند إعادة المحاولة.
- تعامل مع
401و403و404و422بوصفها أخطاء لا تزول بإعادة المحاولة، ما لم يتغير الطلب أو بيانات الاعتماد. - استخدم تراجعًا أسيًا مع تأخير عشوائي عند الإخفاقات المؤقتة، واحترم أي ترويسة
Retry-Afterقد تُضاف مستقبلًا. - تختلف أشكال المجموعات. اتبع بيانات تقسيم النتائج لكل نقطة نهاية ولا تفترض أن كل نتيجة قائمة بسيطة أو غير مقسمة.