API reference

Base URL https://beta-pages.daysli.com/api/v1. Every route takes Authorization: Bearer …. The full schemas are in openapi.json; responses are exactly these shapes, never more.

GET /meThe account this token acts for
GET /appointment-typesAppointment types
GET /availabilityFree times for an appointment type
GET /eventsCalendar events in a window
GET /events/{id}One event or occurrence
GET /tasksTo-dos
GET /tasks/{id}One to-do
GET /requestsRequests people sent
GET /requests/{id}One request
POST /requests/appointmentsAsk for an appointment
POST /requests/tasksAsk for a to-do
POST /requests/{id}/withdrawWithdraw a request this token made
GET /webhook-eventsCatch up on webhook events
GET /webhook-events/{id}One webhook event

GET /v1/me

The account this token acts for. Who the token belongs to, as this token sees them: a stable account id, the scopes granted, whether it is a live or test token, and the profile with `profile:read`. Use it to check a token and to learn what it may do.

Scope: any valid token · Rate class: read

Answer · 200

accountIdstring
scopes"profile:read" | "availability:read" | "events:read" | "tasks:read" | "requests:read" | "requests:contact" | "requests:create" | "webhooks"[]
mode"live" | "test"
profileobject

Errors: 401 invalid_token · 429 rate_limited · 500 internal

GET /v1/appointment-types

Appointment types. The appointment types people can book, in the owner’s order. `404 not_found` while the owner’s booking is off.

Scope: availability:read · Rate class: read

Answer · 200

dataobject[]

Errors: 401 invalid_token · 403 insufficient_scope · 404 not_found · 429 rate_limited · 500 internal

GET /v1/availability

Free times for an appointment type. Free slots for one appointment type over up to 14 days in the timezone you name, from the same engine and rules as the owner’s booking page: working hours, minimum notice, the booking window, buffers, holidays, blocked dates and busy time. Only free time is ever returned — never why other times are not free.

Scope: availability:read · Rate class: availability

Parameters

appointmentTypeIdstring (uuid)required
fromstringrequired
tostringrequired
tzstringrequired

Answer · 200

appointmentTypeIdstring (uuid)
timezonestring
slotsobject[]
daysobject[]

Errors: 401 invalid_token · 403 insufficient_scope · 404 not_found · 422 invalid_input · 429 rate_limited · 500 internal

GET /v1/events

Calendar events in a window. Events and accepted appointments between two instants (at most 62 days), repeating events expanded into their occurrences, in start order. Notes, participants and busy time imported from other calendars are never included.

Scope: events:read · Rate class: read

Parameters

fromstringrequired
tostringrequired
updatedSincestringoptional
includeDeleted"true" | "false"optional
limitintegeroptional
cursorstringoptional

Answer · 200

dataobject[]
nextCursorobject
deletedobject[]

Errors: 401 invalid_token · 403 insufficient_scope · 422 invalid_input · 429 rate_limited · 500 internal

GET /v1/events/{id}

One event or occurrence. An event by id, or one occurrence of a repeating event by `<series id>@<original start>` (the id `GET /events` returns for it).

Scope: events:read · Rate class: read

Parameters

idstringrequired

Answer · 200

idstring
titlestring
startstring
endstring
allDayboolean
startDatestring | null
endDatestring | null
timezonestring
showAs"busy" | "free"
status"confirmed" | "cancelled"
calendarstring
locationobject
urlobject
isAppointmentboolean
requestIdstring (uuid) | null
occurrenceOfstring (uuid) | null
updatedAtstring

Errors: 401 invalid_token · 403 insufficient_scope · 404 not_found · 429 rate_limited · 500 internal

GET /v1/tasks

To-dos. Open and completed to-dos, oldest change first. Completed ones are returned for 90 days after completion. With `updatedSince`, only what changed since then; add `includeDeleted=true` for what was deleted.

Scope: tasks:read · Rate class: read

Parameters

status"open" | "completed"optional
dueFromstringoptional
dueTostringoptional
updatedSincestringoptional
includeDeleted"true" | "false"optional
limitintegeroptional
cursorstringoptional

Answer · 200

dataobject[]
nextCursorobject
deletedobject[]

Errors: 401 invalid_token · 403 insufficient_scope · 422 invalid_input · 429 rate_limited · 500 internal

GET /v1/tasks/{id}

One to-do. A to-do by id.

Scope: tasks:read · Rate class: read

Parameters

idstringrequired

Answer · 200

idstring (uuid)
titlestring
descriptionobject
dueDatestring | null
dueTimestring | null
timezoneobject
priority"none" | "low" | "medium" | "high"
status"open" | "completed"
completedAtstring | null
fromRequesterobject
requestIdstring (uuid) | null
durationMinutesinteger | null
updatedAtstring

Errors: 401 invalid_token · 403 insufficient_scope · 404 not_found · 429 rate_limited · 500 internal

GET /v1/requests

Requests people sent. Appointment and to-do requests, oldest change first. Handled requests are returned for 90 days. Requesters’ email addresses and phone numbers need `requests:contact` as well.

