Log progress on a tracked task
POST
/api/tasks/{id}/progress
Records progress on a task with progress_target > 1 (REDESIGN-V03 §5).
A sub-target increment is NOT a completion: it dispatches
task.progressed, never task.completed, and the task stays open until
its period boundary. Returns 400 if the task is not tracked.
If the quota's period has ended but the rollover job has not run yet
(it runs every few minutes), the period is closed first, so a +1 just
after midnight counts for the new day. Progress logged today is also
recorded in the quota's quota_day_state (it clears a weekly/monthly
quota prompt for the day); undo restores both.
Authorizations
bearerAuth
API token created via POST /api/tokens or the db:create-token CLI command
Type
HTTP (bearer)
Request Body
application/json
JSON
{
"delta": 1
}
Responses
Updated task
application/json
JSON
{
"data": {
"id": 0,
"user_id": 0,
"project_id": 0,
"title": "string",
"original_title": "string",
"short_title": "string",
"done": true,
"done_at": "string",
"priority": 0,
"due_at": "string",
"rrule": "string",
"recurrence_mode": "string",
"anchor_time": "string",
"anchor_dow": 0,
"anchor_dom": 0,
"original_due_at": "string",
"target_at": "string",
"deadline_at": "string",
"horizon": "string",
"horizon_set_at": "string",
"last_considered_at": "string",
"segment_deferred_at": "string",
"segment_targeted_at": "string",
"target_set_at": "string",
"target_auto": true,
"occurrence_at": "string",
"deadline_nag_off": true,
"auto_snooze_minutes": 0,
"deleted_at": "string",
"archived_at": "string",
"labels": [
"string"
],
"notes": "string",
"progress_target": 0,
"progress_current": 0,
"progress_period_start": "string",
"quota_prompt_config": {
"enabled": true,
"slot_id": 0,
"numbers": {
"additionalProperties": 0
}
},
"quota_day_state": {
"date": "2026-09-24",
"logged": 0,
"did": [
"string"
],
"considered": [
"string"
],
"did_applied": {
"additionalProperties": 0
}
},
"completion_count": 0,
"skip_count": 0,
"first_completed_at": "string",
"last_completed_at": "string",
"created_at": "string",
"updated_at": "string",
"is_recurring": true,
"met": true,
"description": "3/2"
}
}
POST
/api/tasks/{id}/progress
