DayPilot Focus-first planning

Developer

Build on DayPilot

The DayPilot API lets your scripts, servers and AI agents read a plan, add and change tasks, and work with projects and docs. It's the same API the website and the iPhone app use.

Using an AI assistant?

Point it at https://daypilot.app/developer.md. It's this whole page as plain text, written for a model to read, and it links to the OpenAPI description for exact request and response shapes. For example:

Read https://daypilot.app/developer.md and write a script that lists my DayPilot tasks due this week. Read the API key from the DAYPILOT_API_KEY environment variable.

Keep the key itself out of the chat: put it in an environment variable or your agent's secret settings, and give the agent a read-only key if it only needs to look.

Getting started

  1. Make a key on the Developer page (sign in first). It's shown once, so copy it then. Choose read only if the key only needs to look.
  2. Send it with every request in the Authorization header: Authorization: Bearer dpk_…
  3. Call the API at https://daypilot.app/api/v1. Check your key with “Who am I?”:
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.

StatusMeaning
400Rejected: the detail says why (a missing title, a date in the wrong order).
401No key, a wrong key, or an expired or deleted one.
402Needs a higher plan; feature and requiredPlan say which.
403Website only, a read-only key trying to change something, or not yours to change.
404Not found, or not something you can see.
409Google Calendar needs reconnecting on the website.
429More 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.

You and your workspace

Check that a key works and see whose it is.

Who am I?

Try it

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.

Example

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

Try it

GET/api/v1/tenant

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

Example

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

Try it

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.

ParameterInTypeDescription
status query enumNotStarted, InProgress, Waiting, Done Only tasks with this status.
projectId query integer Only tasks in this project.
search query string Words in the title.
dueBefore query date Due on or before this day.
includeDone query boolean Include done tasks when filtering.

Example

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

Try it

GET/api/v1/tasks/paged

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

ParameterInTypeDescription
page query integer Which page, from 1.
pageSize query integer Tasks per page, up to 200.
includeDone query boolean Include done tasks.

Example

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

Returns { items, total, page, pageSize }.

What's on Today

Try it

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.

Example

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

Returns a list of tasks.

Get a task

Try it

GET/api/v1/tasks/{id}

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

ParameterInTypeDescription
idrequired path integer The task's id.

Example

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

Returns the task's details.

Add a task

Try it

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.

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

Body

{
  "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
}

Example

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

Try it

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.

ParameterInTypeDescription
idrequired path integer The task's id.

Body

{
  "priority": "Urgent",
  "dueDate": "2026-11-08"
}

Example

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

Try it

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.

ParameterInTypeDescription
idrequired path integer The task's id.

Example

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

Returns nothing (204).

Snooze a task

Try it

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.

ParameterInTypeDescription
idrequired path integer The task's id.

Body

{
  "onDate": "2026-11-07"
}

Example

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

Try it

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

Puts a snoozed task back on the plan from now.

ParameterInTypeDescription
idrequired path integer The task's id.

Example

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

Try it

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

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

ParameterInTypeDescription
idrequired path integer The task's id.

Example

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

Try it

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.

Body

{
  "ids": [],
  "changes": {
    "priority": "High"
  }
}

Example

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

Try it

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.

ParameterInTypeDescription
idrequired path integer The task's id.

Example

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

Try it

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.

ParameterInTypeDescription
startrequired query date The week's first day.
replan query boolean Rebuild the plan first.

Example

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

Try it

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.

Body

{
  "boardStart": "2026-11-02"
}

Example

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?

Try it

GET/api/v1/planner/changes

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

ParameterInTypeDescription
since query datetime When you last looked (ISO 8601).

Example

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

Returns { lastChangedUtc, changed, tenantId }.

Mark a block worked

Try it

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

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

ParameterInTypeDescription
idrequired path integer The block's id, from the week's plan.

Body

{
  "boardStart": "2026-11-02"
}

Example

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

Try it

GET/api/v1/projects

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

Example

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

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

Projects with counts

Try it

GET/api/v1/projects/list

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

Example

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

Returns a list of projects.

Get a project

Try it

GET/api/v1/projects/{id}

One project, with its dates and repeat settings.

ParameterInTypeDescription
idrequired path integer The project's id.

Example

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

Returns the project.

Add a project

Try it

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.

Body

{
  "id": 0,
  "name": "Website refresh",
  "description": "",
  "colorHex": "#2f7cf6",
  "isRecurring": false,
  "startDate": "2026-11-05",
  "dueDate": "2026-12-05",
  "datesProvided": true
}

Example

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

Try it

GET/api/v1/docs

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

Example

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

Returns { docs, canShare }.

Read a doc

Try it

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.

ParameterInTypeDescription
idrequired path integer The doc's id.

Example

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

Returns the doc.

Write a doc

Try it

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.

Body

{
  "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"
}

Example

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

Try it

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.

ParameterInTypeDescription
idrequired path integer The doc's id.

Body

{
  "title": "Opening checklist",
  "dueDate": "2026-11-06",
  "projectId": 101,
  "minutesPerStep": 15
}

Example

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.

How the next weeks look

Try it

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.

Example

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

Try it

GET/api/v1/schedules

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

Example

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. Website-only endpoints 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
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
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 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
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 (required) Website only

Devices

