Check Availability
Retrieve available or busy time slots for a calendar and schedule
Returns available (free) or busy time slots for a given calendar and schedule over a specified date range. Slots are generated from the schedule rules, filtered against existing blocking events, and limited by the max-slots-per-day setting. Supports timezone conversion — when target_timezone is provided, all returned slot times are converted to that timezone.
Requires a valid api_key in the JSON request body
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
api_key |
body | string |
Yes | Your Zyntro API key |
calendar_id |
body | string |
Yes | The UUID of the calendar to check |
schedule_id |
body | string |
Yes | The UUID of the schedule (defines available time blocks, slot duration, and gap between slots) |
days_ahead |
body | integer |
No | Number of days to look ahead from the start date. Default: 7 |
start_date |
body | string |
No | Start date in YYYY-MM-DD HH:MM:SS format. Defaults to now. |
mode |
body | string |
No | What to return: free (available slots, default) or busy (occupied slots) |
current_timezone |
body | string |
No | IANA timezone for interpreting the start_date. Default: UTC |
target_timezone |
body | string |
No | IANA timezone for the returned slot times. If omitted, slots are returned in the calendar's configured timezone. Set this to the contact's timezone to show them slots in their local time. |
Important: The target_timezone field controls what timezone the returned slot times are expressed in. If your contact is in America/New_York but the calendar is configured in Asia/Singapore, set target_timezone to America/New_York and the slots will be returned in Eastern time — making them directly presentable to the contact without any client-side conversion.
Request Body
Content-Type: application/json
Example
{
"mode": "free",
"api_key": "YOUR_API_KEY",
"days_ahead": 7,
"calendar_id": "3d21426f-9042-40d9-a0b2-94037f551d51",
"schedule_id": "8d3be70d-69e1-44c5-9ba7-c551a88f7112",
"target_timezone": "America/New_York"
}
Code Samples
curl -X POST https://app.zyntrohq.com/public/calendar/checkAvailability \
-H "Content-Type: application/json" \
-d '{
"api_key": "YOUR_API_KEY",
"calendar_id": "3d21426f-9042-40d9-a0b2-94037f551d51",
"schedule_id": "8d3be70d-69e1-44c5-9ba7-c551a88f7112",
"days_ahead": 7,
"mode": "free",
"target_timezone": "America/New_York"
}'
Response
{
"data": {
"mode": "free",
"slots": [
{
"end": "2026-04-03 09:30:00",
"label": "Thursday, Apr 3 at 9:00 AM",
"start": "2026-04-03 09:00:00"
},
{
"end": "2026-04-03 11:00:00",
"label": "Thursday, Apr 3 at 10:30 AM",
"start": "2026-04-03 10:30:00"
},
{
"end": "2026-04-04 14:30:00",
"label": "Friday, Apr 4 at 2:00 PM",
"start": "2026-04-04 14:00:00"
}
],
"end_date": "2026-04-10 00:00:00",
"slot_count": 12,
"start_date": "2026-04-03 00:00:00",
"backup_slots": [
{
"end": "2026-04-03 11:30:00",
"label": "Thursday, Apr 3 at 11:00 AM",
"start": "2026-04-03 11:00:00"
}
],
"target_timezone": "America/New_York",
"current_timezone": "UTC",
"backup_slot_count": 5
},
"status": "success"
}
{
"data": [
"Invalid calendar_id value"
],
"status": "error"
}
Info: When max_slots_per_day is configured on the schedule, the endpoint shuffles available slots per day and returns only that many in the main slots array. The remaining slots are returned in backup_slots — available if the primary slots do not work for the contact. In busy mode, no backup slots are returned.
Tip: Each slot includes a label field formatted as a human-readable string (e.g., "Thursday, Apr 3 at 9:00 AM"). This label is already in the target_timezone and can be presented directly to the contact without additional formatting.
Errors
| Code | Message | Resolution |
|---|---|---|
MISSING_API_KEY |
Missing required parameter api_key The api_key is missing. |
Include your API key. |
MISSING_CALENDAR |
Missing required parameter calendar_id The calendar_id is missing. |
Include the calendar UUID. |
MISSING_SCHEDULE |
Missing required parameter schedule_id The schedule_id is missing. |
Include the schedule UUID. |
INACTIVE_USER |
User account is inactive or suspended The account is not active. |
Contact your admin. |
INVALID_ORG |
Invalid organization No org found for the user. |
Contact support. |
INVALID_CALENDAR |
Invalid calendar_id value No calendar with that ID exists. |
Verify the calendar_id. |
INACTIVE_CALENDAR |
Calendar is inactive or not correctly setup The calendar exists but is not active. |
Activate the calendar in Sales > Calendar. |
INVALID_SCHEDULE |
Invalid schedule_id value No schedule with that ID exists. |
Verify the schedule_id. |
DATE_ERROR |
End date must be greater than start date The calculated end date is before the start date. |
Ensure start_date and days_ahead produce a valid range. |