API بوابة Updates Portal
تتيح بوابة التحديثات (Updates Portal) واجهة JSON API عامة وموجزة لتتمكن من استطلاع الحالة، وجلب مدخلات سجل التغييرات، ومتابعة خارطة الطريق، والتحقق من المشكلات المعروفة من أنظمتك الخاصة. لا يلزم أي مصادقة. تقدم الـ API النصوص باللغة الإنجليزية فقط؛ ويتم تجاهل بادئة اللغة في المسار.
Base URL
https://updates.foura.ai
Service Status
GET /api/v1/status
يعرض الحالة التشغيلية المباشرة لكل خدمة من خدمات FourA، بالإضافة إلى الحوادث النشطة والحديثة. يتم تخزينها مؤقتا على جانب الخادم لمدة 15 ثانية، لذا فإن الاستعلام بمعدل أعلى من ذلك سيعيد نفس البيانات (payload).
curl https://updates.foura.ai/api/v1/status
{
"overall": "operational",
"services": [
{
"slug": "api",
"name": "API",
"description": "...",
"status": "operational",
"daily": [
{ "date": "2026-05-19", "status": "operational", "major_outage_minutes": 0, "partial_outage_minutes": 0, "degraded_minutes": 0, "internal_degraded_minutes": 0 }
]
}
],
"active_incidents": [],
"recent_incidents": [
{ "id": "...", "service_slug": "api", "service_name": "API", "impact": "minor", "started_at": "...", "resolved_at": "..." }
]
}
| الحقل من المستوى الأعلى | النوع | الوصف |
|---|---|---|
overall |
string | operational إذا كانت جميع الخدمات تعمل بصحة جيدة، وإلا فستكون إحدى قيم حالة الخدمة |
services |
array | إدخال واحد لكل خدمة خاضعة للمراقبة يتضمن slug و name و description و status الحالية وسجل daily (حتى 90 يوما) |
active_incidents |
array | الحوادث المفتوحة حاليا |
recent_incidents |
array | الحوادث التي تم حلها خلال آخر 14 يوما |
قيم status للخدمة: operational، degraded، partial_outage، major_outage، maintenance.
قيم impact للحادث: minor (أداء متدهور)، major (انقطاع جزئي)، critical (انقطاع في الخدمة).
نمط الاستقصاء (Polling pattern)
استخدم هذا الـ endpoint لربط حالة FourA بلوحة التحكم أو نظام الاستدعاء الخاص بك.
عند تعذر جلب بيانات الحالة، يستجيب الـ endpoint بـ 502 مع {"error": "Monitor unreachable"}. تعامل مع ذلك كحالة غير معروفة بدلا من حالة سيئة، وحاول مجددا في دورة الاستقصاء التالية.
import requests
def check_foura():
r = requests.get("https://updates.foura.ai/api/v1/status", timeout=5)
r.raise_for_status() # raises on the 502 "Monitor unreachable" answer: retry next poll
data = r.json()
if data["overall"] != "operational":
# Page on-call, post to Slack, flip a feature flag, etc.
for svc in data["services"]:
if svc["status"] != "operational":
print(f"{svc['name']}: {svc['status']}")
return data
يرجع GET /api/status القديم 410 Gone ويوجه المتصلين إلى هنا.
سجل التغييرات
GET /api/changelog
يُرجع إدخالات سجل التغييرات المنشورة بترتيب زمني عكسي.
curl "https://updates.foura.ai/api/changelog?limit=20"
معلمات الاستعلام:
| المعلمة | النوع | القيمة الافتراضية | الوصف |
|---|---|---|---|
page |
integer | 1 | رقم الصفحة (يبدأ من 1) |
limit |
integer | 20 | عدد الإدخالات لكل صفحة (الحد الأقصى 50) |
category |
string | - | التصفية حسب new، أو improved، أو fixed |
{
"entries": [
{
"id": 42,
"title": "...",
"body": "Markdown body",
"category": "new",
"tags": "[\"api\",\"dashboard\"]",
"published": 1,
"published_at": "2026-05-19T12:00:00Z",
"created_at": "2026-05-19 11:42:08",
"updated_at": "2026-05-19 11:44:31"
}
],
"total": 137,
"page": 1,
"limit": 20
}
| الحقل | النوع | الوصف |
|---|---|---|
id |
integer | معرف الإدخال |
title |
string | عنوان الإدخال |
body |
string | نص Markdown |
category |
string | new أو improved أو fixed |
tags |
string | مصفوفة JSON مُرمزة كسلسلة نصية (string). يجب تحليلها (parse) قبل الاستخدام: json.loads(entry["tags"]). |
published |
integer | دائمًا 1 هنا. يُرجع الـ endpoint الإدخالات المنشورة فقط. |
published_at |
string | بتنسيق ISO 8601 مع لاحقة Z |
created_at |
string | YYYY-MM-DD HH:MM:SS بتوقيت UTC، بدون محدد للمنطقة الزمنية |
updated_at |
string | نفس تنسيق created_at |
تنسيقا الطابع الزمني مختلفان عن قصد: published_at يمثل تاريخ التحرير ويتضمن منطقة زمنية، بينما created_at وupdated_at هما طابعان زمنيان للتخزين. كلاهما بتوقيت UTC. المحلل (parser) الذي يفترض تنسيقًا واحدًا للثلاثة سيتسبب في حدوث خطأ مع التنسيقين الآخرين.
RSS
يتم أيضًا نشر سجل التغييرات الكامل (أحدث 30 إدخالًا) كخلاصة RSS على:
https://updates.foura.ai/rss
اشترك عبر Feedly أو Miniflux أو Thunderbird أو أي قارئ آخر. يتطابق محتوى الخلاصة مع محتوى سجل التغييرات changelog، بما في ذلك Markdown المحول إلى HTML.
Roadmap
GET /api/roadmap
يُرجع كل عنصر منشور في خارطة الطريق، مرتبا حسب عدد الأصوات ثم وقت الإنشاء.
curl https://updates.foura.ai/api/roadmap
{
"items": [
{
"id": 12,
"title": "...",
"description": "...",
"status": "planned",
"category": "developer-experience",
"votes": 23,
"target_date": "Q3 2026",
"completed_at": null,
"created_at": "2026-03-30 09:32:47"
}
]
}
قيم status للعنصر: planned، in_progress، done، cancelled. تعرض اللوحة في updates.foura.ai/roadmap ثلاثة أعمدة، لذا فإن أي عنصر معين كـ cancelled يصلك عبر هذا الـ endpoint ولا يظهر مطلقًا على الصفحة.
category هو slug بأحرف صغيرة، وليس التسمية التي تعرضها الصفحة. الـ slugs المستخدمة حاليًا: api، infrastructure، developer-experience، dashboard، billing، analytics، authentication. تعامل مع القائمة على أنها مفتوحة، حيث يمكن لعنصر جديد إضافة slug جديد.
target_date هو نص حر ("Q3 2026")، وليس تاريخًا. completed_at يكون null حتى يتم شحن العنصر، ثم يصبح بتنسيق ISO 8601 مع لاحقة Z (2026-09-01T10:15:30.000Z)، وهو نفس تنسيق published_at في مدخلات سجل التغييرات. يستخدم created_at تنسيق YYYY-MM-DD HH:MM:SS بتوقيت UTC. يختلف التنسيقان داخل الكائن الواحد، لذا قم بمعالجة كل حقل بشكل منفصل.
Voting
POST /api/roadmap/:id/vote
تبديل حالة التصويت على عنصر واحد في خارطة الطريق. التصويتات مجهولة الهوية ومرتبطة بـ IP الخاص بالمتصل بالإضافة إلى أول 50 حرفًا من User-Agent الخاص به. يؤدي الاتصال مرة أخرى إلى إزالة التصويت. يستجيب العنصر غير المعروف أو غير المنشور بـ 404 {"error": "Not found"}.
curl -X POST https://updates.foura.ai/api/roadmap/12/vote
{ "votes": 24, "voted": true }
voted يُبلّغ عن حالة ما بعد الاستدعاء: true إذا تم إضافة تصويتك، وfalse إذا تمت إزالته.
تقتصر endpoints الخاصة بـ roadmap، وهما GET /api/roadmap وهذا الـ endpoint، على 30 request لكل دقيقة لكل عنوان IP مصدر. وأكثر من ذلك، تكون الإجابة {"error": "Too many votes, slow down"}.
Known Issues
GET /api/issues
يُرجع المشكلات التي يتتبعها دعم FourA.
curl "https://updates.foura.ai/api/issues?tab=open"
معلمات الاستعلام (Query parameters):
| المعلمة | النوع | القيمة الافتراضية | الوصف |
|---|---|---|---|
tab |
string | open |
open للمشكلات النشطة، و resolved للمحلولة/المغلقة |
{
"issues": [
{
"id": 5,
"title": "...",
"body": "Markdown description",
"severity": "medium",
"status": "investigating",
"service_id": 3,
"resolution": "",
"opened_at": "2026-05-18T09:00:00Z",
"resolved_at": null,
"service_name": "API"
}
]
}
| الحقل | النوع | الوصف |
|---|---|---|
id |
integer | معرف المشكلة (ID) |
title |
string | ملخص قصير |
body |
string | وصف بتنسيق Markdown |
severity |
string | low، أو medium، أو high، أو critical |
status |
string | open، أو investigating، أو resolved، أو closed |
service_id |
integer or null | المعرف الرقمي للخدمة المتأثرة. null عندما لا تكون المشكلة مرتبطة بخدمة محددة. |
service_name |
string or null | الاسم المعروض للخدمة بعد معالجته وتحديده تلقائيا. اقرأ هذا الحقل بدلا من تعيين service_id بنفسك. |
resolution |
string | كيفية حل المشكلة. سلسلة نصية فارغة طالما أن المشكلة لا تزال مفتوحة. |
opened_at |
string | بتنسيق ISO 8601 مع اللاحقة Z |
resolved_at |
string or null | بتنسيق ISO 8601 مع اللاحقة Z، وتكون null طالما أن المشكلة مفتوحة |
يعد service_id مفتاحا خارجيا رقميا، وليس الـ slug الذي تراه في صفحة الحالة. قم بمطابقة المشاكل مع الخدمات باستخدام service_name.
تتكون حمولة بيانات المشكلة (issue payload) من قائمة أعمدة ثابتة ولا تتضمن طابعا زمنيا للتعديل. يمكنك ترتيب المشكلة أو تحديد عمرها الزمني عبر opened_at وresolved_at. ومن بين المجموعات العامة الثلاث، فإن مدخلات changelog فقط هي التي تُرجع created_at وupdated_at.
تُرجع علامة التبويب resolved أحدث 30 مشكلة تم حلها وتتوقف عند هذا الحد. بينما تُرجع علامة التبويب open جميع المشاكل.
ملاحظات
- جميع الـ endpoints عامة ولا تتطلب مفتاح API key. تقتصر الـ endpoints الخاصة بـ roadmap على 30 request في الدقيقة لكل عنوان IP مصدر؛ بينما لا تخضع الـ endpoints الأخرى لأي rate limit خاص بها حاليا، لذا لا تقم بالاستعلام عن الحالة بمعدل يتجاوز صلاحية التخزين المؤقت المحددة بـ 15 ثانية.
- تأتي الـ responses بتنسيق JSON عبر HTTPS. ولا تقبل roadmap وissues أي معاملات تقسيم صفحات (paging parameters). الحد الأقصى الوحيد هو
?tab=resolvedفي issues، حيث يُرجع 30 صفا. - للحصول على إصدارات changelog كنص مجرد أو بتنسيق HTML خام، استخدم خلاصة
/rssبدلا من/api/changelog.
ذات صلة
- Service Status: قراءة البيانات نفسها في المتصفح
- Changelog: تصفح المدخلات مع الفلاتر وتقسيم الصفحات
- Roadmap: التصويت على العناصر في واجهة المستخدم (UI)
- Known Issues: قراءة المشاكل المفتوحة والمحلولة
- Updates Portal: نظرة عامة على القسم