Check bookings, review calls and chats, and manage appointments in your Nexwin AI receptionist.
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.
Explains what Nexwin is and how to sign up. Use when the user asks what Nexwin is, what it does, or how to get started — no account connection needed.
This tool takes no arguments.
Explains what Nexwin is and how to sign up. Use when the user asks what Nexwin is, what it does, or how to get started — no account connection needed.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Adds bookable assets (rooms, campsites, vehicles, equipment) to the connected Nexwin account, up to 100 in one call, and tells the live receptionist about them. Use it to set up a whole list the user has pasted or uploaded. All of them are added or none: if any row is invalid, or a name is already in use, nothing is saved and the error says which row. Identical units go in one asset with a quantity (e.g. "Standard Room", quantity 12) rather than twelve assets. bookingType: nightly (check in one day, out a later day), day (a block within one day), date_range (whole days), or not_applicable. Executes immediately. Call list_assets first to avoid clashing names.
| Argument | Type | Description |
|---|---|---|
| assets* | array |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"assets"
],
"properties": {
"assets": {
"type": "array",
"items": {
"type": "object",
"required": [
"name",
"assetType",
"quantity",
"bookingType"
],
"properties": {
"name": {
"type": "string",
"maxLength": 120,
"minLength": 1,
"description": "e.g. \"Site 12\", \"Deluxe King Room\", \"Toyota Camry #3\""
},
"hideName": {
"type": "boolean",
"description": "true if the receptionist should never say this specific name to callers"
},
"quantity": {
"type": "integer",
"maximum": 1000,
"minimum": 1,
"description": "Identical bookable units this asset stands for"
},
"assetType": {
"type": "string",
"maxLength": 60,
"minLength": 1,
"description": "e.g. \"Campsite\", \"Hotel Room\", \"Car\""
},
"bookingType": {
"enum": [
"nightly",
"day",
"date_range",
"not_applicable"
],
"type": "string"
},
"checkInTime": {
"type": "string",
"description": "HH:mm, business-local. Default 14:00 (nightly) or the day start"
},
"description": {
"type": "string",
"maxLength": 500,
"description": "What the receptionist says when a caller asks about it"
},
"checkOutTime": {
"type": "string",
"description": "HH:mm, business-local. Default 10:00 (nightly) or the day end"
}
},
"additionalProperties": false
},
"maxItems": 100,
"minItems": 1
}
},
"additionalProperties": false
}Adds a person to the connected Nexwin account's team without a login, so bookings can be made with them. Nobody is emailed. Use invite_team_member instead if they need to sign in. Set isInternalOnly for someone callers should never be told about by name. Returns the new teamMemberId.
| Argument | Type | Description |
|---|---|---|
| string | Optional; kept on their profile | |
| lastName* | string | |
| timezone | string | IANA timezone, e.g. Australia/Sydney (the default) |
| firstName* | string | |
| isInternalOnly | boolean | true hides this person's name from callers |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"firstName",
"lastName"
],
"properties": {
"email": {
"type": "string",
"format": "email",
"description": "Optional; kept on their profile"
},
"lastName": {
"type": "string",
"minLength": 1
},
"timezone": {
"type": "string",
"description": "IANA timezone, e.g. Australia/Sydney (the default)"
},
"firstName": {
"type": "string",
"minLength": 1
},
"isInternalOnly": {
"type": "boolean",
"description": "true hides this person's name from callers"
}
},
"additionalProperties": false
}Cancels a booking (appointmentId from get_bookings) by PERMANENTLY DELETING it — it will not appear afterwards, even as canceled. Also removes its Zoom meeting and calendar event and emails the customer a cancellation. Cannot be undone. Before calling, tell the user which booking (customer, time) will be cancelled and that the customer will be emailed, and get their explicit yes; then pass confirm: true.
| Argument | Type | Description |
|---|---|---|
| confirm* | boolean | true only after the user has explicitly confirmed cancelling this specific booking in the conversation |
| appointmentId* | string | From get_bookings |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"appointmentId",
"confirm"
],
"properties": {
"confirm": {
"type": "boolean",
"description": "true only after the user has explicitly confirmed cancelling this specific booking in the conversation"
},
"appointmentId": {
"type": "string",
"description": "From get_bookings"
}
},
"additionalProperties": false
}Creates a new appointment on the connected Nexwin account and emails the customer a confirmation. Executes immediately. Get teamMemberId and timezone from list_team_members first. Online bookings require customerEmail and create a Zoom meeting; in-person bookings need customerEmail or customerPhone. Fails if the team member is already booked at that time.
| Argument | Type | Description |
|---|---|---|
| title* | string | |
| endTime* | string | ISO 8601 with UTC offset, e.g. 2026-09-20T15:00:00+10:00 |
| timezone* | string | IANA timezone, e.g. Australia/Sydney — use the team member's timezone from list_team_members |
| startTime* | string | ISO 8601 with UTC offset, e.g. 2026-09-20T14:00:00+10:00 |
| meetingType* | string | |
| customerName* | string | |
| teamMemberId* | string | From list_team_members |
| customerEmail | string | |
Looks up customers on the connected Nexwin account by part of a name, phone number or email address. Returns contact details, how often they've called or chatted, and what their last conversation was about. Use for "has Sam called before?" or "what did Sam want last time?".
| Argument | Type | Description |
|---|---|---|
| limit | integer | Most matches to return (default 10) |
| search* | string | Part of a name, phone number or email address |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"search"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 20,
"minimum": 1,
"description": "Most matches to return (default 10)"
},
"search": {
"type": "string",
"minLength": 2,
"description": "Part of a name, phone number or email address"
}
},
"additionalProperties": false
}Plan, subscription status, minutes/messages used this period, and wallet balance for the connected Nexwin account.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Summarises what happened on the connected Nexwin account over a period: the answer to "what's happened the last two days?" or "anything I need to follow up?". Returns totals for calls and for chats (how many, resolved, needing follow-up, transferred to staff, sentiment, bookings made) and one entry per conversation, newest first, with the receptionist's own summary and action items. Give lastDays (today counts as day 1, in the business's timezone) or startDate and endDate; 30 days at most. Set followUpsOnly for "who do I need to call back?". For a full transcript, pass an entry's channel and id to get_call_chat_detail.
| Argument | Type | Description |
|---|---|---|
| endDate | string | YYYY-MM-DD, business-local |
| lastDays | integer | How many days back, today included. Use instead of startDate/endDate. |
| maxItems | integer | Conversations to list (default 50) |
| startDate | string | YYYY-MM-DD, business-local |
| followUpsOnly | boolean | Only list conversations that have action items |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"endDate": {
"type": "string",
"description": "YYYY-MM-DD, business-local"
},
"lastDays": {
"type": "integer",
"maximum": 30,
"minimum": 1,
"description": "How many days back, today included. Use instead of startDate/endDate."
},
"maxItems": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Conversations to list (default 50)"
},
"startDate": {
"type": "string",
"description": "YYYY-MM-DD, business-local"
},
"followUpsOnly": {
"type": "boolean",
"description": "Only list conversations that have action items"
}
},
"additionalProperties": false
}Shows how the connected account's AI receptionist is set up right now, as callers hear it: business name, about text and address, the How to Handle Calls handbook, the receptionist's name and greetings, what it does after hours, whether confirmation emails go out, the service area (every place served, and what happens to callers outside it), and the business hours (read-only). Also lists the last few published versions, for restore_ai_setup_version. Call this before update_ai_setup so a change is based on the current wording.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Lists the connected Nexwin account's appointments/bookings in a date range (max 30 days, first 25 results). Each booking includes its appointmentId and teamMemberId (needed for reschedule_booking and cancel_booking), exact ISO startTime/endTime, and timezone. Requires a connected account.
| Argument | Type | Description |
|---|---|---|
| status | string | |
| endDate* | string | YYYY-MM-DD, business-local |
| startDate* | string | YYYY-MM-DD, business-local |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"startDate",
"endDate"
],
"properties": {
"status": {
"enum": [
"scheduled",
"confirmed",
"canceled",
"completed"
],
"type": "string"
},
"endDate": {
"type": "string",
"description": "YYYY-MM-DD, business-local"
},
"startDate": {
"type": "string",
"description": "YYYY-MM-DD, business-local"
}
},
"additionalProperties": false
}Fetches the full transcript and detail for one call or chat, by id. Requires a connected account.
| Argument | Type | Description |
|---|---|---|
| id* | string | The callId or chatId from get_call_chat_history |
| channel* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"channel",
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The callId or chatId from get_call_chat_history"
},
"channel": {
"enum": [
"call",
"chat"
],
"type": "string"
}
},
"additionalProperties": false
}Lists recent calls or chats for the connected Nexwin account in a date range, without full transcripts. Requires a connected account.
| Argument | Type | Description |
|---|---|---|
| limit | integer | |
| channel* | string | |
| endDate* | string | YYYY-MM-DD |
| startDate* | string | YYYY-MM-DD |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"channel",
"startDate",
"endDate"
],
"properties": {
"limit": {
"type": "integer",
"maximum": 25,
"minimum": 1
},
"channel": {
"enum": [
"call",
"chat"
],
"type": "string"
},
"endDate": {
"type": "string",
"description": "YYYY-MM-DD"
},
"startDate": {
"type": "string",
"description": "YYYY-MM-DD"
}
},
"additionalProperties": false
}Adds customers to the connected Nexwin account, up to 200 in one call, from a list the user has pasted or uploaded. The receptionist then recognises them by phone number when they call. A row whose phone number or email already belongs to a customer is skipped, as is a row with no first name; the result says how many of each. Existing customers are never changed. Nobody is contacted. Executes immediately.
| Argument | Type | Description |
|---|---|---|
| customers* | array |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"customers"
],
"properties": {
"customers": {
"type": "array",
"items": {
"type": "object",
"required": [
"firstName"
],
"properties": {
"email": {
"type": "string",
"maxLength": 254
},
"notes": {
"type": "string",
"maxLength": 1000,
"description": "Anything the receptionist should know about this customer"
},
"phone": {
"type": "string",
"maxLength": 30,
"description": "Include the country code or leading 0, e.g. 0412 345 678"
},
"address": {
"type": "string",
"maxLength": 300
},
"lastName": {
"type": "string",
"maxLength": 80
},
"firstName": {
"type": "string",
"maxLength": 80,
"minLength": 1
}
},
"additionalProperties": false
},
"maxItems": 200,
"minItems": 1
}
},
"additionalProperties": false
}Emails someone an invitation to join the connected Nexwin account with their own login. They become a team member once they accept; the link expires after 24 hours. Use add_team_member instead for a person who only needs to be bookable and won't sign in. The invitee starts with calendar access only; access to call history, the knowledge base or AI Setup is granted in the Nexwin dashboard. Executes immediately: the email is sent as soon as this is called, so check the address with the user first.
| Argument | Type | Description |
|---|---|---|
| role* | string | admin can manage the team and settings; member cannot |
| email* | string | |
| lastName* | string | |
| timezone | string | IANA timezone, e.g. Australia/Sydney (the default) |
| firstName* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"email",
"firstName",
"lastName",
"role"
],
"properties": {
"role": {
"enum": [
"admin",
"member"
],
"type": "string",
"description": "admin can manage the team and settings; member cannot"
},
"email": {
"type": "string",
"format": "email"
},
"lastName": {
"type": "string",
"minLength": 1
},
"timezone": {
"type": "string",
"description": "IANA timezone, e.g. Australia/Sydney (the default)"
},
"firstName": {
"type": "string",
"minLength": 1
}
},
"additionalProperties": false
}Lists the bookable assets on the connected Nexwin account: things customers book rather than people, such as hotel rooms, campsites, vehicles or equipment. Shows each asset's type, how many identical units it has, how it is booked and its check-in and check-out times. Call this before add_assets to see what is already there.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}Lists the connected Nexwin account's active team members with their teamMemberId and timezone. Call this before create_booking to get a real teamMemberId and the timezone to book in. Requires a connected account.
No arguments.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {}
}PERMANENTLY removes a team member (teamMemberId from list_team_members) from the connected Nexwin account. If they have a login it is deleted, so they can no longer sign in, and their connected calendars are disconnected. Cannot be undone; they would have to be invited again. The account owner cannot be removed, and nobody can remove themselves. Before calling, tell the user exactly who will be removed and that their sign-in is deleted, and get their explicit yes; then pass confirm: true.
| Argument | Type | Description |
|---|---|---|
| confirm* | boolean | true only after the user has explicitly confirmed removing this specific person in the conversation |
| teamMemberId* | string | From list_team_members |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"teamMemberId",
"confirm"
],
"properties": {
"confirm": {
"type": "boolean",
"description": "true only after the user has explicitly confirmed removing this specific person in the conversation"
},
"teamMemberId": {
"type": "string",
"description": "From list_team_members"
}
},
"additionalProperties": false
}Moves an existing booking (appointmentId from get_bookings) to a new time and emails the customer about the change. Before calling, tell the user which booking (customer, current time) is moving to which new time, and get their explicit yes; then pass confirm: true. Executes as soon as it is called with confirm: true.
| Argument | Type | Description |
|---|---|---|
| confirm* | boolean | true only after the user has explicitly confirmed this specific change in the conversation |
| endTime* | string | ISO 8601 with UTC offset, e.g. 2026-09-20T15:00:00+10:00 |
| timezone | string | IANA timezone; defaults to the booking’s existing timezone |
| startTime* | string | ISO 8601 with UTC offset, e.g. 2026-09-20T14:00:00+10:00 |
| appointmentId* | string | From get_bookings |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"appointmentId",
"startTime",
"endTime",
"confirm"
],
"properties": {
"confirm": {
"type": "boolean",
"description": "true only after the user has explicitly confirmed this specific change in the conversation"
},
"endTime": {
"type": "string",
"description": "ISO 8601 with UTC offset, e.g. 2026-09-20T15:00:00+10:00"
},
"timezone": {
"type": "string",
"description": "IANA timezone; defaults to the booking’s existing timezone"
},
"startTime": {
"type": "string",
"description": "ISO 8601 with UTC offset, e.g. 2026-09-20T14:00:00+10:00"
},
"appointmentId": {
"type": "string",
"description": "From get_bookings"
}
},
"additionalProperties": false
}Undoes changes made with update_ai_setup or update_service_area by putting those same settings back to what they were in an earlier published version (version numbers come from get_ai_setup or from an update result). Goes live for callers straight away and is itself saved as a new version. Settings those tools cannot change are left as they are now. A version published from the Nexwin dashboard doesn't record its list of areas, so restoring one leaves the service area as it is; the result says so. Before calling, tell the user which version is being restored and get their explicit yes; then pass confirm: true.
| Argument | Type | Description |
|---|---|---|
| confirm* | boolean | true only after the user has explicitly approved restoring this version in the conversation |
| version* | integer | The published version to go back to |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"version",
"confirm"
],
"properties": {
"confirm": {
"type": "boolean",
"description": "true only after the user has explicitly approved restoring this version in the conversation"
},
"version": {
"type": "integer",
"minimum": 1,
"description": "The published version to go back to"
}
},
"additionalProperties": false
}Changes how the connected account's AI receptionist answers, and puts the change live for real callers straight away. Editable fields: businessName, aboutYourBusiness (max 500 characters), businessAddress, handbook (the How to Handle Calls instructions), assistantName, greetingNew, greetingReturning, afterHoursAction (message, callback or voicemail) and sendConfirmationEmail (true or false). For the handbook, set append: true to add a line to the end of what's there, or remove: true to take one exact piece of text back out and leave the rest untouched; with neither, the whole handbook is replaced. Call get_ai_setup first. Before calling, tell the user exactly which settings will change and to what, and get their explicit yes; then pass confirm: true. All changes in one call are applied together or not at all, and are saved as a new version that restore_ai_setup_version can undo. For something temporary (someone on leave, a holiday closure): append a note to the handbook that carries its own dates, e.g. "TEMPORARY, from Mon 12 Oct 2026 until Sun 18 Oct 2026: Raj is on leave. Offer callers a callback from Monday 19 October. Ignore this note outside those dates." Nothing removes the note automatically, so tell the user it stays in the handbook until they ask you to take it out, which is another call with remove: true and the exact text of the note.
| Argument | Type | Description |
|---|---|---|
| changes* | array | |
| confirm* | boolean | true only after the user has explicitly approved these specific changes in the conversation |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"changes",
"confirm"
],
"properties": {
"changes": {
"type": "array",
"items": {
"type": "object",
"required": [
"field",
"value"
],
"properties": {
"field": {
"enum": [
"businessName",
"aboutYourBusiness",
"businessAddress",
"handbook",
"assistantName",
"greetingNew",
"greetingReturning",
"afterHoursAction",
"sendConfirmationEmail"
],
"type": "string"
},
"value": {
"type": [
"string",
"boolean"
],
"description": "Text for most fields; true or false for sendConfirmationEmail"
},
"append": {
"type": "boolean",
"description": "handbook and aboutYourBusiness only: add to the end of the existing text instead of replacing it"
},
"remove": {
"type": "boolean",
"description": "handbook and aboutYourBusiness only: take this exact text out of the existing text and leave the rest as it is"
}
},
"additionalProperties": false
},
"maxItems": 9,
"minItems": 1
},
"confirm": {
"type": "boolean",
"description": "true only after the user has explicitly approved these specific changes in the conversation"
}
},
"additionalProperties": false
}Changes which places the connected account's AI receptionist serves, and puts the change live for real callers straight away. In Australia the area is one list that can mix whole states, councils, suburbs and postcodes (a postcode adds every suburb in it); in Qatar it is a list of municipalities (type region). Name places as people write them, adding the state (and for a suburb, the postcode) when a name could mean more than one place; if a name still matches several, nothing changes and the error lists the matches to ask the user about. remove takes places off the list and runs before add, so one call can swap areas. coverAll: true serves the whole country instead of a list; adding areas to a whole-country setting narrows it to just those areas. The list cannot leave out part of a listed area: to stop serving one suburb of a listed state or council, remove that state or council and add the parts still served. outOfAreaPolicy sets what happens to callers outside the area: reject (told so, not booked) or flag_for_review (details taken for the team to check). Call get_ai_setup first: its serviceArea setting lists every place served now. Before calling, tell the user exactly which places will be added or removed (or that the whole country will be served) and that it goes live immediately, and get their explicit yes; then pass confirm: true. Saved as a new version that restore_ai_setup_version can undo.
| Argument | Type | Description |
|---|---|---|
| add | array | Places to start serving |
| remove | array | Places on the list to stop serving |
| confirm* | boolean | true only after the user has explicitly approved this specific change in the conversation |
| coverAll |
Changes a team member's settings (teamMemberId from list_team_members): their timezone, role, how much notice they need before a booking (leadTimeMinutes), the travel gap kept around each of their bookings (travelBufferMinutes), or whether their name is hidden from callers (isInternalOnly). Only the fields given are changed. Only the account owner can change a role or isInternalOnly. Before calling, tell the user who is being changed and how, and get their explicit yes; then pass confirm: true.
| Argument | Type | Description |
|---|---|---|
| role | string | |
| confirm* | boolean | true only after the user has explicitly approved this specific change in the conversation |
| timezone | string | IANA timezone, e.g. Australia/Perth |
| teamMemberId* | string | From list_team_members |
| isInternalOnly | boolean | |
| leadTimeMinutes | integer | Minutes from now before their next booking is allowed |
| travelBufferMinutes | integer | Minutes kept free before and after each booking; 0 turns it off |
| customerPhone |
| string |
| meetingAddress | string | For in_person bookings |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"teamMemberId",
"title",
"startTime",
"endTime",
"timezone",
"meetingType",
"customerName"
],
"properties": {
"title": {
"type": "string"
},
"endTime": {
"type": "string",
"description": "ISO 8601 with UTC offset, e.g. 2026-09-20T15:00:00+10:00"
},
"timezone": {
"type": "string",
"description": "IANA timezone, e.g. Australia/Sydney — use the team member's timezone from list_team_members"
},
"startTime": {
"type": "string",
"description": "ISO 8601 with UTC offset, e.g. 2026-09-20T14:00:00+10:00"
},
"meetingType": {
"enum": [
"online",
"in_person"
],
"type": "string"
},
"customerName": {
"type": "string"
},
"teamMemberId": {
"type": "string",
"description": "From list_team_members"
},
"customerEmail": {
"type": "string"
},
"customerPhone": {
"type": "string"
},
"meetingAddress": {
"type": "string",
"description": "For in_person bookings"
}
},
"additionalProperties": false
}| boolean |
| true to serve the whole country instead of a list; not combined with add or remove |
| outOfAreaPolicy | string | What happens to callers outside the area |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"confirm"
],
"properties": {
"add": {
"type": "array",
"items": {
"type": "object",
"required": [
"type",
"name"
],
"properties": {
"name": {
"type": "string",
"maxLength": 100,
"minLength": 1,
"description": "The place's name as people write it; for a postcode, its four digits"
},
"type": {
"enum": [
"state",
"council",
"suburb",
"postcode",
"region"
],
"type": "string"
},
"state": {
"type": "string",
"maxLength": 40,
"description": "Australian state or territory (e.g. NSW), to tell same-named places apart"
},
"postcode": {
"type": "string",
"maxLength": 10,
"description": "A suburb's postcode, to tell same-named suburbs apart"
}
},
"additionalProperties": false
},
"maxItems": 100,
"description": "Places to start serving"
},
"remove": {
"type": "array",
"items": {
"$ref": "#/properties/add/items"
},
"maxItems": 100,
"description": "Places on the list to stop serving"
},
"confirm": {
"type": "boolean",
"description": "true only after the user has explicitly approved this specific change in the conversation"
},
"coverAll": {
"type": "boolean",
"description": "true to serve the whole country instead of a list; not combined with add or remove"
},
"outOfAreaPolicy": {
"enum": [
"reject",
"flag_for_review"
],
"type": "string",
"description": "What happens to callers outside the area"
}
},
"additionalProperties": false
}{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"teamMemberId",
"confirm"
],
"properties": {
"role": {
"enum": [
"admin",
"member"
],
"type": "string"
},
"confirm": {
"type": "boolean",
"description": "true only after the user has explicitly approved this specific change in the conversation"
},
"timezone": {
"type": "string",
"description": "IANA timezone, e.g. Australia/Perth"
},
"teamMemberId": {
"type": "string",
"description": "From list_team_members"
},
"isInternalOnly": {
"type": "boolean"
},
"leadTimeMinutes": {
"type": "integer",
"maximum": 10080,
"minimum": 0,
"description": "Minutes from now before their next booking is allowed"
},
"travelBufferMinutes": {
"type": "integer",
"maximum": 480,
"minimum": 0,
"description": "Minutes kept free before and after each booking; 0 turns it off"
}
},
"additionalProperties": false
}