Book
bookBook one of the open times for the customer. The business then either confirms it at once or receives it as a request it approves (or, for a business that takes its bookings by email, confirms with the customer itself); the answer says which, what happens next, and a manage.token to check or cancel the booking later. The customer is emailed. Confirm the service, the time and the customer's details with the customer before calling it. idempotency_key is required: choose a new random one for each booking (a UUID without hyphens) and send the same one to retry after a timeout, so a retry cannot make a second booking.
Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| tint | No | What is being booked at a window tint business, in place of `items` (the card says which a business takes): the class of the customer's car, the windows, the film and the shade, each chosen from the card's `tint` section. The business prices and times it; a shade never changes the price. Choosing the front two windows and the rear sides books the full vehicle, at its price. | |
| agent | Yes | Who is booking, so the business sees that an agent made the booking and which one. | |
| items | No | What is being booked. May be left out only when the business offers exactly one service (a consulting business's one kind of call). A window tint business takes `tint` instead, never items. | |
| start | Yes | A start time from `times`, ISO 8601 with an offset, on a whole minute: seconds, when written, are 00 ("2026-10-12T10:00:00-07:00" or "2026-10-12T17:00Z"). It is checked again, and refused with `time_not_open` if it is no longer open. | |
| answers | No | Answers to the questions the card lists under booking.answers, by their `id`. Each question there says its exact format and shows an example that passes: a select takes exactly one of its option strings, copied character for character; a multiselect takes a list of its option strings (at most its `maxSelections`, each once); a text, a long text, an email, a phone number and a web address each have a stated length limit; a select with `allowOther` takes "Other" with the customer's own words under `<id>_other`; and a question with a `none` phrase takes exactly that phrase when there is no answer. A business that comes to the customer (a mobile detailer or tint shop) asks for `address`: check it first (POST /agent/address, the MCP tool check_address) and send the `address` that answers. The address is checked again here, and refused with `address_invalid`, `address_unconfirmed` (with the corrected address) or `outside_service_area`. When Google could not confirm it or corrected it, and the customer says theirs is right as they gave it, send theirs with `address_confirmed: true`: it is filed as given, for the business to check (never past `outside_service_area`). Leave out when the card lists none. | |
| customer | Yes | The person the booking is for. They receive the confirmation email. | |
| idempotency_key | Yes | Required. A key you choose, new for each booking: 32 to 255 letters, digits, dashes or underscores, and RANDOM, never a counter, a word or a pattern (a UUID without hyphens is right; a key with fewer than 8 distinct characters is refused). Calling book again with the same key and customer email answers the first booking again, with the same manage token, instead of making a second one: use it to retry safely after a timeout. |