قوائم المهام

حاويات تجمع المهام داخل المشروع. معرّفات بصيغة slug.

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

شكل المورد

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

idstring

الـ slug الخاص بقائمة المهام.

titlestring
notesstring | null

النص العادي المقابل للملاحظات المنسّقة.

prioritystring | null

أولوية قائمة المهام.

القيم:lowmediumhighurgent

completedboolean
completed_atstring (date-time) | null
tasks_countinteger
completed_tasks_countinteger
project_slugstring
created_atstring (date-time)
TaskList
{
  "id": "الصفحة-الرئيسية",
  "title": "الصفحة الرئيسية",
  "notes": "نبدأ بالهيدر ثم قسم المزايا.",
  "priority": "high",
  "completed": false,
  "completed_at": null,
  "tasks_count": 9,
  "completed_tasks_count": 3,
  "project_slug": "تطوير-الموقع",
  "created_at": "2026-07-02T10:05:12.000+03:00"
}

عرض قوائم مهام المشروع

GET/projects/{project_id}/task-listsيتطلب task_lists:read

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

project_idstringمطلوب

الـ slug الخاص بالمشروع.

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

limitinteger

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

الافتراضي: 50

offsetinteger

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

الافتراضي: 0

مثال الطلب

cURL
curl "https://app.fareeqy.com/api/v1/projects/تطوير-الموقع/task-lists" \
  -H "Authorization: Bearer $FAREEQY_API_KEY"

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

200
{
  "data": [
    {
      "id": "الصفحة-الرئيسية",
      "title": "الصفحة الرئيسية",
      "notes": "نبدأ بالهيدر ثم قسم المزايا.",
      "priority": "high",
      "completed": false,
      "completed_at": null,
      "tasks_count": 9,
      "completed_tasks_count": 3,
      "project_slug": "تطوير-الموقع",
      "created_at": "2026-07-02T10:05:12.000+03:00"
    }
  ],
  "meta": {
    "total": 4,
    "limit": 50,
    "offset": 0,
    "count": 4
  }
}
حالات الرفض:401403404429اعرض أمثلة الرفض
401default

Missing or invalid API key.

default
{
  "error": {
    "code": "unauthorized",
    "message": "Invalid or missing API key."
  }
}
403forbidden

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": "This API key is not permitted to perform this operation."
  }
}
The company's plan carries no API access
{
  "error": {
    "code": "plan_upgrade_required",
    "message": "خطة «الاحترافي» لا تشمل الوصول إلى API. رقِّ إلى «المتطور» أو «الانتاجي» لتفعيله. — The الاحترافي plan does not include API access. Upgrade to «المتطور» or «الانتاجي» to enable it."
  }
}
404default

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.

default
{
  "error": {
    "code": "not_found",
    "message": "Resource not found, or you do not have access to it."
  }
}
429rate_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. — Daily API quota exhausted: the المتطور plan allows 1000 calls per day. It resets at midnight Asia/Riyadh."
  }
}
Over 300 requests in a minute (Rack::Attack body, flat error)
{
  "error": "Rate limit exceeded. Please try again later."
}
الأخطاء

إنشاء قائمة مهام

POST/projects/{project_id}/task-listsيتطلب task_lists:write

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

project_idstringمطلوب

الـ slug الخاص بالمشروع.

جسم الطلب

titlestringمطلوب
notesstring | null

ملاحظات بنص منسّق، وتُرسل نصاً عادياً.

prioritystring | null

أولوية قائمة المهام.

القيم:lowmediumhighurgent

مثال الطلب

cURL
curl -X POST "https://app.fareeqy.com/api/v1/projects/تطوير-الموقع/task-lists" \
  -H "Authorization: Bearer $FAREEQY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title":"الصفحة الرئيسية","notes":"نبدأ بالهيدر ثم قسم المزايا.","priority":"high"}'

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

