Capri API

Capri API

Your tasks, from anywhere

With an API token, scripts, shortcuts and other apps can read and change your Capri tasks, projects, labels, comments, deadlines and schedule. 27 endpoints, all JSON, the same for accounts kept by Capri and accounts synced with Todoist.

  1. Make a token. In Capri, open Account → API tokens → New token, name it and copy it. It starts with capri_ and is only shown once.
  2. Send it with each request in the Authorization header.
  3. Try it: this gets everything open.
curl https://capritasks.xyz/api/bootstrap \
  -H "Authorization: Bearer capri_YOUR_TOKEN"

And this adds a task:

curl -X POST https://capritasks.xyz/api/tasks \
  -H "Authorization: Bearer capri_YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"content": "Send the report", "due_string": "tomorrow 5pm", "priority": 4, "labels": ["errands"]}'

Tokens and safety

  • A token acts as you, so keep it secret like a password. Don’t put it in a public repository or a web page.
  • You can have up to 10. Name each after what uses it, so you know which to delete.
  • Delete one in Account → API tokens and anything using it stops straight away. A password reset or recovery-code sign-in deletes them all. One unused for 180 days ends by itself.
  • Signing out everywhere or changing your password keeps them.
  • A token can’t sign in, change your password, email, passkeys or plan, use Co-Work, or make more tokens. Those answer 403.

Permissions

When you make a token you give it Full access, or only the permissions you tick. You can change them later from Account → API tokens → Permissions, and the change applies straight away. Each endpoint below shows the permission it needs. Without it, the reply is 403 with "scope" naming the missing one.

PermissionLets the token
adminFull access: everything below, and anything added later.
readRead tasks, projects, sections, labels, comments, completed tasks, deadlines, the schedule and your account’s basics.
tasksAdd, change, move, complete, reopen and delete tasks.
commentsAdd comments.
projectsAdd, change, reorder and delete projects, sections and labels.
deadlinesSet and clear deadlines.
scheduleChange the time-block schedule (needs Capri+).

Give each token only what it needs. A script that just shows today’s tasks only needs read.

C++ with netc++

The C++ examples use netc++, a C++17 network library for Windows, macOS and Linux where everything goes through ->. Add it to a CMake project:

CMakeLists.txt
include(FetchContent)
FetchContent_Declare(netcpp
    GIT_REPOSITORY https://github.com/Unblonded/netcpp.git
    GIT_TAG v1.0.0)
FetchContent_MakeAvailable(netcpp)

target_link_libraries(your_app PRIVATE netcpp::netcpp)

Then make one client, give it your token, and call any endpoint. Replies have status, body and ok(); network failures throw netcpp::Error.

main.cpp
#include <netcpp/netcpp.hpp>
#include <iostream>

int main() {
    using namespace std::chrono_literals;
    auto capri = netcpp::api("https://capritasks.xyz/api");
    capri->bearer("capri_YOUR_TOKEN")
         ->header("X-Capri-TZ", "Europe/London")
         ->timeout(10s);

    // Today's tasks
    auto today = capri->get("/filter", {{"query", "today"}});
    std::cout << today.body << "\n";

    // Add one
    auto task = capri->post("/tasks", netcpp::Body::json(
        R"({"content": "Buy milk", "due_string": "tomorrow 5pm"})"));
    if (!task.ok()) std::cerr << task.status << " " << task.body << "\n";
}

Requests and replies

  • The address is https://capritasks.xyz. Every endpoint starts with /api/.
  • Send bodies as JSON with Content-Type: application/json. Replies are JSON too.
  • Each token can make 120 requests a minute. After that it gets 429 until the minute is up.
  • If your tasks are kept by Capri, add your time zone so words like “today” and “tomorrow 5pm” mean your day: X-Capri-TZ: Europe/London.
  • Ids are strings. Get them from Everything open, or from the reply when you add something.

Reading

Everything open

GET/api/bootstrapread

All your projects, sections, labels and open tasks in one go. This is what Capri loads when it starts, so it’s the easiest way to get a full picture.

curl https://capritasks.xyz/api/bootstrap \
  -H "Authorization: Bearer capri_YOUR_TOKEN"
