List tasks
GET/api/v1/tasks
Shared tasks in the workspace, newest first, with cursor paging. Filters combine. Private tasks belong to one person and are never returned.
Query parameters
| Parameter | Type | Description |
|---|---|---|
status | string | A task status by value, or open / done as shorthands for not-done and done. |
assigneeId | string | — |
contactId | string | — |
projectId | string | — |
ticketId | string | Tasks created from this ticket. |
q | string | Case-insensitive match on the title. |
limit | number | Page size, 1 to 100. Default 50. |
cursor | string | The nextCursor from the previous page. |
Example request
curl "https://crowdstack.org/api/v1/tasks?status=open&limit=1" \
-H "Authorization: Bearer $CROWDSTACK_API_KEY"Example response
{
"tasks": [
{
"id": "cmf3k2x9a0040abcd",
"number": 12,
"key": "T-12",
"title": "Send Acme the security questionnaire",
"description": null,
"status": "todo",
"type": "chore",
"priority": 3,
"dueDate": "2026-09-18",
"doneAt": null,
"assignee": {
"id": "cmf3k2x9a0003abcd",
"name": "Jane Doe",
"email": "jane@acme-mail.com"
},
"createdBy": {
"id": "cmf3k2x9a0003abcd",
"name": "Jane Doe",
"email": "jane@acme-mail.com"
},
"contact": {
"id": "cmf3k2x9a0001abcd",
"email": "jane@acme.com",
"firstName": "Jane",
"lastName": "Doe"
},
"project": null,
"parentId": null,
"ticketId": null,
"fields": {
"effort": "medium"
},
"createdAt": "2026-09-15T10:12:00.000Z",
"updatedAt": "2026-09-15T10:12:00.000Z"
}
],
"nextCursor": "cmf3k2x9a0040abcd"
}Get a task
GET/api/v1/tasks/:id
One shared task with its comments (oldest first) and its subtasks.
Responses
| Status | Meaning |
|---|---|
| 404 | No shared task with that id. |
Example request
curl "https://crowdstack.org/api/v1/tasks/cmf3k2x9a0001abcd" \
-H "Authorization: Bearer $CROWDSTACK_API_KEY"Example response
{
"task": {
"id": "cmf3k2x9a0040abcd",
"number": 12,
"key": "T-12",
"title": "Send Acme the security questionnaire",
"description": null,
"status": "todo",
"type": "chore",
"priority": 3,
"dueDate": "2026-09-18",
"doneAt": null,
"assignee": {
"id": "cmf3k2x9a0003abcd",
"name": "Jane Doe",
"email": "jane@acme-mail.com"
},
"createdBy": {
"id": "cmf3k2x9a0003abcd",
"name": "Jane Doe",
"email": "jane@acme-mail.com"
},
"contact": {
"id": "cmf3k2x9a0001abcd",
"email": "jane@acme.com",
"firstName": "Jane",
"lastName": "Doe"
},
"project": null,
"parentId": null,
"ticketId": null,
"fields": {
"effort": "medium"
},
"createdAt": "2026-09-15T10:12:00.000Z",
"updatedAt": "2026-09-15T10:12:00.000Z",
"comments": [
{
"id": "cmf3k2x9a0045abcd",
"body": "Questionnaire sent, waiting on their security team.",
"author": {
"id": "cmf3k2x9a0003abcd",
"name": "Jane Doe",
"email": "jane@acme-mail.com"
},
"createdAt": "2026-09-16T09:00:00.000Z",
"updatedAt": "2026-09-16T09:00:00.000Z"
}
],
"subtasks": []
}
}Create a task
POST/api/v1/tasks
Opens a shared task. Only the title is required; everything else falls back to the workspace's defaults. Pass createdById and assigneeId to say whose task it is; list_users gives the ids.
Status and type accept a value or its label from Settings, Tasks. Priority is 0 to 4 or none, low, medium, high, urgent. Due dates are day-granular, yyyy-mm-dd.
Every task has a creator. When createdById is left out it is whoever made the API key, then the workspace's longest-standing member. An assignee left out defaults to the creator.
Creating a task with the done status stamps doneAt immediately. Tasks made through the API are always shared, never private.
Request body
| Field | Type | Description |
|---|---|---|
titlerequired | string | — |
description | string | null | Plain text. |
status | string | Defaults to the workspace's default task status. |
type | string | null | Defaults to the workspace's default task type. null leaves it untyped. |
priority | number | string | 0 to 4, or none, low, medium, high, urgent. |
dueDate | string | null | yyyy-mm-dd. |
assigneeId | string | null | An active member. Defaults to the creator. |
createdById | string | null | The member the task is recorded as created by. |
contactId | string | null | Files the task against a contact and logs it on their timeline. |
projectId | string | null | An open project in the workspace. |
parentId | string | null | Makes this a subtask of another shared task. |
ticketId | string | null | Links the task to a ticket; marking it done reopens the ticket with a note. |
fields | object | Custom field values keyed by field key. Unknown keys are rejected; get_workspace lists the defined fields. |
Responses
| Status | Meaning |
|---|---|
| 201 | Body: { task }. |
| 422 | Validation failed, including unknown assignee, contact, project or parent ids. |
Example request
curl -X POST https://crowdstack.org/api/v1/tasks \
-H "Authorization: Bearer $CROWDSTACK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"title": "Send Acme the security questionnaire",
"assigneeId": "cmf3k2x9a0003abcd",
"priority": "high",
"dueDate": "2026-09-18",
"contactId": "cmf3k2x9a0001abcd",
"fields": {
"effort": "medium"
}
}'Example response
{
"task": {
"id": "cmf3k2x9a0040abcd",
"number": 12,
"key": "T-12",
"title": "Send Acme the security questionnaire",
"description": null,
"status": "todo",
"type": "chore",
"priority": 3,
"dueDate": "2026-09-18",
"doneAt": null,
"assignee": {
"id": "cmf3k2x9a0003abcd",
"name": "Jane Doe",
"email": "jane@acme-mail.com"
},
"createdBy": {
"id": "cmf3k2x9a0003abcd",
"name": "Jane Doe",
"email": "jane@acme-mail.com"
},
"contact": {
"id": "cmf3k2x9a0001abcd",
"email": "jane@acme.com",
"firstName": "Jane",
"lastName": "Doe"
},
"project": null,
"parentId": null,
"ticketId": null,
"fields": {
"effort": "medium"
},
"createdAt": "2026-09-15T10:12:00.000Z",
"updatedAt": "2026-09-15T10:12:00.000Z"
}
}Update a task
PATCH/api/v1/tasks/:id
Change a shared task's title, description, status, type, priority, due date, assignee, contact, project or custom fields. Only keys you send are changed. Moving to the done status stamps doneAt and, for a task linked to a ticket, reopens that ticket with an internal note.
Request body
| Field | Type | Description |
|---|---|---|
title | string | — |
description | string | null | — |
status | string | — |
type | string | null | — |
priority | number | string | 0 to 4, or none, low, medium, high, urgent. |
dueDate | string | null | yyyy-mm-dd, or null to clear. |
assigneeId | string | null | null unassigns. |
contactId | string | null | — |
projectId | string | null | — |
fields | object | Custom field values keyed by field key. Unknown keys are rejected; get_workspace lists the defined fields. |
Responses
| Status | Meaning |
|---|---|
| 200 | Body: { task }. |
| 404 | No shared task with that id. |
Example request
curl -X PATCH https://crowdstack.org/api/v1/tasks/cmf3k2x9a0001abcd \
-H "Authorization: Bearer $CROWDSTACK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"status": "done"
}'Example response
{
"task": {
"id": "cmf3k2x9a0040abcd",
"number": 12,
"key": "T-12",
"title": "Send Acme the security questionnaire",
"description": null,
"status": "done",
"type": "chore",
"priority": 3,
"dueDate": "2026-09-18",
"doneAt": "2026-09-16T09:00:00.000Z",
"assignee": {
"id": "cmf3k2x9a0003abcd",
"name": "Jane Doe",
"email": "jane@acme-mail.com"
},
"createdBy": {
"id": "cmf3k2x9a0003abcd",
"name": "Jane Doe",
"email": "jane@acme-mail.com"
},
"contact": {
"id": "cmf3k2x9a0001abcd",
"email": "jane@acme.com",
"firstName": "Jane",
"lastName": "Doe"
},
"project": null,
"parentId": null,
"ticketId": null,
"fields": {
"effort": "medium"
},
"createdAt": "2026-09-15T10:12:00.000Z",
"updatedAt": "2026-09-15T10:12:00.000Z"
}
}Comment on a task
POST/api/v1/tasks/:id/comments
Adds a plain-text comment to a shared task, attributed to the member behind the API key (or authorId when given).
Request body
| Field | Type | Description |
|---|---|---|
bodyrequired | string | — |
authorId | string | The member to post as. Defaults to the key's owner. |
Responses
| Status | Meaning |
|---|---|
| 201 | Body: { comment }. |
| 404 | No shared task with that id. |
Example request
curl -X POST https://crowdstack.org/api/v1/tasks/cmf3k2x9a0001abcd/comments \
-H "Authorization: Bearer $CROWDSTACK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"body": "Questionnaire sent, waiting on their security team."
}'Example response
{
"comment": {
"id": "cmf3k2x9a0045abcd",
"body": "Questionnaire sent, waiting on their security team.",
"author": {
"id": "cmf3k2x9a0003abcd",
"name": "Jane Doe",
"email": "jane@acme-mail.com"
},
"createdAt": "2026-09-16T09:00:00.000Z",
"updatedAt": "2026-09-16T09:00:00.000Z"
}
}List projects
GET/api/v1/projects
Projects that group tasks, with open task counts. Archived projects are left out unless asked for.
Query parameters
| Parameter | Type | Description |
|---|---|---|
archived | include | only | include adds archived projects; only returns just them. |
Example request
curl "https://crowdstack.org/api/v1/projects" \
-H "Authorization: Bearer $CROWDSTACK_API_KEY"Example response
{
"projects": [
{
"id": "cmf3k2x9a0120abcd",
"name": "Q4 launch",
"description": null,
"archivedAt": null,
"taskCount": 8,
"createdAt": "2026-09-01T09:00:00.000Z"
}
]
}Create a project
POST/api/v1/projects
Creates a project to group tasks under. Names are unique per workspace, case-insensitively.
Request body
| Field | Type | Description |
|---|---|---|
namerequired | string | — |
description | string | null | — |
Responses
| Status | Meaning |
|---|---|
| 201 | Body: { project }. |
| 422 | A project with that name already exists. |
Example request
curl -X POST https://crowdstack.org/api/v1/projects \
-H "Authorization: Bearer $CROWDSTACK_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "Q4 launch"
}'Example response
{
"project": {
"id": "cmf3k2x9a0120abcd",
"name": "Q4 launch",
"description": null,
"archivedAt": null,
"createdAt": "2026-09-01T09:00:00.000Z"
}
}