API Endpoints
All endpoints use the base URL https://projects.cyrus365.com/api/v1.
Projects
| Method | Path | Scope | Description |
GET | /projects | projects.read | List accessible projects |
GET | /projects/:id | projects.read or bound project key | Get project detail |
GET /projects
Query parameters:
| Param | Type | Description |
status | string | Filter: ACTIVE, PLANNING, PAUSED, COMPLETED, ARCHIVED |
page | number | Page number (default 1) |
perPage | number | Items per page (default 50, max 200) |
GET /projects/:id
Query parameters:
| Param | Type | Description |
include | string | Comma-separated: tasks, stats, all |
taskPage | number | Sub-page for included tasks |
taskPerPage | number | Tasks per sub-page |
Tasks
| Method | Path | Scope | Description |
GET | /projects/:id/tasks | tasks.read | List tasks with filters |
POST | /projects/:id/tasks | tasks.write | Create a task |
GET | /projects/:id/tasks/:taskId | tasks.read | Get task detail |
PATCH | /projects/:id/tasks/:taskId | tasks.write | Update a task |
PATCH | /projects/:id/tasks/:taskId/reorder | tasks.write | Move or reorder a task |
DELETE | /projects/:id/tasks/:taskId | tasks.write | Delete a task |
GET /projects/:id/tasks
| Param | Type | Description |
status | string | Comma-separated: TODO, IN_PROGRESS, REVIEW, DONE, CLOSED |
priority | string | Comma-separated: LOW, MEDIUM, HIGH, URGENT |
assigneeId | string | Filter by assignee user ID |
sprintId | string | Filter by sprint (null for unassigned) |
groupId | string | Filter by group (null for drafts) |
updatedSince | string | ISO 8601 date — only tasks updated after this time |
search | string | Text search in title and description |
page | number | Page number |
perPage | number | Items per page (max 200) |
POST /projects/:id/tasks
{
"title": "Design login page",
"description": "Mobile-first responsive design",
"status": "TODO",
"priority": "HIGH",
"groupId": "group_id",
"sprintId": "sprint_id",
"startDate": "2025-02-01",
"dueDate": "2025-02-15",
"color": "#3b82f6",
"assigneeIds": ["user_id_1", "user_id_2"]
}
| Field | Required | Description |
title | Yes | Task title |
description | Optional description |
status | TODO (default), IN_PROGRESS, REVIEW, DONE, CLOSED |
priority | MEDIUM (default), LOW, HIGH, URGENT |
groupId | Target group (null = drafts) |
sprintId | Sprint assignment (null = unassigned) |
startDate | ISO date |
dueDate | ISO date |
color | Hex color string |
assigneeIds | Array of user IDs |
PATCH /projects/:id/tasks/:taskId
All fields are optional — only provided fields are updated.
{
"title": "Updated title",
"status": "IN_PROGRESS",
"priority": "URGENT",
"groupId": "new_group_id",
"sprintId": "new_sprint_id",
"assigneeIds": ["user_id_1"]
}
PATCH /projects/:id/tasks/:taskId/reorder
Move a task to Drafts or to a group/sprint position. Send the target context and optional neighbor task IDs; the API generates the ordering key server-side.
{
"targetGroupId": "group_id",
"targetSprintId": "sprint_id",
"insertAfterTaskId": "task_before_id",
"insertBeforeTaskId": "task_after_id"
}
Set both targetGroupId and targetSprintId to null to move the task to Drafts. Omit both neighbor fields to append to the end of the target context.
Subtasks
| Method | Path | Scope | Description |
GET | /projects/:id/tasks/:taskId/subtasks | tasks.read | List subtasks |
POST | /projects/:id/tasks/:taskId/subtasks | tasks.write | Create subtask |
Comments
| Method | Path | Scope | Description |
GET | /projects/:id/tasks/:taskId/comments | comments.read | List comments |
POST | /projects/:id/tasks/:taskId/comments | comments.write | Create comment |
Activity Logs
| Method | Path | Scope | Description |
GET | /projects/:id/tasks/:taskId/logs | activity.read | Task activity history |
Sprints
| Method | Path | Scope | Description |
GET | /projects/:id/sprints | sprints.read | List sprints |
POST | /projects/:id/sprints | sprints.write | Create sprint |
GET | /projects/:id/sprints/:sprintId | sprints.read | Get sprint detail |
PATCH | /projects/:id/sprints/:sprintId | sprints.write | Update sprint |
DELETE | /projects/:id/sprints/:sprintId | sprints.write | Delete sprint |
POST /projects/:id/sprints
{
"name": "Sprint 3",
"startDate": "2025-01-20",
"endDate": "2025-02-03",
"status": "PLANNING",
"orderKey": 3
}
| Field | Required | Description |
name | Yes | Sprint name |
startDate | ISO date |
endDate | ISO date |
status | PLANNING (default), ACTIVE, COMPLETED |
orderKey | Numeric ordering value; omitted values append to the end |
PATCH /projects/:id/sprints/:sprintId
All fields are optional. Supported fields: name, startDate, endDate, status, orderKey, lockLevel.
DELETE /projects/:id/sprints/:sprintId
Deleting a sprint moves its tasks back to the backlog (sprint assignment set to null). The last sprint in a project cannot be deleted.
Groups
| Method | Path | Scope | Description |
GET | /projects/:id/groups | groups.read | List groups (Kanban columns) |
POST | /projects/:id/groups | groups.write | Create group |
GET | /projects/:id/groups/:groupId | groups.read | Get group detail |
PATCH | /projects/:id/groups/:groupId | groups.write | Update group |
DELETE | /projects/:id/groups/:groupId | groups.write | Delete group |
PATCH /projects/:id/groups/:groupId
All fields are optional. Supported fields: name, color, orderKey.
Deleting a group also deletes the tasks in that group.
Members
| Method | Path | Scope | Description |
GET | /projects/:id/members | members.read | List project members |
Member responses include membership fields (
id,
userId,
role,
autoAdded,
createdAt) plus display profile fields when available:
name,
email,
avatarUrl, and
avatarConfig. Use
userId when assigning tasks through
assigneeIds.
Tags
| Method | Path | Scope | Description |
GET | /projects/:id/tags | tags.read | List tags (hierarchical) |
POST | /projects/:id/tags | tags.write | Create project tag |
Calendar Events
| Method | Path | Scope | Description |
GET | /projects/:id/calendar-events | calendar.read | List calendar events |
POST | /projects/:id/calendar-events | calendar.write | Create calendar event |
GET | /projects/:id/calendar-events/:eventId | calendar.read | Get calendar event detail |
PATCH | /projects/:id/calendar-events/:eventId | calendar.write | Update calendar event |
DELETE | /projects/:id/calendar-events/:eventId | calendar.write | Delete calendar event |
POST /projects/:id/calendar-events
{
"title": "Launch Readiness Review",
"description": "Final go/no-go checkpoint",
"date": "2026-03-20T09:00:00.000Z",
"type": "MILESTONE",
"color": "#3b82f6",
"taskIds": ["task_1", "task_2"]
}
| Field | Required | Description |
title | Yes | Event title |
description | Optional description |
date | Yes | ISO 8601 date-time |
type | DEADLINE, MILESTONE, PRESENTATION, MEETING, REVIEW, RELEASE, OTHER |
color | Optional hex color override |
taskIds | Optional array of linked task IDs in the same project |
PATCH /projects/:id/calendar-events/:eventId
All fields are optional. If taskIds is provided, it replaces the current linked task set.
Related