Record a blocker
Records that the task in the path is blocked by `blocker_task_id` — the SAME operation the MCP `link_task_dependency` tool executes. Recording a link that already exists succeeds unchanged (no duplicate row, no second webhook), so retries are safe. A link that would close a loop is REFUSED with 409 `dependency_cycle`: the graph a client reads is guaranteed acyclic. A task cannot block itself (400 `validation_failed`), and a blocker in another organization is indistinguishable from one that does not exist (404 `resource_not_found`). Answers the task's full dependency view, so the caller can see whether it is now blocked without a second call.
Records that the task in the path is blocked by blocker_task_id — the SAME operation the MCP link_task_dependency tool executes. Recording a link that already exists succeeds unchanged (no duplicate row, no second webhook), so retries are safe. A link that would close a loop is REFUSED with 409 dependency_cycle: the graph a client reads is guaranteed acyclic. A task cannot block itself (400 validation_failed), and a blocker in another organization is indistinguishable from one that does not exist (404 resource_not_found). Answers the task's full dependency view, so the caller can see whether it is now blocked without a second call.
Authorization
bearerAuth A gid_ API key (Settings → API keys) or an OAuth 2.1 access token.
In: header
Path Parameters
Task short id, e.g. T-123 (a bare 123 is also accepted on input).
^(?:T-)?[0-9]{1,12}$Header Parameters
Optional client-generated key (1-255 visible ASCII characters; a UUID works) making this POST safely retryable. Retrying with the SAME key and byte-identical body within 24h replays the stored first response (marked Idempotency-Replayed: true, never re-executed, never charged against quota). The same key with a different body answers 422 idempotency_key_reused; a retry racing the first execution answers 409 idempotency_in_progress. Omitting the header executes normally with no idempotency guarantee.
1 <= length <= 255Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
The blocker to record for the task in the path.
Response Body
application/json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
application/problem+json
curl -X POST "https://example.com/v1/tasks/string/dependencies" \ -H "Content-Type: application/json" \ -d '{ "blocker_task_id": "string" }'{ "task_id": "string", "is_blocked": true, "blocked_by_count": -9007199254740991, "blocking_count": -9007199254740991, "blocked_by": [ { "task_id": "string", "title": "string", "status": "TODO", "open": true } ], "blocking": [ { "task_id": "string", "title": "string", "status": "TODO", "open": true } ]}Get a task's dependencies GET
Both directions of the task's blocker graph one hop out: `blocked_by` (must finish first) and `blocking` (waiting on this task), plus the derived `is_blocked`. A task with no links answers an empty view rather than 404. This is not paginated — the answer is a task's immediate neighbours, not a traversal; walk the chain by following each `task_id`.
Remove a blocker DELETE
Removes the blocked-by link between the two tasks — neither task is otherwise touched, and completion history is untouched. Removing a link that is not there succeeds unchanged, so retries are safe. When this frees the task (its last OPEN blocker is gone), the `task.unblocked` webhook fires — the same event a blocker being completed or archived produces. Answers the task's full dependency view after the removal.