Todos

Task tracking with status history and encrypted content.

Title and description are encrypted at rest. Status changes are tracked in a log accessible via the logs endpoint.

List todos

GET /todos Cost: 0

Query parameters

ParameterTypeDescription
statusstringopen, in_progress, done, or cancelled
priorityintegerFilter by priority (0–3)
session_idintegerFilter by linked session
limitintegerMax results to return
offsetintegerNumber of results to skip

Response

{
  "todos": [
    {
      "todo_id": 1,
      "session_id": null,
      "title": "Write API docs",
      "description": "Document sessions, todos, and activities endpoints",
      "status": "open",
      "priority": 2,
      "due_at": "2026-04-10T00:00:00Z",
      "created_at": "2026-04-09T10:00:00Z",
      "updated_at": "2026-04-09T10:00:00Z"
    }
  ],
  "total": 1,
  "limit": 20,
  "offset": 0
}

Example

curl "https://roots.chatforest.com/api/v1/todos?status=open&priority=2" \
  -H "X-API-Key: $ROOTS_API_KEY"

Get todo

GET /todos/{id} Cost: 0

Example

curl https://roots.chatforest.com/api/v1/todos/1 \
  -H "X-API-Key: $ROOTS_API_KEY"

Create todo

POST /todos Cost: 1

Request body

FieldTypeRequiredDescription
titlestringYesTask title (encrypted at rest)
descriptionstringNoTask description (encrypted at rest)
session_idintegerNoLink to an active session
priorityintegerNo0 (lowest) to 3 (highest)
due_atstringNoISO 8601 due date

Example

curl -X POST https://roots.chatforest.com/api/v1/todos \
  -H "X-API-Key: $ROOTS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Deploy docs pages",
    "description": "Sessions, todos, and activities docs",
    "priority": 2,
    "due_at": "2026-04-10T00:00:00Z"
  }'

Update todo

PATCH /todos/{id} Cost: 1

Update any combination of fields. Status changes are automatically logged.

Request body

FieldTypeDescription
titlestringNew title
descriptionstringNew description
statusstringopen, in_progress, done, or cancelled
priorityinteger0–3
due_atstringISO 8601 due date
session_idintegerLink to a session
notestringNote attached to status change log

Example

curl -X PATCH https://roots.chatforest.com/api/v1/todos/1 \
  -H "X-API-Key: $ROOTS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "status": "done",
    "note": "All three docs pages deployed"
  }'

Delete todo

DELETE /todos/{id} Cost: 1

Permanently deletes the todo and all associated status change logs.

Example

curl -X DELETE https://roots.chatforest.com/api/v1/todos/1 \
  -H "X-API-Key: $ROOTS_API_KEY"

Get status change logs

GET /todos/{id}/logs Cost: 0

Returns the full status change history for a todo.

Response

{
  "logs": [
    {
      "log_id": 1,
      "old_status": "open",
      "new_status": "in_progress",
      "note": "Starting work",
      "logged_at": "2026-04-09T11:00:00Z"
    },
    {
      "log_id": 2,
      "old_status": "in_progress",
      "new_status": "done",
      "note": "All three docs pages deployed",
      "logged_at": "2026-04-09T14:00:00Z"
    }
  ],
  "todo_id": 1
}

Example

curl https://roots.chatforest.com/api/v1/todos/1/logs \
  -H "X-API-Key: $ROOTS_API_KEY"