تخطٍ إلى المحتوى

وثائق المطورين · REST API v1

طوّر على Eyivo عبر واجهة API منظمة واحدة.

أدر الصفحات والمكونات والمدونات والمنتجات والمعارض والفيديوهات والقوائم والوسائط والنماذج وإعدادات الموقع عبر أدوات ونقاط REST محمية بالصلاحيات.

عنوان URL الأساسي

https://app.eyivo.com/api/v1

1. نظرة عامة

تتيح Eyivo REST API التحكم برمجيًا في المواقع المنظمة. تستخدم HTTPS وJSON، وتحمل إصدارًا تحت /api/v1، وتطبق حدود الملكية والخطط والتحقق والتدقيق نفسها المطبقة في لوحة التحكم.

JSON وmultipart

Accept: application/json. Content-Type: application/json; الملفات: multipart/form-data.

مواقع المستخدم فقط

تقتصر كل عملية على المواقع التي يملكها المستخدم المصادَق عليه.

المسودة أولًا

احفظ مسودة وتحقق من جاهزيتها ثم انشر العنصر باللغة المطلوبة عندما يريد المستخدم إتاحته للزوار. لا تُنشر المسودات الأخرى.

الإصدارات: تتطلب التغييرات التي تكسر عقد الواجهة إصدارًا أساسيًا جديدًا. قد تُضاف حقول إلى كائنات JSON الحالية، لذا ينبغي للبرامج العميلة تجاهل الحقول غير المعروفة.

2. البدء السريع

  1. 1
    أنشئ رمزًا.

    سجّل الدخول إلى التطبيق، وافتح رموز API، واختر أقل الصلاحيات اللازمة، ثم انسخ ey_ السري عند ظهوره.

  2. 2
    اعرض مواقعك.

    تحقق من المصادقة واحصل على معرّف الموقع الرقمي الذي تستخدمه نقاط النهاية المتفرعة.

  3. 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

  1. أنشئ code_verifier عشوائيًا عالي العشوائية، ثم احسب code_challenge المقابل بخوارزمية SHA-256.
  2. وجّه المستخدم إلى /oauth/authorize مع response_type=code وclient_id العام وredirect_uri المسجّل بدقة وscope المطلوب مفصولًا بمسافات وstate وcode_challenge وcode_challenge_method=S256.
  3. تحقق من state بعد إعادة التوجيه، ثم استبدل رمز التفويض المعاد لدى /oauth/token باستخدام code_verifier الأصلي.
  4. احفظ رموز الوصول والتحديث بأمان. حدّثها قبل انتهاء صلاحيتها واستبدل بيانات الاعتماد الدوّارة بصورة ذرّية.
لا تكشف الرموز مطلقًا: لا تضع رموز الحامل في عناوين URL أو سجلات المتصفح أو مستودع الشيفرة أو لقطات الشاشة أو شيفرة العميل التي لا تستطيع حماية الأسرار.

4. الصلاحيات

يحتاج كل طلب إلى الصلاحية المحددة أدناه. يجيز الرمز الشخصي الذي يحتوي على * جميع فحوص الصلاحيات، لكن ينبغي للتطبيقات طلب أقل مجموعة ممكنة.

الصلاحيةإمكانات REST
sites:readسرد المواقع المملوكة واسترجاع موقع واحد.
sites:writeإنشاء مواقع باستخدام رمز وصول صالح للحساب بالكامل.
content:readقراءة المحتوى والمخططات والقوائم والنماذج والإعدادات.
content:writeإنشاء المحتوى وتعديله وحذفه ونشره صراحةً وتشغيل إجراءات اللوحات المعلنة.
media:readGET /sites/{site}/media, GET /sites/{site}/media/stock-photos
media:writePOST /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. المواقع

GET/sites

سرد المواقع المملوكة · sites:read

POST/sites

إنشاء موقع · sites:write

GET/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. الصفحات

GET/sites/{site}/pages

سرد الصفحات · content:read

POST/sites/{site}/pages

إنشاء مسودة · content:write

GET/sites/{site}/pages/{page}

استرجاع صفحة · content:read

PATCH/sites/{site}/pages/{page}

تحديث مسودة · content:write

DELETE/sites/{site}/pages/{page}

حذف صفحة · content:write

POST/sites/{site}/pages/{page}/publication

content: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. عناصر الكتالوج

GET/sites/{site}/catalog-items

سرد العناصر · content:read

POST/sites/{site}/catalog-items

إنشاء عنصر كمسودة · content:write

GET/sites/{site}/catalog-items/{catalogItem}

استرجاع عنصر · content:read

DELETE/sites/{site}/catalog-items/{catalogItem}

حذف عنصر · content:write

PUT/sites/{site}/catalog-items/{catalogItem}

content:write · locale, slug, title

POST/sites/{site}/catalog-items/{catalogItem}/publication

content: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. النطاقات المخصصة

GET/sites/{site}/domains

سرد النطاقات · domains:read

POST/sites/{site}/domains

طلب نطاق · domains:write

POST/sites/{site}/domains/{domain}/activate

التفعيل بعد التحقق · domains:write

POST/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 قد تُضاف مستقبلًا.
  • تختلف أشكال المجموعات. اتبع بيانات تقسيم النتائج لكل نقطة نهاية ولا تفترض أن كل نتيجة قائمة بسيطة أو غير مقسمة.