TodoBase developers

API v1

JSON API documentation

Read and update your TodoBase workspace over HTTP with the same secure bearer tokens used by MCP integrations.

Manage access tokens

Quick start

Make your first request

Create a token on the Integrations page, copy it immediately, and send it in the Authorization header.

Base URL

https://todobase.app/api/v1

List todos

curl \
  -H "Authorization: Bearer todobase_your-token" \
  -H "Accept: application/json" \
  https://todobase.app/api/v1/todos

Authentication

Every request requires a bearer token. Tokens are shown once, stored as a one-way digest, and grant read/write access to projects the token owner owns or has joined. Removing a member immediately removes that project from their token’s access. Revoke a token from Integrations when it is no longer needed.

Authorization: Bearer todobase_your-token
Accept: application/json
Content-Type: application/json
Treat tokens like passwords. Current tokens grant account-wide API access and do not have per-resource permission scopes.

Responses and errors

Successful responses wrap resources in data. List responses also include the applied pagination values.

List response

{
  "data": [ ... ],
  "meta": {
    "limit": 50,
    "offset": 0
  }
}

Error response

{
  "error": {
    "code": "validation_failed",
    "message": "Validation failed.",
    "details": [ "Title can't be blank" ]
  }
}
Status Meaning
200Request succeeded.
201Resource created.
204Resource deleted; the response has no body.
400A parameter or request body is malformed.
401The bearer token is missing or invalid.
404The resource does not exist or belongs to another user.
422The submitted resource failed validation.

Pagination and filtering

List endpoints accept limit and offset. The default limit is 50 and the maximum is 100. The project selected in the browser does not affect API requests.

Resource Parameter Description
TodosqMatches reference code, title, description, or reference URL.
Todosproject_idReturn todos from one accessible project. Omit for all projects.
Todostag_idsComma-separated tag IDs or an array.
Todosplanned_onExact date in YYYY-MM-DD format.
TodosunplannedSet to true to return todos without a planned date.
TodoscompletedFilter by true or false.
TodoscanceledFilter by true or false.
Meeting notesqMatches title or Markdown body.
Meeting notesproject_idReturn notes from one accessible project. Omit for all projects.
Meeting notestag_idsComma-separated tag IDs or an array.
Meeting notesoccurred_onExact date in YYYY-MM-DD format.

Projects

List owned and shared projects. Only the owner can rename a project. General always stays private.

GET
/api/v1/projects

List projects

POST
/api/v1/projects

Create a project

PATCH
/api/v1/projects/:id

Rename a project

Todos

Manage todos and their progress comments. Todo detail routes accept a numeric ID or a reference such as TODO-12. Ambiguous references return 400; use the numeric ID when members have matching reference codes.

GET
/api/v1/todos

List and filter todos

POST
/api/v1/todos

Create a todo

GET
/api/v1/todos/:id

Read a todo, including its comments

PATCH
/api/v1/todos/:id

Update a todo

PATCH
/api/v1/todos/:id/cancel

Cancel a todo and remove it from planning

PATCH
/api/v1/todos/:id/restore

Restore a canceled todo

POST
/api/v1/todos/:todo_id/comments

Add a progress comment

Meeting notes

Store and search project meeting notes with Markdown bodies, dates, durations, and reusable tags.

GET
/api/v1/meeting_notes

List and filter meeting notes

POST
/api/v1/meeting_notes

Create a meeting note

GET
/api/v1/meeting_notes/:id

Read a meeting note

PATCH
/api/v1/meeting_notes/:id

Update a meeting note

DELETE
/api/v1/meeting_notes/:id

Permanently delete a meeting note

Tags

Manage the reusable tags that can be assigned to todos and meeting notes.

GET
/api/v1/tags

List tags alphabetically

POST
/api/v1/tags

Create a tag

PATCH
/api/v1/tags/:id

Update a tag

DELETE
/api/v1/tags/:id

Permanently delete a tag

Request bodies and fields

JSON write requests wrap attributes in a singular resource key. Fields omitted from a PATCH request remain unchanged.

Project

name is required. Names are trimmed, repeated whitespace is collapsed, and values must be unique per account without regard to case. Names may contain up to 80 characters. General is created automatically and cannot be renamed or deleted.

{
  "project": {
    "name": "Client work"
  }
}

Todo

Shared todos accept assignee_id on create and update. Choose an ID from the project's available_assignees in GET /api/v1/projects, use null to unassign, or omit to keep the current assignee. Responses include a nullable assignee with id and name. Only the owner and accepted members of a shared project can be assigned. Repeating todos keep their assignee; removing a member or moving work outside their access clears the assignment. Personal capacity counts assigned work, plus unassigned work created by that user.

Create and update also accept blocked and blocked_by, which are included in todo responses. Set blocked: true with an optional plain-text name to block an open todo. Update the name alone while blocked, or use an empty string to clear it. Set blocked: false to unblock and clear the name. Completing or cancelling clears blocking; completed and cancelled todos cannot be blocked. Planning and ordering stay unchanged.

title is required when creating. Accepted fields: title, project_id, description, reference_url, estimated_minutes, planned_on, completed, blocked, blocked_by, recurrence_pattern, tag_ids, and tag_names. Create omission uses General; update omission preserves the todo's project. Todo responses include project with id, name, and general. Repeat patterns are daily, weekdays, every_other_day, and weekly.

{
  "todo": {
    "title": "Document the API",
    "project_id": 1,
    "estimated_minutes": 30,
    "planned_on": "2026-10-08",
    "tag_names": [ "integration" ]
  }
}

Progress comment

body is required and accepts up to 2,000 characters.

{
  "comment": {
    "body": "Published the first draft."
  }
}

Meeting note

title, body, and occurred_on are required when creating. Also accepts project_id, duration_minutes, tag_ids, and tag_names. Create omission uses General; update omission preserves the note's project. Responses include project with id, name, and general. Detail responses include read-only follow_up_todos created from the note.

{
  "meeting_note": {
    "title": "API review",
    "project_id": 1,
    "body": "## Decisions\n\n- Publish v1",
    "occurred_on": "2026-10-08",
    "duration_minutes": 25
  }
}

Tag

name is required when creating. color is optional and defaults automatically.

{
  "tag": {
    "name": "integration",
    "color": "emerald"
  }
}