# DayPilot API

> DayPilot plans a person's tasks into their calendar and replans as the day changes. This is its HTTP API, the same one the DayPilot website and iPhone app use. With it, a script, a server or an AI agent can read a person's plan, add and change tasks, and work with their projects and docs.

- Base URL: https://daypilot.app/api/v1
- Authentication: `Authorization: Bearer dpk_…`, with an API key the person makes at https://daypilot.app/Settings/Developer. A key acts as that person.
- OpenAPI 3.1 description (every endpoint, with request and response schemas): https://daypilot.app/openapi/v1.json
- These docs as a web page: https://daypilot.app/Developer

## Getting started

1. Make an API key at https://daypilot.app/Settings/Developer (sign in first). It's shown once; keep it secret, for example in an environment variable named `DAYPILOT_API_KEY`.
2. Send it with every request in the Authorization header: `Authorization: Bearer dpk_…`.
3. Check it works:

```bash
curl -H "Authorization: Bearer $DAYPILOT_API_KEY" https://daypilot.app/api/v1/auth/me
```

## Conventions

- JSON in, JSON out, with field names in camelCase.
- Dates are YYYY-MM-DD, times are HH:mm:ss, and moments are ISO 8601 in UTC (2026-11-05T15:00:00Z).
- Choices are words: "High", "InProgress", "Published".
- Every change replans before it answers, so what you read next is already up to date.
- Ids are numbers, and you find them by listing: projects, tasks, docs.

## Errors

Errors come back as problem details, `{ "title", "detail", "status" }`, with the reason in `detail`, written to be shown to a person.

| Status | Meaning |
|---|---|
| 400 | Rejected: the detail says why (a missing title, a date in the wrong order). |
| 401 | No key, a wrong key, or an expired or deleted one. |
| 402 | Needs a higher plan; feature and requiredPlan say which. |
| 403 | Website only, a read-only key trying to change something, or not yours to change. |
| 404 | Not found, or not something you can see. |
| 409 | Google Calendar needs reconnecting on the website. |
| 429 | More than 120 requests in a minute; wait for Retry-After seconds. |

## Limits

- Each key can make 120 requests a minute.
- A key can't sign in, change the password or delete the account, buy or change a plan, invite or remove people, import from other apps, or make more keys. Those stay on the website.
- A read-only key can only read; anything that changes data gets 403.

## Guide

The calls people's own systems use most, by what they're for. Example ids are made up: find real ones by listing (projects, tasks, docs).

### You and your workspace

Check that a key works and see whose it is.

#### Who am I?

`GET /api/v1/auth/me`

The account the key belongs to: name, email, time zone, workspace and plan. A good first call to check a key works.

```bash
curl 'https://daypilot.app/api/v1/auth/me' \
  -H "Authorization: Bearer $DAYPILOT_API_KEY"
```

Returns your profile, your workspace and the features your plan includes.

#### Your workspace

`GET /api/v1/tenant`

The workspace's name, your role in it and its members.

```bash
curl 'https://daypilot.app/api/v1/tenant' \
  -H "Authorization: Bearer $DAYPILOT_API_KEY"
```

Returns the workspace with its members and plan.

### Tasks

Read, add and change tasks. Every change replans before it answers, so the plan is always current.

#### List tasks

`GET /api/v1/tasks`

Your tasks, with optional filters. With no filters you get every task, open and done; with any filter, done tasks are left out unless includeDone is true.

| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| `status` | query | enum: NotStarted, InProgress, Waiting, Done | no | Only tasks with this status. |
| `projectId` | query | integer | no | Only tasks in this project. |
| `search` | query | string | no | Words in the title. |
| `dueBefore` | query | date | no | Due on or before this day. |
| `includeDone` | query | boolean | no | Include done tasks when filtering. |

```bash
curl 'https://daypilot.app/api/v1/tasks' \
  -H "Authorization: Bearer $DAYPILOT_API_KEY"
```

Returns a list of tasks with their project, status, priority, due date and estimate.

#### List tasks a page at a time

`GET /api/v1/tasks/paged`

The same list in pages, for big task lists. The same filters work here.

| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| `page` | query | integer | no | Which page, from 1. |
| `pageSize` | query | integer | no | Tasks per page, up to 200. |
| `includeDone` | query | boolean | no | Include done tasks. |

