---
title: "الأحداث: دليل API فريقي"
description: "أحداث تقويم الشركة. معرّفات رقمية. مسارات الأحداث في REST API فريقي: البارامترات، وجسم الطلب، وأمثلة الاستجابة، وحالات الرفض."
url: https://fareeqy.com/api/v1/docs/events
language: ar
---

# الأحداث

أحداث تقويم الشركة. معرّفات رقمية.

عنوان الخدمة `https://app.fareeqy.com/api/v1`

المحتويات

في هذه الصفحة

-   شكل المورد
-   عرض أحداث التقويم
-   إنشاء حدث
-   عرض حدث
-   تعديل حدث
-   حذف حدث

المسارات

-   [الحساب](https://fareeqy.com/api/v1/docs/account)
-   [الأحداث](https://fareeqy.com/api/v1/docs/events)
-   [المشاريع](https://fareeqy.com/api/v1/docs/projects)
-   [الأعضاء](https://fareeqy.com/api/v1/docs/members)
-   [قوائم المهام](https://fareeqy.com/api/v1/docs/task-lists)
-   [المهام](https://fareeqy.com/api/v1/docs/tasks)
-   [التعليقات](https://fareeqy.com/api/v1/docs/comments)
-   [المجلس](https://fareeqy.com/api/v1/docs/discussions)
-   [الملفات](https://fareeqy.com/api/v1/docs/files)
-   [المجلدات](https://fareeqy.com/api/v1/docs/folders)

المزيد

-   [سجل التغييرات](https://fareeqy.com/api/v1/docs/changelog)

في هذه الصفحة

-   شكل المورد
-   عرض أحداث التقويم
-   إنشاء حدث
-   عرض حدث
-   تعديل حدث
-   حذف حدث

المسارات

-   [الحساب](https://fareeqy.com/api/v1/docs/account)
-   [الأحداث](https://fareeqy.com/api/v1/docs/events)
-   [المشاريع](https://fareeqy.com/api/v1/docs/projects)
-   [الأعضاء](https://fareeqy.com/api/v1/docs/members)
-   [قوائم المهام](https://fareeqy.com/api/v1/docs/task-lists)
-   [المهام](https://fareeqy.com/api/v1/docs/tasks)
-   [التعليقات](https://fareeqy.com/api/v1/docs/comments)
-   [المجلس](https://fareeqy.com/api/v1/docs/discussions)
-   [الملفات](https://fareeqy.com/api/v1/docs/files)
-   [المجلدات](https://fareeqy.com/api/v1/docs/folders)

المزيد

-   [سجل التغييرات](https://fareeqy.com/api/v1/docs/changelog)

## شكل المورد

الحقول التي ترجع داخل `data` في مسارات هذه المجموعة.

`id` integer

معرّف رقمي، فالأحداث بلا slug.

`url` string | null

العنوان الكامل للصفحة التي يفتحها الشخص في فريقي.

`name` string

`description` string | null

`starts_at` string (date-time)

`ends_at` string (date-time)

`all_day` boolean

`meeting_url` string | null

`organizer` string | null

من نظّم الحدث. ويستطيع المفتاح تعديل أي حدث في شركته أو حذفه، أياً كان منظّمه.

`organizer_email` string | null

`attendees` object\[\]

Event نسخ

 `{   "id": 77,   "url": "https://app.fareeqy.com/events/77",   "name": "اجتماع مراجعة التصاميم",   "description": "نراجع نسخة الهيدر ونقرر الاتجاه النهائي.",   "starts_at": "2026-08-05T13:00:00.000+03:00",   "ends_at": "2026-08-05T14:00:00.000+03:00",   "all_day": false,   "meeting_url": "https://meet.google.com/abc-defg-hij",   "organizer": "سارة العتيبي",   "organizer_email": "sara@example.com",   "attendees": [     {       "name": "عبدالله المطيري",       "email": "abdullah@example.com"     }   ] }`

### عرض أحداث التقويم

GET /events يتطلب `events:read`

كل أحداث تقويم الشركة، أياً كان منظّمها. ترجع القادمة فقط افتراضياً، وتتقدّم نافذة `from` / `to` الصريحة على `include_past`. تُحسب الحدود وحدّ «القادم» بتوقيت الشركة.

#### بارامترات الاستعلام

`from` string

الحد الأدنى لوقت البدء بصيغة ISO 8601. والنافذة الصريحة تتقدم على `include_past`.

`to` string

الحد الأعلى لوقت البدء بصيغة ISO 8601.

`include_past` boolean

عند غياب نافذة `from` / `to`، تُضمَّن الأحداث الماضية.

الافتراضي: `false`

`limit` integer

حجم الصفحة. الافتراضي 50، والحد الأقصى 100، وما زاد عنه يُقصَر عليه.

الافتراضي: `50`

`offset` integer

عدد السجلات التي تُتخطّى. الافتراضي 0.

الافتراضي: `0`

#### مثال الطلب

cURL نسخ

 `curl "https://app.fareeqy.com/api/v1/events" \   -H "Authorization: Bearer $FAREEQY_API_KEY"`

#### مثال الاستجابة

200 نسخ

 `{   "data": [     {       "id": 77,       "url": "https://app.fareeqy.com/events/77",       "name": "اجتماع مراجعة التصاميم",       "description": "نراجع نسخة الهيدر ونقرر الاتجاه النهائي.",       "starts_at": "2026-08-05T13:00:00.000+03:00",       "ends_at": "2026-08-05T14:00:00.000+03:00",       "all_day": false,       "meeting_url": "https://meet.google.com/abc-defg-hij",       "organizer": "سارة العتيبي",       "organizer_email": "sara@example.com",       "attendees": [         {           "name": "عبدالله المطيري",           "email": "abdullah@example.com"         }       ]     }   ],   "meta": {     "total": 4,     "limit": 50,     "offset": 0,     "count": 4   } }`

حالات الرفض: 401 403 404 422 429 اعرض أمثلة الرفض أخفِ أمثلة الرفض

401 `default`

Missing or invalid API key.

default نسخ

 `{   "error": {     "code": "unauthorized",     "message": "مفتاح الـ API غير صالح أو غير مُرسَل."   } }`

403 `forbidden`

Two different refusals share this status, and a client must tell them apart by `error.code`. `forbidden` means the key's scope or allowlist does not permit this operation, or Pundit denied the action. `plan_upgrade_required` means the company's plan carries no API access at all, so no key on it can ever succeed and there is nothing to retry.

This key may not perform this operation نسخ

 `{   "error": {     "code": "forbidden",     "message": "هذا الـ API key لا يملك صلاحية تنفيذ هذه العملية."   } }`

The company's plan carries no API access نسخ

 `{   "error": {     "code": "plan_upgrade_required",     "message": "خطة «الاحترافي» لا تشمل الوصول إلى API. رقِّ إلى «المتطور» أو «الإنتاجي» لتفعيله."   } }`

404 `not_found`

Resource not found or not accessible — also returned for EVERY endpoint when the company's `rest_api` feature flag is disabled (the surface is hidden). Lookups drill through the URL hierarchy, so another company's record is a 404 and never a leak. A path that matches no route at all answers 404 with the distinct code `unknown_endpoint` and echoes the path back, so a mistyped or half-built URL is told apart from a record that is missing or out of reach.

A record that is missing or out of reach نسخ

 `{   "error": {     "code": "not_found",     "message": "غير موجود، أو لا تملك صلاحية الوصول إليه."   } }`

A path that matches no endpoint نسخ

 `{   "error": {     "code": "unknown_endpoint",     "message": "لا يوجد endpoint يطابق GET /api/v1/projcts. راجع المسار في توثيق الـ API."   } }`

422 `default`

A caller-fixable bad request (validation error, bad date, bad enum).

default نسخ

 `{   "error": {     "code": "unprocessable_entity",     "message": "قيمة due_at غير صالحة؛ أرسل تاريخاً مثل 2026-07-20. المهمة تُستحق في يوم، وأي وقت ترسله يُهمل."   } }`

429 `rate_limit_exceeded`

Either the company's daily API allowance is spent ( `rate_limit_exceeded` ), or the per-key / per-IP burst throttle of 300 requests per minute fired. Both come back after a wait, so `Retry-After` is honest here. **The two bodies are not the same shape.** The daily-quota refusal uses the standard error envelope. The burst throttle is served by Rack::Attack ahead of the application, so its body is a flat `{"error": "<string>"}` with no `code`. A client that reads `error.code` has to tolerate `error` being a plain string.

Today's daily allowance is spent (application envelope) نسخ

 `{   "error": {     "code": "rate_limit_exceeded",     "message": "استهلكت رصيد اليوم من طلبات API في خطة «المتطور» (1000 طلب يوميًا). يتجدد الرصيد عند منتصف الليل بتوقيت Asia/Riyadh."   } }`

Over 300 requests in a minute (Rack::Attack body, flat error) نسخ

 `{   "error": "Rate limit exceeded. Please try again later." }`

[الأخطاء](https://fareeqy.com/api/v1/docs#errors)

### إنشاء حدث

POST /events يتطلب `events:write`

يمر عبر Events::Creator نفسه الذي يستخدمه المنتج، فيُشعَر المدعوون، ويتزامن الحدث مع تقويم Google المرتبط. الأوقات المرسلة بلا منطقة زمنية تُقرأ بتوقيت الشركة.

#### جسم الطلب

`name` string مطلوب

`description` string | null

`starts_at` string مطلوب

بصيغة ISO 8601، مثل 2026-07-20T14:00.

`ends_at` string مطلوب

بصيغة ISO 8601.

`all_day` boolean

`meeting_url` string | null

`attendee_emails` string (email)\[\]

بُرد أعضاء الشركة الذين تدعوهم.

#### مثال الطلب

cURL نسخ

 `curl -X POST "https://app.fareeqy.com/api/v1/events" \   -H "Authorization: Bearer $FAREEQY_API_KEY" \   -H "Content-Type: application/json" \   -d '{"name":"اجتماع مراجعة التصاميم","description":"نراجع نسخة الهيدر ونقرر الاتجاه النهائي.","starts_at":"2026-08-05T13:00","ends_at":"2026-08-05T14:00","all_day":false,"meeting_url":"https://meet.google.com/abc-defg-hij","attendee_emails":["abdullah@example.com"]}'`

#### مثال الاستجابة

201 نسخ

 `{   "data": {     "id": 77,     "url": "https://app.fareeqy.com/events/77",     "name": "اجتماع مراجعة التصاميم",     "description": "نراجع نسخة الهيدر ونقرر الاتجاه النهائي.",     "starts_at": "2026-08-05T13:00:00.000+03:00",     "ends_at": "2026-08-05T14:00:00.000+03:00",     "all_day": false,     "meeting_url": "https://meet.google.com/abc-defg-hij",     "organizer": "سارة العتيبي",     "organizer_email": "sara@example.com",     "attendees": [       {         "name": "عبدالله المطيري",         "email": "abdullah@example.com"       }     ]   } }`

حالات الرفض: 401 403 404 409 422 429 اعرض أمثلة الرفض أخفِ أمثلة الرفض

401 `default`

Missing or invalid API key.

default نسخ

 `{   "error": {     "code": "unauthorized",     "message": "مفتاح الـ API غير صالح أو غير مُرسَل."   } }`

403 `forbidden`

Two different refusals share this status, and a client must tell them apart by `error.code`. `forbidden` means the key's scope or allowlist does not permit this operation, or Pundit denied the action. `plan_upgrade_required` means the company's plan carries no API access at all, so no key on it can ever succeed and there is nothing to retry.

This key may not perform this operation نسخ

 `{   "error": {     "code": "forbidden",     "message": "هذا الـ API key لا يملك صلاحية تنفيذ هذه العملية."   } }`

The company's plan carries no API access نسخ

 `{   "error": {     "code": "plan_upgrade_required",     "message": "خطة «الاحترافي» لا تشمل الوصول إلى API. رقِّ إلى «المتطور» أو «الإنتاجي» لتفعيله."   } }`

404 `not_found`

Resource not found or not accessible — also returned for EVERY endpoint when the company's `rest_api` feature flag is disabled (the surface is hidden). Lookups drill through the URL hierarchy, so another company's record is a 404 and never a leak. A path that matches no route at all answers 404 with the distinct code `unknown_endpoint` and echoes the path back, so a mistyped or half-built URL is told apart from a record that is missing or out of reach.

A record that is missing or out of reach نسخ

 `{   "error": {     "code": "not_found",     "message": "غير موجود، أو لا تملك صلاحية الوصول إليه."   } }`

A path that matches no endpoint نسخ

 `{   "error": {     "code": "unknown_endpoint",     "message": "لا يوجد endpoint يطابق GET /api/v1/projcts. راجع المسار في توثيق الـ API."   } }`

409 `default`

A uniqueness/record conflict; retry.

default نسخ

 `{   "error": {     "code": "conflict",     "message": "تعذّر إتمام العملية بسبب تعارض. أعد المحاولة."   } }`

422 `default`

A caller-fixable bad request (validation error, bad date, bad enum).

default نسخ

 `{   "error": {     "code": "unprocessable_entity",     "message": "قيمة due_at غير صالحة؛ أرسل تاريخاً مثل 2026-07-20. المهمة تُستحق في يوم، وأي وقت ترسله يُهمل."   } }`

429 `rate_limit_exceeded`

Either the company's daily API allowance is spent ( `rate_limit_exceeded` ), or the per-key / per-IP burst throttle of 300 requests per minute fired. Both come back after a wait, so `Retry-After` is honest here. **The two bodies are not the same shape.** The daily-quota refusal uses the standard error envelope. The burst throttle is served by Rack::Attack ahead of the application, so its body is a flat `{"error": "<string>"}` with no `code`. A client that reads `error.code` has to tolerate `error` being a plain string.

Today's daily allowance is spent (application envelope) نسخ

 `{   "error": {     "code": "rate_limit_exceeded",     "message": "استهلكت رصيد اليوم من طلبات API في خطة «المتطور» (1000 طلب يوميًا). يتجدد الرصيد عند منتصف الليل بتوقيت Asia/Riyadh."   } }`

Over 300 requests in a minute (Rack::Attack body, flat error) نسخ

 `{   "error": "Rate limit exceeded. Please try again later." }`

[الأخطاء](https://fareeqy.com/api/v1/docs#errors)

### عرض حدث

GET /events/ {id} يتطلب `events:read`

#### بارامترات المسار

`id` integer مطلوب

المعرّف الرقمي للحدث، فالأحداث بلا معرّف ثابت وبلا slug.

#### مثال الطلب

cURL نسخ

 `curl "https://app.fareeqy.com/api/v1/events/77" \   -H "Authorization: Bearer $FAREEQY_API_KEY"`

#### مثال الاستجابة

200 نسخ

 `{   "data": {     "id": 77,     "url": "https://app.fareeqy.com/events/77",     "name": "اجتماع مراجعة التصاميم",     "description": "نراجع نسخة الهيدر ونقرر الاتجاه النهائي.",     "starts_at": "2026-08-05T13:00:00.000+03:00",     "ends_at": "2026-08-05T14:00:00.000+03:00",     "all_day": false,     "meeting_url": "https://meet.google.com/abc-defg-hij",     "organizer": "سارة العتيبي",     "organizer_email": "sara@example.com",     "attendees": [       {         "name": "عبدالله المطيري",         "email": "abdullah@example.com"       }     ]   } }`

حالات الرفض: 401 403 404 429 اعرض أمثلة الرفض أخفِ أمثلة الرفض

401 `default`

Missing or invalid API key.

default نسخ

 `{   "error": {     "code": "unauthorized",     "message": "مفتاح الـ API غير صالح أو غير مُرسَل."   } }`

403 `forbidden`

Two different refusals share this status, and a client must tell them apart by `error.code`. `forbidden` means the key's scope or allowlist does not permit this operation, or Pundit denied the action. `plan_upgrade_required` means the company's plan carries no API access at all, so no key on it can ever succeed and there is nothing to retry.

This key may not perform this operation نسخ

 `{   "error": {     "code": "forbidden",     "message": "هذا الـ API key لا يملك صلاحية تنفيذ هذه العملية."   } }`

The company's plan carries no API access نسخ

 `{   "error": {     "code": "plan_upgrade_required",     "message": "خطة «الاحترافي» لا تشمل الوصول إلى API. رقِّ إلى «المتطور» أو «الإنتاجي» لتفعيله."   } }`

404 `not_found`

Resource not found or not accessible — also returned for EVERY endpoint when the company's `rest_api` feature flag is disabled (the surface is hidden). Lookups drill through the URL hierarchy, so another company's record is a 404 and never a leak. A path that matches no route at all answers 404 with the distinct code `unknown_endpoint` and echoes the path back, so a mistyped or half-built URL is told apart from a record that is missing or out of reach.

A record that is missing or out of reach نسخ

 `{   "error": {     "code": "not_found",     "message": "غير موجود، أو لا تملك صلاحية الوصول إليه."   } }`

A path that matches no endpoint نسخ

 `{   "error": {     "code": "unknown_endpoint",     "message": "لا يوجد endpoint يطابق GET /api/v1/projcts. راجع المسار في توثيق الـ API."   } }`

429 `rate_limit_exceeded`

Either the company's daily API allowance is spent ( `rate_limit_exceeded` ), or the per-key / per-IP burst throttle of 300 requests per minute fired. Both come back after a wait, so `Retry-After` is honest here. **The two bodies are not the same shape.** The daily-quota refusal uses the standard error envelope. The burst throttle is served by Rack::Attack ahead of the application, so its body is a flat `{"error": "<string>"}` with no `code`. A client that reads `error.code` has to tolerate `error` being a plain string.

Today's daily allowance is spent (application envelope) نسخ

 `{   "error": {     "code": "rate_limit_exceeded",     "message": "استهلكت رصيد اليوم من طلبات API في خطة «المتطور» (1000 طلب يوميًا). يتجدد الرصيد عند منتصف الليل بتوقيت Asia/Riyadh."   } }`

Over 300 requests in a minute (Rack::Attack body, flat error) نسخ

 `{   "error": "Rate limit exceeded. Please try again later." }`

[الأخطاء](https://fareeqy.com/api/v1/docs#errors)

### تعديل حدث

PATCH /events/ {id} يتطلب `events:write`

أي حدث في شركة المفتاح، أياً كان منظّمه. لا يتغير إلا ما ترسله، باستثناء `attendee_emails`: إرسالها يستبدل قائمة المدعوين كاملة.

#### بارامترات المسار

`id` integer مطلوب

المعرّف الرقمي للحدث، فالأحداث بلا معرّف ثابت وبلا slug.

#### جسم الطلب

`name` string

`description` string | null

`starts_at` string

بصيغة ISO 8601.

`ends_at` string

بصيغة ISO 8601.

`all_day` boolean

`meeting_url` string | null

`attendee_emails` string (email)\[\]

إرسال الحقل يستبدل قائمة المدعوين كاملة.

#### مثال الطلب

cURL نسخ

 `curl -X PATCH "https://app.fareeqy.com/api/v1/events/77" \   -H "Authorization: Bearer $FAREEQY_API_KEY" \   -H "Content-Type: application/json" \   -d '{"name":"","description":null,"starts_at":"","ends_at":"","all_day":false,"meeting_url":null,"attendee_emails":[""]}'`

#### مثال الاستجابة

200 نسخ

 `{   "data": {     "id": 77,     "url": "https://app.fareeqy.com/events/77",     "name": "اجتماع مراجعة التصاميم",     "description": "نراجع نسخة الهيدر ونقرر الاتجاه النهائي.",     "starts_at": "2026-08-05T13:00:00.000+03:00",     "ends_at": "2026-08-05T14:00:00.000+03:00",     "all_day": false,     "meeting_url": "https://meet.google.com/abc-defg-hij",     "organizer": "سارة العتيبي",     "organizer_email": "sara@example.com",     "attendees": [       {         "name": "عبدالله المطيري",         "email": "abdullah@example.com"       }     ]   } }`

حالات الرفض: 401 403 404 409 422 429 اعرض أمثلة الرفض أخفِ أمثلة الرفض

401 `default`

Missing or invalid API key.

default نسخ

 `{   "error": {     "code": "unauthorized",     "message": "مفتاح الـ API غير صالح أو غير مُرسَل."   } }`

403 `forbidden`

Two different refusals share this status, and a client must tell them apart by `error.code`. `forbidden` means the key's scope or allowlist does not permit this operation, or Pundit denied the action. `plan_upgrade_required` means the company's plan carries no API access at all, so no key on it can ever succeed and there is nothing to retry.

This key may not perform this operation نسخ

 `{   "error": {     "code": "forbidden",     "message": "هذا الـ API key لا يملك صلاحية تنفيذ هذه العملية."   } }`

The company's plan carries no API access نسخ

 `{   "error": {     "code": "plan_upgrade_required",     "message": "خطة «الاحترافي» لا تشمل الوصول إلى API. رقِّ إلى «المتطور» أو «الإنتاجي» لتفعيله."   } }`

404 `not_found`

Resource not found or not accessible — also returned for EVERY endpoint when the company's `rest_api` feature flag is disabled (the surface is hidden). Lookups drill through the URL hierarchy, so another company's record is a 404 and never a leak. A path that matches no route at all answers 404 with the distinct code `unknown_endpoint` and echoes the path back, so a mistyped or half-built URL is told apart from a record that is missing or out of reach.

A record that is missing or out of reach نسخ

 `{   "error": {     "code": "not_found",     "message": "غير موجود، أو لا تملك صلاحية الوصول إليه."   } }`

A path that matches no endpoint نسخ

 `{   "error": {     "code": "unknown_endpoint",     "message": "لا يوجد endpoint يطابق GET /api/v1/projcts. راجع المسار في توثيق الـ API."   } }`

409 `default`

A uniqueness/record conflict; retry.

default نسخ

 `{   "error": {     "code": "conflict",     "message": "تعذّر إتمام العملية بسبب تعارض. أعد المحاولة."   } }`

422 `default`

A caller-fixable bad request (validation error, bad date, bad enum).

default نسخ

 `{   "error": {     "code": "unprocessable_entity",     "message": "قيمة due_at غير صالحة؛ أرسل تاريخاً مثل 2026-07-20. المهمة تُستحق في يوم، وأي وقت ترسله يُهمل."   } }`

429 `rate_limit_exceeded`

Either the company's daily API allowance is spent ( `rate_limit_exceeded` ), or the per-key / per-IP burst throttle of 300 requests per minute fired. Both come back after a wait, so `Retry-After` is honest here. **The two bodies are not the same shape.** The daily-quota refusal uses the standard error envelope. The burst throttle is served by Rack::Attack ahead of the application, so its body is a flat `{"error": "<string>"}` with no `code`. A client that reads `error.code` has to tolerate `error` being a plain string.

Today's daily allowance is spent (application envelope) نسخ

 `{   "error": {     "code": "rate_limit_exceeded",     "message": "استهلكت رصيد اليوم من طلبات API في خطة «المتطور» (1000 طلب يوميًا). يتجدد الرصيد عند منتصف الليل بتوقيت Asia/Riyadh."   } }`

Over 300 requests in a minute (Rack::Attack body, flat error) نسخ

 `{   "error": "Rate limit exceeded. Please try again later." }`

[الأخطاء](https://fareeqy.com/api/v1/docs#errors)

### حذف حدث

DELETE /events/ {id} يتطلب `events:destructive`

حذف نهائي، لأي حدث في شركة المفتاح أياً كان منظّمه. يمتد إلى النسخ الشخصية التي أخذها آخرون من حدث عام.

#### بارامترات المسار

`id` integer مطلوب

المعرّف الرقمي للحدث، فالأحداث بلا معرّف ثابت وبلا slug.

#### مثال الطلب

cURL نسخ

 `curl -X DELETE "https://app.fareeqy.com/api/v1/events/77" \   -H "Authorization: Bearer $FAREEQY_API_KEY"`

#### مثال الاستجابة

200 نسخ

 `{   "data": {     "deleted": true,     "event": {       "id": 77,       "name": "اجتماع مراجعة التصاميم"     }   } }`

حالات الرفض: 401 403 404 429 اعرض أمثلة الرفض أخفِ أمثلة الرفض

401 `default`

Missing or invalid API key.

default نسخ

 `{   "error": {     "code": "unauthorized",     "message": "مفتاح الـ API غير صالح أو غير مُرسَل."   } }`

403 `forbidden`

Two different refusals share this status, and a client must tell them apart by `error.code`. `forbidden` means the key's scope or allowlist does not permit this operation, or Pundit denied the action. `plan_upgrade_required` means the company's plan carries no API access at all, so no key on it can ever succeed and there is nothing to retry.

This key may not perform this operation نسخ

 `{   "error": {     "code": "forbidden",     "message": "هذا الـ API key لا يملك صلاحية تنفيذ هذه العملية."   } }`

The company's plan carries no API access نسخ

 `{   "error": {     "code": "plan_upgrade_required",     "message": "خطة «الاحترافي» لا تشمل الوصول إلى API. رقِّ إلى «المتطور» أو «الإنتاجي» لتفعيله."   } }`

404 `not_found`

Resource not found or not accessible — also returned for EVERY endpoint when the company's `rest_api` feature flag is disabled (the surface is hidden). Lookups drill through the URL hierarchy, so another company's record is a 404 and never a leak. A path that matches no route at all answers 404 with the distinct code `unknown_endpoint` and echoes the path back, so a mistyped or half-built URL is told apart from a record that is missing or out of reach.

A record that is missing or out of reach نسخ

 `{   "error": {     "code": "not_found",     "message": "غير موجود، أو لا تملك صلاحية الوصول إليه."   } }`

A path that matches no endpoint نسخ

 `{   "error": {     "code": "unknown_endpoint",     "message": "لا يوجد endpoint يطابق GET /api/v1/projcts. راجع المسار في توثيق الـ API."   } }`

429 `rate_limit_exceeded`

Either the company's daily API allowance is spent ( `rate_limit_exceeded` ), or the per-key / per-IP burst throttle of 300 requests per minute fired. Both come back after a wait, so `Retry-After` is honest here. **The two bodies are not the same shape.** The daily-quota refusal uses the standard error envelope. The burst throttle is served by Rack::Attack ahead of the application, so its body is a flat `{"error": "<string>"}` with no `code`. A client that reads `error.code` has to tolerate `error` being a plain string.

Today's daily allowance is spent (application envelope) نسخ

 `{   "error": {     "code": "rate_limit_exceeded",     "message": "استهلكت رصيد اليوم من طلبات API في خطة «المتطور» (1000 طلب يوميًا). يتجدد الرصيد عند منتصف الليل بتوقيت Asia/Riyadh."   } }`

Over 300 requests in a minute (Rack::Attack body, flat error) نسخ

 `{   "error": "Rate limit exceeded. Please try again later." }`

[الأخطاء](https://fareeqy.com/api/v1/docs#errors)

[السابق الحساب](https://fareeqy.com/api/v1/docs/account) [التالي المشاريع](https://fareeqy.com/api/v1/docs/projects)
