---
title: "Booking pages"
description: "Public pages where guests book meetings on a calendar, their open times, and the bookings they take."
url: "https://nextmail.sh/docs/mcp/tools/bookings"
area: "MCP server"
category: "Tools"
---

# Booking pages

Public pages where guests book meetings on a calendar, their open times, and the bookings they take.

## Booking pages tools

| Tool | What it does |
| --- | --- |
| listBookingPages | The person’s booking pages, with their public links and how many bookings are upcoming or wait for approval. `q`, `status`, `since`, `until` and `sort` narrow and order them. |
| getBookingPage | One page in full: lengths, place, weekly hours, dates with other hours, rules, questions, and the out of office periods that close it. |
| createBookingPage | Create a page. Only `name` is needed, and it takes bookings at once on weekdays from 09:00 to 17:00 unless `config` says otherwise. |
| updateBookingPage | Change the name, the link, the status or any setting. Send only what changes. `status` `paused` stops offering times. |
| deleteBookingPage | Delete a page for good. Its meetings stay on the calendar. A chat always asks first. |
| listBookingTimes | The times a page offers in a window, after the calendar, other bookings and out of office are taken out. With `bookingId`, the times that booking can move to. |
| listBookings | The meetings guests booked: `upcoming`, `pending`, `past` or `ended`, for every page or some. `q` searches the guest and the page, and `from` and `to` keep a window. |
| getBooking | One booking: the guest, the time, their answers and how it ended if it did. |
| approveBooking | Confirm a booking that waits for approval. The guest gets the invitation. |
| declineBooking | Turn down a booking that waits for approval, with an optional reason for the guest. A chat always asks first. |
| cancelBooking | Cancel a meeting that has not ended, with an optional reason for the guest. A chat always asks first. |
| resendBookingEmail | Send the guest the latest email about their booking again. |
| getBookingAnalytics | How the pages did over a window: bookings made, cancelled and moved, the busiest pages and weekdays, and the meetings still to come. `pageIds` counts some pages only. |
| setBookingPageBackground | Put an image from Files behind a page, replacing the photo there was. It also needs `files:read`. A chat asks first unless you asked for it. |
| removeBookingPageBackground | Delete the photo behind a page. A page that showed it goes back to the default background. A chat asks first unless you asked for it. |
| rescheduleBooking | Move a meeting to a new time the page offers, with an optional reason. The guest gets the new time by email. A chat asks first unless you asked for it. |

> Reading needs `calendar:read`. Creating or changing a page and approving, declining, cancelling, rescheduling or sending again need `calendar:write` and `emails:send`, because the guest is emailed from the address of the page. Deleting a page needs only `calendar:write`.

> A page belongs to one person, so a client reaches the pages of the person it acts for. A client limited to particular addresses is refused, because a page reads the whole calendar.

> The tools apply the same rules and refusals as the REST API, and the `/booking-pages` and `/bookings` pages of the API reference describe every field of `config`.

## Reference

### `listBookingPages`

List the booking pages of the person: the public links where somebody can book a meeting on their calendar, with how many bookings are upcoming and how many wait for approval. q searches the name and the link, status keeps the active or the paused pages, since and until keep the pages made in a window, and sort orders them.

- Scopes: `calendar:read`.
- The app's assistant runs it without asking.
- Toolkit: `calendar`.

**Inputs**

- `q` (`string`, up to 200 characters): Only the pages whose name or link contains this text, at most 200 characters. Case and accents are ignored.
- `status` (`string`, one of `"active"`, `"paused"`): `active` for the pages that take bookings, `paused` for the ones that do not. Left out, both.
- `since` (`string`, format `date-time`): Only the pages made at or after this ISO 8601 instant.
- `until` (`string`, format `date-time`): Only the pages made before this ISO 8601 instant.
- `sort` (`string`, one of `"oldest"`, `"newest"`, `"name"`, `"upcoming"`): `oldest` (the default) or `newest` by when the page was made, `name` from A to Z, or `upcoming` with the most upcoming meetings first.