```bash
curl 'https://daypilot.app/api/v1/tasks/paged' \
  -H "Authorization: Bearer $DAYPILOT_API_KEY"
```

Returns { items, total, page, pageSize }.

#### What's on Today

`GET /api/v1/tasks/today`

What the Today view shows: overdue work, work due today or tomorrow, work in progress and escalated work, most urgent first.

```bash
curl 'https://daypilot.app/api/v1/tasks/today' \
  -H "Authorization: Bearer $DAYPILOT_API_KEY"
```

Returns a list of tasks.

#### Get a task

`GET /api/v1/tasks/{id}`

One task in full: description, dates, estimate, sub-tasks, attachments and docs.

| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| `id` | path | integer | yes | The task's id. |

```bash
curl 'https://daypilot.app/api/v1/tasks/{id}' \
  -H "Authorization: Bearer $DAYPILOT_API_KEY"
```

Returns the task's details.

#### Add a task

`POST /api/v1/tasks/save`

Adds a task and plans it straight away. Send id 0. The description is HTML. With isChunked, the estimate is split into blocks of chunkMinutes, spread out before the due date.

> Note: To change a task later, use “Change a task”: saving an existing id here replaces every field, so anything left out is reset.

```bash
curl -X POST 'https://daypilot.app/api/v1/tasks/save' \
  -H "Authorization: Bearer $DAYPILOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":0,"projectId":101,"title":"Draft the Q4 budget","description":"<p>Start from last quarter'\''s numbers.</p>","priority":"High","dueDate":"2026-11-12","estimatedHours":3,"isChunked":true,"chunkMinutes":60}'
```

Returns { id } of the new task.

#### Change a task

`PATCH /api/v1/tasks/{id}`

Changes only the fields you send, then replans. You can send title, status, priority, projectId, parentTaskId, dueDate, dueTime, startDate, estimatedHours, isChunked, chunkMinutes, scheduleId and assignedToUserId; clearDueDate, clearStartDate and clearParent remove a value.

| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| `id` | path | integer | yes | The task's id. |

```bash
curl -X PATCH 'https://daypilot.app/api/v1/tasks/{id}' \
  -H "Authorization: Bearer $DAYPILOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"priority":"Urgent","dueDate":"2026-11-08"}'
```

Returns the task's details after the change.

#### Mark a task done

`POST /api/v1/tasks/{id}/done`

The same as ticking its circle: the parent's status rolls up, a repeating task makes its next occurrence, and the plan is rebuilt.

| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| `id` | path | integer | yes | The task's id. |

```bash
curl -X POST 'https://daypilot.app/api/v1/tasks/{id}/done' \
  -H "Authorization: Bearer $DAYPILOT_API_KEY"
```

Returns nothing (204).

#### Snooze a task

`POST /api/v1/tasks/{id}/snooze`

Keeps the task off the plan for now. Send an empty body for tomorrow's working hours, onDate for that day's, or until for an exact moment.

| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| `id` | path | integer | yes | The task's id. |

```bash
curl -X POST 'https://daypilot.app/api/v1/tasks/{id}/snooze' \
  -H "Authorization: Bearer $DAYPILOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"onDate":"2026-11-07"}'
```

Returns { snoozedUntilUtc }.

#### Unsnooze a task

`DELETE /api/v1/tasks/{id}/snooze`

Puts a snoozed task back on the plan from now.

| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| `id` | path | integer | yes | The task's id. |

```bash
curl -X DELETE 'https://daypilot.app/api/v1/tasks/{id}/snooze' \
  -H "Authorization: Bearer $DAYPILOT_API_KEY"
```

Returns nothing (204).

#### A task's sub-tasks

`GET /api/v1/tasks/{id}/subtasks`

Everything under a task, at any depth, open and done.

| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| `id` | path | integer | yes | The task's id. |

```bash
curl 'https://daypilot.app/api/v1/tasks/{id}/subtasks' \
  -H "Authorization: Bearer $DAYPILOT_API_KEY"
```

Returns a list of tasks.

#### Change many tasks at once

`POST /api/v1/tasks/bulk`

The same change for up to 1000 tasks, then one replan. Tasks that can't take the change are listed with the reason; the rest change.

```bash
curl -X POST 'https://daypilot.app/api/v1/tasks/bulk' \
  -H "Authorization: Bearer $DAYPILOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"ids":[],"changes":{"priority":"High"}}'
```