Scope: requests:read · Rate class: read

Parameters

status"pending" | "accepted" | "declined" | "withdrawn" | "expired" | "rescheduled" | "cancelled" | "completed"optional
kind"appointment" | "task"optional
createdByThisToken"true" | "false"optional
updatedSincestringoptional
includeDeleted"true" | "false"optional
limitintegeroptional
cursorstringoptional

Answer · 200

dataobject[]
nextCursorobject
deletedobject[]

Errors: 401 invalid_token · 403 insufficient_scope · 422 invalid_input · 429 rate_limited · 500 internal

GET /v1/requests/{id}

One request. A request by id.

Scope: requests:read · Rate class: read

Parameters

idstringrequired

Answer · 200

idstring (uuid)
kind"appointment" | "task"
status"pending" | "accepted" | "declined" | "withdrawn" | "expired" | "rescheduled" | "cancelled" | "completed"
cancelledBy"owner" | "requester" | null
appointmentTypeIdstring (uuid) | null
slotobject | null
suggestedDueDatestring | null
messageobject
noteobject
requesterobject
source"public" | "api"
createdByThisTokenboolean
testboolean
createdAtstring
updatedAtstring

Errors: 401 invalid_token · 403 insufficient_scope · 404 not_found · 429 rate_limited · 500 internal

POST /v1/requests/appointments

Ask for an appointment. Sends an appointment request to the owner’s inbox, exactly as their booking page does: the slot is checked again, the same limits apply, and nothing is confirmed until the owner accepts. With `notifyRequester` the requester gets Daysli’s emails and status link; a test token never emails anyone.

Scope: requests:create · Rate class: create · Needs an Idempotency-Key header

Body

appointmentTypeIdstring (uuid)required
slotobjectrequired
messagestringoptional
requesterobjectrequired
requesterTimezonestringrequired
requesterLocalestringrequired
notifyRequesterbooleanoptional

Answer · 201

requestobject
statusUrlobject

Errors: 401 invalid_token · 403 insufficient_scope · 404 not_found · 409 slot_unavailable · 422 invalid_input, idempotency_mismatch · 429 rate_limited, too_many_pending · 500 internal

POST /v1/requests/tasks

Ask for a to-do. Sends a to-do request to the owner’s inbox, exactly as their page does. The owner decides whether it becomes one of their to-dos.

Scope: requests:create · Rate class: create · Needs an Idempotency-Key header

Body

messagestringrequired
notestringoptional
suggestedDueDatestringoptional
requesterobjectrequired
requesterTimezonestringrequired
requesterLocalestringrequired
notifyRequesterbooleanoptional

Answer · 201

requestobject
statusUrlobject

Errors: 401 invalid_token · 403 insufficient_scope · 404 not_found · 422 invalid_input, idempotency_mismatch · 429 rate_limited, too_many_pending · 500 internal

POST /v1/requests/{id}/withdraw

Withdraw a request this token made. Withdraws a request this token created while it is still pending. Requests from anywhere else are `404 not_found`.

Scope: requests:create · Rate class: create · Needs an Idempotency-Key header

Parameters

idstringrequired

Answer · 200

idstring (uuid)
kind"appointment" | "task"
status"pending" | "accepted" | "declined" | "withdrawn" | "expired" | "rescheduled" | "cancelled" | "completed"
cancelledBy"owner" | "requester" | null
appointmentTypeIdstring (uuid) | null
slotobject | null
suggestedDueDatestring | null
messageobject
noteobject
requesterobject
source"public" | "api"
createdByThisTokenboolean
testboolean
createdAtstring
updatedAtstring

Errors: 401 invalid_token · 403 insufficient_scope · 404 not_found · 409 invalid_transition · 422 idempotency_mismatch · 429 rate_limited · 500 internal

GET /v1/webhook-events

Catch up on webhook events. The events this token was entitled to since an instant (at most 30 days back), oldest first: the same payloads the webhooks deliver, for a receiver that was down.

Scope: webhooks · Rate class: read

Parameters

sincestringrequired
limitintegeroptional
cursorstringoptional

Answer · 200

dataobject[]
nextCursorobject

Errors: 401 invalid_token · 403 insufficient_scope · 422 invalid_input · 429 rate_limited · 500 internal

GET /v1/webhook-events/{id}

One webhook event. A webhook event by id.

Scope: webhooks · Rate class: read

Parameters

idstringrequired

Answer · 200

idstring (uuid)
type"request.created" | "request.withdrawn" | "request.accepted" | "request.declined" | "request.expired" | "appointment.rescheduled" | "appointment.confirmed" | "appointment.cancelled" | "appointment.completed" | "task.created" | "task.updated" | "task.completed" | "task.deleted" | "event.created" | "event.updated" | "event.deleted" | "authorization.revoked" | "ping"
apiVersion"v1"
occurredAtstring
accountstring
testboolean
dataobject | object | object

Errors: 401 invalid_token · 403 insufficient_scope · 404 not_found · 429 rate_limited · 500 internal