TodoBase developers
API v1JSON API documentation
Read and update your TodoBase workspace over HTTP with the same secure bearer tokens used by MCP integrations.
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
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 |
|---|---|
| 200 | Request succeeded. |
| 201 | Resource created. |
| 204 | Resource deleted; the response has no body. |
| 400 | A parameter or request body is malformed. |
| 401 | The bearer token is missing or invalid. |
| 404 | The resource does not exist or belongs to another user. |
| 422 | The 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 |
|---|---|---|
| Todos | q | Matches reference code, title, description, or reference URL. |
| Todos | project_id | Return todos from one accessible project. Omit for all projects. |
| Todos | tag_ids | Comma-separated tag IDs or an array. |
| Todos | planned_on | Exact date in YYYY-MM-DD format. |
| Todos | unplanned | Set to true to return todos without a planned date. |
| Todos | completed | Filter by true or false. |
| Todos | canceled | Filter by true or false. |
| Meeting notes | q | Matches title or Markdown body. |
| Meeting notes | project_id | Return notes from one accessible project. Omit for all projects. |
| Meeting notes | tag_ids | Comma-separated tag IDs or an array. |
| Meeting notes | occurred_on | Exact date in YYYY-MM-DD format. |
Projects
List owned and shared projects. Only the owner can rename a project. General always stays private.
/api/v1/projects
List projects
/api/v1/projects
Create a project
/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.
/api/v1/todos
List and filter todos
/api/v1/todos
Create a todo
/api/v1/todos/:id
Read a todo, including its comments
/api/v1/todos/:id
Update a todo
/api/v1/todos/:id/cancel
Cancel a todo and remove it from planning
/api/v1/todos/:id/restore
Restore a canceled todo
/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.
/api/v1/meeting_notes
List and filter meeting notes
/api/v1/meeting_notes
Create a meeting note
/api/v1/meeting_notes/:id
Read a meeting note
/api/v1/meeting_notes/:id
Update a meeting note
/api/v1/meeting_notes/:id
Permanently delete a meeting note
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"
}
}