Returns how many changed, and why the others didn't.

#### Delete a task

`DELETE /api/v1/tasks/{id}`

Deletes the task, its blocks and its files. Its sub-tasks move up to its parent. This can't be undone.

| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| `id` | path | integer | yes | The task's id. |

```bash
curl -X DELETE 'https://daypilot.app/api/v1/tasks/{id}' \
  -H "Authorization: Bearer $DAYPILOT_API_KEY"
```

Returns nothing (204).

### The plan

Where DayPilot has put the work: blocks of time around the calendar.

#### A week of the plan

`GET /api/v1/planner/board`

One week from start: every block of work, calendar event and working-hours window, laid out by day. Use the first day of your week.

| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| `start` | query | date | yes | The week's first day. |
| `replan` | query | boolean | no | Rebuild the plan first. |

```bash
curl 'https://daypilot.app/api/v1/planner/board?start=2026-11-02' \
  -H "Authorization: Bearer $DAYPILOT_API_KEY"
```

Returns the week's days, blocks, events and anything that couldn't be planned.

#### Replan now

`POST /api/v1/planner/replan`

Rebuilds the plan, as the planner's Replan button does. DayPilot also replans by itself every 15 minutes and after every change.

```bash
curl -X POST 'https://daypilot.app/api/v1/planner/replan' \
  -H "Authorization: Bearer $DAYPILOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"boardStart":"2026-11-02"}'
```

Returns the week from boardStart.

#### Has anything changed?

`GET /api/v1/planner/changes`

Cheap enough to call often: poll this, and fetch tasks or the plan again only when changed is true.

| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| `since` | query | datetime | no | When you last looked (ISO 8601). |

```bash
curl 'https://daypilot.app/api/v1/planner/changes' \
  -H "Authorization: Bearer $DAYPILOT_API_KEY"
```

Returns { lastChangedUtc, changed, tenantId }.

#### Mark a block worked

`POST /api/v1/planner/chunks/{id}/done`

Marks one block of a task as worked. Block ids come from the week's plan.

| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| `id` | path | integer | yes | The block's id, from the week's plan. |

```bash
curl -X POST 'https://daypilot.app/api/v1/planner/chunks/{id}/done' \
  -H "Authorization: Bearer $DAYPILOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"boardStart":"2026-11-02"}'
```

Returns the week from boardStart.

### Projects

The containers tasks live in.

#### List projects

`GET /api/v1/projects`

Every project you can put a task in, by id and name. Personal Tasks is always there.

```bash
curl 'https://daypilot.app/api/v1/projects' \
  -H "Authorization: Bearer $DAYPILOT_API_KEY"
```

Returns a list of { id, name, groupId }.

#### Projects with counts

`GET /api/v1/projects/list`

Projects with their color, description and how many tasks are open.

```bash
curl 'https://daypilot.app/api/v1/projects/list' \
  -H "Authorization: Bearer $DAYPILOT_API_KEY"
```

Returns a list of projects.

#### Get a project

`GET /api/v1/projects/{id}`

One project, with its dates and repeat settings.

| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| `id` | path | integer | yes | The project's id. |

```bash
curl 'https://daypilot.app/api/v1/projects/{id}' \
  -H "Authorization: Bearer $DAYPILOT_API_KEY"
```

Returns the project.

#### Add a project

`POST /api/v1/projects`

Adds a project (id 0), or changes one (its id). Send datesProvided: true with startDate and dueDate to set its dates.

```bash
curl -X POST 'https://daypilot.app/api/v1/projects' \
  -H "Authorization: Bearer $DAYPILOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":0,"name":"Website refresh","description":"","colorHex":"#2f7cf6","isRecurring":false,"startDate":"2026-11-05","dueDate":"2026-12-05","datesProvided":true}'
```

Returns { id } of the project.

### Docs

Procedures, policies and notes. You see the docs you made and the ones shared with you.

#### List docs

`GET /api/v1/docs`

Every doc you can see, with the doc above each one (parentId), so you can build the tree.

```bash
curl 'https://daypilot.app/api/v1/docs' \
  -H "Authorization: Bearer $DAYPILOT_API_KEY"
```

Returns { docs, canShare }.

#### Read a doc

`GET /api/v1/docs/{id}`

One doc: its text as HTML, the docs above and below it, its files and the tasks that use it.

| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| `id` | path | integer | yes | The doc's id. |