Also available in: API [`GET /booking-pages`](https://nextmail.sh/docs/api/reference/booking-pages#get-booking-pages); TypeScript [`nextmail.bookings.listPages()`](https://nextmail.sh/docs/sdk/reference/bookings#listPages); Python [`bookings.list_pages()`](https://nextmail.sh/docs/python/reference/bookings#listPages); Ruby [`bookings.list_pages`](https://nextmail.sh/docs/ruby/reference/bookings#listPages); PHP [`bookings->listPages`](https://nextmail.sh/docs/php/reference/bookings#listPages); Go [`Bookings.ListPages`](https://nextmail.sh/docs/go/reference/bookings#listPages); Java [`bookings().listPages`](https://nextmail.sh/docs/java/reference/bookings#listPages); C# [`Bookings.ListPagesAsync`](https://nextmail.sh/docs/csharp/reference/bookings#listPages).

### `getBookingPage`

Read one booking page with every setting: lengths, place, weekly hours, dates with other hours, notice, buffers, questions, and the days it is closed because the person is out of office.

- Scopes: `calendar:read`.
- The app's assistant runs it without asking.
- Toolkit: `calendar`.

**Inputs**

- `id` (`string`, required, 1 to 64 characters): The booking page, such as bkp_5c1e9a7b3d2f48e6a0b4c7d1, as listBookingPages shows it.

Also available in: API [`GET /booking-pages/{id}`](https://nextmail.sh/docs/api/reference/booking-pages#get-booking-pages-id); TypeScript [`nextmail.bookings.getPage()`](https://nextmail.sh/docs/sdk/reference/bookings#getPage); Python [`bookings.get_page()`](https://nextmail.sh/docs/python/reference/bookings#getPage); Ruby [`bookings.get_page`](https://nextmail.sh/docs/ruby/reference/bookings#getPage); PHP [`bookings->getPage`](https://nextmail.sh/docs/php/reference/bookings#getPage); Go [`Bookings.GetPage`](https://nextmail.sh/docs/go/reference/bookings#getPage); Java [`bookings().getPage`](https://nextmail.sh/docs/java/reference/bookings#getPage); C# [`Bookings.GetPageAsync`](https://nextmail.sh/docs/csharp/reference/bookings#getPage).

### `createBookingPage`

Create a booking page. It is live at once at /book/<slug> with weekdays 09:00 to 17:00 open unless config says otherwise. A person has at most 25 pages.

- Scopes: `calendar:write`, `emails:send`.
- The app's assistant asks first unless you asked for it.
- Toolkit: `calendar`.

**Inputs**

- `name` (`string`, required, 1 to 80 characters): What the page is called, shown to guests as its heading, such as `Intro call`.
- `slug` (`string`, 1 to 60 characters): The last part of the public link, `/book/<slug>`: lowercase letters, digits and hyphens. Left out, it is made from the name. It is unique across Nextmail.
- `timezone` (`string`, 1 to 64 characters): The IANA time zone the working hours are read in, such as `Europe/Berlin`, for a new page whose `config.availability.timezone` is not sent. Defaults to `UTC`.
- `config` (`object`): The settings of the page. Send only the parts that change: a top-level value replaces the stored one, and inside `location`, `availability`, `rules`, `appearance`, `guestChanges`, `busy` and `seo` each field is merged on its own. A list (`durations`, `questions`, `availability.weekly`, `availability.overrides`) is replaced whole.
  - `description` (`string`, up to 2000 characters): Text shown under the name of the page. Basic Markdown works: bold, italic, links and lists.
  - `hostName` (`string`, up to 80 characters): The name guests see as the person they meet. Defaults to the name of the account.
  - `durations` (`integer[]`, 1 to 4 items): The meeting lengths a guest can pick, in minutes, each a multiple of 5 between 5 and 720.
  - `approval` (`boolean`): True holds each new booking as a request until it is approved or declined. False confirms it at once.
  - `fromEmail` (`string`, up to 320 characters): The address the booking emails are sent from and the calendar events are organised by. It has to be one the owner of the page may send from.
  - `notifyHost` (`boolean`): Whether that address gets an email about each new, moved or cancelled booking.
  - `questions` (`object[]`, up to 10 items): What the guest is asked besides their name and email, at most 10.
    - `id` (`string`, required, pattern `^[a-z0-9]{4,16}$`): A stable key for the answers: 4 to 16 lowercase letters and digits, unique on the page. `name`, `email`, `phone`, `timezone` and `start` are taken.
    - `kind` (`string`, required, one of `"text"`, `"long-text"`, `"phone"`, `"choice"`, `"checkbox"`): `text`, `long-text`, `phone`, `choice` (one of `options`) or `checkbox`.
    - `label` (`string`, required, 1 to 120 characters)
    - `required` (`boolean`, required)
    - `options` (`string[]`, required, up to 12 items): The answers of a `choice` question, at least two. Empty for the other kinds.
    - `placeholder` (`string`, up to 160 characters): Example text shown in the empty field of a `text`, `long-text` or `phone` question, such as `Anything we should know before the meeting?`. Up to 160 characters, empty for none. A `choice` or `checkbox` question ignores it.
  - `confirmation` (`string`, up to 1000 characters): Text shown to the guest after booking, and added to the confirmation email.
  - `redirectUrl` (`string`, up to 2000 characters): An `https://` page to send the guest to after booking, or empty.
  - `extraGuests` (`integer`, at least 0, at most 10): How many other people a guest may add to a booking, 0 to 10. Each one gets the invitation and every later change. Defaults to 0, which hides the field.
  - `reminders` (`object`): When the guest is emailed a reminder and when the host is reminded, each a list of minutes before the start.
    - `guest` (`integer[]`, up to 3 items): Minutes before the start to email the guest a reminder, at most 3, each one of 10, 30, 60, 120, 1440, 2880, 10080. Defaults to one day before. An empty list sends none.
    - `host` (`integer[]`, up to 3 items): Minutes before the start the host is reminded by the alarm on the meeting in their calendar, at most 3, each one of 0, 5, 10, 15, 30, 60, 1440. Defaults to 10. It applies to meetings booked after it changes.
  - `location` (`object`): Where the meeting happens.
    - `kind` (`string`, one of `"video"`, `"phone"`, `"in-person"`, `"none"`): `video` with a fixed link in `value`, `phone` (the guest is asked for a number), `in-person` with the address in `value`, or `none`.
    - `value` (`string`, up to 500 characters): The `https://` link of a `video` meeting or the address of an `in-person` one.
  - `availability` (`object`): When the page offers times, before the calendar is taken out.
    - `timezone` (`string`, 1 to 64 characters): The IANA time zone the hours below are read in.
    - `weekly` (`object[][]`, 7 to 7 items): Seven lists, Sunday first, of the hours open on that weekday. An empty list closes the day.
      - `start` (`integer`, required, at least 0, at most 1440): Minutes after midnight the range opens, so `540` is 09:00.
      - `end` (`integer`, required, at least 0, at most 1440): Minutes after midnight the range closes, later than `start`.
    - `overrides` (`object[]`, up to 180 items): Dates with their own hours, at most 180. `date` is `YYYY-MM-DD` in the time zone of the page, and an empty `ranges` closes that date.
      - `date` (`string`, required)
      - `ranges` (`object[]`, required, up to 6 items)
        - `start` (`integer`, required, at least 0, at most 1440): Minutes after midnight the range opens, so `540` is 09:00.
        - `end` (`integer`, required, at least 0, at most 1440): Minutes after midnight the range closes, later than `start`.
  - `rules` (`object`): The limits on which of the open hours are offered.
    - `noticeMinutes` (`integer`, at least 0, at most 43200): How many minutes ahead a booking has to be made.
    - `horizonDays` (`integer`, at least 1, at most 365): How many days ahead the page offers times, up to 365.
    - `intervalMinutes` (`integer`, nullable): Minutes between two start times, one of 5, 10, 15, 20, 30, 45, 60, 90, 120. Null steps by the length of the meeting.
    - `bufferBeforeMinutes` (`integer`, at least 0, at most 240): Minutes kept free before every meeting, up to 240.
    - `bufferAfterMinutes` (`integer`, at least 0, at most 240): Minutes kept free after every meeting, up to 240.
    - `dailyLimit` (`integer`, nullable, at least 1, at most 50): The most bookings this page takes on one day, up to 50. Null for no limit.
  - `appearance` (`object`): How the public page looks.
    - `accent` (`string`, pattern `^#[0-9a-f]{6}$`): The colour of buttons and the picked day, as `#rrggbb`.
    - `theme` (`string`, one of `"auto"`, `"light"`, `"dark"`): `auto` follows the device of the guest, or force `light` or `dark`.
    - `showAvatar` (`boolean`)
    - `background` (`string`, default `"default"`): What fills the page behind the card: `default`, one of the presets `dusk`, `mist`, `sand`, `night`, `meadow`, `dots`, `brush`, `trail`, `ember`, `canvas`, `bloom`, `field`, `wanderer` and `gold`, `image` for the uploaded background image, or a colour as `#rrggbb`. Defaults to `default`.
    - `fonts` (`object`, default `{"primary":null,"secondary":null}`): The typefaces of the public page: `primary` for its text and `secondary` for its title. Each is one of the brand fonts the workspace appearance offers, or null for the standard font.
      - `primary` (`string`, nullable, one of `"system"`, `"arial"`, `"helvetica"`, `"verdana"`, `"tahoma"`, `"trebuchet-ms"`, `"georgia"`, `"times-new-roman"`, `"courier-new"`, `"dm-sans"`, `"inter"`, `"roboto"`, `"open-sans"`, `"lato"`, `"montserrat"`, `"poppins"`, `"nunito"`, `"work-sans"`, `"source-sans-3"`, `"ibm-plex-sans"`, `"merriweather"`, `"playfair-display"`, `"instrument-serif"`, `"jetbrains-mono"`, `"dm-mono"`, `"geist-mono"`, default `null`): The font of the text, such as `inter`. Null uses the standard font.
      - `secondary` (`string`, nullable, one of `"system"`, `"arial"`, `"helvetica"`, `"verdana"`, `"tahoma"`, `"trebuchet-ms"`, `"georgia"`, `"times-new-roman"`, `"courier-new"`, `"dm-sans"`, `"inter"`, `"roboto"`, `"open-sans"`, `"lato"`, `"montserrat"`, `"poppins"`, `"nunito"`, `"work-sans"`, `"source-sans-3"`, `"ibm-plex-sans"`, `"merriweather"`, `"playfair-display"`, `"instrument-serif"`, `"jetbrains-mono"`, `"dm-mono"`, `"geist-mono"`, default `null`): The font of the title, such as `instrument-serif`. Null keeps the title in the font of the text.
    - `backgroundImage` (`string`, nullable, up to 2000 characters, default `null`): The address of the uploaded background image, or null. Read only: upload one with `PUT /booking-pages/{id}/background` and remove it with `DELETE` on the same path.
  - `guestChanges` (`object`): What a guest may do from the link in their emails.
    - `cancel` (`boolean`)
    - `reschedule` (`boolean`)
    - `cutoffMinutes` (`integer`, at least 0, at most 20160): How many minutes before the meeting those changes close.
  - `busy` (`object`): What counts as busy besides the events the person made and the bookings they already have.
    - `addresses` (`string[]`, nullable, up to 50 items): The addresses whose invitations block time unless declined. Null checks every address the person holds.
    - `subscriptions` (`boolean`): Whether events from calendars the person subscribed to block time.
    - `outOfOffice` (`boolean`, default `true`): Whether the page offers no times while `fromEmail` is out of office. Defaults to true.
  - `seo` (`object`): How the public page presents itself to browsers and search engines.
    - `title` (`string`, up to 120 characters, default `""`): The title of the browser tab and of a search result. Empty uses the name of the page and the host.
    - `description` (`string`, up to 300 characters, default `""`): The summary under the title in a search result. Empty uses the start of the description.
    - `indexable` (`boolean`, default `false`): Whether search engines may list the page. False, the default, asks them not to.

Also available in: API [`POST /booking-pages`](https://nextmail.sh/docs/api/reference/booking-pages#post-booking-pages); TypeScript [`nextmail.bookings.createPage()`](https://nextmail.sh/docs/sdk/reference/bookings#createPage); Python [`bookings.create_page()`](https://nextmail.sh/docs/python/reference/bookings#createPage); Ruby [`bookings.create_page`](https://nextmail.sh/docs/ruby/reference/bookings#createPage); PHP [`bookings->createPage`](https://nextmail.sh/docs/php/reference/bookings#createPage); Go [`Bookings.CreatePage`](https://nextmail.sh/docs/go/reference/bookings#createPage); Java [`bookings().createPage`](https://nextmail.sh/docs/java/reference/bookings#createPage); C# [`Bookings.CreatePageAsync`](https://nextmail.sh/docs/csharp/reference/bookings#createPage).

### `updateBookingPage`

Change a booking page: its name, its link, pause or resume it, or any setting in config. Send only what changes. Bookings already made keep their time.

- Scopes: `calendar:write`, `emails:send`.
- The app's assistant asks first unless you asked for it.
- Toolkit: `calendar`.

**Inputs**

- `id` (`string`, required, 1 to 64 characters): The booking page, such as bkp_5c1e9a7b3d2f48e6a0b4c7d1, as listBookingPages shows it.
- `name` (`string`, 1 to 80 characters): What the page is called, shown to guests as its heading, such as `Intro call`.
- `slug` (`string`, 1 to 60 characters): The last part of the public link, `/book/<slug>`: lowercase letters, digits and hyphens. It is unique across Nextmail. Left out, the stored link stays.
- `status` (`string`, one of `"active"`, `"paused"`): `active` takes bookings. `paused` keeps the link working but offers no times.
- `config` (`object`): The settings of the page. Send only the parts that change: a top-level value replaces the stored one, and inside `location`, `availability`, `rules`, `appearance`, `guestChanges`, `busy` and `seo` each field is merged on its own. A list (`durations`, `questions`, `availability.weekly`, `availability.overrides`) is replaced whole.
  - `description` (`string`, up to 2000 characters): Text shown under the name of the page. Basic Markdown works: bold, italic, links and lists.
  - `hostName` (`string`, up to 80 characters): The name guests see as the person they meet. Left out, the stored name stays.
  - `durations` (`integer[]`, 1 to 4 items): The meeting lengths a guest can pick, in minutes, each a multiple of 5 between 5 and 720.
  - `approval` (`boolean`): True holds each new booking as a request until it is approved or declined. False confirms it at once.
  - `fromEmail` (`string`, up to 320 characters): The address the booking emails are sent from and the calendar events are organised by. It has to be one the owner of the page may send from.
  - `notifyHost` (`boolean`): Whether that address gets an email about each new, moved or cancelled booking.
  - `questions` (`object[]`, up to 10 items): What the guest is asked besides their name and email, at most 10.
    - `id` (`string`, required, pattern `^[a-z0-9]{4,16}$`): A stable key for the answers: 4 to 16 lowercase letters and digits, unique on the page. `name`, `email`, `phone`, `timezone` and `start` are taken.
    - `kind` (`string`, required, one of `"text"`, `"long-text"`, `"phone"`, `"choice"`, `"checkbox"`): `text`, `long-text`, `phone`, `choice` (one of `options`) or `checkbox`.
    - `label` (`string`, required, 1 to 120 characters)
    - `required` (`boolean`, required)
    - `options` (`string[]`, required, up to 12 items): The answers of a `choice` question, at least two. Empty for the other kinds.
    - `placeholder` (`string`, up to 160 characters): Example text shown in the empty field of a `text`, `long-text` or `phone` question, such as `Anything we should know before the meeting?`. Up to 160 characters, empty for none. A `choice` or `checkbox` question ignores it.
  - `confirmation` (`string`, up to 1000 characters): Text shown to the guest after booking, and added to the confirmation email.
  - `redirectUrl` (`string`, up to 2000 characters): An `https://` page to send the guest to after booking, or empty.
  - `extraGuests` (`integer`, at least 0, at most 10): How many other people a guest may add to a booking, 0 to 10. Each one gets the invitation and every later change, and 0 hides the field. Left out, the stored number stays.
  - `reminders` (`object`): When the guest is emailed a reminder and when the host is reminded, each a list of minutes before the start.
    - `guest` (`integer[]`, up to 3 items): Minutes before the start to email the guest a reminder, at most 3, each one of 10, 30, 60, 120, 1440, 2880, 10080. An empty list sends none. Left out, the stored list stays.
    - `host` (`integer[]`, up to 3 items): Minutes before the start the host is reminded by the alarm on the meeting in their calendar, at most 3, each one of 0, 5, 10, 15, 30, 60, 1440. It applies to meetings booked after it changes. Left out, the stored list stays.
  - `location` (`object`): Where the meeting happens.
    - `kind` (`string`, one of `"video"`, `"phone"`, `"in-person"`, `"none"`): `video` with a fixed link in `value`, `phone` (the guest is asked for a number), `in-person` with the address in `value`, or `none`.
    - `value` (`string`, up to 500 characters): The `https://` link of a `video` meeting or the address of an `in-person` one.
  - `availability` (`object`): When the page offers times, before the calendar is taken out.
    - `timezone` (`string`, 1 to 64 characters): The IANA time zone the hours below are read in.
    - `weekly` (`object[][]`, 7 to 7 items): Seven lists, Sunday first, of the hours open on that weekday. An empty list closes the day.
      - `start` (`integer`, required, at least 0, at most 1440): Minutes after midnight the range opens, so `540` is 09:00.
      - `end` (`integer`, required, at least 0, at most 1440): Minutes after midnight the range closes, later than `start`.
    - `overrides` (`object[]`, up to 180 items): Dates with their own hours, at most 180. `date` is `YYYY-MM-DD` in the time zone of the page, and an empty `ranges` closes that date.
      - `date` (`string`, required)
      - `ranges` (`object[]`, required, up to 6 items)
        - `start` (`integer`, required, at least 0, at most 1440): Minutes after midnight the range opens, so `540` is 09:00.
        - `end` (`integer`, required, at least 0, at most 1440): Minutes after midnight the range closes, later than `start`.
  - `rules` (`object`): The limits on which of the open hours are offered.
    - `noticeMinutes` (`integer`, at least 0, at most 43200): How many minutes ahead a booking has to be made.
    - `horizonDays` (`integer`, at least 1, at most 365): How many days ahead the page offers times, up to 365.
    - `intervalMinutes` (`integer`, nullable): Minutes between two start times, one of 5, 10, 15, 20, 30, 45, 60, 90, 120. Null steps by the length of the meeting.
    - `bufferBeforeMinutes` (`integer`, at least 0, at most 240): Minutes kept free before every meeting, up to 240.
    - `bufferAfterMinutes` (`integer`, at least 0, at most 240): Minutes kept free after every meeting, up to 240.
    - `dailyLimit` (`integer`, nullable, at least 1, at most 50): The most bookings this page takes on one day, up to 50. Null for no limit.
  - `appearance` (`object`): How the public page looks.
    - `accent` (`string`, pattern `^#[0-9a-f]{6}$`): The colour of buttons and the picked day, as `#rrggbb`.
    - `theme` (`string`, one of `"auto"`, `"light"`, `"dark"`): `auto` follows the device of the guest, or force `light` or `dark`.
    - `showAvatar` (`boolean`)
    - `background` (`string`): What fills the page behind the card: `default`, one of the presets `dusk`, `mist`, `sand`, `night`, `meadow`, `dots`, `brush`, `trail`, `ember`, `canvas`, `bloom`, `field`, `wanderer` and `gold`, `image` for the uploaded background image, or a colour as `#rrggbb`. Left out, the stored background stays.
    - `fonts` (`object`): The typefaces of the public page, merged by key: `primary` for its text and `secondary` for its title, each a brand font or null for the standard font. Left out, the stored fonts stay.
      - `primary` (`string`, nullable, one of `"system"`, `"arial"`, `"helvetica"`, `"verdana"`, `"tahoma"`, `"trebuchet-ms"`, `"georgia"`, `"times-new-roman"`, `"courier-new"`, `"dm-sans"`, `"inter"`, `"roboto"`, `"open-sans"`, `"lato"`, `"montserrat"`, `"poppins"`, `"nunito"`, `"work-sans"`, `"source-sans-3"`, `"ibm-plex-sans"`, `"merriweather"`, `"playfair-display"`, `"instrument-serif"`, `"jetbrains-mono"`, `"dm-mono"`, `"geist-mono"`): The font of the text, such as `inter`. Null uses the standard font.
      - `secondary` (`string`, nullable, one of `"system"`, `"arial"`, `"helvetica"`, `"verdana"`, `"tahoma"`, `"trebuchet-ms"`, `"georgia"`, `"times-new-roman"`, `"courier-new"`, `"dm-sans"`, `"inter"`, `"roboto"`, `"open-sans"`, `"lato"`, `"montserrat"`, `"poppins"`, `"nunito"`, `"work-sans"`, `"source-sans-3"`, `"ibm-plex-sans"`, `"merriweather"`, `"playfair-display"`, `"instrument-serif"`, `"jetbrains-mono"`, `"dm-mono"`, `"geist-mono"`): The font of the title, such as `instrument-serif`. Null keeps the title in the font of the text.
    - `backgroundImage` (`string`, nullable, up to 2000 characters): Read only. Sending it back as you read it changes nothing; upload or remove the image on the background path of the page.
  - `guestChanges` (`object`): What a guest may do from the link in their emails.
    - `cancel` (`boolean`)
    - `reschedule` (`boolean`)
    - `cutoffMinutes` (`integer`, at least 0, at most 20160): How many minutes before the meeting those changes close.
  - `busy` (`object`): What counts as busy besides the events the person made and the bookings they already have.
    - `addresses` (`string[]`, nullable, up to 50 items): The addresses whose invitations block time unless declined. Null checks every address the person holds.
    - `subscriptions` (`boolean`): Whether events from calendars the person subscribed to block time.
    - `outOfOffice` (`boolean`): Whether the page offers no times while `fromEmail` is out of office. Left out, the stored setting stays.
  - `seo` (`object`): How the public page presents itself to browsers and search engines.
    - `title` (`string`, up to 120 characters): The title of the browser tab and of a search result. Empty uses the name of the page and the host.
    - `description` (`string`, up to 300 characters): The summary under the title in a search result. Empty uses the start of the description.
    - `indexable` (`boolean`): Whether search engines may list the page. False asks them not to. Left out, the stored setting stays.

Also available in: API [`PATCH /booking-pages/{id}`](https://nextmail.sh/docs/api/reference/booking-pages#patch-booking-pages-id); TypeScript [`nextmail.bookings.updatePage()`](https://nextmail.sh/docs/sdk/reference/bookings#updatePage); Python [`bookings.update_page()`](https://nextmail.sh/docs/python/reference/bookings#updatePage); Ruby [`bookings.update_page`](https://nextmail.sh/docs/ruby/reference/bookings#updatePage); PHP [`bookings->updatePage`](https://nextmail.sh/docs/php/reference/bookings#updatePage); Go [`Bookings.UpdatePage`](https://nextmail.sh/docs/go/reference/bookings#updatePage); Java [`bookings().updatePage`](https://nextmail.sh/docs/java/reference/bookings#updatePage); C# [`Bookings.UpdatePageAsync`](https://nextmail.sh/docs/csharp/reference/bookings#updatePage).

### `deleteBookingPage`

Delete a booking page for good. Its public link stops working and guests can no longer change their bookings, but the meetings already booked stay on the calendar.

- Scopes: `calendar:write`.
- The app's assistant always asks first.
- Toolkit: `calendar`.

**Inputs**

- `id` (`string`, required, 1 to 64 characters): The booking page, such as bkp_5c1e9a7b3d2f48e6a0b4c7d1, as listBookingPages shows it.

Also available in: API [`DELETE /booking-pages/{id}`](https://nextmail.sh/docs/api/reference/booking-pages#delete-booking-pages-id); TypeScript [`nextmail.bookings.deletePage()`](https://nextmail.sh/docs/sdk/reference/bookings#deletePage); Python [`bookings.delete_page()`](https://nextmail.sh/docs/python/reference/bookings#deletePage); Ruby [`bookings.delete_page`](https://nextmail.sh/docs/ruby/reference/bookings#deletePage); PHP [`bookings->deletePage`](https://nextmail.sh/docs/php/reference/bookings#deletePage); Go [`Bookings.DeletePage`](https://nextmail.sh/docs/go/reference/bookings#deletePage); Java [`bookings().deletePage`](https://nextmail.sh/docs/java/reference/bookings#deletePage); C# [`Bookings.DeletePageAsync`](https://nextmail.sh/docs/csharp/reference/bookings#deletePage).

### `listBookingTimes`

List the times a booking page offers in a window, after working hours, the calendar, other bookings, buffers and out of office are taken into account. Pass bookingId to find a new time for that booking: its own time counts as free and the times are for its length.

- Scopes: `calendar:read`.
- The app's assistant runs it without asking.
- Toolkit: `calendar`.

**Inputs**

- `id` (`string`, required, 1 to 64 characters): The booking page, such as bkp_5c1e9a7b3d2f48e6a0b4c7d1, as listBookingPages shows it.
- `from` (`string`, format `date-time`): The start of the window as an ISO 8601 instant. Defaults to now.
- `to` (`string`, format `date-time`): The end of the window. Defaults to 14 days after `from`, and at most 62 days after it.
- `durationMinutes` (`integer`, at least 1): The meeting length in minutes, one of the `durations` of the page. Defaults to the shortest.
- `bookingId` (`string`, 1 to 64 characters): A booking on this page to find a new time for, such as `bkg_2b8d4f6a1c3e5079b6d8f0a2`. Its own time counts as free and the times are for its length, so `durationMinutes` is ignored.

Also available in: API [`GET /booking-pages/{id}/times`](https://nextmail.sh/docs/api/reference/booking-pages#get-booking-pages-id-times); TypeScript [`nextmail.bookings.listTimes()`](https://nextmail.sh/docs/sdk/reference/bookings#listTimes); Python [`bookings.list_times()`](https://nextmail.sh/docs/python/reference/bookings#listTimes); Ruby [`bookings.list_times`](https://nextmail.sh/docs/ruby/reference/bookings#listTimes); PHP [`bookings->listTimes`](https://nextmail.sh/docs/php/reference/bookings#listTimes); Go [`Bookings.ListTimes`](https://nextmail.sh/docs/go/reference/bookings#listTimes); Java [`bookings().listTimes`](https://nextmail.sh/docs/java/reference/bookings#listTimes); C# [`Bookings.ListTimesAsync`](https://nextmail.sh/docs/csharp/reference/bookings#listTimes).

### `listBookings`

List the meetings guests booked: upcoming, waiting for approval, past, or declined and cancelled. q searches the guest name and email and the page name, pageIds keeps the bookings of some pages, and from and to keep the meetings that start in a window.

- Scopes: `calendar:read`.
- The app's assistant runs it without asking.
- Toolkit: `calendar`.

**Inputs**

- `view` (`string`, one of `"upcoming"`, `"pending"`, `"past"`, `"ended"`): `upcoming` (confirmed and not over, the default), `pending` (waiting for approval), `past`, or `ended` (declined and cancelled).
- `pageId` (`string`, 1 to 64 characters): Only the bookings of this page. `pageIds` takes several.
- `pageIds` (`string[]`, up to 25 items): Only the bookings of these pages, as ids separated by commas, at most 25. Left out, every page.
- `q` (`string`, up to 200 characters): Only the bookings whose guest name, guest email or page name contains this text, at most 200 characters. Case and accents are ignored.
- `from` (`string`, format `date-time`): Only the meetings that start at or after this ISO 8601 instant.
- `to` (`string`, format `date-time`): Only the meetings that start before this ISO 8601 instant.
- `limit` (`integer`, at least 1, at most 100): How many to return, 30 by default and at most 100.
- `cursor` (`string`, 1 to 256 characters): The `nextCursor` of the previous page.

Also available in: API [`GET /bookings`](https://nextmail.sh/docs/api/reference/booking-pages#get-bookings); TypeScript [`nextmail.bookings.list()`](https://nextmail.sh/docs/sdk/reference/bookings#list), [`nextmail.bookings.listAll()`](https://nextmail.sh/docs/sdk/reference/bookings#listAll), [`nextmail.bookings.iterate()`](https://nextmail.sh/docs/sdk/reference/bookings#iterate); Python [`bookings.list()`](https://nextmail.sh/docs/python/reference/bookings#list), [`bookings.list_all()`](https://nextmail.sh/docs/python/reference/bookings#listAll), [`bookings.iterate()`](https://nextmail.sh/docs/python/reference/bookings#iterate); Ruby [`bookings.list`](https://nextmail.sh/docs/ruby/reference/bookings#list), [`bookings.list_all`](https://nextmail.sh/docs/ruby/reference/bookings#listAll), [`bookings.iterate`](https://nextmail.sh/docs/ruby/reference/bookings#iterate); PHP [`bookings->list`](https://nextmail.sh/docs/php/reference/bookings#list), [`bookings->listAll`](https://nextmail.sh/docs/php/reference/bookings#listAll), [`bookings->iterate`](https://nextmail.sh/docs/php/reference/bookings#iterate); Go [`Bookings.List`](https://nextmail.sh/docs/go/reference/bookings#list), [`Bookings.ListAll`](https://nextmail.sh/docs/go/reference/bookings#listAll), [`Bookings.Iterate`](https://nextmail.sh/docs/go/reference/bookings#iterate); Java [`bookings().list`](https://nextmail.sh/docs/java/reference/bookings#list), [`bookings().listAll`](https://nextmail.sh/docs/java/reference/bookings#listAll), [`bookings().iterate`](https://nextmail.sh/docs/java/reference/bookings#iterate); C# [`Bookings.ListAsync`](https://nextmail.sh/docs/csharp/reference/bookings#list), [`Bookings.ListAllAsync`](https://nextmail.sh/docs/csharp/reference/bookings#listAll), [`Bookings.IterateAsync`](https://nextmail.sh/docs/csharp/reference/bookings#iterate).

### `getBooking`

Read one booking: who booked, when, their answers, and how it ended if it did.

- Scopes: `calendar:read`.
- The app's assistant runs it without asking.
- Toolkit: `calendar`.

**Inputs**

- `id` (`string`, required, 1 to 64 characters): The booking, such as bkg_2b8d4f6a1c3e5079b6d8f0a2, as listBookings shows it.

Also available in: API [`GET /bookings/{id}`](https://nextmail.sh/docs/api/reference/booking-pages#get-bookings-id); TypeScript [`nextmail.bookings.get()`](https://nextmail.sh/docs/sdk/reference/bookings#get); Python [`bookings.get()`](https://nextmail.sh/docs/python/reference/bookings#get); Ruby [`bookings.get`](https://nextmail.sh/docs/ruby/reference/bookings#get); PHP [`bookings->get`](https://nextmail.sh/docs/php/reference/bookings#get); Go [`Bookings.Get`](https://nextmail.sh/docs/go/reference/bookings#get); Java [`bookings().get`](https://nextmail.sh/docs/java/reference/bookings#get); C# [`Bookings.GetAsync`](https://nextmail.sh/docs/csharp/reference/bookings#get).

### `approveBooking`

Approve a booking that waits for approval. The hold on the calendar becomes a confirmed meeting and the guest gets the invitation by email.

- Scopes: `calendar:write`, `emails:send`.
- The app's assistant asks first unless you asked for it.
- Toolkit: `calendar`.

**Inputs**

- `id` (`string`, required, 1 to 64 characters): The booking, such as bkg_2b8d4f6a1c3e5079b6d8f0a2, as listBookings shows it.

Also available in: API [`POST /bookings/{id}/approve`](https://nextmail.sh/docs/api/reference/booking-pages#post-bookings-id-approve); TypeScript [`nextmail.bookings.approve()`](https://nextmail.sh/docs/sdk/reference/bookings#approve); Python [`bookings.approve()`](https://nextmail.sh/docs/python/reference/bookings#approve); Ruby [`bookings.approve`](https://nextmail.sh/docs/ruby/reference/bookings#approve); PHP [`bookings->approve`](https://nextmail.sh/docs/php/reference/bookings#approve); Go [`Bookings.Approve`](https://nextmail.sh/docs/go/reference/bookings#approve); Java [`bookings().approve`](https://nextmail.sh/docs/java/reference/bookings#approve); C# [`Bookings.ApproveAsync`](https://nextmail.sh/docs/csharp/reference/bookings#approve).

### `declineBooking`

Decline a booking that waits for approval. The time is freed and the guest is told by email, with the reason if one is given.

- Scopes: `calendar:write`, `emails:send`.
- The app's assistant always asks first.
- Toolkit: `calendar`.

**Inputs**

- `id` (`string`, required, 1 to 64 characters): The booking, such as bkg_2b8d4f6a1c3e5079b6d8f0a2, as listBookings shows it.
- `reason` (`string`, nullable, up to 500 characters): A sentence for the guest, at most 500 characters, included in the email they get.

Also available in: API [`POST /bookings/{id}/decline`](https://nextmail.sh/docs/api/reference/booking-pages#post-bookings-id-decline); TypeScript [`nextmail.bookings.decline()`](https://nextmail.sh/docs/sdk/reference/bookings#decline); Python [`bookings.decline()`](https://nextmail.sh/docs/python/reference/bookings#decline); Ruby [`bookings.decline`](https://nextmail.sh/docs/ruby/reference/bookings#decline); PHP [`bookings->decline`](https://nextmail.sh/docs/php/reference/bookings#decline); Go [`Bookings.Decline`](https://nextmail.sh/docs/go/reference/bookings#decline); Java [`bookings().decline`](https://nextmail.sh/docs/java/reference/bookings#decline); C# [`Bookings.DeclineAsync`](https://nextmail.sh/docs/csharp/reference/bookings#decline).

### `cancelBooking`

Cancel a booked meeting that has not ended. The calendar event is cancelled and the guest gets the cancellation by email, with the reason if one is given.

- Scopes: `calendar:write`, `emails:send`.
- The app's assistant always asks first.
- Toolkit: `calendar`.

**Inputs**

- `id` (`string`, required, 1 to 64 characters): The booking, such as bkg_2b8d4f6a1c3e5079b6d8f0a2, as listBookings shows it.
- `reason` (`string`, nullable, up to 500 characters): A sentence for the guest, at most 500 characters, included in the email they get.

Also available in: API [`POST /bookings/{id}/cancel`](https://nextmail.sh/docs/api/reference/booking-pages#post-bookings-id-cancel); TypeScript [`nextmail.bookings.cancel()`](https://nextmail.sh/docs/sdk/reference/bookings#cancel); Python [`bookings.cancel()`](https://nextmail.sh/docs/python/reference/bookings#cancel); Ruby [`bookings.cancel`](https://nextmail.sh/docs/ruby/reference/bookings#cancel); PHP [`bookings->cancel`](https://nextmail.sh/docs/php/reference/bookings#cancel); Go [`Bookings.Cancel`](https://nextmail.sh/docs/go/reference/bookings#cancel); Java [`bookings().cancel`](https://nextmail.sh/docs/java/reference/bookings#cancel); C# [`Bookings.CancelAsync`](https://nextmail.sh/docs/csharp/reference/bookings#cancel).

### `resendBookingEmail`

Send the guest the latest email about their booking again, such as a confirmation that failed to send.

- Scopes: `calendar:write`, `emails:send`.
- The app's assistant asks first unless you asked for it.
- Toolkit: `calendar`.

**Inputs**

- `id` (`string`, required, 1 to 64 characters): The booking, such as bkg_2b8d4f6a1c3e5079b6d8f0a2, as listBookings shows it.

Also available in: API [`POST /bookings/{id}/resend`](https://nextmail.sh/docs/api/reference/booking-pages#post-bookings-id-resend); TypeScript [`nextmail.bookings.resendEmail()`](https://nextmail.sh/docs/sdk/reference/bookings#resendEmail); Python [`bookings.resend_email()`](https://nextmail.sh/docs/python/reference/bookings#resendEmail); Ruby [`bookings.resend_email`](https://nextmail.sh/docs/ruby/reference/bookings#resendEmail); PHP [`bookings->resendEmail`](https://nextmail.sh/docs/php/reference/bookings#resendEmail); Go [`Bookings.ResendEmail`](https://nextmail.sh/docs/go/reference/bookings#resendEmail); Java [`bookings().resendEmail`](https://nextmail.sh/docs/java/reference/bookings#resendEmail); C# [`Bookings.ResendEmailAsync`](https://nextmail.sh/docs/csharp/reference/bookings#resendEmail).

### `getBookingAnalytics`

How the booking pages of the person did over a window: bookings made, confirmed, waiting, expired, declined and cancelled (by the guest or the host), meetings moved, minutes booked and the cancellation rate, per minute, hour or day (grain, day by default), the pages that got the most bookings and the weekdays meetings fall on, plus the meetings still to come right now. The window reaches back days or minutes from now, minutes winning when both are given, and is 30 days by default. pageIds narrows it to some pages. offsetMinutes is the reader's offset from UTC, so a day starts at their midnight.

- Scopes: `calendar:read`.
- The app's assistant runs it without asking.
- Toolkit: `calendar`.

**Inputs**

- `pageIds` (`string[]`, up to 25 items): Count only the bookings of these booking pages, at most 25, such as bkp_5c1e9a7b3d2f48e6a0b4c7d1. Leave it out to count every page of the person.
- `days` (`integer`, at least 1, at most 1095): How far back to look, from 1 to 1095, defaulting to 30. The oldest bucket is a whole one and the newest is partial.
- `minutes` (`integer`, at least 1, at most 1576800): The window in minutes, from 1 to 1576800, which wins over `days` when both are sent.
- `grain` (`string`, one of `"minute"`, `"hour"`, `"day"`): How wide one bucket of `series` is: `minute`, `hour` or `day`, defaulting to `day`.
- `offsetMinutes` (`integer`, at least -840, at most 840): Minutes east of UTC to cut the buckets and the weekdays in, from -840 to 840, defaulting to 0, so a day breaks where the reader's day does.

Also available in: API [`GET /bookings/analytics`](https://nextmail.sh/docs/api/reference/booking-pages#get-bookings-analytics); TypeScript [`nextmail.bookings.analytics()`](https://nextmail.sh/docs/sdk/reference/bookings#analytics); Python [`bookings.analytics()`](https://nextmail.sh/docs/python/reference/bookings#analytics); Ruby [`bookings.analytics`](https://nextmail.sh/docs/ruby/reference/bookings#analytics); PHP [`bookings->analytics`](https://nextmail.sh/docs/php/reference/bookings#analytics); Go [`Bookings.Analytics`](https://nextmail.sh/docs/go/reference/bookings#analytics); Java [`bookings().analytics`](https://nextmail.sh/docs/java/reference/bookings#analytics); C# [`Bookings.AnalyticsAsync`](https://nextmail.sh/docs/csharp/reference/bookings#analytics).

### `setBookingPageBackground`

Set the photo behind a booking page from an image in Files, replacing the one there was, and switch the page background to it. The image is fitted and stored as WebP; it can start from up to 5MB.

- Scopes: `calendar:write`, `emails:send`, `files:read`.
- The app's assistant asks first unless you asked for it.
- Toolkit: `calendar`.

**Inputs**

- `id` (`string`, required, 1 to 64 characters): The booking page, such as bkp_5c1e9a7b3d2f48e6a0b4c7d1, as listBookingPages shows it.
- `fileId` (`string`, required, 1 to 128 characters): The fileId of an image in Files: one the user attached in this chat, or one listFiles found.

Also available in: API [`PUT /booking-pages/{id}/background`](https://nextmail.sh/docs/api/reference/booking-pages#put-booking-pages-id-background); TypeScript [`nextmail.bookings.uploadBackground()`](https://nextmail.sh/docs/sdk/reference/bookings#uploadBackground); Python [`bookings.upload_background()`](https://nextmail.sh/docs/python/reference/bookings#uploadBackground); Ruby [`bookings.upload_background`](https://nextmail.sh/docs/ruby/reference/bookings#uploadBackground); PHP [`bookings->uploadBackground`](https://nextmail.sh/docs/php/reference/bookings#uploadBackground); Go [`Bookings.UploadBackground`](https://nextmail.sh/docs/go/reference/bookings#uploadBackground); Java [`bookings().uploadBackground`](https://nextmail.sh/docs/java/reference/bookings#uploadBackground); C# [`Bookings.UploadBackgroundAsync`](https://nextmail.sh/docs/csharp/reference/bookings#uploadBackground).

### `removeBookingPageBackground`

Remove the photo behind a booking page and delete the stored image. A page that showed it goes back to the default background. Removing a photo that is not set changes nothing.

- Scopes: `calendar:write`, `emails:send`.
- The app's assistant asks first unless you asked for it.
- Toolkit: `calendar`.

**Inputs**

- `id` (`string`, required, 1 to 64 characters): The booking page, such as bkp_5c1e9a7b3d2f48e6a0b4c7d1, as listBookingPages shows it.

Also available in: API [`DELETE /booking-pages/{id}/background`](https://nextmail.sh/docs/api/reference/booking-pages#delete-booking-pages-id-background); TypeScript [`nextmail.bookings.removeBackground()`](https://nextmail.sh/docs/sdk/reference/bookings#removeBackground); Python [`bookings.remove_background()`](https://nextmail.sh/docs/python/reference/bookings#removeBackground); Ruby [`bookings.remove_background`](https://nextmail.sh/docs/ruby/reference/bookings#removeBackground); PHP [`bookings->removeBackground`](https://nextmail.sh/docs/php/reference/bookings#removeBackground); Go [`Bookings.RemoveBackground`](https://nextmail.sh/docs/go/reference/bookings#removeBackground); Java [`bookings().removeBackground`](https://nextmail.sh/docs/java/reference/bookings#removeBackground); C# [`Bookings.RemoveBackgroundAsync`](https://nextmail.sh/docs/csharp/reference/bookings#removeBackground).

### `rescheduleBooking`

Move a booked meeting to a new time, keeping its length. The time has to be open on its booking page: listBookingTimes with bookingId lists the times it can move to. The calendar event moves, the guest gets the new time and an updated invitation by email, with the reason if one is given, and a request that waited for approval is confirmed at the new time.

- Scopes: `calendar:write`, `emails:send`.
- The app's assistant asks first unless you asked for it.
- Toolkit: `calendar`.

**Inputs**

- `id` (`string`, required, 1 to 64 characters): The booking, such as bkg_2b8d4f6a1c3e5079b6d8f0a2, as listBookings shows it.
- `start` (`string`, required, format `date-time`): The new start as an ISO 8601 instant. It has to be one of the open times of the page for this booking, as `GET /booking-pages/{id}/times` lists them with `bookingId`. The meeting keeps its length.
- `reason` (`string`, nullable, up to 500 characters): A sentence for the guest, at most 500 characters, included in the email about the new time.

Also available in: API [`POST /bookings/{id}/reschedule`](https://nextmail.sh/docs/api/reference/booking-pages#post-bookings-id-reschedule); TypeScript [`nextmail.bookings.reschedule()`](https://nextmail.sh/docs/sdk/reference/bookings#reschedule); Python [`bookings.reschedule()`](https://nextmail.sh/docs/python/reference/bookings#reschedule); Ruby [`bookings.reschedule`](https://nextmail.sh/docs/ruby/reference/bookings#reschedule); PHP [`bookings->reschedule`](https://nextmail.sh/docs/php/reference/bookings#reschedule); Go [`Bookings.Reschedule`](https://nextmail.sh/docs/go/reference/bookings#reschedule); Java [`bookings().reschedule`](https://nextmail.sh/docs/java/reference/bookings#reschedule); C# [`Bookings.RescheduleAsync`](https://nextmail.sh/docs/csharp/reference/bookings#reschedule).
