create_hold
Temporarily reserves one option (by optionId, or the first available option for params) for a few minutes so the customer can confirm. Returns holdId, expiresAt, the quote and the next step. Does not charge or message the customer.
Scope & access
Follow the credential fields below. Public discovery does not require a login; private booking operations require the indicated token.
This tool advertises idempotent behavior. If an idempotencyKey is specified, reuse it with identical arguments only when retrying that same intended action.
Parameters
These are the directory endpoint parameters. Business endpoints scope public discovery to the published business; owner calls still require businessId. Inspect tools/list on your endpoint for the exact schema.
businessIdRequiredbusinessId: a business ID from search_businesses, e.g. "biz_01j…", or the business's booking-page slug, e.g. "studio-nine"
optionIdOptionaloptionId: an option ID returned by check_availability, e.g. "opt_eyJ…"
offeringIdOptionalofferingId: an offering ID from list_offerings or get_business, e.g. "off_01j…"
paramsRequiredparams: booking parameters matching the business's bookingParamsSchema from get_business
customerRequiredcustomer: who the hold is for; phone/email are optional at this step
idempotencyKeyRequiredidempotencyKey: a unique string you generate per intended action (e.g. a UUID); retries with the same key return the same result
Example call
Pass this object to the MCP client's callTool method. Replace placeholders with returned IDs, saved credentials and the customer's details; use future dates appropriate to their request.
{
"name": "create_hold",
"arguments": {
"businessId": "<businessId>",
"params": {
"checkIn": "2026-11-14",
"checkOut": "2026-11-16",
"adults": 2
},
"customer": {
"name": "Asha Perera",
"email": "asha@example.com"
},
"idempotencyKey": "<new-UUID-for-this-action>"
}
}JSON schemas
Nested fields, formats, enums and constraints are included in the complete schemas. Successful data is returned in structuredContent. SDK input validation and domain errors use different error shapes.
Input schemaJSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"businessId": {
"type": "string",
"minLength": 1,
"description": "businessId: a business ID from search_businesses, e.g. \"biz_01j…\", or the business's booking-page slug, e.g. \"studio-nine\""
},
"optionId": {
"type": "string",
"minLength": 1,
"description": "optionId: an option ID returned by check_availability, e.g. \"opt_eyJ…\""
},
"offeringId": {
"type": "string",
"minLength": 1,
"description": "offeringId: an offering ID from list_offerings or get_business, e.g. \"off_01j…\""
},
"params": {
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {},
"description": "params: booking parameters matching the business's bookingParamsSchema from get_business"
},
"customer": {
"type": "object",
"properties": {
"name": {
"type": "string",
"minLength": 1,
"maxLength": 120,
"description": "name: customer full name, e.g. \"Asha Perera\""
},
"phone": {
"type": "string",
"pattern": "^\\+[1-9]\\d{6,14}$",
"description": "phone: customer mobile number in E.164 format, e.g. \"+94771234567\""
},
"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,}$",
"description": "email: customer email address, e.g. \"asha@example.com\""
}
},
"required": [
"name"
],
"description": "customer: who the hold is for; phone/email are optional at this step"
},
"idempotencyKey": {
"type": "string",
"minLength": 8,
"maxLength": 200,
"description": "idempotencyKey: a unique string you generate per intended action (e.g. a UUID); retries with the same key return the same result"
}
},
"required": [
"businessId",
"params",
"customer",
"idempotencyKey"
]
}Output schemaJSON Schema
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": {
"holdId": {
"type": "string"
},
"holdToken": {
"type": "string",
"description": "Secret for get_booking_progress, release_hold and resend_verification_code. Store securely."
},
"status": {
"type": "string",
"const": "held"
},
"expiresAt": {
"type": "string"
},
"nextStep": {
"type": "string"
}
},
"required": [
"holdId",
"holdToken",
"status",
"expiresAt",
"nextStep"
],
"additionalProperties": {}
}Behavior annotationsMCP
{
"readOnlyHint": false,
"destructiveHint": false,
"idempotentHint": true,
"openWorldHint": false
}Errors & next steps
Check isError before reading a success response. Follow nextStep where supplied, and never treat a pending booking as confirmed. See Errors and retries and the booking lifecycle for recovery paths.
Back to all tools