```bash
curl 'https://daypilot.app/api/v1/docs/{id}' \
  -H "Authorization: Bearer $DAYPILOT_API_KEY"
```

Returns the doc.

#### Write a doc

`POST /api/v1/docs/save`

Adds a doc (id 0) or saves one. The body is HTML. A new doc starts as a Draft, seen only by its editors; send status Published to share it with whoever it's shared with.

```bash
curl -X POST 'https://daypilot.app/api/v1/docs/save' \
  -H "Authorization: Bearer $DAYPILOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"id":0,"parentDocId":null,"title":"Opening checklist","body":"<ol><li>Unlock the front door</li><li>Turn on the lights</li><li>Check the voicemail</li></ol>","status":"Draft"}'
```

Returns { id } of the doc.

#### Run a doc as tasks

`POST /api/v1/docs/{id}/run`

Turns a doc's checklist or numbered steps into a task with a sub-task for each step, planned. Leave steps out for every step.

| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| `id` | path | integer | yes | The doc's id. |

```bash
curl -X POST 'https://daypilot.app/api/v1/docs/{id}/run' \
  -H "Authorization: Bearer $DAYPILOT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"title":"Opening checklist","dueDate":"2026-11-06","projectId":101,"minutesPerStep":15}'
```

Returns { taskId, subTaskCount }.

### Search, insights and schedules

Finding things, and how the coming weeks look.

#### Search

`GET /api/v1/search`

Searches tasks, projects, templates, docs, groups and schedules, best match first, forgiving of typos.

| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| `q` | query | string | yes | What to look for. |
| `limit` | query | integer | no | How many results. |

```bash
curl 'https://daypilot.app/api/v1/search?q=budget' \
  -H "Authorization: Bearer $DAYPILOT_API_KEY"
```

Returns { query, results } with each result's kind, title, where it lives and its link.

#### How the next weeks look

`GET /api/v1/dashboard/insights`

Free time against planned work for the next three weeks, and the deadlines at risk, with the dashboard's summary sentences.

```bash
curl 'https://daypilot.app/api/v1/dashboard/insights' \
  -H "Authorization: Bearer $DAYPILOT_API_KEY"
```

Returns capacity by day and week, and deadlines with their status.

#### Your schedules

`GET /api/v1/schedules`

Your working hours: each schedule's days, time windows and time zone.

```bash
curl 'https://daypilot.app/api/v1/schedules' \
  -H "Authorization: Bearer $DAYPILOT_API_KEY"
```

Returns your schedules.

## Every endpoint

Everything else the API offers, grouped as the API groups it. Request and response schemas are in the OpenAPI description. Endpoints marked “website only” refuse API keys (403).

### Auth

- `DELETE /api/v1/auth/account` — website only
- `POST /api/v1/auth/change-password` — website only
- `POST /api/v1/auth/google/link` — website only
- `GET /api/v1/auth/me` — in the guide above
- `POST /api/v1/auth/revoke-all` — website only

### Billing

- `GET /api/v1/billing`
- `POST /api/v1/billing/apple/transaction` — website only
- `POST /api/v1/billing/checkout` — website only
- `POST /api/v1/billing/portal` — website only

### Calendars

- `GET /api/v1/calendars` — `refresh` (query, boolean)
- `PUT /api/v1/calendars`
- `DELETE /api/v1/calendars` — website only
- `POST /api/v1/calendars/google/complete` — website only
- `GET /api/v1/calendars/google/connect-url` — `returnTo` (query, string) — website only
- `POST /api/v1/calendars/sync`
- `POST /api/v1/calendars/toggle-sync`

### Dashboard

- `GET /api/v1/dashboard`
- `GET /api/v1/dashboard/insights` — in the guide above
- `GET /api/v1/dashboard/team`

### Developer

- `GET /api/v1/developer/catalog`
- `GET /api/v1/developer/keys` — website only
- `POST /api/v1/developer/keys` — website only
- `DELETE /api/v1/developer/keys/{id}` — `id` (path, integer, required) — website only

### Devices

- `GET /api/v1/devices` — website only
- `POST /api/v1/devices` — website only
- `DELETE /api/v1/devices/{token}` — `token` (path, string, required) — website only

### Docs