GET /api/v1/devices Website only
POST /api/v1/devices Website only
DELETE /api/v1/devices/{token} token (required) Website only

Docs

GET /api/v1/docs In the guide
DELETE /api/v1/docs/attachments/{id} id (required)
GET /api/v1/docs/editor id, parentId
GET /api/v1/docs/options
POST /api/v1/docs/save In the guide
GET /api/v1/docs/{id} id (required) In the guide
DELETE /api/v1/docs/{id} id (required)
POST /api/v1/docs/{id}/move id (required)
POST /api/v1/docs/{id}/reviewed id (required)
GET /api/v1/docs/{id}/revisions id (required)
GET /api/v1/docs/{id}/revisions/{revisionId} id (required), revisionId (required)
POST /api/v1/docs/{id}/revisions/{revisionId}/restore id (required), revisionId (required)
POST /api/v1/docs/{id}/run id (required) In the guide
GET /api/v1/docs/{id}/sharing id (required)
PUT /api/v1/docs/{id}/sharing id (required)
POST /api/v1/docs/{id}/status id (required)
GET /api/v1/docs/{id}/steps id (required)

Groups

GET /api/v1/groups
POST /api/v1/groups
GET /api/v1/groups/{id} id (required)
PUT /api/v1/groups/{id} id (required)
DELETE /api/v1/groups/{id} id (required)
GET /api/v1/groups/{id}/assignees id (required)
POST /api/v1/groups/{id}/members id (required)
DELETE /api/v1/groups/{id}/members/{userId} id (required), userId (required)

Import

POST /api/v1/import/clickup/attachments Website only
GET /api/v1/import/jobs/{jobId} jobId (required) Website only
POST /api/v1/import/run Website only
POST /api/v1/import/{provider}/preview provider (required) Website only
POST /api/v1/import/{provider}/workspaces provider (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 (required), replan In the guide
GET /api/v1/planner/changes since In the guide
POST /api/v1/planner/chunks/{id}/done id (required) In the guide
DELETE /api/v1/planner/chunks/{id}/done id (required), boardStart (required)
POST /api/v1/planner/chunks/{id}/move id (required)
POST /api/v1/planner/chunks/{id}/unpin id (required)
POST /api/v1/planner/events
POST /api/v1/planner/events/all-day
PUT /api/v1/planner/events/{id} id (required)
DELETE /api/v1/planner/events/{id} id (required), boardStart (required), scope
PUT /api/v1/planner/events/{id}/all-day id (required)
POST /api/v1/planner/events/{id}/move id (required)
POST /api/v1/planner/replan In the guide
POST /api/v1/planner/tasks/{id}/done id (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
POST /api/v1/projects In the guide
GET /api/v1/projects/list In the guide
GET /api/v1/projects/{id} id (required) In the guide
DELETE /api/v1/projects/{id} id (required), moveTasksTo

Schedules

GET /api/v1/schedules selectedId In the guide
POST /api/v1/schedules
GET /api/v1/schedules/end-of-day scheduleId, 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 (required)

Search

GET /api/v1/search q, limit In the guide

Tasks

GET /api/v1/tasks status, projectId, groupId, search, dueBefore, includeDone In the guide
DELETE /api/v1/tasks/attachments/{id} id (required)
POST /api/v1/tasks/bulk In the guide
POST /api/v1/tasks/bulk/delete
GET /api/v1/tasks/editor id, templateId, parentTaskId, newTemplate, projectTemplateId, projectId
POST /api/v1/tasks/lineage
GET /api/v1/tasks/paged status, projectId, groupId, search, dueBefore, includeDone, page, pageSize In the guide
POST /api/v1/tasks/save In the guide
GET /api/v1/tasks/today In the guide
GET /api/v1/tasks/today/tree
GET /api/v1/tasks/{id} id (required) In the guide
PATCH /api/v1/tasks/{id} id (required) In the guide
DELETE /api/v1/tasks/{id} id (required) In the guide
GET /api/v1/tasks/{id}/blocks id (required)
POST /api/v1/tasks/{id}/done id (required) In the guide
POST /api/v1/tasks/{id}/escalation/reset id (required)
POST /api/v1/tasks/{id}/promote id (required)
POST /api/v1/tasks/{id}/snooze id (required) In the guide
DELETE /api/v1/tasks/{id}/snooze id (required) In the guide
GET /api/v1/tasks/{id}/subtasks id (required) In the guide
POST /api/v1/tasks/{id}/subtasks/fit id (required)
GET /api/v1/tasks/{id}/subtasks/open id (required)
GET /api/v1/tasks/{id}/subtasks/outside id (required)

Templates

GET /api/v1/templates type, id
POST /api/v1/templates/folder
DELETE /api/v1/templates/folder/{id} id (required)
GET /api/v1/templates/list
POST /api/v1/templates/project
GET /api/v1/templates/project/{id} id (required)
POST /api/v1/templates/task
GET /api/v1/templates/task/{id} id (required)
DELETE /api/v1/templates/task/{id} id (required)

Tenant

GET /api/v1/tenant In the guide
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 (required) Website only
POST /api/v1/tenant/leave Website only
PATCH /api/v1/tenant/members/{userId} userId (required) Website only
DELETE /api/v1/tenant/members/{userId} userId (required) Website only