201
{
  "data": {
    "id": "الصفحة-الرئيسية",
    "title": "الصفحة الرئيسية",
    "notes": "نبدأ بالهيدر ثم قسم المزايا.",
    "priority": "high",
    "completed": false,
    "completed_at": null,
    "tasks_count": 9,
    "completed_tasks_count": 3,
    "project_slug": "تطوير-الموقع",
    "created_at": "2026-07-02T10:05:12.000+03:00"
  }
}
حالات الرفض:401403404409422429اعرض أمثلة الرفض
401default

Missing or invalid API key.

default
{
  "error": {
    "code": "unauthorized",
    "message": "Invalid or missing API key."
  }
}
403forbidden

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": "This API key is not permitted to perform this operation."
  }
}
The company's plan carries no API access
{
  "error": {
    "code": "plan_upgrade_required",
    "message": "خطة «الاحترافي» لا تشمل الوصول إلى API. رقِّ إلى «المتطور» أو «الانتاجي» لتفعيله. — The الاحترافي plan does not include API access. Upgrade to «المتطور» or «الانتاجي» to enable it."
  }
}
404default

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.

default
{
  "error": {
    "code": "not_found",
    "message": "Resource not found, or you do not have access to it."
  }
}
409default

A uniqueness/record conflict; retry.

default
{
  "error": {
    "code": "conflict",
    "message": "Could not complete due to a conflict; please retry."
  }
}
422default

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

default
{
  "error": {
    "code": "unprocessable_entity",
    "message": "Title can't be blank"
  }
}
429rate_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. — Daily API quota exhausted: the المتطور plan allows 1000 calls per day. It resets at midnight Asia/Riyadh."
  }
}
Over 300 requests in a minute (Rack::Attack body, flat error)
{
  "error": "Rate limit exceeded. Please try again later."
}
الأخطاء

عرض قائمة مهام

GET/projects/{project_id}/task-lists/{id}يتطلب task_lists:read

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

project_idstringمطلوب

الـ slug الخاص بالمشروع.

idstringمطلوب

الـ slug الخاص بقائمة المهام، وهو فريد داخل مشروعها.

مثال الطلب

cURL
curl "https://app.fareeqy.com/api/v1/projects/تطوير-الموقع/task-lists/الصفحة-الرئيسية" \
  -H "Authorization: Bearer $FAREEQY_API_KEY"

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

200
{
  "data": {
    "id": "الصفحة-الرئيسية",
    "title": "الصفحة الرئيسية",
    "notes": "نبدأ بالهيدر ثم قسم المزايا.",
    "priority": "high",
    "completed": false,
    "completed_at": null,
    "tasks_count": 9,
    "completed_tasks_count": 3,
    "project_slug": "تطوير-الموقع",
    "created_at": "2026-07-02T10:05:12.000+03:00"
  }
}
حالات الرفض:401403404429اعرض أمثلة الرفض
401default

Missing or invalid API key.

default
{
  "error": {
    "code": "unauthorized",
    "message": "Invalid or missing API key."
  }
}
403forbidden

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": "This API key is not permitted to perform this operation."
  }
}
The company's plan carries no API access
{
  "error": {
    "code": "plan_upgrade_required",
    "message": "خطة «الاحترافي» لا تشمل الوصول إلى API. رقِّ إلى «المتطور» أو «الانتاجي» لتفعيله. — The الاحترافي plan does not include API access. Upgrade to «المتطور» or «الانتاجي» to enable it."
  }
}
404default

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.

default
{
  "error": {
    "code": "not_found",
    "message": "Resource not found, or you do not have access to it."
  }
}
429rate_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. — Daily API quota exhausted: the المتطور plan allows 1000 calls per day. It resets at midnight Asia/Riyadh."
  }
}
Over 300 requests in a minute (Rack::Attack body, flat error)
{
  "error": "Rate limit exceeded. Please try again later."
}
الأخطاء

تعديل قائمة مهام

PATCH/projects/{project_id}/task-lists/{id}يتطلب task_lists:write

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

project_idstringمطلوب

الـ slug الخاص بالمشروع.

idstringمطلوب

الـ slug الخاص بقائمة المهام، وهو فريد داخل مشروعها.