- `GET /api/v1/docs` — in the guide above
- `DELETE /api/v1/docs/attachments/{id}` — `id` (path, integer, required)
- `GET /api/v1/docs/editor` — `id` (query, integer), `parentId` (query, integer)
- `GET /api/v1/docs/options`
- `POST /api/v1/docs/save` — in the guide above
- `GET /api/v1/docs/{id}` — `id` (path, integer, required) — in the guide above
- `DELETE /api/v1/docs/{id}` — `id` (path, integer, required)
- `POST /api/v1/docs/{id}/move` — `id` (path, integer, required)
- `POST /api/v1/docs/{id}/reviewed` — `id` (path, integer, required)
- `GET /api/v1/docs/{id}/revisions` — `id` (path, integer, required)
- `GET /api/v1/docs/{id}/revisions/{revisionId}` — `id` (path, integer, required), `revisionId` (path, integer, required)
- `POST /api/v1/docs/{id}/revisions/{revisionId}/restore` — `id` (path, integer, required), `revisionId` (path, integer, required)
- `POST /api/v1/docs/{id}/run` — `id` (path, integer, required) — in the guide above
- `GET /api/v1/docs/{id}/sharing` — `id` (path, integer, required)
- `PUT /api/v1/docs/{id}/sharing` — `id` (path, integer, required)
- `POST /api/v1/docs/{id}/status` — `id` (path, integer, required)
- `GET /api/v1/docs/{id}/steps` — `id` (path, integer, required)

### Groups

- `GET /api/v1/groups`
- `POST /api/v1/groups`
- `GET /api/v1/groups/{id}` — `id` (path, integer, required)
- `PUT /api/v1/groups/{id}` — `id` (path, integer, required)
- `DELETE /api/v1/groups/{id}` — `id` (path, integer, required)
- `GET /api/v1/groups/{id}/assignees` — `id` (path, integer, required)
- `POST /api/v1/groups/{id}/members` — `id` (path, integer, required)
- `DELETE /api/v1/groups/{id}/members/{userId}` — `id` (path, integer, required), `userId` (path, string, required)

### Import

- `POST /api/v1/import/clickup/attachments` — website only
- `GET /api/v1/import/jobs/{jobId}` — `jobId` (path, string, required) — website only
- `POST /api/v1/import/run` — website only
- `POST /api/v1/import/{provider}/preview` — `provider` (path, string, required) — website only
- `POST /api/v1/import/{provider}/workspaces` — `provider` (path, string, required) — website only

### Inbox

- `GET /api/v1/inbox`
- `POST /api/v1/inbox/check`
- `POST /api/v1/inbox/regenerate`
- `PUT /api/v1/inbox/senders`

### Planner

- `GET /api/v1/planner/board` — `start` (query, date, required), `replan` (query, boolean) — in the guide above
- `GET /api/v1/planner/changes` — `since` (query, datetime) — in the guide above
- `POST /api/v1/planner/chunks/{id}/done` — `id` (path, integer, required) — in the guide above
- `DELETE /api/v1/planner/chunks/{id}/done` — `id` (path, integer, required), `boardStart` (query, date, required)
- `POST /api/v1/planner/chunks/{id}/move` — `id` (path, integer, required)
- `POST /api/v1/planner/chunks/{id}/unpin` — `id` (path, integer, required)
- `POST /api/v1/planner/events`
- `POST /api/v1/planner/events/all-day`
- `PUT /api/v1/planner/events/{id}` — `id` (path, integer, required)
- `DELETE /api/v1/planner/events/{id}` — `id` (path, integer, required), `boardStart` (query, date, required), `scope` (query, enum)
- `PUT /api/v1/planner/events/{id}/all-day` — `id` (path, integer, required)
- `POST /api/v1/planner/events/{id}/move` — `id` (path, integer, required)
- `POST /api/v1/planner/replan` — in the guide above
- `POST /api/v1/planner/tasks/{id}/done` — `id` (path, integer, required)

### Preferences

- `GET /api/v1/preferences`
- `PUT /api/v1/preferences`
- `POST /api/v1/preferences/profile-image`
- `DELETE /api/v1/preferences/profile-image`
- `POST /api/v1/preferences/timezone`
- `GET /api/v1/preferences/timezones`

### Projects

- `GET /api/v1/projects` — in the guide above
- `POST /api/v1/projects` — in the guide above
- `GET /api/v1/projects/list` — in the guide above
- `GET /api/v1/projects/{id}` — `id` (path, integer, required) — in the guide above
- `DELETE /api/v1/projects/{id}` — `id` (path, integer, required), `moveTasksTo` (query, integer)

