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: نظرة عامة على القسم
آخر تحديث: 10 سبتمبر 2026