curl --request GET \
--url https://api.dialtu.com/api/v2/public/calendar/availability \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.dialtu.com/api/v2/public/calendar/availability"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.dialtu.com/api/v2/public/calendar/availability', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"data": {
"range": {
"start_date": "2023-12-25",
"end_date": "2023-12-25",
"days": 123
},
"services": [
{
"id": 123,
"name": "<string>",
"duration_minutes": 123,
"capacity": 123,
"first_available_at": "<string>",
"effective_end_date": "2023-12-25",
"days": [
{
"date": "2023-12-25",
"capacity": 123
}
],
"profiles": [
{
"calendar_profile_id": 123,
"name": "<string>",
"timezone": "<string>",
"duration_minutes": 123,
"capacity": 123,
"first_available_at": "<string>",
"days": [
{
"date": "2023-12-25",
"capacity": 123
}
]
}
]
}
]
},
"status": "success"
}Get bookable capacity per service
How many more appointments fit, per service, over a date range.
capacity is summed PER PROVIDER, not unioned by instant: three providers
free at 09:00 is three patients you can call, not one opening. It is net of
booked appointments, buffers, breaks, blackouts and the notice/horizon policy,
and it is an UPPER BOUND — booking one slot can eliminate more than one
candidate once buffers interact.
start_date defaults to today in the tenant’s default timezone; every
other date in the response is PROVIDER-local, which is the frame the whole
calendar domain resolves in.
days defaults to 7 to match the calendar agent tool’s own
search_days. Querying a wider range than the agent that will do the
calling is how a caller ends up queueing patients the agent will tell there
is nothing available — see the integration guide.
curl --request GET \
--url https://api.dialtu.com/api/v2/public/calendar/availability \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.dialtu.com/api/v2/public/calendar/availability"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.dialtu.com/api/v2/public/calendar/availability', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"data": {
"range": {
"start_date": "2023-12-25",
"end_date": "2023-12-25",
"days": 123
},
"services": [
{
"id": 123,
"name": "<string>",
"duration_minutes": 123,
"capacity": 123,
"first_available_at": "<string>",
"effective_end_date": "2023-12-25",
"days": [
{
"date": "2023-12-25",
"capacity": 123
}
],
"profiles": [
{
"calendar_profile_id": 123,
"name": "<string>",
"timezone": "<string>",
"duration_minutes": 123,
"capacity": 123,
"first_available_at": "<string>",
"days": [
{
"date": "2023-12-25",
"capacity": 123
}
]
}
]
}
]
},
"status": "success"
}Authorizations
API key created in the dashboard under Settings → API Keys. Send it as Authorization: Bearer pk_....
Query Parameters
First day of the range, YYYY-MM-DD. Defaults to today in the account's default timezone.
Length of the range in days, 1–31. Defaults to 7, matching the calendar agent's own search window.
Comma-separated service IDs to restrict the answer to. Omit for all services; an explicitly empty value is rejected.
Comma-separated professional IDs to restrict the answer to.
Restrict capacity to one event type.
Appointment length to size slots by, overriding the service default.
Comma-separated extras. profiles adds a per-professional breakdown under each service.