Availability & Schedule Tracking
Query live availability and per-date capacity data to determine when appointments can be booked, and manage the schedule tracking records that back the booking engine.
Before You Begin
GET /v1/appointment-slots/availabilityandGET /v1/appointment-slots/schedule-trackingrequire theslots:readscope.PATCH /v1/appointment-slots/tracking/:slot_idandPOST /v1/appointment-slots/regeneraterequire theslots:writescope.
Get Availability
Returns all open calendar windows for a specific date, with live filled and available slot counts.
- Endpoint:
GET https://api.huskyvoice.ai/v1/appointment-slots/availability - Required scope:
slots:read
| Parameter | Required | Description |
|---|---|---|
date | Yes | Date to check — YYYY-MM-DD |
branch_id | No | Filter by branch UUID |
session | No | Filter by session: Morning, Afternoon, or Evening |
- cURL
- Python
- JavaScript
- n8n
curl -s "https://api.huskyvoice.ai/v1/appointment-slots/availability?date=2026-06-15&session=Morning" \
-H "Authorization: Bearer YOUR_API_KEY"
import requests
url = "https://api.huskyvoice.ai/v1/appointment-slots/availability"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
params = {"date": "2026-06-15", "session": "Morning"}
response = requests.get(url, headers=headers, params=params)
print(response.json())
const params = new URLSearchParams({ date: "2026-06-15", session: "Morning" });
const response = await fetch(
`https://api.huskyvoice.ai/v1/appointment-slots/availability?${params}`,
{ headers: { "Authorization": "Bearer YOUR_API_KEY" } }
);
const data = await response.json();
console.log(data);
Create an HTTP Header Auth credential in n8n: set Name to Authorization and Value to Bearer YOUR_API_KEY. Select it in the HTTP Request node's Authentication field.
{
"name": "HuskyVoice – Get Availability",
"nodes": [
{
"parameters": {
"method": "GET",
"url": "https://api.huskyvoice.ai/v1/appointment-slots/availability",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendQuery": true,
"queryParameters": {
"parameters": [
{ "name": "date", "value": "2026-06-15" },
{ "name": "session", "value": "Morning" }
]
}
},
"id": "1",
"name": "Get Availability",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [250, 300]
}
],
"connections": {},
"settings": {},
"meta": { "instanceId": "huskyvoice-docs" }
}
Response — 200 OK
{
"success": true,
"date": "2026-06-15",
"slots": [
{
"slot_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890||2026-06-15",
"calendar_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"branch_id": "branch_uuid_here",
"day": "monday",
"session": "Morning",
"batch": "MA",
"start_time": "09:00",
"end_time": "11:00",
"appointment_type": null,
"max_slots": 20,
"ai_slots": 10,
"filled_slots": 3,
"available_slots": 7,
"status": "OPEN",
"created_at": "2026-05-01T10:00:00.000Z",
"updated_at": "2026-05-01T10:00:00.000Z"
}
]
}
The slot_id in availability results uses the 2-part format calendar_id||YYYY-MM-DD. Pass this value directly to the PATCH or disable endpoints — the server extracts the calendar ID from the first segment automatically.
filled_slots counts confirmed appointments for the window on that date. available_slots is computed as ai_slots − filled_slots.
Get Schedule Tracking
Returns per-date schedule tracking records — the persistent fill-count projections the booking engine maintains for each calendar window and date.
- Endpoint:
GET https://api.huskyvoice.ai/v1/appointment-slots/schedule-tracking - Required scope:
slots:read
| Parameter | Required | Description |
|---|---|---|
date_from | Yes | Start date — YYYY-MM-DD |
date_to | No | End date — YYYY-MM-DD (defaults to date_from if omitted) |
branch_id | No | Filter by branch UUID |
appointment_type_id | No | Filter by service UUID |
session | No | Filter by session |
- cURL
- Python
- JavaScript
- n8n
curl -s "https://api.huskyvoice.ai/v1/appointment-slots/schedule-tracking?date_from=2026-06-15&date_to=2026-06-21" \
-H "Authorization: Bearer YOUR_API_KEY"
import requests
url = "https://api.huskyvoice.ai/v1/appointment-slots/schedule-tracking"
headers = {"Authorization": "Bearer YOUR_API_KEY"}
params = {
"date_from": "2026-06-15",
"date_to": "2026-06-21"
}
response = requests.get(url, headers=headers, params=params)
print(response.json())
const params = new URLSearchParams({
date_from: "2026-06-15",
date_to: "2026-06-21"
});
const response = await fetch(
`https://api.huskyvoice.ai/v1/appointment-slots/schedule-tracking?${params}`,
{ headers: { "Authorization": "Bearer YOUR_API_KEY" } }
);
const data = await response.json();
console.log(data);
Create an HTTP Header Auth credential in n8n: set Name to Authorization and Value to Bearer YOUR_API_KEY. Select it in the HTTP Request node's Authentication field.
{
"name": "HuskyVoice – Get Schedule Tracking",
"nodes": [
{
"parameters": {
"method": "GET",
"url": "https://api.huskyvoice.ai/v1/appointment-slots/schedule-tracking",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendQuery": true,
"queryParameters": {
"parameters": [
{ "name": "date_from", "value": "2026-06-15" },
{ "name": "date_to", "value": "2026-06-21" }
]
}
},
"id": "1",
"name": "Get Schedule Tracking",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [250, 300]
}
],
"connections": {},
"settings": {},
"meta": { "instanceId": "huskyvoice-docs" }
}
Response — 200 OK
{
"success": true,
"data": [
{
"slot_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890||2026-06-15||f47ac10b-58cc-4372-a567-0e02b2c3d479",
"calendar_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"appointment_type_id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"appointment_type_name": "General Checkup",
"date": "2026-06-15",
"day_of_week": "monday",
"session": "Morning",
"batch": "MA",
"start_time": "09:00",
"end_time": "11:00",
"max_slots": 20,
"filled_slots": 3,
"available_slots": 17,
"status": "OPEN"
}
]
}
The slot_id in schedule tracking results uses the 3-part format calendar_id||YYYY-MM-DD||appointment_type_id. Pass this value directly to PATCH /v1/appointment-slots/tracking/:slot_id.
Update a Schedule Tracking Record
Override the status or max_slots for a specific date's tracking record. Filled and available counts are always computed from live appointment data and cannot be set directly.
- Endpoint:
PATCH https://api.huskyvoice.ai/v1/appointment-slots/tracking/{slot_id} - Required scope:
slots:write
The {slot_id} must be the 3-part format from a schedule-tracking response: calendar_id||YYYY-MM-DD||appointment_type_id.
- cURL
- Python
- JavaScript
- n8n
curl -s -X PATCH \
"https://api.huskyvoice.ai/v1/appointment-slots/tracking/a1b2c3d4-e5f6-7890-abcd-ef1234567890||2026-06-15||f47ac10b-58cc-4372-a567-0e02b2c3d479" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"status": "CLOSED"}'
import requests
slot_id = "a1b2c3d4-e5f6-7890-abcd-ef1234567890||2026-06-15||f47ac10b-58cc-4372-a567-0e02b2c3d479"
url = f"https://api.huskyvoice.ai/v1/appointment-slots/tracking/{slot_id}"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
payload = {"status": "CLOSED"}
response = requests.patch(url, json=payload, headers=headers)
print(response.json())
const slotId = "a1b2c3d4-e5f6-7890-abcd-ef1234567890||2026-06-15||f47ac10b-58cc-4372-a567-0e02b2c3d479";
const response = await fetch(
`https://api.huskyvoice.ai/v1/appointment-slots/tracking/${encodeURIComponent(slotId)}`,
{
method: "PATCH",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({ status: "CLOSED" })
}
);
const data = await response.json();
console.log(data);
Create an HTTP Header Auth credential in n8n: set Name to Authorization and Value to Bearer YOUR_API_KEY. Select it in the HTTP Request node's Authentication field.
{
"name": "HuskyVoice – Update Tracking Record",
"nodes": [
{
"parameters": {
"method": "PATCH",
"url": "https://api.huskyvoice.ai/v1/appointment-slots/tracking/a1b2c3d4-e5f6-7890-abcd-ef1234567890||2026-06-15||f47ac10b-58cc-4372-a567-0e02b2c3d479",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "{\n \"status\": \"CLOSED\"\n}"
},
"id": "1",
"name": "Update Tracking Record",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [250, 300]
}
],
"connections": {},
"settings": {},
"meta": { "instanceId": "huskyvoice-docs" }
}
| Field | Description |
|---|---|
status | "OPEN" or "CLOSED" — overrides the window's status for this date only |
max_slots | Override the slot capacity for this date only |
Regenerate Schedule Tracking
Recreates schedule tracking records for a date range from the current calendar window definitions. Use this after making changes to calendar windows to ensure the per-date projections are up to date.
- Endpoint:
POST https://api.huskyvoice.ai/v1/appointment-slots/regenerate - Required scope:
slots:write
- cURL
- Python
- JavaScript
- n8n
curl -s -X POST https://api.huskyvoice.ai/v1/appointment-slots/regenerate \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"date_from": "2026-06-15", "date_to": "2026-06-30"}'
import requests
url = "https://api.huskyvoice.ai/v1/appointment-slots/regenerate"
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
payload = {
"date_from": "2026-06-15",
"date_to": "2026-06-30"
}
response = requests.post(url, json=payload, headers=headers)
print(response.json())
const response = await fetch(
"https://api.huskyvoice.ai/v1/appointment-slots/regenerate",
{
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({ date_from: "2026-06-15", date_to: "2026-06-30" })
}
);
const data = await response.json();
console.log(data);
Create an HTTP Header Auth credential in n8n: set Name to Authorization and Value to Bearer YOUR_API_KEY. Select it in the HTTP Request node's Authentication field.
{
"name": "HuskyVoice – Regenerate Schedule Tracking",
"nodes": [
{
"parameters": {
"method": "POST",
"url": "https://api.huskyvoice.ai/v1/appointment-slots/regenerate",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth",
"sendBody": true,
"specifyBody": "json",
"jsonBody": "{\n \"date_from\": \"2026-06-15\",\n \"date_to\": \"2026-06-30\"\n}"
},
"id": "1",
"name": "Regenerate Schedule Tracking",
"type": "n8n-nodes-base.httpRequest",
"typeVersion": 4.2,
"position": [250, 300]
}
],
"connections": {},
"settings": {},
"meta": { "instanceId": "huskyvoice-docs" }
}
| Field | Required | Description |
|---|---|---|
date_from | Yes | Start of the regeneration range — YYYY-MM-DD |
date_to | No | End of the range — YYYY-MM-DD (defaults to date_from if omitted) |
Response — 200 OK
{
"success": true,
"processed": 16,
"skipped": 0,
"errors": 0,
"upserted": 16
}
Error Codes
| Status | Code | Cause |
|---|---|---|
400 | VALIDATION_ERROR | Missing required parameter (date or date_from) |
404 | NOT_FOUND | Schedule tracking record not found (PATCH only) |
403 | INSUFFICIENT_SCOPE | API key does not have the required scope |