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 /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
accountId | string |
scopes | "profile:read" | "availability:read" | "events:read" | "tasks:read" | "requests:read" | "requests:contact" | "requests:create" | "webhooks"[] |
mode | "live" | "test" |
profile | object |
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
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
appointmentTypeId | string (uuid) | required |
from | string | required |
to | string | required |
tz | string | required |
Answer · 200
appointmentTypeId | string (uuid) |
timezone | string |
slots | object[] |
days | object[] |
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
from | string | required |
to | string | required |
updatedSince | string | optional |
includeDeleted | "true" | "false" | optional |
limit | integer | optional |
cursor | string | optional |
Answer · 200
data | object[] |
nextCursor | object |
deleted | object[] |
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
Answer · 200
id | string |
title | string |
start | string |
end | string |
allDay | boolean |
startDate | string | null |
endDate | string | null |
timezone | string |
showAs | "busy" | "free" |
status | "confirmed" | "cancelled" |
calendar | string |
location | object |
url | object |
isAppointment | boolean |
requestId | string (uuid) | null |
occurrenceOf | string (uuid) | null |
updatedAt | string |
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 |
dueFrom | string | optional |
dueTo | string | optional |
updatedSince | string | optional |
includeDeleted | "true" | "false" | optional |
limit | integer | optional |
cursor | string | optional |
Answer · 200
data | object[] |
nextCursor | object |
deleted | object[] |
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
Answer · 200
id | string (uuid) |
title | string |
description | object |
dueDate | string | null |
dueTime | string | null |
timezone | object |
priority | "none" | "low" | "medium" | "high" |
status | "open" | "completed" |
completedAt | string | null |
fromRequester | object |
requestId | string (uuid) | null |
durationMinutes | integer | null |
updatedAt | string |
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 |
updatedSince | string | optional |
includeDeleted | "true" | "false" | optional |
limit | integer | optional |
cursor | string | optional |
Answer · 200
data | object[] |
nextCursor | object |
deleted | object[] |
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
Answer · 200
id | string (uuid) |
kind | "appointment" | "task" |
status | "pending" | "accepted" | "declined" | "withdrawn" | "expired" | "rescheduled" | "cancelled" | "completed" |
cancelledBy | "owner" | "requester" | null |
appointmentTypeId | string (uuid) | null |
slot | object | null |
suggestedDueDate | string | null |
message | object |
note | object |
requester | object |
source | "public" | "api" |
createdByThisToken | boolean |
test | boolean |
createdAt | string |
updatedAt | string |
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
appointmentTypeId | string (uuid) | required |
slot | object | required |
message | string | optional |
requester | object | required |
requesterTimezone | string | required |
requesterLocale | string | required |
notifyRequester | boolean | optional |
Answer · 201
request | object |
statusUrl | object |
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
message | string | required |
note | string | optional |
suggestedDueDate | string | optional |
requester | object | required |
requesterTimezone | string | required |
requesterLocale | string | required |
notifyRequester | boolean | optional |
Answer · 201
request | object |
statusUrl | object |
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
Answer · 200
id | string (uuid) |
kind | "appointment" | "task" |
status | "pending" | "accepted" | "declined" | "withdrawn" | "expired" | "rescheduled" | "cancelled" | "completed" |
cancelledBy | "owner" | "requester" | null |
appointmentTypeId | string (uuid) | null |
slot | object | null |
suggestedDueDate | string | null |
message | object |
note | object |
requester | object |
source | "public" | "api" |
createdByThisToken | boolean |
test | boolean |
createdAt | string |
updatedAt | string |
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
since | string | required |
limit | integer | optional |
cursor | string | optional |
Answer · 200
data | object[] |
nextCursor | object |
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
Answer · 200
id | string (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" |
occurredAt | string |
account | string |
test | boolean |
data | object | object | object |
Errors: 401 invalid_token · 403 insufficient_scope · 404 not_found · 429 rate_limited · 500 internal