Download OpenAPI specification:Download
Reference documentation for the webhook protocol that platforms implement to receive appointment requests from DialStack.
When DialStack's voice AI searches for availability or creates a booking, DialStack
sends webhook requests to your platform's configured webhook_url. Your platform
processes the request and returns a response that DialStack relays back to the voice AI.
Configure webhooks on your platform record:
https://api.yourplatform.com/dialstack)DialStack appends the endpoint path to your base URL:
{webhook_url}/customers/lookup{webhook_url}/availability/search{webhook_url}/bookingsAll webhook requests include these headers:
| Header | Description |
|---|---|
Content-Type |
Always application/json |
X-DialStack-Signature |
HMAC-SHA256 signature for verification |
X-DialStack-Account-Id |
The account ID for this request |
The X-DialStack-Signature header contains a timestamp and signature:
X-DialStack-Signature: t=1697634600,v1=5257a869e7ecebeda32affa62cdca3fa51cad7e77a0e56ff536d0ce8e108d8bd
To verify the signature:
t) and signature (v1) from the header{timestamp}.{request_body}HMAC-SHA256(webhook_secret, concatenated_string)v1 (use timing-safe comparison)Webhook endpoints that your platform implements to receive scheduling requests from DialStack.
These endpoints are called by DialStack when the voice AI needs to look up a customer, search for availability, or create a booking. Your platform processes the request and returns a response.
DialStack sends this request at the start of every call to determine if the caller is a new or existing customer.
Your platform should look up the caller by phone number and return their profile if found. Include upcoming appointment information if available — the voice AI uses this for context during the call.
| X-DialStack-Account-Id required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 The DialStack account ID for this request |
| account_id required | string The account ID (same as X-DialStack-Account-Id header) |
required | object |
| found required | boolean Whether a matching customer record was found |
object Customer details (present only when found is true) |
{- "account_id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
- "customer": {
- "phone": "+15551234567"
}
}{- "found": true,
- "customer": {
- "name": "Jane Smith",
- "phone": "+15551234567",
- "existing_appointment": {
- "start_at": "2024-01-20T14:00:00Z",
- "end_at": "2024-01-20T14:30:00Z",
- "status": "confirmed"
}
}
}DialStack sends this request when the voice AI needs to find available appointment slots.
Your platform should query your booking system and return matching availability.
| X-DialStack-Account-Id required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 The DialStack account ID for this request |
| account_id required | string The account ID (same as X-DialStack-Account-Id header) |
required | object (AvailabilityQuery) |
required | Array of objects (Availability) List of available appointment slots | ||||
Array
| |||||
{- "account_id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
- "query": {
- "filter": {
- "start_at_range": {
- "start_at": "2024-01-15T09:00:00Z",
- "end_at": "2024-01-15T17:00:00Z"
}
}
}
}{- "availabilities": [
- {
- "start_at": "2024-01-15T10:00:00Z",
- "duration_minutes": 30
}, - {
- "start_at": "2024-01-15T10:30:00Z",
- "duration_minutes": 30
}
]
}DialStack sends this request when the voice AI needs to book an appointment.
Your platform should:
idempotency_key - if you've seen it before, return the original responseIdempotency: The idempotency_key prevents duplicate bookings. Store it when
processing a booking, and if the same key arrives again, return the original
booking response. Keys can be safely expired after 24 hours.
| X-DialStack-Account-Id required | string Example: acct_01h2xcejqtf2nbrexx3vqjhp41 The DialStack account ID for this request |
| account_id required | string The account ID (same as X-DialStack-Account-Id header) |
| idempotency_key required | string Unique key to prevent duplicate bookings. If you receive the same key again, return the original booking response. Keys can be safely expired after 24 hours. |
required | object (BookingRequest) |
required | object (Booking) | ||||||||||||||||
| |||||||||||||||||
{- "account_id": "acct_01h2xcejqtf2nbrexx3vqjhp41",
- "idempotency_key": "booking-req-123456",
- "booking": {
- "start_at": "2024-01-15T10:00:00Z",
- "duration_minutes": 30,
- "customer": {
- "phone": "+15551234567",
- "name": "John Doe",
- "email": "john@example.com"
}, - "notes": "Initial consultation - referred by AI assistant"
}
}{- "booking": {
- "id": "bkg_01h2xcejqtf2nbrexx3vqjhp41",
- "status": "confirmed",
- "start_at": "2024-01-15T10:00:00Z",
- "end_at": "2024-01-15T10:30:00Z",
- "customer": {
- "phone": "+15551234567",
- "name": "John Doe"
}, - "location": {
- "name": "Main Office",
- "address": "123 Main St, City, ST 12345"
}, - "created_at": "2024-01-10T14:30:00Z"
}
}