جسم الطلب

titlestring
notesstring | null
prioritystring | null

أولوية قائمة المهام.

القيم:lowmediumhighurgent

مثال الطلب

cURL
curl -X PATCH "https://app.fareeqy.com/api/v1/projects/تطوير-الموقع/task-lists/الصفحة-الرئيسية" \
  -H "Authorization: Bearer $FAREEQY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"priority":"urgent"}'

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

200
{
  "data": {
    "id": "الصفحة-الرئيسية",
    "title": "الصفحة الرئيسية",
    "notes": "نبدأ بالهيدر ثم قسم المزايا.",
    "priority": "high",
    "completed": false,
    "completed_at": null,
    "tasks_count": 9,
    "completed_tasks_count": 3,
    "project_slug": "تطوير-الموقع",
    "created_at": "2026-07-02T10:05:12.000+03:00"
  }
}
حالات الرفض:401403404409422429اعرض أمثلة الرفض
401default

Missing or invalid API key.

default
{
  "error": {
    "code": "unauthorized",
    "message": "Invalid or missing API key."
  }
}
403forbidden

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": "This API key is not permitted to perform this operation."
  }
}
The company's plan carries no API access
{
  "error": {
    "code": "plan_upgrade_required",
    "message": "خطة «الاحترافي» لا تشمل الوصول إلى API. رقِّ إلى «المتطور» أو «الانتاجي» لتفعيله. — The الاحترافي plan does not include API access. Upgrade to «المتطور» or «الانتاجي» to enable it."
  }
}
404default

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.

default
{
  "error": {
    "code": "not_found",
    "message": "Resource not found, or you do not have access to it."
  }
}
409default

A uniqueness/record conflict; retry.

default
{
  "error": {
    "code": "conflict",
    "message": "Could not complete due to a conflict; please retry."
  }
}
422default

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

default
{
  "error": {
    "code": "unprocessable_entity",
    "message": "Title can't be blank"
  }
}
429rate_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. — Daily API quota exhausted: the المتطور plan allows 1000 calls per day. It resets at midnight Asia/Riyadh."
  }
}
Over 300 requests in a minute (Rack::Attack body, flat error)
{
  "error": "Rate limit exceeded. Please try again later."
}
الأخطاء

حذف قائمة مهام

DELETE/projects/{project_id}/task-lists/{id}يتطلب task_lists:destructive

حذف نهائي ومتسلسل، يحذف مهامها معها. يتطلب delete_any_task_or_list، ولا استثناء لمن أنشأها.

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

project_idstringمطلوب

الـ slug الخاص بالمشروع.

idstringمطلوب

الـ slug الخاص بقائمة المهام، وهو فريد داخل مشروعها.

مثال الطلب

cURL
curl -X DELETE "https://app.fareeqy.com/api/v1/projects/تطوير-الموقع/task-lists/الصفحة-الرئيسية" \
  -H "Authorization: Bearer $FAREEQY_API_KEY"

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

200
{
  "data": {
    "deleted": true,
    "task_list": {
      "title": "الصفحة الرئيسية",
      "slug": "الصفحة-الرئيسية"
    },
    "deleted_tasks": 9
  }
}
حالات الرفض:401403404429اعرض أمثلة الرفض
401default

Missing or invalid API key.

default
{
  "error": {
    "code": "unauthorized",
    "message": "Invalid or missing API key."
  }
}
403forbidden

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": "This API key is not permitted to perform this operation."
  }
}
The company's plan carries no API access
{
  "error": {
    "code": "plan_upgrade_required",
    "message": "خطة «الاحترافي» لا تشمل الوصول إلى API. رقِّ إلى «المتطور» أو «الانتاجي» لتفعيله. — The الاحترافي plan does not include API access. Upgrade to «المتطور» or «الانتاجي» to enable it."
  }
}
404default

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.

