تخطَّ إلى المحتوى الرئيسي

Developer Page Specifications

API Contracts

5 GET endpoints — /editorial/home · /industries/{slug} · /insights/{slugOrId} · /topics/{slug} · /authors/{slug}. Locale-aware, CDN-cacheable.

مكتمل

خمس endpoints GET (القائمة، التفاصيل، الفئة، الموضوع، المؤلِّف) + POST واحد (الاشتراك). كلها قابلة-للـ-cache في CDN، كلها مُدركة-للمحلّية، كلها تُرجع أشكال envelope { items، meta، seo } مُتَّسقة.

1 · GET /api/editorial

  • Query: category? · topic? · author? · q? · sort (latest|most-read|editor-picks|long-reads|short-reads) · page · pageSize · lang.
  • الاستجابة: { featured: ArticleListItem[3]، items: ArticleListItem[]، mostRead: ArticleListItem[5]، categories: CategoryItem[]، topics: TopicItem[20]، totalCount، pagination، seo }.
  • ArticleListItem: { id، slug، type، title، dek، excerpt، coverImageUrl، category{slug, name}، topics[]، author{slug, displayName, role, avatarUrl}، publishedAt، readingTimeMinutes، isFeatured، isEditorPick، isPractical، viewCount }.
  • Cache: 300s public + 900s s-maxage. أبطل عند نشر/تحديث المقالة.

2 · GET /api/editorial/{slug}

  • الاستجابة: { article: EditorialArticle كامل + bodyHtml، author: EditorialAuthor كامل، category: EditorialCategory كامل، topics[]، images[]، relatedArticles[<=6]، mostRead[5]، connectedSignals[<=8]، translation?: { exists: bool، slug?، lang? }، seo: { metaTitle، metaDescription، canonicalUrl، ogImage، jsonLd، hreflang[] } }.
  • connectedSignals مَحدود بـ 8 جانب-الخادم. القائمة الكاملة متاحة عبر /api/editorial/{slug}/signals?offset=8.
  • Cache: 600s public + 1800s s-maxage. أبطل عند تحديث المقالة أو entity مرتبط.
  • الأخطاء: 404 slug مجهول؛ 410 Gone حين IsActive=false ومُتقاعد عمداً؛ 503 مع retry-hint عند فشل البنية التحتية (أبداً 500 للعميل).

3 · GET /api/editorial/categories/{slug}

  • Query: topic? · sort · page · pageSize · lang.
  • الاستجابة: { category: EditorialCategory كامل، featured?: ArticleListItem، items: ArticleListItem[]، relatedCategories[3]، totalCount، pagination، seo }.
  • 404 حين categorySlug مجهول (لا fallback للقائمة الكاملة).

4 · GET /api/editorial/topics/{slug}

  • الاستجابة: { topic: EditorialTopic كامل، items: ArticleListItem[]، mostReadInTopic[5]، connectedEcosystem: { opportunities[<=4]، files[<=4]، startups[<=4] }، pagination، seo }.
  • connectedEcosystem مُتَخَصِّص-بالموضوع: يُبرز entities غير-Editorial مُعَلَّمة بنفس slug الموضوع، مَحدود بـ 4 لكل نوع.

5 · GET /api/editorial/authors/{slug}

  • الاستجابة: { author: EditorialAuthor كامل، stats: { totalArticles، articlesByType: {news، analysis، ...}، joinedDate }، latestArticles: ArticleListItem[]، mostReadByAuthor[5]، topicsCovered[]، pagination، seo }.

6 · POST /api/subscriptions/editorial-digest

  • الـ Body: { email، preferredLang، interestCategories[]، consentPlatform (true)، consentPartners?، source: 'listing'|'category'|'topic'|'article'، articleIdContext? }.
  • الخادم: يَكتب صف EditorialSubscription + يُدرج welcome email. محدود-المعدّل 5/IP/ساعة.