Read Waitwhile visits, bookings, customers, services and analytics; add, update and cancel visits.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
WRITE: add one staff note to a customer's record (optionally tied to a visit and location). Adds only; nothing is edited or sent to the customer. POST /customers/{customerId}/notes.
The note text.
Customer id.
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
WRITE: add one staff note to a customer's record (optionally tied to a visit and location). Adds only; nothing is edited or sent to the customer. POST /customers/{customerId}/notes.
| Argument | Type | Description |
|---|---|---|
| content* | string | The note text. |
| visit_id | string | |
| customer_id* | string | Customer id. |
| location_id | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"customer_id",
"content"
],
"properties": {
"content": {
"type": "string",
"maxLength": 1000,
"minLength": 1,
"description": "The note text."
},
"visit_id": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"customer_id": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Customer id."
},
"location_id": {
"type": "string",
"maxLength": 100,
"minLength": 1
}
}
}WRITE: cancel ONE visit (a waitlist entry or booking). Waitwhile sets its state to COMPLETE and adds the CANCELLED tag; the visit is kept, not deleted. By default the request asks Waitwhile to suppress the customer message; this may only stop the immediate cancellation notice, and scheduled reminders/follow-ups can still go out per the location's settings. With send_notifications=true Waitwhile may text/e-mail this ONE customer. POST /visits/{visitId}/cancel.
| Argument | Type | Description |
|---|---|---|
| visit_id* | string | Visit id. |
| send_notifications | boolean | Default false: the request asks Waitwhile not to send the immediate confirmation/status message. This may not stop everything: scheduled reminders and follow-ups can still go out according to the location's own settings. Set true to let Waitwhile send its normal messages to the customer. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"visit_id"
],
"properties": {
"visit_id": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Visit id."
},
"send_notifications": {
"type": "boolean",
"description": "Default false: the request asks Waitwhile not to send the immediate confirmation/status message. This may not stop everything: scheduled reminders and follow-ups can still go out according to the location's own settings. Set true to let Waitwhile send its normal messages to the customer."
}
}
}WRITE: create ONE visit at a location. Without a date it adds the customer to the waitlist; with a local date-time (YYYY-MM-DDThh:mm) it creates a booking. Needs a location and at least a name, phone or e-mail. Not idempotent: calling it twice creates two visits. Visit notes are not supported here (the field is deprecated): use waitwhile_add_customer_note. By default the request asks Waitwhile to suppress the customer message; this may only stop the immediate confirmation, and scheduled reminders/follow-ups can still go out per the location's settings. With send_notifications=true Waitwhile may text/e-mail this ONE customer. POST /visits.
| Argument | Type | Description |
|---|---|---|
| date | string | Booking start in the location's local time, YYYY-MM-DDThh:mm. Omit to join the waitlist. |
| name | string | Customer name. |
| string | Customer e-mail. | |
| phone | string | Customer phone, E.164 (+16005551234). |
| duration | integer | Booking duration in seconds. |
| last_name | string | |
| first_name | string | |
| party_size |
The first available booking slots of a location (optionally for a party size, services and resources) from a date. Use it to propose appointment times. GET /visits/first-available-slots.
| Argument | Type | Description |
|---|---|---|
| to_date | string | Local end, YYYY-MM-DDThh:mm. |
| from_date | string | Local start, YYYY-MM-DDThh:mm. |
| party_size | integer | |
| location_id* | string | Location id. |
| service_ids | array | |
| resource_ids | array | |
| max_num_slots | integer | Max number of slots to return. |
| service_duration | integer | Service duration in seconds. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"location_id"
],
"properties": {
"to_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$",
"description": "Local end, YYYY-MM-DDThh:mm."
},
"from_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$",
"description": "Local start, YYYY-MM-DDThh:mm."
},
"party_size": {
"type": "integer",
"maximum": 100,
"minimum": 1
},
"location_id": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Location id."
},
"service_ids": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"maxItems": 30,
"minItems": 1
},
"resource_ids": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"maxItems": 30,
"minItems": 1
},
"max_num_slots": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Max number of slots to return."
},
"service_duration": {
"type": "integer",
"maximum": 86400,
"minimum": 60,
"description": "Service duration in seconds."
}
}
}One customer by id: contact details, tags, per-location state and last visit. Contains personal data. GET /customers/{customerId}.
| Argument | Type | Description |
|---|---|---|
| customer_id* | string | Customer id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"customer_id"
],
"properties": {
"customer_id": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Customer id."
}
}
}One data field by id. GET /data-fields/{dataFieldId}.
| Argument | Type | Description |
|---|---|---|
| data_field_id* | string | Data field id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"data_field_id"
],
"properties": {
"data_field_id": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Data field id."
}
}
}One location by id or short name (the part of its public Waitwhile URL). GET /locations/{shortNameOrId}.
| Argument | Type | Description |
|---|---|---|
| location* | string | Location id or short name. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"location"
],
"properties": {
"location": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Location id or short name."
}
}
}Live status of one location: open/closed, waiting and serving counts, estimated wait. GET /location-status/{locationId}.
| Argument | Type | Description |
|---|---|---|
| location_id* | string | Location id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"location_id"
],
"properties": {
"location_id": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Location id."
}
}
}One message by id. Contains personal data. GET /messages/{messageId}.
| Argument | Type | Description |
|---|---|---|
| message_id* | string | Message id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"message_id"
],
"properties": {
"message_id": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Message id."
}
}
}One resource by id. GET /resources/{resourceId}.
| Argument | Type | Description |
|---|---|---|
| resource_id* | string | Resource id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"resource_id"
],
"properties": {
"resource_id": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Resource id."
}
}
}One service by id. GET /services/{serviceId}.
| Argument | Type | Description |
|---|---|---|
| service_id* | string | Service id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"service_id"
],
"properties": {
"service_id": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Service id."
}
}
}One visit (waitlist entry or booking) by id: customer, state, tags, services, resources, party size, position, estimated wait and all timestamps. GET /visits/{visitId}.
| Argument | Type | Description |
|---|---|---|
| visit_id* | string | Visit id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"visit_id"
],
"properties": {
"visit_id": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Visit id."
}
}
}The account's audit log: who changed what and when (visits, customers, locations, services, resources, users, messages). Filter by type, event, entity, location or date. GET /audit-entries.
| Argument | Type | Description |
|---|---|---|
| desc | boolean | Newest first. |
| type | string | |
| event | string | Audit event type. |
| limit | integer | Results per page, 1-100 (default 20). |
| to_date | string | ISO 8601 date or date-time (e.g. 2026-10-01 or 2026-10-01T00:00:00Z). |
| entity_id | string | Id of the changed object. |
| from_date | string | ISO 8601 date or date-time (e.g. 2026-10-01 or 2026-10-01T00:00:00Z). |
| location_id | string | |
| start_after | string | Cursor: pass the previous reply's next_start_after to get the next page. |
Booking slots of a location for a date range with the free spots per resource and service, so you can see when an appointment can be booked. Dates are local to the location, YYYY-MM-DDThh:mm. GET /visits/availability.
| Argument | Type | Description |
|---|---|---|
| to_date | string | Local end, YYYY-MM-DDThh:mm. |
| from_date | string | Local start, YYYY-MM-DDThh:mm. |
| location_id* | string | Location id. |
| service_ids | array | Only slots for these services. |
| resource_ids | array | Only slots for these resources. |
| show_min_spots | integer | Only slots with at least this many free spots. |
| service_duration | integer | Service duration in seconds, to size the slots. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"location_id"
],
"properties": {
"to_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$",
"description": "Local end, YYYY-MM-DDThh:mm."
},
"from_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$",
"description": "Local start, YYYY-MM-DDThh:mm."
},
"location_id": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Location id."
},
"service_ids": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"maxItems": 30,
"minItems": 1,
"description": "Only slots for these services."
},
"resource_ids": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"maxItems": 30,
"minItems": 1,
"description": "Only slots for these resources."
},
"show_min_spots": {
"type": "integer",
"maximum": 1000,
"minimum": 1,
"description": "Only slots with at least this many free spots."
},
"service_duration": {
"type": "integer",
"maximum": 86400,
"minimum": 60,
"description": "Service duration in seconds, to size the slots."
}
}
}The staff notes recorded on a customer (content, author, visit and location, timestamps). GET /customers/{customerId}/notes.
| Argument | Type | Description |
|---|---|---|
| customer_id* | string | Customer id. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"customer_id"
],
"properties": {
"customer_id": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Customer id."
}
}
}List customers (name, phone, e-mail, tags, last visit per location, created/updated). Cursor-paged, 20 per page by default; filter by location, external id or created/updated date. Contains personal data. GET /customers.
| Argument | Type | Description |
|---|---|---|
| desc | boolean | Newest first. |
| limit | integer | Results per page, 1-100 (default 20). |
| to_date | string | ISO 8601 date or date-time (e.g. 2026-10-01T00:00:00Z), or epoch milliseconds. |
| from_date | string | ISO 8601 date or date-time (e.g. 2026-10-01T00:00:00Z), or epoch milliseconds. |
| external_id | string | |
| location_id | string | Only customers with visits at this location. |
| start_after | string | Cursor: pass the previous reply's next_start_after to get the next page. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"desc": {
"type": "boolean",
"description": "Newest first."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Results per page, 1-100 (default 20)."
},
"to_date": {
"type": "string",
"description": "ISO 8601 date or date-time (e.g. 2026-10-01T00:00:00Z), or epoch milliseconds."
},
"from_date": {
"type": "string",
"description": "ISO 8601 date or date-time (e.g. 2026-10-01T00:00:00Z), or epoch milliseconds."
},
"external_id": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"location_id": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Only customers with visits at this location."
},
"start_after": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "Cursor: pass the previous reply's next_start_after to get the next page."
}
}
}List the custom data fields (intake/booking form questions) with type, options and where they apply. Use the ids to read answers on visits. GET /data-fields.
| Argument | Type | Description |
|---|---|---|
| q | string | Prefix match on name or display name. |
| limit | integer | Results per page, 1-100 (default 20). |
| external_id | string | |
| location_id | array | Only items offered at these locations. |
| start_after | string | Cursor: pass the previous reply's next_start_after to get the next page. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"q": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Prefix match on name or display name."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Results per page, 1-100 (default 20)."
},
"external_id": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"location_id": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"maxItems": 30,
"minItems": 1,
"description": "Only items offered at these locations."
},
"start_after": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "Cursor: pass the previous reply's next_start_after to get the next page."
}
}
}Live status of every location: open/closed, number of people waiting and being served, current estimated wait time, and booking counters. GET /location-status.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Results per page, 1-100 (default 20). |
| start_after | string | Cursor: pass the previous reply's next_start_after to get the next page. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Results per page, 1-100 (default 20)."
},
"start_after": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "Cursor: pass the previous reply's next_start_after to get the next page."
}
}
}List the account's locations (businesses/sites): id, name, short name, address, time zone, opening hours and waitlist/booking settings. Use the ids to filter visits, services and resources. GET /locations.
| Argument | Type | Description |
|---|---|---|
| desc | boolean | Newest first. |
| limit | integer | Results per page, 1-100 (default 20). |
| external_id | string | Only the location with this external id. |
| start_after | string | Cursor: pass the previous reply's next_start_after to get the next page. |
| country_code | string | Two-letter country code. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"desc": {
"type": "boolean",
"description": "Newest first."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Results per page, 1-100 (default 20)."
},
"external_id": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Only the location with this external id."
},
"start_after": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "Cursor: pass the previous reply's next_start_after to get the next page."
},
"country_code": {
"type": "string",
"maxLength": 2,
"minLength": 2,
"description": "Two-letter country code."
}
}
}List the SMS/e-mail messages Waitwhile sent to and received from customers: channel, recipient, body, delivery state (PENDING, BLOCKED, FAILED, DELIVERED, UNCONFIRMED, RECEIVED) and error. Filter by location, visit, customer, state or date. Contains personal data. This only reads; it cannot send. GET /messages.
| Argument | Type | Description |
|---|---|---|
| desc | boolean | Newest first. |
| limit | integer | Results per page, 1-100 (default 20). |
| state | string | |
| to_date | string | ISO 8601 date or date-time (e.g. 2026-10-01T00:00:00Z), or epoch milliseconds. |
| visit_id | string | |
| from_date | string | ISO 8601 date or date-time (e.g. 2026-10-01T00:00:00Z), or epoch milliseconds. |
| customer_id | string | |
| location_id | string | |
| start_after | string | Cursor: pass the previous reply's next_start_after to get the next page. |
List resources — the people, rooms, tables or equipment that serve customers: name, locations, services, availability flag and category structure. GET /resources.
| Argument | Type | Description |
|---|---|---|
| q | string | Prefix match on name or display name. |
| string | Only the resource with this e-mail. | |
| limit | integer | Results per page, 1-100 (default 20). |
| parent_id | string | Only children of this category. |
| external_id | string | |
| is_category | boolean | Only resource categories (true) or only resources (false). |
| location_id | array | Only items offered at these locations. |
| start_after | string | Cursor: pass the previous reply's next_start_after to get the next page. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"q": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Prefix match on name or display name."
},
"email": {
"type": "string",
"maxLength": 200,
"minLength": 3,
"description": "Only the resource with this e-mail."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Results per page, 1-100 (default 20)."
},
"parent_id": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Only children of this category."
},
"external_id": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"is_category": {
"type": "boolean",
"description": "Only resource categories (true) or only resources (false)."
},
"location_id": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"maxItems": 30,
"minItems": 1,
"description": "Only items offered at these locations."
},
"start_after": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "Cursor: pass the previous reply's next_start_after to get the next page."
}
}
}List services (what customers book or queue for): name, duration, price, locations, resources and category structure. GET /services.
| Argument | Type | Description |
|---|---|---|
| q | string | Prefix match on name or display name. |
| limit | integer | Results per page, 1-100 (default 20). |
| parent_id | string | Only children of this category. |
| external_id | string | |
| is_category | boolean | Only service categories (true) or only services (false). |
| location_id | array | Only items offered at these locations. |
| start_after | string | Cursor: pass the previous reply's next_start_after to get the next page. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"q": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Prefix match on name or display name."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Results per page, 1-100 (default 20)."
},
"parent_id": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Only children of this category."
},
"external_id": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"is_category": {
"type": "boolean",
"description": "Only service categories (true) or only services (false)."
},
"location_id": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"maxItems": 30,
"minItems": 1,
"description": "Only items offered at these locations."
},
"start_after": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "Cursor: pass the previous reply's next_start_after to get the next page."
}
}
}List the staff users of the account: name, e-mail, roles, locations. Password data and tokens are never returned. GET /users.
| Argument | Type | Description |
|---|---|---|
| q | string | Prefix match on name or e-mail. |
| role | array | Only users with these roles. |
| limit | integer | Results per page, 1-100 (default 20). |
| external_id | string | |
| location_id | array | Only users with access to these locations. |
| start_after | string | Cursor: pass the previous reply's next_start_after to get the next page. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"q": {
"type": "string",
"maxLength": 200,
"minLength": 1,
"description": "Prefix match on name or e-mail."
},
"role": {
"type": "array",
"items": {
"type": "string",
"maxLength": 50,
"minLength": 1
},
"maxItems": 10,
"minItems": 1,
"description": "Only users with these roles."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Results per page, 1-100 (default 20)."
},
"external_id": {
"type": "string",
"maxLength": 200,
"minLength": 1
},
"location_id": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"maxItems": 30,
"minItems": 1,
"description": "Only users with access to these locations."
},
"start_after": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "Cursor: pass the previous reply's next_start_after to get the next page."
}
}
}List visits: waitlist entries (people in line) and bookings (appointments), with customer, state (PENDING, DRAFT, BOOKED, WAITING, SERVING, COMPLETE), tags (e.g. NO-SHOW, CANCELLED, ARRIVED), services, resources, party size, position and timestamps. Filter by location, state, tag, customer, service, resource, booking date (local time) or created/updated date. Cursor-paged. Contains customer contact details. GET /visits.
| Argument | Type | Description |
|---|---|---|
| tag | string | |
| desc | boolean | Newest first. |
| limit | integer | Results per page, 1-100 (default 20). |
| state | string | |
| to_date | string | Visits created up to this date-time (ISO 8601 or epoch ms). |
| from_date | string | Visits created from this date-time (ISO 8601 or epoch ms). |
| service_id | string | |
| customer_id | string | |
| location_id | string |
Working hours/availability of a location's resources on a date (e.g. who is working today). GET /resources/availability.
| Argument | Type | Description |
|---|---|---|
| date | string | Date (yyyy-mm-dd) or ISO 8601 date-time; default today. |
| location_id* | string | Location id. |
| resource_ids | array | Only these resources. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"location_id"
],
"properties": {
"date": {
"type": "string",
"description": "Date (yyyy-mm-dd) or ISO 8601 date-time; default today."
},
"location_id": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Location id."
},
"resource_ids": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"maxItems": 30,
"minItems": 1,
"description": "Only these resources."
}
}
}Search customers by a prefix match on name, phone, e-mail or customer id; optionally narrowed by location, visit state or tag. Page-numbered. Contains personal data. GET /customers/search.
| Argument | Type | Description |
|---|---|---|
| q* | string | Prefix match on name, phone, e-mail or customer id. |
| tag | string | |
| page | integer | Page number, from 1 (default 1). Pass the previous reply's next_page. |
| limit | integer | Results per page, 1-100 (default 20). |
| state | string | |
| location_id | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"q"
],
"properties": {
"q": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Prefix match on name, phone, e-mail or customer id."
},
"tag": {
"enum": [
"NO-SHOW",
"CANCELLED",
"REMOVED",
"ALERTED",
"ARRIVED",
"DELAYED",
"CONFIRMED",
"EXPIRED",
"FLAGGED",
"IMPORTED",
"PRIORITIZED",
"CAPACITY",
"REJECTED",
"QUICK"
],
"type": "string"
},
"page": {
"type": "integer",
"maximum": 1000000,
"minimum": 1,
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Results per page, 1-100 (default 20)."
},
"state": {
"enum": [
"PENDING",
"DRAFT",
"BOOKED",
"WAITING",
"SERVING",
"COMPLETE"
],
"type": "string"
},
"location_id": {
"type": "string",
"maxLength": 100,
"minLength": 1
}
}
}Search visits by a prefix match on customer name, phone, e-mail or customer id, optionally filtered by location, state, tag and excluded tags. Page-numbered. Contains customer contact details. GET /visits/search.
| Argument | Type | Description |
|---|---|---|
| q* | string | Prefix match on name, phone, e-mail or customer id. |
| tag | string | |
| page | integer | Page number, from 1 (default 1). Pass the previous reply's next_page. |
| limit | integer | Results per page, 1-100 (default 20). |
| state | string | |
| location_id | string | |
| exclude_tags | array | Leave out visits carrying any of these tags. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"q"
],
"properties": {
"q": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Prefix match on name, phone, e-mail or customer id."
},
"tag": {
"enum": [
"NO-SHOW",
"CANCELLED",
"REMOVED",
"ALERTED",
"ARRIVED",
"DELAYED",
"CONFIRMED",
"EXPIRED",
"FLAGGED",
"IMPORTED",
"PRIORITIZED",
"CAPACITY",
"REJECTED",
"QUICK"
],
"type": "string"
},
"page": {
"type": "integer",
"maximum": 1000000,
"minimum": 1,
"description": "Page number, from 1 (default 1). Pass the previous reply's next_page."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Results per page, 1-100 (default 20)."
},
"state": {
"enum": [
"PENDING",
"DRAFT",
"BOOKED",
"WAITING",
"SERVING",
"COMPLETE"
],
"type": "string"
},
"location_id": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"exclude_tags": {
"type": "array",
"items": {
"enum": [
"NO-SHOW",
"CANCELLED",
"REMOVED",
"ALERTED",
"ARRIVED",
"DELAYED",
"CONFIRMED",
"EXPIRED",
"FLAGGED",
"IMPORTED",
"PRIORITIZED",
"CAPACITY",
"REJECTED",
"QUICK"
],
"type": "string"
},
"maxItems": 10,
"description": "Leave out visits carrying any of these tags."
}
}
}WRITE: change ONE visit — its state (e.g. WAITING to SERVING to COMPLETE, or BOOKED), add/remove tags (e.g. ARRIVED, CONFIRMED, NO-SHOW), booking date/duration or party size. Only the fields you pass change. By default the request asks Waitwhile to suppress the customer message; this may only stop the immediate status message, and scheduled reminders/follow-ups can still go out per the location's settings. With send_notifications=true Waitwhile may text/e-mail this ONE customer. Use waitwhile_cancel_visit to cancel. POST /visits/{visitId}.
| Argument | Type | Description |
|---|---|---|
| date | string | New booking start, local time YYYY-MM-DDThh:mm. |
| state | string | New state. |
| add_tags | array | Tags to add. |
| duration | integer | New booking duration in seconds. |
| visit_id* | string | Visit id. |
| party_size | integer | |
| remove_tags | array | Tags to remove. |
| send_notifications | boolean | Default false: the request asks Waitwhile not to send the immediate confirmation/status message. This may not stop everything: scheduled reminders and follow-ups can still go out according to the location's own settings. Set true to let Waitwhile send its normal messages to the customer. |
Aggregated visit statistics for a period: visits, waitlisted, bookings, served, no-shows, cancellations, wait and serve duration quantiles, and breakdowns by location, resource, service, party size, user, day of week and hour of day. GET /analytics/visits (JSON).
| Argument | Type | Description |
|---|---|---|
| to_date | string | Period end (ISO 8601 or epoch ms). |
| from_date | string | Period start (ISO 8601 or epoch ms). |
| location_id | string | Only this location (default: all). |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"to_date": {
"type": "string",
"description": "Period end (ISO 8601 or epoch ms)."
},
"from_date": {
"type": "string",
"description": "Period start (ISO 8601 or epoch ms)."
},
"location_id": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Only this location (default: all)."
}
}
}| integer |
| location_id* | string | Location id (see waitwhile_list_locations). |
| service_ids | array | Services the customer wants. |
| resource_ids | array | Preferred resources (staff, rooms). |
| send_notifications | boolean | Default false: the request asks Waitwhile not to send the immediate confirmation/status message. This may not stop everything: scheduled reminders and follow-ups can still go out according to the location's own settings. Set true to let Waitwhile send its normal messages to the customer. |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"location_id"
],
"properties": {
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$",
"description": "Booking start in the location's local time, YYYY-MM-DDThh:mm. Omit to join the waitlist."
},
"name": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Customer name."
},
"email": {
"type": "string",
"format": "email",
"pattern": "^(?:[A-Za-z0-9_'+\\-]+\\.)*[A-Za-z0-9_'+\\-]*[A-Za-z0-9_+-]@(?:[A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$",
"maxLength": 100,
"description": "Customer e-mail."
},
"phone": {
"type": "string",
"pattern": "^\\+[1-9]\\d{6,14}$",
"description": "Customer phone, E.164 (+16005551234)."
},
"duration": {
"type": "integer",
"maximum": 86400,
"minimum": 0,
"description": "Booking duration in seconds."
},
"last_name": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"first_name": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"party_size": {
"type": "integer",
"maximum": 100,
"minimum": 1
},
"location_id": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Location id (see waitwhile_list_locations)."
},
"service_ids": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"maxItems": 30,
"minItems": 1,
"description": "Services the customer wants."
},
"resource_ids": {
"type": "array",
"items": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"maxItems": 30,
"minItems": 1,
"description": "Preferred resources (staff, rooms)."
},
"send_notifications": {
"type": "boolean",
"description": "Default false: the request asks Waitwhile not to send the immediate confirmation/status message. This may not stop everything: scheduled reminders and follow-ups can still go out according to the location's own settings. Set true to let Waitwhile send its normal messages to the customer."
}
}
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"desc": {
"type": "boolean",
"description": "Newest first."
},
"type": {
"enum": [
"ACCOUNT",
"CUSTOMER",
"DATA-FIELD",
"MESSAGE",
"LOCATION",
"RESOURCE",
"SERVICE",
"USER",
"VISIT"
],
"type": "string"
},
"event": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Audit event type."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Results per page, 1-100 (default 20)."
},
"to_date": {
"type": "string",
"description": "ISO 8601 date or date-time (e.g. 2026-10-01 or 2026-10-01T00:00:00Z)."
},
"entity_id": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Id of the changed object."
},
"from_date": {
"type": "string",
"description": "ISO 8601 date or date-time (e.g. 2026-10-01 or 2026-10-01T00:00:00Z)."
},
"location_id": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"start_after": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "Cursor: pass the previous reply's next_start_after to get the next page."
}
}
}| external_customer_id | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"desc": {
"type": "boolean",
"description": "Newest first."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Results per page, 1-100 (default 20)."
},
"state": {
"enum": [
"PENDING",
"BLOCKED",
"FAILED",
"DELIVERED",
"UNCONFIRMED",
"RECEIVED"
],
"type": "string"
},
"to_date": {
"type": "string",
"description": "ISO 8601 date or date-time (e.g. 2026-10-01T00:00:00Z), or epoch milliseconds."
},
"visit_id": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"from_date": {
"type": "string",
"description": "ISO 8601 date or date-time (e.g. 2026-10-01T00:00:00Z), or epoch milliseconds."
},
"customer_id": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"location_id": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"start_after": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "Cursor: pass the previous reply's next_start_after to get the next page."
},
"external_customer_id": {
"type": "string",
"maxLength": 200,
"minLength": 1
}
}
}| Only visits at this location. |
| resource_id | string |
| start_after | string | Cursor: pass the previous reply's next_start_after to get the next page. |
| to_booking_date | string | Bookings starting at or before this local date-time, YYYY-MM-DDThh:mm. |
| from_booking_date | string | Bookings starting at or after this local date-time, YYYY-MM-DDThh:mm. |
| external_customer_id | string |
{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"properties": {
"tag": {
"enum": [
"NO-SHOW",
"CANCELLED",
"REMOVED",
"ALERTED",
"ARRIVED",
"DELAYED",
"CONFIRMED",
"EXPIRED",
"FLAGGED",
"IMPORTED",
"PRIORITIZED",
"CAPACITY",
"REJECTED",
"QUICK"
],
"type": "string"
},
"desc": {
"type": "boolean",
"description": "Newest first."
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Results per page, 1-100 (default 20)."
},
"state": {
"enum": [
"PENDING",
"DRAFT",
"BOOKED",
"WAITING",
"SERVING",
"COMPLETE"
],
"type": "string"
},
"to_date": {
"type": "string",
"description": "Visits created up to this date-time (ISO 8601 or epoch ms)."
},
"from_date": {
"type": "string",
"description": "Visits created from this date-time (ISO 8601 or epoch ms)."
},
"service_id": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"customer_id": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"location_id": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Only visits at this location."
},
"resource_id": {
"type": "string",
"maxLength": 100,
"minLength": 1
},
"start_after": {
"type": "string",
"maxLength": 500,
"minLength": 1,
"description": "Cursor: pass the previous reply's next_start_after to get the next page."
},
"to_booking_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$",
"description": "Bookings starting at or before this local date-time, YYYY-MM-DDThh:mm."
},
"from_booking_date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$",
"description": "Bookings starting at or after this local date-time, YYYY-MM-DDThh:mm."
},
"external_customer_id": {
"type": "string",
"maxLength": 200,
"minLength": 1
}
}
}{
"type": "object",
"$schema": "https://json-schema.org/draft/2020-12/schema",
"required": [
"visit_id"
],
"properties": {
"date": {
"type": "string",
"pattern": "^\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}$",
"description": "New booking start, local time YYYY-MM-DDThh:mm."
},
"state": {
"enum": [
"PENDING",
"DRAFT",
"BOOKED",
"WAITING",
"SERVING",
"COMPLETE"
],
"type": "string",
"description": "New state."
},
"add_tags": {
"type": "array",
"items": {
"enum": [
"NO-SHOW",
"CANCELLED",
"REMOVED",
"ALERTED",
"ARRIVED",
"DELAYED",
"CONFIRMED",
"EXPIRED",
"FLAGGED",
"IMPORTED",
"PRIORITIZED",
"CAPACITY",
"REJECTED",
"QUICK"
],
"type": "string"
},
"maxItems": 10,
"minItems": 1,
"description": "Tags to add."
},
"duration": {
"type": "integer",
"maximum": 86400,
"minimum": 0,
"description": "New booking duration in seconds."
},
"visit_id": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "Visit id."
},
"party_size": {
"type": "integer",
"maximum": 100,
"minimum": 1
},
"remove_tags": {
"type": "array",
"items": {
"enum": [
"NO-SHOW",
"CANCELLED",
"REMOVED",
"ALERTED",
"ARRIVED",
"DELAYED",
"CONFIRMED",
"EXPIRED",
"FLAGGED",
"IMPORTED",
"PRIORITIZED",
"CAPACITY",
"REJECTED",
"QUICK"
],
"type": "string"
},
"maxItems": 10,
"minItems": 1,
"description": "Tags to remove."
},
"send_notifications": {
"type": "boolean",
"description": "Default false: the request asks Waitwhile not to send the immediate confirmation/status message. This may not stop everything: scheduled reminders and follow-ups can still go out according to the location's own settings. Set true to let Waitwhile send its normal messages to the customer."
}
}
}