Reply 200
{
  "projects": [
    {
      "id": "ciy0N4oeU6DMn",
      "name": "Work",
      "color": "blue",
      "parent_id": null,
      "child_order": 1,
      "inbox_project": false,
      "is_archived": false,
      "is_favorite": false,
      "view_style": "list"
    }
  ],
  "sections": [
    {
      "id": "cKYAq921AUF6H",
      "project_id": "ciy0N4oeU6DMn",
      "name": "This week",
      "section_order": 1,
      "is_archived": false
    }
  ],
  "labels": [
    {
      "id": "cxrxS24xnNyoY",
      "name": "errands",
      "color": "green",
      "item_order": 1,
      "is_favorite": false
    }
  ],
  "tasks": [
    {
      "id": "cp1u6O9InfekT",
      "content": "Send the report",
      "description": "The Q4 numbers",
      "project_id": "ciy0N4oeU6DMn",
      "section_id": "cKYAq921AUF6H",
      "parent_id": null,
      "labels": [
        "errands"
      ],
      "priority": 4,
      "due": {
        "date": "2026-11-10T17:00:00",
        "string": "tomorrow 5pm",
        "is_recurring": false,
        "timezone": null,
        "lang": "en"
      },
      "checked": false,
      "completed_at": null,
      "added_at": "2026-11-09T20:27:12.688Z",
      "updated_at": "2026-11-09T20:27:12.716Z",
      "child_order": 3,
      "day_order": -1,
      "note_count": 0,
      "is_collapsed": false
    }
  ]
}

Filter tasks

GET/api/filterread

