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
403with codetasks_disabledand 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
403with codestaff_principal_required. Changes made through the API are recorded under that user’s name. - Scopes:
tasks:readto read tasks, comments, statuses, labels and assignable staff.tasks:writeto create, update, move, link, archive, delete and comment.tasks:writeincludestasks:read.
REST quickstart
Create a task
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
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.
Links and comments
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 anIdempotency-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 arevision 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:
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.
