---
title: "External Integrations with the Fareeqy API"
description: "The Fareeqy REST API: projects, task lists, tasks, files, and discussions. Requests carry a Bearer key, a scope, and an explicit list of allowed operations."
url: https://fareeqy.com/api/v1/docs/en
language: en
---

For developers

# External Integrations with the Fareeqy API

The Fareeqy API is a REST API for reading, creating, and updating projects, task lists, tasks, Majlis discussions, files, folders, calendar events, members, and comments. Each request requires a Bearer key, a scope, and allowed operations. The API is in preview and enabled per company.

Base URL

`https://app.fareeqy.com/api/v1`

Version

[v1.3.0](https://fareeqy.com/api/v1/docs/changelog/en)

OpenAPI 3.1

[OpenAPI file](https://fareeqy.com/openapi.yaml)

Status

Preview, enabled per company

Contents

Essentials

-   Start in three steps
-   Access and activation
-   Authentication
-   Key authority
-   Scope and operations
-   Identifiers and addresses
-   Response envelopes
-   Rate limits and the daily quota
-   Operation catalog
-   Errors
-   All endpoints

Endpoints

-   [Account](https://fareeqy.com/api/v1/docs/account/en)
-   [Events](https://fareeqy.com/api/v1/docs/events/en)
-   [Projects](https://fareeqy.com/api/v1/docs/projects/en)
-   [Members](https://fareeqy.com/api/v1/docs/members/en)
-   [Task lists](https://fareeqy.com/api/v1/docs/task-lists/en)
-   [Tasks](https://fareeqy.com/api/v1/docs/tasks/en)
-   [Comments](https://fareeqy.com/api/v1/docs/comments/en)
-   [Discussions](https://fareeqy.com/api/v1/docs/discussions/en)
-   [Files](https://fareeqy.com/api/v1/docs/files/en)
-   [Folders](https://fareeqy.com/api/v1/docs/folders/en)

More

-   [Changelog](https://fareeqy.com/api/v1/docs/changelog/en)

Essentials

-   Start in three steps
-   Access and activation
-   Authentication
-   Key authority
-   Scope and operations
-   Identifiers and addresses
-   Response envelopes
-   Rate limits and the daily quota
-   Operation catalog
-   Errors
-   All endpoints

Endpoints

-   [Account](https://fareeqy.com/api/v1/docs/account/en)
-   [Events](https://fareeqy.com/api/v1/docs/events/en)
-   [Projects](https://fareeqy.com/api/v1/docs/projects/en)
-   [Members](https://fareeqy.com/api/v1/docs/members/en)
-   [Task lists](https://fareeqy.com/api/v1/docs/task-lists/en)
-   [Tasks](https://fareeqy.com/api/v1/docs/tasks/en)
-   [Comments](https://fareeqy.com/api/v1/docs/comments/en)
-   [Discussions](https://fareeqy.com/api/v1/docs/discussions/en)
-   [Files](https://fareeqy.com/api/v1/docs/files/en)
-   [Folders](https://fareeqy.com/api/v1/docs/folders/en)

More

-   [Changelog](https://fareeqy.com/api/v1/docs/changelog/en)

## Start in three steps

1.   Mint an API key in your company settings, and pick its scope and the operations it carries.
2.   Check the key works, and see which operations it carries and which company it acts for.
3.   Read your projects, then work inside them: lists, tasks, majlis and files.

Request Copy

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

Response Copy

 `{   "data": {     "key": {       "name": "مزامنة الفوترة",       "access": "write",       "operations": [         "projects:read",         "tasks:read",         "tasks:write"       ]     },     "company": {       "name": "فريق التقنية"     },     "created_by": {       "name": "سارة العتيبي",       "email": "sara@example.com"     }   } }`

`created_by` is a signature that tells you which key an integration carries. It is not the identity the request runs as.

## Access and activation

The API is available on the **Advanced** and **Productive** plans. The Free and Pro plans carry no API access at all: a request from them is refused with 403 and `plan_upgrade_required`, and retrying will never help.

The surface is in preview and switched on per company. While it is off for yours, every authenticated path returns 404: the surface is hidden, not merely forbidden. Authentication is checked first (a bad key is still 401), then the flag, so the 404 only appears once a valid key has been presented.

To switch the API on for your company, or to ask for higher limits, get in touch and we will enable it on your account.

## Authentication

Every request carries its API key in the `Authorization` header as a Bearer credential. A key is shown once at creation (only its hashed digest is stored), so save yours when you mint it.

cURL Copy

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

REST keys and MCP tokens are separate credentials; neither authenticates against the other's interface.

## Key authority

-   The key belongs to the company, not its creator, and works after they leave.

-   An operation not granted to the key ← 403.

-   The key reaches every company project, including private ones, except an onboarding demo project created for someone else, and every event on the company calendar.

-   A record belonging to another company ← 404.

-   `created_by` names the key creator, not the request identity.

-   Key administration: owner and authorized users; not managers or members.


## Scope and operations

Every endpoint declares the single operation it requires, a stable `<resource>:<capability>` string such as `projects:write`. A key is gated twice before a request runs.

-   **Scope** is the ceiling: `read` or `write`. A `write` key also carries `read`. The scope decides which operations a key may ever hold.

-   **The allowed-operations list** is the operative gate: the explicit operations this key may call, validated to be a subset of what its scope permits. A key cannot be saved with an empty list, so it is never accidentally open.


Both must hold: the operation must be in the key's list, and its scope must satisfy the operation's capability. Otherwise the request is refused with 403 and audited as `denied`.

**Deletes are opt-in.** `destructive` operations need the `write` scope but are deliberately excluded from the default grant: each delete is ticked on a key by hand. See the operation catalog below.

## Identifiers and addresses

Projects, task lists, tasks and majlis topics hand back a stable ref in `id`: `prj-8f3kd`, `lst-4m2qp`, `tsk-9wb7t`, `mjl-6khz2`. A ref is unique across the install, it is ASCII so it needs no URL-encoding, and it does not change when the record is renamed. It is also what the browser address bar shows, so what a colleague copies off the screen works in your script unchanged.

A slug is still accepted on every nested address where it was, and so is the numeric id of a project, task list, task, majlis topic or file, so nothing you stored against an earlier version of this API has to be migrated. What changed is which shape we hand you, not which we accept.

The `*_slug` fields in responses ( `project_slug`, `task_list_slug`, `task_slug`, `discussion_slug` ) carry the ref too, not a slug. They keep the name for compatibility.

Every project, task list, task, majlis topic, comment, file, folder, event and search hit carries `url`: the absolute address of the page a person opens in فريقي. A comment has no page of its own, so it carries its parent's; a folder carries the project's files page scoped to it. Link to it rather than building the address yourself.

One record has two addresses, and the difference between them is the whole safety argument:

-   **The nested address** takes either shape: `/projects/{project}/lists/{list}/tasks/{task}`. It still means what it says: a URL naming the wrong parent is a 404 even when its leaf ref would have resolved on its own.

-   **The flat address** takes a ref and nothing else: `/tasks/tsk-9wb7t`, `/lists/lst-4m2qp`, `/discussions/mjl-6khz2`, `DELETE /files/fil-3qd8n`. The refusal is the point: a slug repeats across projects, so serving a flat lookup by slug would hand over another project's record.

-   A handle is constrained per prefix rather than to the shared ref shape, so `/tasks/lst-4m2qp` is a 404 instead of a task list answered from the task address. Quietly reaching a record of the wrong type is the worst failure an address scheme can have, so it is refused twice: at the router, then again on resolution.

-   Collections stay under a parent, because a collection **is** its parent's ("the tasks in THIS list"), but the parent may be named flatly: `/lists/lst-4m2qp/tasks` is the same list without the project.


A file sits in between: it has a ref ( `fil-3qd8n` ) that the flat delete address takes and that search returns in `id`, but a project's file listing still answers with its numeric id. Both resolve wherever a file is accepted.

Folders, events, comments and comment attachments have no ref and are addressed by numeric ids. Those ids are global, so every lookup is drilled through the parent project (or, for events, the key's company): an id from another company resolves to 404, never a leak.

Slugs are Arabic because your project names are, so URL-encode them before sending: `تطوير-الموقع` becomes `%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-...`. The examples here show the raw text so they stay readable. A ref spares you all of it.

## Response envelopes

Every response is enveloped, so you never handle a bare array or a root-level field.

-   Single resource: `{ "data": { ... } }`

-   Collection: `{ "data": [ ... ], "meta": { total, limit, offset, count } }`

-   Delete: `{ "data": { "deleted": true, ... } }`

-   Error: `{ "error": { "code": "...", "message": "..." } }`


`error.code` is the stable part your program reads, and it stays in English. `error.message` is written in Arabic, for a person to read. Branch on the code, never on the message. The one body outside this shape is the burst throttle's, which arrives ahead of the application with `error` as a plain string.

Collections take `limit` (default 50, max 100, clamped) and `offset` (default 0). `meta.total` is the full unfiltered count; `meta.count` is the number of records in the returned page.

## Rate limits and the daily quota

Two independent layers, and they refuse differently.

**Burst.** Each key is throttled to 300 requests per minute, and a matching per-IP throttle applies too. Crossing either returns 429.

**Daily quota.** Every request spends one call from the company's daily allowance. The allowance is per company, not per key, so minting extra keys does not raise it, and it resets at midnight in your company's own time zone.

| Plan | Daily API calls |
| --- | --- |
| Free | No API access |
| Pro | No API access |
| Advanced | 1,000 |
| Productive | 10,000 |

A plan with no access is not being rate-limited: its refusal is 403 `plan_upgrade_required` and carries no `Retry-After`, because waiting will never help. A plan that has access and has spent today's calls gets 429 `rate_limit_exceeded` with a `Retry-After` pointing at your company's next midnight. Treating the two as the same failure sends a well-behaved client into a retry loop that can never succeed.

`X-RateLimit-Limit`, `X-RateLimit-Remaining` and `X-RateLimit-Reset` are set on **every** served response, not only on refusals, so your client can slow down before it reaches zero. On an uncapped plan the first two read `unlimited`.

## Operation catalog

The table lists every operation that can be granted to a key, grouped by resource. Delete operations are never granted automatically; each one must be enabled individually.

| Resource | Read | Write | Destructive |
| --- | --- | --- | --- |
| `account` | `account:read` | None | None |
| `projects` | `projects:read` | `projects:write` | `projects:destructive` |
| `task_lists` | `task_lists:read` | `task_lists:write` | `task_lists:destructive` |
| `tasks` | `tasks:read` | `tasks:write` | `tasks:destructive` |
| `discussions` | `discussions:read` | `discussions:write` | `discussions:destructive` |
| `comments` | `comments:read` | `comments:write` | None |
| `files` | `files:read` | `files:write` | `files:destructive` |
| `events` | `events:read` | `events:write` | `events:destructive` |

## Errors

All errors use a shared shape containing a stable machine-readable code and a human-readable message. These errors may be returned by any endpoint.

### 401 Unauthorized

Missing or invalid API key.

401 Copy

 `{   "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

403 Copy

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

The company's plan carries no API access

403 Copy

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

### 404 NotFound

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

404 Copy

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

A path that matches no endpoint

404 Copy

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

### 422 Unprocessable

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

422 Copy

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

### 409 Conflict

A uniqueness/record conflict; retry.

409 Copy

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

### 409 ProjectInUse

The project cannot be deleted because a connected integration sends its work there. Nothing was deleted. Disconnect the integration, or point it at another project, then delete again. Retrying as-is will not help.

409 Copy

 `{   "error": {     "code": "project_in_use",     "message": "هذا المشروع وجهة تكامل موصول (Sentry). حذفه لا يوقف وصول الأخطاء، بل يجعلها تصل إلى لا مكان. افصل التكامل من «الإعدادات ← التكاملات»، أو وجّهه إلى مشروع آخر، ثم احذف هذا المشروع."   } }`

### 429 RateLimited

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.

Headers sent with it

`Retry-After` Seconds to wait before retrying. On a spent daily allowance this points at the company's next midnight.

`X-RateLimit-Limit` The plan's daily API allowance, or `unlimited`.

`X-RateLimit-Remaining` Calls left in today's allowance, or `unlimited`.

`X-RateLimit-Reset` Unix timestamp of the next reset (the company's next midnight).

Today's daily allowance is spent (application envelope)

429 Copy

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

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

429 Copy

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

## All endpoints

The index lists every endpoint. Open an endpoint's group for its parameters, request body, and a response example.

### [Account](https://fareeqy.com/api/v1/docs/account/en)

The calling key itself and workspace-wide search.

-   [GET /me The calling key and the company it acts for](https://fareeqy.com/api/v1/docs/account/en#getMe)
-   [GET /search Unified workspace search](https://fareeqy.com/api/v1/docs/account/en#search)

### [Events](https://fareeqy.com/api/v1/docs/events/en)

Company calendar events. Numeric ids.

-   [GET /events List calendar events](https://fareeqy.com/api/v1/docs/events/en#listEvents)
-   [POST /events Create an event](https://fareeqy.com/api/v1/docs/events/en#createEvent)
-   [GET /events/ {id} Get an event](https://fareeqy.com/api/v1/docs/events/en#getEvent)
-   [PATCH /events/ {id} Update an event](https://fareeqy.com/api/v1/docs/events/en#updateEvent)
-   [DELETE /events/ {id} Delete an event](https://fareeqy.com/api/v1/docs/events/en#deleteEvent)

### [Projects](https://fareeqy.com/api/v1/docs/projects/en)

The company's projects, private ones included.

-   [GET /projects List the company's projects](https://fareeqy.com/api/v1/docs/projects/en#listProjects)
-   [POST /projects Create a project](https://fareeqy.com/api/v1/docs/projects/en#createProject)
-   [GET /projects/ {id} Get a project](https://fareeqy.com/api/v1/docs/projects/en#getProject)
-   [PATCH /projects/ {id} Update a project](https://fareeqy.com/api/v1/docs/projects/en#updateProject)
-   [DELETE /projects/ {id} Delete a project](https://fareeqy.com/api/v1/docs/projects/en#deleteProject)
-   [POST /projects/ {id} /archive Archive a project](https://fareeqy.com/api/v1/docs/projects/en#archiveProject)
-   [POST /projects/ {id} /unarchive Unarchive a project](https://fareeqy.com/api/v1/docs/projects/en#unarchiveProject)

### [Members](https://fareeqy.com/api/v1/docs/members/en)

A project's assignable people.

-   [GET /projects/ {project\_id} /members List a project's assignable people](https://fareeqy.com/api/v1/docs/members/en#listProjectMembers)

### [Task lists](https://fareeqy.com/api/v1/docs/task-lists/en)

Containers that group tasks within a project. Ref ids (lst-); a slug still resolves.

-   [GET /projects/ {project\_id} /lists List a project's task lists](https://fareeqy.com/api/v1/docs/task-lists/en#listTaskLists)
-   [POST /projects/ {project\_id} /lists Create a task list](https://fareeqy.com/api/v1/docs/task-lists/en#createTaskList)
-   [GET /projects/ {project\_id} /lists/ {id} Get a task list](https://fareeqy.com/api/v1/docs/task-lists/en#getTaskList)
-   [PATCH /projects/ {project\_id} /lists/ {id} Update a task list](https://fareeqy.com/api/v1/docs/task-lists/en#updateTaskList)
-   [DELETE /projects/ {project\_id} /lists/ {id} Delete a task list](https://fareeqy.com/api/v1/docs/task-lists/en#deleteTaskList)
-   [POST /projects/ {project\_id} /lists/ {id} /complete Mark a task list complete](https://fareeqy.com/api/v1/docs/task-lists/en#completeTaskList)
-   [POST /projects/ {project\_id} /lists/ {id} /incomplete Reopen a task list](https://fareeqy.com/api/v1/docs/task-lists/en#reopenTaskList)
-   [POST /projects/ {project\_id} /lists/ {id} /move Move a task list to another project](https://fareeqy.com/api/v1/docs/task-lists/en#moveTaskList)
-   [GET /lists/ {id} Get a task list by ref](https://fareeqy.com/api/v1/docs/task-lists/en#getTaskListByRef)
-   [PATCH /lists/ {id} Update a task list by ref](https://fareeqy.com/api/v1/docs/task-lists/en#updateTaskListByRef)
-   [DELETE /lists/ {id} Delete a task list by ref](https://fareeqy.com/api/v1/docs/task-lists/en#deleteTaskListByRef)
-   [POST /lists/ {id} /complete Complete a task list by ref](https://fareeqy.com/api/v1/docs/task-lists/en#completeTaskListByRef)
-   [POST /lists/ {id} /incomplete Reopen a task list by ref](https://fareeqy.com/api/v1/docs/task-lists/en#incompleteTaskListByRef)
-   [POST /lists/ {id} /move Move a task list to another project, by ref](https://fareeqy.com/api/v1/docs/task-lists/en#moveTaskListByRef)

### [Tasks](https://fareeqy.com/api/v1/docs/tasks/en)

The actionable items nested under a task list. Ref ids (tsk-); a slug still resolves.

-   [GET /projects/ {project\_id} /lists/ {task\_list\_id} /tasks List a task list's tasks](https://fareeqy.com/api/v1/docs/tasks/en#listTasks)
-   [POST /projects/ {project\_id} /lists/ {task\_list\_id} /tasks Create a task](https://fareeqy.com/api/v1/docs/tasks/en#createTask)
-   [GET /projects/ {project\_id} /lists/ {task\_list\_id} /tasks/ {id} Get a task](https://fareeqy.com/api/v1/docs/tasks/en#getTask)
-   [PATCH /projects/ {project\_id} /lists/ {task\_list\_id} /tasks/ {id} Update a task](https://fareeqy.com/api/v1/docs/tasks/en#updateTask)
-   [DELETE /projects/ {project\_id} /lists/ {task\_list\_id} /tasks/ {id} Delete a task](https://fareeqy.com/api/v1/docs/tasks/en#deleteTask)
-   [POST /projects/ {project\_id} /lists/ {task\_list\_id} /tasks/ {id} /complete Mark a task complete](https://fareeqy.com/api/v1/docs/tasks/en#completeTask)
-   [POST /projects/ {project\_id} /lists/ {task\_list\_id} /tasks/ {id} /incomplete Reopen a task](https://fareeqy.com/api/v1/docs/tasks/en#reopenTask)
-   [POST /projects/ {project\_id} /lists/ {task\_list\_id} /tasks/ {id} /move Move a task to another list in the same project](https://fareeqy.com/api/v1/docs/tasks/en#moveTask)
-   [POST /projects/ {project\_id} /lists/ {task\_list\_id} /tasks/ {id} /time Record time spent on a task](https://fareeqy.com/api/v1/docs/tasks/en#setTaskTimeSpent)
-   [GET /lists/ {task\_list\_id} /tasks List a task list's tasks, by ref](https://fareeqy.com/api/v1/docs/tasks/en#listTasksByRef)
-   [POST /lists/ {task\_list\_id} /tasks Create a task in a task list, by ref](https://fareeqy.com/api/v1/docs/tasks/en#createTaskByRef)
-   [GET /tasks/ {id} Get a task by ref](https://fareeqy.com/api/v1/docs/tasks/en#getTaskByRef)
-   [PATCH /tasks/ {id} Update a task by ref](https://fareeqy.com/api/v1/docs/tasks/en#updateTaskByRef)
-   [DELETE /tasks/ {id} Delete a task by ref](https://fareeqy.com/api/v1/docs/tasks/en#deleteTaskByRef)
-   [POST /tasks/ {id} /complete Complete a task by ref](https://fareeqy.com/api/v1/docs/tasks/en#completeTaskByRef)
-   [POST /tasks/ {id} /incomplete Reopen a task by ref](https://fareeqy.com/api/v1/docs/tasks/en#incompleteTaskByRef)
-   [POST /tasks/ {id} /move Move a task to another list, by ref](https://fareeqy.com/api/v1/docs/tasks/en#moveTaskByRef)
-   [POST /tasks/ {id} /time Record time spent on a task, by ref](https://fareeqy.com/api/v1/docs/tasks/en#setTaskTimeSpentByRef)

### [Comments](https://fareeqy.com/api/v1/docs/comments/en)

Comments on a task list or task, read and written, and the text of files attached to them.

-   [GET /projects/ {project\_id} /lists/ {task\_list\_id} /comments List a task list's comments](https://fareeqy.com/api/v1/docs/comments/en#listTaskListComments)
-   [POST /projects/ {project\_id} /lists/ {task\_list\_id} /comments Comment on a task list](https://fareeqy.com/api/v1/docs/comments/en#createTaskListComment)
-   [GET /projects/ {project\_id} /lists/ {task\_list\_id} /comments/ {comment\_id} /attachments/ {id} Read a file attached to a task list comment](https://fareeqy.com/api/v1/docs/comments/en#getTaskListCommentAttachment)
-   [GET /projects/ {project\_id} /lists/ {task\_list\_id} /tasks/ {task\_id} /comments List a task's comments](https://fareeqy.com/api/v1/docs/comments/en#listTaskComments)
-   [POST /projects/ {project\_id} /lists/ {task\_list\_id} /tasks/ {task\_id} /comments Comment on a task](https://fareeqy.com/api/v1/docs/comments/en#createTaskComment)
-   [GET /projects/ {project\_id} /lists/ {task\_list\_id} /tasks/ {task\_id} /comments/ {comment\_id} /attachments/ {id} Read a file attached to a task comment](https://fareeqy.com/api/v1/docs/comments/en#getTaskCommentAttachment)
-   [GET /lists/ {task\_list\_id} /comments List a task list's comments, by ref](https://fareeqy.com/api/v1/docs/comments/en#listTaskListCommentsByRef)
-   [POST /lists/ {task\_list\_id} /comments Comment on a task list, by ref](https://fareeqy.com/api/v1/docs/comments/en#createTaskListCommentByRef)
-   [GET /lists/ {task\_list\_id} /comments/ {comment\_id} /attachments/ {id} Read a file attached to a task list comment, by ref](https://fareeqy.com/api/v1/docs/comments/en#getTaskListCommentAttachmentByRef)
-   [GET /tasks/ {task\_id} /comments List a task's comments, by ref](https://fareeqy.com/api/v1/docs/comments/en#listTaskCommentsByRef)
-   [POST /tasks/ {task\_id} /comments Comment on a task, by ref](https://fareeqy.com/api/v1/docs/comments/en#createTaskCommentByRef)
-   [GET /tasks/ {task\_id} /comments/ {comment\_id} /attachments/ {id} Read a file attached to a task comment, by ref](https://fareeqy.com/api/v1/docs/comments/en#getTaskCommentAttachmentByRef)

### [Discussions](https://fareeqy.com/api/v1/docs/discussions/en)

Majlis discussion topics within a project. Ref ids (mjl-); a slug still resolves.

-   [GET /projects/ {project\_id} /discussions List a project's majlis topics](https://fareeqy.com/api/v1/docs/discussions/en#listDiscussions)
-   [POST /projects/ {project\_id} /discussions Create (and publish) a majlis topic](https://fareeqy.com/api/v1/docs/discussions/en#createDiscussion)
-   [GET /projects/ {project\_id} /discussions/ {id} Get a majlis topic](https://fareeqy.com/api/v1/docs/discussions/en#getDiscussion)
-   [PATCH /projects/ {project\_id} /discussions/ {id} Update a majlis topic](https://fareeqy.com/api/v1/docs/discussions/en#updateDiscussion)
-   [DELETE /projects/ {project\_id} /discussions/ {id} Delete a majlis topic](https://fareeqy.com/api/v1/docs/discussions/en#deleteDiscussion)
-   [POST /projects/ {project\_id} /discussions/ {id} /reply Reply to a majlis topic](https://fareeqy.com/api/v1/docs/discussions/en#replyToDiscussion)
-   [GET /discussions/ {id} Get a majlis topic by ref](https://fareeqy.com/api/v1/docs/discussions/en#getDiscussionByRef)
-   [PATCH /discussions/ {id} Update a majlis topic by ref](https://fareeqy.com/api/v1/docs/discussions/en#updateDiscussionByRef)
-   [DELETE /discussions/ {id} Delete a majlis topic by ref](https://fareeqy.com/api/v1/docs/discussions/en#deleteDiscussionByRef)
-   [POST /discussions/ {id} /reply Reply to a majlis topic by ref](https://fareeqy.com/api/v1/docs/discussions/en#replyToDiscussionByRef)

### [Files](https://fareeqy.com/api/v1/docs/files/en)

Project files and external links. Numeric ids; the flat delete address takes a fil- ref.

-   [GET /projects/ {project\_id} /files List one level of a project's file browser](https://fareeqy.com/api/v1/docs/files/en#listFiles)
-   [POST /projects/ {project\_id} /files Upload a file from inline content](https://fareeqy.com/api/v1/docs/files/en#uploadFile)
-   [POST /projects/ {project\_id} /files/link Add an external link](https://fareeqy.com/api/v1/docs/files/en#addExternalLink)
-   [DELETE /projects/ {project\_id} /files/ {id} Delete a file](https://fareeqy.com/api/v1/docs/files/en#deleteFile)
-   [DELETE /files/ {id} Delete a file by ref](https://fareeqy.com/api/v1/docs/files/en#deleteFileByRef)

### [Folders](https://fareeqy.com/api/v1/docs/folders/en)

Folders in a project's files section. Numeric ids.

-   [POST /projects/ {project\_id} /folders Create a folder](https://fareeqy.com/api/v1/docs/folders/en#createFolder)
-   [DELETE /projects/ {project\_id} /folders/ {id} Delete a folder](https://fareeqy.com/api/v1/docs/folders/en#deleteFolder)

## Enable the API and Issue a Key

Request API activation for your company. Once enabled, issue a key from API Keys settings and select its allowed operations.

[Open Fareeqy](https://app.fareeqy.com) [Talk to us](https://fareeqy.com/contact/en)