default
{
  "error": {
    "code": "not_found",
    "message": "Resource not found, or you do not have access to it."
  }
}
429rate_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. — Daily API quota exhausted: the المتطور plan allows 1000 calls per day. It resets at midnight Asia/Riyadh."
  }
}
Over 300 requests in a minute (Rack::Attack body, flat error)
{
  "error": "Rate limit exceeded. Please try again later."
}
الأخطاء

إتمام قائمة مهام

POST/projects/{project_id}/task-lists/{id}/completeيتطلب task_lists:write

متاح لأي عضو في المشروع، فهو إجراء عمل لا تعديل محتوى.

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

project_idstringمطلوب

الـ slug الخاص بالمشروع.

idstringمطلوب

الـ slug الخاص بقائمة المهام، وهو فريد داخل مشروعها.

مثال الطلب

cURL
curl -X POST "https://app.fareeqy.com/api/v1/projects/تطوير-الموقع/task-lists/الصفحة-الرئيسية/complete" \
  -H "Authorization: Bearer $FAREEQY_API_KEY"

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

200
{
  "data": {
    "id": "الصفحة-الرئيسية",
    "title": "الصفحة الرئيسية",
    "notes": "نبدأ بالهيدر ثم قسم المزايا.",
    "priority": "high",
    "completed": false,
    "completed_at": null,
    "tasks_count": 9,
    "completed_tasks_count": 3,
    "project_slug": "تطوير-الموقع",
    "created_at": "2026-07-02T10:05:12.000+03:00"
  }
}
حالات الرفض:401403404409422429اعرض أمثلة الرفض
401default

Missing or invalid API key.

default
{
  "error": {
    "code": "unauthorized",
    "message": "Invalid or missing API key."
  }
}
403forbidden

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": "This API key is not permitted to perform this operation."
  }
}
The company's plan carries no API access
{
  "error": {
    "code": "plan_upgrade_required",
    "message": "خطة «الاحترافي» لا تشمل الوصول إلى API. رقِّ إلى «المتطور» أو «الانتاجي» لتفعيله. — The الاحترافي plan does not include API access. Upgrade to «المتطور» or «الانتاجي» to enable it."
  }
}
404default

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.

default
{
  "error": {
    "code": "not_found",
    "message": "Resource not found, or you do not have access to it."
  }
}
409default

A uniqueness/record conflict; retry.

default
{
  "error": {
    "code": "conflict",
    "message": "Could not complete due to a conflict; please retry."
  }
}
422default

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

default
{
  "error": {
    "code": "unprocessable_entity",
    "message": "Title can't be blank"
  }
}
429rate_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. — Daily API quota exhausted: the المتطور plan allows 1000 calls per day. It resets at midnight Asia/Riyadh."
  }
}
Over 300 requests in a minute (Rack::Attack body, flat error)
{
  "error": "Rate limit exceeded. Please try again later."
}
الأخطاء

إعادة فتح قائمة مهام

POST/projects/{project_id}/task-lists/{id}/incompleteيتطلب task_lists:write

متاح لأي عضو في المشروع.

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

project_idstringمطلوب

الـ slug الخاص بالمشروع.

idstringمطلوب

الـ slug الخاص بقائمة المهام، وهو فريد داخل مشروعها.

مثال الطلب

cURL
curl -X POST "https://app.fareeqy.com/api/v1/projects/تطوير-الموقع/task-lists/الصفحة-الرئيسية/incomplete" \
  -H "Authorization: Bearer $FAREEQY_API_KEY"

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

200
{
  "data": {
    "id": "الصفحة-الرئيسية",
    "title": "الصفحة الرئيسية",
    "notes": "نبدأ بالهيدر ثم قسم المزايا.",
    "priority": "high",
    "completed": false,
    "completed_at": null,
    "tasks_count": 9,
    "completed_tasks_count": 3,
    "project_slug": "تطوير-الموقع",
    "created_at": "2026-07-02T10:05:12.000+03:00"
  }
}
حالات الرفض:401403404409422429اعرض أمثلة الرفض
401default

Missing or invalid API key.

