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

ParameterTypeDescription
statusstringA task status by value, or open / done as shorthands for not-done and done.
assigneeIdstring—
contactIdstring—
projectIdstring—
ticketIdstringTasks created from this ticket.
qstringCase-insensitive match on the title.
limitnumberPage size, 1 to 100. Default 50.
cursorstringThe 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

StatusMeaning
404No 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

FieldTypeDescription
titlerequiredstring—
descriptionstring | nullPlain text.
statusstringDefaults to the workspace's default task status.
typestring | nullDefaults to the workspace's default task type. null leaves it untyped.
prioritynumber | string0 to 4, or none, low, medium, high, urgent.
dueDatestring | nullyyyy-mm-dd.
assigneeIdstring | nullAn active member. Defaults to the creator.
createdByIdstring | nullThe member the task is recorded as created by.
contactIdstring | nullFiles the task against a contact and logs it on their timeline.
projectIdstring | nullAn open project in the workspace.
parentIdstring | nullMakes this a subtask of another shared task.
ticketIdstring | nullLinks the task to a ticket; marking it done reopens the ticket with a note.
fieldsobjectCustom field values keyed by field key. Unknown keys are rejected; get_workspace lists the defined fields.

Responses

StatusMeaning
201Body: { task }.
422Validation 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

FieldTypeDescription
titlestring—
descriptionstring | null—
statusstring—
typestring | null—
prioritynumber | string0 to 4, or none, low, medium, high, urgent.
dueDatestring | nullyyyy-mm-dd, or null to clear.
assigneeIdstring | nullnull unassigns.
contactIdstring | null—
projectIdstring | null—
fieldsobjectCustom field values keyed by field key. Unknown keys are rejected; get_workspace lists the defined fields.

Responses

StatusMeaning
200Body: { task }.
404No 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

FieldTypeDescription
bodyrequiredstring—
authorIdstringThe member to post as. Defaults to the key's owner.

Responses

StatusMeaning
201Body: { comment }.
404No 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

ParameterTypeDescription
archivedinclude | onlyinclude 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

FieldTypeDescription
namerequiredstring—
descriptionstring | null—

Responses

StatusMeaning
201Body: { project }.
422A 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"
  }
}