Open tasks matching a query. On an account synced with Todoist this uses Todoist’s filters (today, overdue, #Work & p1). On an account whose tasks are kept by Capri, it finds tasks whose name contains the words.

Address (query)

FieldTypeWhat it is
queryrequiredstringThe filter or words to look for. Goes in the address.
curl https://capritasks.xyz/api/filter?query=today \
  -H "Authorization: Bearer capri_YOUR_TOKEN"
Reply 200
{
  "tasks": [
    {
      "id": "cp1u6O9InfekT",
      "content": "Send the report",
      "description": "The Q4 numbers",
      "project_id": "ciy0N4oeU6DMn",
      "section_id": "cKYAq921AUF6H",
      "parent_id": null,
      "labels": [
        "errands"
      ],
      "priority": 4,
      "due": {
        "date": "2026-11-10T17:00:00",
        "string": "tomorrow 5pm",
        "is_recurring": false,
        "timezone": null,
        "lang": "en"
      },
      "checked": false,
      "completed_at": null,
      "added_at": "2026-11-09T20:27:12.688Z",
      "updated_at": "2026-11-09T20:27:12.716Z",
      "child_order": 3,
      "day_order": -1,
      "note_count": 0,
      "is_collapsed": false
    }
  ]
}

Completed tasks

GET/api/completedread

Tasks you’ve finished between two times. Free accounts see the last 7 days; Capri+ can go back further.

Address (query)

FieldTypeWhat it is
sincestringISO time to start from. Defaults to a week ago.
untilstringISO time to end at. Defaults to now.

Accounts synced with Todoist may also get "partial": true when Todoist only sent part of the history.

curl https://capritasks.xyz/api/completed?since=2026-11-01T00:00:00Z \
  -H "Authorization: Bearer capri_YOUR_TOKEN"
Reply 200
{
  "items": [
    {
      "id": "cp1u6O9InfekT",
      "content": "Send the report",
      "description": "The Q4 numbers",
      "project_id": "ciy0N4oeU6DMn",
      "section_id": "cKYAq921AUF6H",
      "parent_id": null,
      "labels": [
        "errands"
      ],
      "priority": 4,
      "due": {
        "date": "2026-11-10T17:00:00",
        "string": "tomorrow 5pm",
        "is_recurring": false,
        "timezone": null,
        "lang": "en"
      },
      "checked": true,
      "completed_at": "2026-11-10T16:42:03.120Z",
      "added_at": "2026-11-09T20:27:12.688Z",
      "updated_at": "2026-11-09T20:27:12.716Z",
      "child_order": 3,
      "day_order": -1,
      "note_count": 0,
      "is_collapsed": false
    }
  ]
}

Your account

GET/api/statusread

Who the token belongs to: username, email, plan and whether tasks are kept by Capri (mode: "capri") or in Todoist ("both" or "todoist").

The reply has a few more fields the app uses; the ones above are the useful ones.

curl https://capritasks.xyz/api/status \
  -H "Authorization: Bearer capri_YOUR_TOKEN"
Reply 200
{
  "connected": true,
  "account": {
    "mode": "capri",
    "username": "sam",
    "email": "[email protected]",
    "plan": "free",
    "until": null
  }
}

Tasks

Add a task

POST/api/taskstasks

Adds a task and replies with it, including its new id.

Body (JSON)

FieldTypeWhat it is
contentrequiredstringThe task’s name. Markdown links and **bold** work.
descriptionstringNotes under the name.
due_stringstringA date in words: tomorrow 5pm, next friday, every monday, every 2 weeks.
due_datestringA day, YYYY-MM-DD. null clears the date.
due_datetimestringAn exact time, ISO 8601 (2026-11-10T17:00:00Z).
priorityinteger4 is the most urgent (P1 in the app), 1 is normal (P4).
project_idstringWhich project. Leave it out for the Inbox.
section_idstringWhich section of that project.
parent_idstringMakes it a sub-task of this task.
labelsstring[]Label names, like ["errands"].
curl -X POST https://capritasks.xyz/api/tasks \
  -H "Authorization: Bearer capri_YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"content": "Send the report", "due_string": "tomorrow 5pm", "priority": 4, "labels": ["errands"]}'
Reply 200
{
  "id": "cp1u6O9InfekT",
  "content": "Send the report",
  "description": "The Q4 numbers",
  "project_id": "ciy0N4oeU6DMn",
  "section_id": "cKYAq921AUF6H",
  "parent_id": null,
  "labels": [
    "errands"
  ],
  "priority": 4,
  "due": {
    "date": "2026-11-10T17:00:00",
    "string": "tomorrow 5pm",
    "is_recurring": false,
    "timezone": null,
    "lang": "en"
  },
  "checked": false,
  "completed_at": null,
  "added_at": "2026-11-09T20:27:12.688Z",
  "updated_at": "2026-11-09T20:27:12.716Z",
  "child_order": 3,
  "day_order": -1,
  "note_count": 0,
  "is_collapsed": false
}

Quick add

POST/api/tasks/quicktasks

Adds a task from one line, the way the app’s Add box does: #Project, @label and p1 to p4 are picked out of the text. On accounts synced with Todoist, dates in the text (tomorrow 10am) work too. On accounts kept by Capri, a repeat at the end (every monday) does; use due_string with Add a task for other dates.

Body (JSON)

FieldTypeWhat it is
textrequiredstringThe whole line.
curl -X POST https://capritasks.xyz/api/tasks/quick \
  -H "Authorization: Bearer capri_YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"text": "Call Sam tomorrow 10am #Work @errands p2"}'
Reply 200
{
  "id": "cIg5KxTmKOBXk",
  "content": "Call Sam",
  "description": "",
  "project_id": "ciy0N4oeU6DMn",
  "section_id": null,
  "parent_id": null,
  "labels": [
    "errands"
  ],
  "priority": 3,
  "due": {
    "date": "2026-11-10T10:00:00",
    "string": "tomorrow 10am",
    "is_recurring": false,
    "timezone": null,
    "lang": "en"
  },
  "checked": false,
  "completed_at": null,
  "added_at": "2026-11-09T20:27:12.688Z",
  "updated_at": "2026-11-09T20:27:12.716Z",
  "child_order": 3,
  "day_order": -1,
  "note_count": 0,
  "is_collapsed": false
}

Change a task

POST/api/tasks/{id}tasks

Changes only the fields you send. To move it to another project, section or parent, use Move a task.

Body (JSON)

FieldTypeWhat it is
contentrequiredstringThe task’s name. Markdown links and **bold** work.
descriptionstringNotes under the name.
due_stringstringA date in words: tomorrow 5pm, next friday, every monday, every 2 weeks.
due_datestringA day, YYYY-MM-DD. null clears the date.
due_datetimestringAn exact time, ISO 8601 (2026-11-10T17:00:00Z).
priorityinteger4 is the most urgent (P1 in the app), 1 is normal (P4).
labelsstring[]Label names, like ["errands"].
curl -X POST https://capritasks.xyz/api/tasks/cp1u6O9InfekT \
  -H "Authorization: Bearer capri_YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"content": "Send the final report", "priority": 3}'
Reply 200
{
  "id": "cp1u6O9InfekT",
  "content": "Send the final report",
  "description": "The Q4 numbers",
  "project_id": "ciy0N4oeU6DMn",
  "section_id": "cKYAq921AUF6H",
  "parent_id": null,
  "labels": [
    "errands"
  ],
  "priority": 3,
  "due": {
    "date": "2026-11-10T17:00:00",
    "string": "tomorrow 5pm",
    "is_recurring": false,
    "timezone": null,
    "lang": "en"
  },
  "checked": false,
  "completed_at": null,
  "added_at": "2026-11-09T20:27:12.688Z",
  "updated_at": "2026-11-09T20:27:12.716Z",
  "child_order": 3,
  "day_order": -1,
  "note_count": 0,
  "is_collapsed": false
}

Move a task

POST/api/tasks/{id}/movetasks

Moves a task, with its sub-tasks, somewhere else. Send one of the three.

Body (JSON)

FieldTypeWhat it is
project_idstringTo the top of this project.
section_idstringInto this section.
parent_idstringUnder this task, as a sub-task.
curl -X POST https://capritasks.xyz/api/tasks/cp1u6O9InfekT/move \
  -H "Authorization: Bearer capri_YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"section_id": "cKYAq921AUF6H"}'
Reply 200
{
  "id": "cp1u6O9InfekT",
  "content": "Send the report",
  "description": "The Q4 numbers",
  "project_id": "ciy0N4oeU6DMn",
  "section_id": "cKYAq921AUF6H",
  "parent_id": null,
  "labels": [
    "errands"
  ],
  "priority": 4,
  "due": {
    "date": "2026-11-10T17:00:00",
    "string": "tomorrow 5pm",
    "is_recurring": false,
    "timezone": null,
    "lang": "en"
  },
  "checked": false,
  "completed_at": null,
  "added_at": "2026-11-09T20:27:12.688Z",
  "updated_at": "2026-11-09T20:27:12.716Z",
  "child_order": 3,
  "day_order": -1,
  "note_count": 0,
  "is_collapsed": false
}

Complete a task

POST/api/tasks/{id}/closetasks

Ticks it off. A repeating task moves on to its next date instead.

curl -X POST https://capritasks.xyz/api/tasks/cp1u6O9InfekT/close \
  -H "Authorization: Bearer capri_YOUR_TOKEN"
Reply 200
{
  "ok": true
}

Reopen a task

POST/api/tasks/{id}/reopentasks

Unticks a completed task.

curl -X POST https://capritasks.xyz/api/tasks/cp1u6O9InfekT/reopen \
  -H "Authorization: Bearer capri_YOUR_TOKEN"
Reply 200
{
  "ok": true
}

Delete a task

DELETE/api/tasks/{id}tasks

Deletes it and its sub-tasks. This can’t be undone.

curl -X DELETE https://capritasks.xyz/api/tasks/cp1u6O9InfekT \
  -H "Authorization: Bearer capri_YOUR_TOKEN"
Reply 200
{
  "ok": true
}

Comments

List comments

GET/api/tasks/{id}/commentsread

A task’s comments, oldest first.

curl https://capritasks.xyz/api/tasks/cp1u6O9InfekT/comments \
  -H "Authorization: Bearer capri_YOUR_TOKEN"
Reply 200
{
  "comments": [
    {
      "id": "cQgg1IysWiB5S",
      "task_id": "cp1u6O9InfekT",
      "content": "Numbers are in the shared folder",
      "posted_at": "2026-11-09T20:27:12.763Z"
    }
  ]
}

Add a comment

POST/api/commentscomments

Adds a comment to a task.

Body (JSON)

FieldTypeWhat it is
task_idrequiredstringThe task.
contentrequiredstringThe comment.
curl -X POST https://capritasks.xyz/api/comments \
  -H "Authorization: Bearer capri_YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"task_id": "cp1u6O9InfekT", "content": "Numbers are in the shared folder"}'
Reply 200
{
  "id": "cQgg1IysWiB5S",
  "task_id": "cp1u6O9InfekT",
  "content": "Numbers are in the shared folder",
  "posted_at": "2026-11-09T20:27:12.763Z"
}

Projects

Add a project

POST/api/projectsprojects

Makes a project.

Body (JSON)

FieldTypeWhat it is
namerequiredstringIts name.
colorstringOne of the colours.
curl -X POST https://capritasks.xyz/api/projects \
  -H "Authorization: Bearer capri_YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "Work", "color": "blue"}'
Reply 200
{
  "id": "ciy0N4oeU6DMn",
  "name": "Work",
  "color": "blue",
  "parent_id": null,
  "child_order": 1,
  "inbox_project": false,
  "is_archived": false,
  "is_favorite": false,
  "view_style": "list"
}

Change a project

POST/api/projects/{id}projects

Renames or recolours it.

Body (JSON)

FieldTypeWhat it is
namestringA new name.
colorstringA new colour.
curl -X POST https://capritasks.xyz/api/projects/ciy0N4oeU6DMn \
  -H "Authorization: Bearer capri_YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "Work stuff"}'
Reply 200
{
  "id": "ciy0N4oeU6DMn",
  "name": "Work stuff",
  "color": "blue",
  "parent_id": null,
  "child_order": 1,
  "inbox_project": false,
  "is_archived": false,
  "is_favorite": false,
  "view_style": "list"
}

Delete a project

DELETE/api/projects/{id}projects

Deletes it with its sections and tasks. This can’t be undone.

curl -X DELETE https://capritasks.xyz/api/projects/ciy0N4oeU6DMn \
  -H "Authorization: Bearer capri_YOUR_TOKEN"
Reply 200
{
  "ok": true
}

Sections

Add a section

POST/api/sectionsprojects

Makes a section in a project.

Body (JSON)

FieldTypeWhat it is
namerequiredstringIts name.
project_idrequiredstringWhich project.
curl -X POST https://capritasks.xyz/api/sections \
  -H "Authorization: Bearer capri_YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "This week", "project_id": "ciy0N4oeU6DMn"}'
Reply 200
{
  "id": "cKYAq921AUF6H",
  "project_id": "ciy0N4oeU6DMn",
  "name": "This week",
  "section_order": 1,
  "is_archived": false
}

Rename a section

POST/api/sections/{id}projects

Renames it.

Body (JSON)

FieldTypeWhat it is
namerequiredstringThe new name.
curl -X POST https://capritasks.xyz/api/sections/cKYAq921AUF6H \
  -H "Authorization: Bearer capri_YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "Next week"}'
Reply 200
{
  "id": "cKYAq921AUF6H",
  "project_id": "ciy0N4oeU6DMn",
  "name": "Next week",
  "section_order": 1,
  "is_archived": false
}

Reorder sections

POST/api/sections/reorderprojects

Sets the order of a project’s sections.

Body (JSON)

FieldTypeWhat it is
sectionsrequiredobject[]Each { "id", "section_order" }, counting from 1.
curl -X POST https://capritasks.xyz/api/sections/reorder \
  -H "Authorization: Bearer capri_YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"sections": [{"id": "cKYAq921AUF6H", "section_order": 1}, {"id": "cTq0sV1aFq2Lm", "section_order": 2}]}'
Reply 200
{
  "ok": true
}

Delete a section

DELETE/api/sections/{id}projects

Deletes it and its tasks. This can’t be undone.

curl -X DELETE https://capritasks.xyz/api/sections/cKYAq921AUF6H \
  -H "Authorization: Bearer capri_YOUR_TOKEN"
Reply 200
{
  "ok": true
}

Labels

Add a label

POST/api/labelsprojects

Makes a label.

Body (JSON)

FieldTypeWhat it is
namerequiredstringIts name, without the @.
colorstringOne of the colours.
curl -X POST https://capritasks.xyz/api/labels \
  -H "Authorization: Bearer capri_YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"name": "errands", "color": "green"}'
Reply 200
{
  "id": "cxrxS24xnNyoY",
  "name": "errands",
  "color": "green",
  "item_order": 1,
  "is_favorite": false
}

Change a label

POST/api/labels/{id}projects

Renames or recolours it.

Body (JSON)

FieldTypeWhat it is
namestringA new name.
colorstringA new colour.
curl -X POST https://capritasks.xyz/api/labels/cxrxS24xnNyoY \
  -H "Authorization: Bearer capri_YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"color": "orange"}'
Reply 200
{
  "id": "cxrxS24xnNyoY",
  "name": "errands",
  "color": "orange",
  "item_order": 1,
  "is_favorite": false
}

Delete a label

DELETE/api/labels/{id}projects

Deletes the label. Tasks keep everything else.

curl -X DELETE https://capritasks.xyz/api/labels/cxrxS24xnNyoY \
  -H "Authorization: Bearer capri_YOUR_TOKEN"
Reply 200
{
  "ok": true
}

Deadlines

List deadlines

GET/api/deadlinesread

Capri’s deadlines: the day a task must be done by, separate from its due date. Keyed by task id.

curl https://capritasks.xyz/api/deadlines \
  -H "Authorization: Bearer capri_YOUR_TOKEN"
Reply 200
{
  "cp1u6O9InfekT": "2026-12-01"
}

Set deadlines

POST/api/deadlinesdeadlines

Sets or clears deadlines for any number of tasks at once.

Body (JSON)

FieldTypeWhat it is
setrequiredobjectTask id → YYYY-MM-DD, or null to clear it.
curl -X POST https://capritasks.xyz/api/deadlines \
  -H "Authorization: Bearer capri_YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"set": {"cp1u6O9InfekT": "2026-12-01", "cIg5KxTmKOBXk": null}}'
Reply 200
{
  "ok": true
}

Schedule

Get the schedule

GET/api/scheduleread

Your time-block schedule: repeating schedules (days 0 = Sunday to 6 = Saturday) and, per date, one-off extra blocks and the ids ticked off that day.

curl https://capritasks.xyz/api/schedule \
  -H "Authorization: Bearer capri_YOUR_TOKEN"
Reply 200
{
  "schedules": [
    {
      "id": "weekdays",
      "name": "Weekdays",
      "days": [
        1,
        2,
        3,
        4,
        5
      ],
      "blocks": [
        {
          "id": "deep",
          "title": "Deep work",
          "start": "09:00",
          "end": "11:30"
        }
      ]
    }
  ],
  "days": {
    "2026-11-10": {
      "extra": [
        {
          "id": "gym",
          "title": "Gym",
          "start": "18:00",
          "end": "19:00"
        }
      ],
      "done": [
        "deep"
      ]
    }
  }
}

Save the schedule

POST/api/scheduleschedule

Needs Capri+. Send schedules to replace the repeating schedules, or day with extra and done to replace one date.

Body (JSON)

FieldTypeWhat it is
schedulesobject[]Up to 20, each { id, name, days, blocks }. A block is { id, title, start, end } with HH:MM times.
daystringA date, YYYY-MM-DD.
extraobject[]That date’s one-off blocks.
donestring[]Ids of the blocks ticked off that date.
curl -X POST https://capritasks.xyz/api/schedule \
  -H "Authorization: Bearer capri_YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"day": "2026-11-10", "extra": [{"id": "gym", "title": "Gym", "start": "18:00", "end": "19:00"}], "done": ["deep"]}'
Reply 200
{
  "ok": true
}

Objects

Replies use the same shapes as Todoist’s API, whichever kind of account you have.

Task

FieldTypeWhat it is
idstringIts id.
contentstringThe name.
descriptionstringNotes under the name.
project_idstringIts project.
section_idstring | nullIts section, if any.
parent_idstring | nullIts parent task, for a sub-task.
labelsstring[]Label names.
priorityinteger4 is the most urgent (P1), 1 normal (P4).
dueobject | nulldate (YYYY-MM-DD, or with a time), string (how it was written), is_recurring.
checkedbooleanWhether it’s done.
completed_atstring | nullWhen it was done.
added_atstringWhen it was made.
child_orderintegerIts place in the list.
note_countintegerHow many comments it has.

Project

FieldTypeWhat it is
idstringIts id.
namestringIts name.
colorstringOne of the colours below.
inbox_projectbooleantrue for the Inbox.
child_orderintegerIts place in the sidebar.

Section

FieldTypeWhat it is
idstringIts id.
project_idstringIts project.
namestringIts name.
section_orderintegerIts place in the project.

Label

FieldTypeWhat it is
idstringIts id.
namestringIts name, without the @.
colorstringOne of the colours below.

Comment

FieldTypeWhat it is
idstringIts id.
task_idstringIts task.
contentstringThe text.
posted_atstringWhen it was added.

Colours

Projects and labels take one of these names as color.

berry_redredorangeyellowolive_greenlime_greengreenmint_greentealsky_bluelight_bluebluegrapevioletlavendermagentasalmoncharcoalgreytaupe

Errors

Anything other than 200 comes with {"error": "…"}, a sentence saying what went wrong, which you can show to people as it is.

{
  "error": "That API token isn’t valid. It may have been deleted, or ended with a password reset."
}
StatusMeans
400Something in the request is wrong: a missing field, a bad date, an id that doesn’t exist. error says what.
401The token is wrong, deleted, or ended with a password reset.
402That needs Capri+ ("plus": true in the reply). Saving the schedule, say.
403The token doesn’t have the permission this needs ("scope" in the reply says which), or tokens can’t use that address at all (account settings, Co-Work and so on).
404No such task, project, section or label.
429More than 120 requests in a minute. Wait a moment and try again.
502Todoist didn’t answer, for an account synced with Todoist. Try again shortly.