default
{
  "error": {
    "code": "unauthorized",
    "message": "Invalid or missing API key."
  }
}
403forbidden

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": "This API key is not permitted to perform this operation."
  }
}
The company's plan carries no API access
{
  "error": {
    "code": "plan_upgrade_required",
    "message": "خطة «الاحترافي» لا تشمل الوصول إلى API. رقِّ إلى «المتطور» أو «الانتاجي» لتفعيله. — The الاحترافي plan does not include API access. Upgrade to «المتطور» or «الانتاجي» to enable it."
  }
}
404default

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.

default
{
  "error": {
    "code": "not_found",
    "message": "Resource not found, or you do not have access to it."
  }
}
409default

A uniqueness/record conflict; retry.

default
{
  "error": {
    "code": "conflict",
    "message": "Could not complete due to a conflict; please retry."
  }
}
422default

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

default
{
  "error": {
    "code": "unprocessable_entity",
    "message": "Title can't be blank"
  }
}
429rate_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. — Daily API quota exhausted: the المتطور plan allows 1000 calls per day. It resets at midnight Asia/Riyadh."
  }
}
Over 300 requests in a minute (Rack::Attack body, flat error)
{
  "error": "Rate limit exceeded. Please try again later."
}
الأخطاء

نقل قائمة مهام إلى مشروع آخر

POST/projects/{project_id}/task-lists/{id}/moveيتطلب task_lists:write

ينقل القائمة ومهامها إلى مشروع آخر. يجب أن تملك صلاحية إنشاء قائمة في الوجهة، ويُرفض النقل إلى مشروع مؤرشف. وأي مهمة مسندة إلى شخص ليس عضواً في الوجهة يُلغى إسنادها.

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

project_idstringمطلوب

الـ slug الخاص بالمشروع.

idstringمطلوب

الـ slug الخاص بقائمة المهام، وهو فريد داخل مشروعها.

جسم الطلب

target_project_slugstringمطلوب

الـ slug الخاص بالمشروع الوجهة.

مثال الطلب

cURL
curl -X POST "https://app.fareeqy.com/api/v1/projects/تطوير-الموقع/task-lists/الصفحة-الرئيسية/move" \
  -H "Authorization: Bearer $FAREEQY_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"target_project_slug":"تطبيق-الجوال"}'

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

200
{
  "data": {
    "id": "الصفحة-الرئيسية",
    "title": "الصفحة الرئيسية",
    "notes": "نبدأ بالهيدر ثم قسم المزايا.",
    "priority": "high",
    "completed": false,
    "completed_at": null,
    "tasks_count": 9,
    "completed_tasks_count": 3,
    "project_slug": "تطوير-الموقع",
    "created_at": "2026-07-02T10:05:12.000+03:00"
  }
}
حالات الرفض:401403404409422429اعرض أمثلة الرفض
401default

Missing or invalid API key.

default
{
  "error": {
    "code": "unauthorized",
    "message": "Invalid or missing API key."
  }
}
403forbidden

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": "This API key is not permitted to perform this operation."
  }
}
The company's plan carries no API access
{
  "error": {
    "code": "plan_upgrade_required",
    "message": "خطة «الاحترافي» لا تشمل الوصول إلى API. رقِّ إلى «المتطور» أو «الانتاجي» لتفعيله. — The الاحترافي plan does not include API access. Upgrade to «المتطور» or «الانتاجي» to enable it."
  }
}
404default

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.

default
{
  "error": {
    "code": "not_found",
    "message": "Resource not found, or you do not have access to it."
  }
}
409default

A uniqueness/record conflict; retry.

default
{
  "error": {
    "code": "conflict",
    "message": "Could not complete due to a conflict; please retry."
  }
}
422default

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

default
{
  "error": {
    "code": "unprocessable_entity",
    "message": "Title can't be blank"
  }
}
429rate_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. — Daily API quota exhausted: the المتطور plan allows 1000 calls per day. It resets at midnight Asia/Riyadh."
  }
}
Over 300 requests in a minute (Rack::Attack body, flat error)
{
  "error": "Rate limit exceeded. Please try again later."
}
الأخطاء