### Schedules

- `GET /api/v1/schedules` — `selectedId` (query, integer) — in the guide above
- `POST /api/v1/schedules`
- `GET /api/v1/schedules/end-of-day` — `scheduleId` (query, integer), `date` (query, date)
- `GET /api/v1/schedules/new`
- `GET /api/v1/schedules/options`
- `GET /api/v1/schedules/palette`
- `GET /api/v1/schedules/timezones`
- `DELETE /api/v1/schedules/{id}` — `id` (path, integer, required)

### Search

- `GET /api/v1/search` — `q` (query, string), `limit` (query, integer) — in the guide above

### Tasks

- `GET /api/v1/tasks` — `status` (query, enum), `projectId` (query, integer), `groupId` (query, integer), `search` (query, string), `dueBefore` (query, date), `includeDone` (query, boolean) — in the guide above
- `DELETE /api/v1/tasks/attachments/{id}` — `id` (path, integer, required)
- `POST /api/v1/tasks/bulk` — in the guide above
- `POST /api/v1/tasks/bulk/delete`
- `GET /api/v1/tasks/editor` — `id` (query, integer), `templateId` (query, integer), `parentTaskId` (query, integer), `newTemplate` (query, boolean), `projectTemplateId` (query, integer), `projectId` (query, integer)
- `POST /api/v1/tasks/lineage`
- `GET /api/v1/tasks/paged` — `status` (query, enum), `projectId` (query, integer), `groupId` (query, integer), `search` (query, string), `dueBefore` (query, date), `includeDone` (query, boolean), `page` (query, integer), `pageSize` (query, integer) — in the guide above
- `POST /api/v1/tasks/save` — in the guide above
- `GET /api/v1/tasks/today` — in the guide above
- `GET /api/v1/tasks/today/tree`
- `GET /api/v1/tasks/{id}` — `id` (path, integer, required) — in the guide above
- `PATCH /api/v1/tasks/{id}` — `id` (path, integer, required) — in the guide above
- `DELETE /api/v1/tasks/{id}` — `id` (path, integer, required) — in the guide above
- `GET /api/v1/tasks/{id}/blocks` — `id` (path, integer, required)
- `POST /api/v1/tasks/{id}/done` — `id` (path, integer, required) — in the guide above
- `POST /api/v1/tasks/{id}/escalation/reset` — `id` (path, integer, required)
- `POST /api/v1/tasks/{id}/promote` — `id` (path, integer, required)
- `POST /api/v1/tasks/{id}/snooze` — `id` (path, integer, required) — in the guide above
- `DELETE /api/v1/tasks/{id}/snooze` — `id` (path, integer, required) — in the guide above
- `GET /api/v1/tasks/{id}/subtasks` — `id` (path, integer, required) — in the guide above
- `POST /api/v1/tasks/{id}/subtasks/fit` — `id` (path, integer, required)
- `GET /api/v1/tasks/{id}/subtasks/open` — `id` (path, integer, required)
- `GET /api/v1/tasks/{id}/subtasks/outside` — `id` (path, integer, required)

### Templates

- `GET /api/v1/templates` — `type` (query, string), `id` (query, integer)
- `POST /api/v1/templates/folder`
- `DELETE /api/v1/templates/folder/{id}` — `id` (path, integer, required)
- `GET /api/v1/templates/list`
- `POST /api/v1/templates/project`
- `GET /api/v1/templates/project/{id}` — `id` (path, integer, required)
- `POST /api/v1/templates/task`
- `GET /api/v1/templates/task/{id}` — `id` (path, integer, required)
- `DELETE /api/v1/templates/task/{id}` — `id` (path, integer, required)

### Tenant

- `GET /api/v1/tenant` — in the guide above
- `PUT /api/v1/tenant` — website only
- `POST /api/v1/tenant/invitations` — website only
- `POST /api/v1/tenant/invitations/accept` — website only
- `DELETE /api/v1/tenant/invitations/{id}` — `id` (path, integer, required) — website only
- `POST /api/v1/tenant/leave` — website only
- `PATCH /api/v1/tenant/members/{userId}` — `userId` (path, string, required) — website only
- `DELETE /api/v1/tenant/members/{userId}` — `userId` (path, string, required) — website only
