Skip to main content
The Tasks API gives your scripts and AI assistants the same board your team uses in Admin > Tasks: create tasks, link the evidence they came from, move them between statuses and comment on them. See Tasks for the board itself.

Before you start

  • Tasks must be enabled for your workspace. It is off by default; contact AGO to enable it. Until then, every call returns 403 with code tasks_disabled and the MCP task tools are hidden.
  • Calls run as an active staff user. For an API key, that is the user who created the key. For OAuth, it is the user who granted access. If that user is not, or is no longer, an active staff user, calls return 403 with code staff_principal_required. Changes made through the API are recorded under that user’s name.
  • Scopes: tasks:read to read tasks, comments, statuses, labels and assignable staff. tasks:write to create, update, move, link, archive, delete and comment. tasks:write includes tasks:read.
Create the key in Developer > API Keys. See API Key Authentication.

REST quickstart

Create a task

Only title is required. Without status, the task lands in the first to-do status. Without owner_id, it is unowned. You can attach up to 10 links when creating a task. The response is 201 with the task:
identifier is the task’s short ID. Every {task_id} in the endpoints below accepts either the UUID or the identifier, so GET /api/v1/tasks/TASK-12 works.

List tasks

Move a task

Status keys come from GET /api/v1/task-statuses. The default keys are TODO, IN_PROGRESS, IN_REVIEW, DONE and CANCELED.

Claude and MCP quickstart

The task tools are part of the MCP server at /api/v1/mcp. Connect your assistant with an API key or OAuth that has tasks:read or tasks:write (see Use AGO from AI assistants), then ask in plain language:
Show me the unowned high-priority tasks and who could take them.
Create a task to fix the refund policy page, linked to conversation 1111…, due next Tuesday.
Move TASK-12 to Done and comment that the page is fixed.
To turn recent feedback into tasks, use the triage_feedback_into_tasks workflow. See Triage feedback into tasks.

Endpoints

Full parameters and schemas are in the Tasks section of the Endpoints sidebar.

List filters

An unknown filter value returns 400 with code invalid_<param> (for example invalid_status). The message lists the valid values and param names the field.

Updating a task

PUT /api/v1/tasks/{task_id} changes only the fields you send. Send null to clear owner_id, deadline or description. label_ids replaces all labels on the task. The owner must be an active staff user; use GET /api/v1/task-assignees to find valid IDs.

Moving a task

POST /api/v1/tasks/{task_id}/move accepts: Without neighbors or placement, the task goes to the bottom of the column (the top for done and canceled statuses). If the neighbor cards moved in the meantime, the call returns 409 with code stale_neighbors: read the board again and retry. POST /api/v1/tasks/{task_id}/links takes {"target_type": "...", "target_id": "..."}, where target_type is conversation, ticket, feedback, message or knowledge_update_request. An ID that does not exist returns 404 with code link_target_not_found. When a linked item is later deleted, the link stays with deleted: true. POST /api/v1/tasks/{task_id}/comments takes content (up to 10,000 characters) and optional mention_ids (up to 20 active staff users). Mentioned users are notified. To read knowledge update requests, use the existing knowledge update request tools in the MCP Server reference (list_knowledge_update_requests, get_knowledge_update_request).

The task object

Avoiding duplicates with idempotency keys

Send an Idempotency-Key header (1 to 255 characters) on POST /api/v1/tasks and POST /api/v1/tasks/{task_id}/comments. If the request is retried with the same key and body, AGO returns the first response instead of creating a second task or comment. This holds even if the task was deleted afterwards. Reusing a key with a different body returns 409 with code idempotency_key_reused. Keys are kept for 24 hours and are scoped to your API key or user. On MCP, pass the key as the idempotency_key argument of create_task and add_task_comment.

Handling conflicts

Every task has a revision number. To avoid overwriting a teammate’s change, send the revision you last read as expected_revision on PUT or move. If the task changed since, the call returns 409 with code task_revision_conflict. Read the task again, reapply your change and retry.

Pagination

GET /api/v1/tasks returns up to limit tasks (default 50, maximum 100) and uses cursors instead of page numbers:
Pass next_cursor as the cursor parameter to get the next page, keeping the same filters and sort. total is only included on the first page. A cursor from another sort returns 400 with code invalid_cursor.

Errors

Errors use the standard error envelope. Task-specific codes: See API Errors for the full list.