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.
bearerAuthAuthorizationBearer <token>A gid_ API key (Profile → API Keys) or an OAuth 2.1 access token.
task_id*stringTask short id, e.g. T-123 (a bare 123 is also accepted on input).
^(?:T-)?[0-9]{1,12}$Idempotency-Key?stringOptional 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 <= 255application/json- body
The blocker to record for the task in the path.
blocker_task_id*stringThe task that must finish FIRST. It must be in the same organization as the task in the path.
^(?:T-)?[0-9]{1,12}$The task's dependencies after the link was recorded.
application/json- response
Both directions of a task's blocker graph, one hop out, plus its derived blocked state.
task_id*stringThe task this view is for.
^(?:T-)?[0-9]{1,12}$is_blocked*booleanDERIVED on every read: true when at least one entry in blocked_by is still open. Never a stored column and never written to the task's status — a blocked task keeps whatever status its owner set.
blocked_by_count*integerHow many tasks must finish first, open or not — blocked_by.length.
-9007199254740991 <= value <= 9007199254740991blocking_count*integerHow many tasks wait on this one — blocking.length.
-9007199254740991 <= value <= 9007199254740991blocked_by*array<>Tasks that must finish before this one can be worked on, oldest link first.
blocking*array<>Tasks waiting on this one, oldest link first — the other direction of the same edges.
curl -X POST 'https://app.nowgetitdone.com/v1/tasks/T-123/dependencies' \ -H 'Content-Type: application/json' \ -d '{ "blocker_task_id": "T-123"}'{ "task_id": "T-123", "is_blocked": true, "blocked_by_count": 2, "blocking_count": 1, "blocked_by": [ { "task_id": "T-123", "title": "Ship the public API", "status": "TODO", "open": true } ], "blocking": [ { "task_id": "T-123", "title": "Ship the public API", "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…
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…