---
title: "Booking pages"
description: "Public pages where guests book meetings on a calendar, their open times, and the bookings they take."
url: "https://openemail.uk/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. |
| 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. |
| listBookings | The meetings guests booked: `upcoming`, `pending`, `past` or `ended`, for every page or one. |
| 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. |

> Reading needs `calendar:read`. Creating or changing a page and approving, declining, cancelling 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.

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

**Inputs**

Takes no input.

Also available in: API [`GET /booking-pages`](https://openemail.uk/docs/api/reference/booking-pages#get-booking-pages); TypeScript [`bookings.listPages()`](https://openemail.uk/docs/sdk/reference/bookings#listPages); Python [`bookings.list_pages()`](https://openemail.uk/docs/python/reference/bookings#listPages); Ruby [`bookings.list_pages`](https://openemail.uk/docs/ruby/reference/bookings#listPages); PHP [`bookings->listPages`](https://openemail.uk/docs/php/reference/bookings#listPages); Go [`Bookings.ListPages`](https://openemail.uk/docs/go/reference/bookings#listPages); Java [`bookings().listPages`](https://openemail.uk/docs/java/reference/bookings#listPages); C# [`Bookings.ListPagesAsync`](https://openemail.uk/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://openemail.uk/docs/api/reference/booking-pages#get-booking-pages-id); TypeScript [`bookings.getPage()`](https://openemail.uk/docs/sdk/reference/bookings#getPage); Python [`bookings.get_page()`](https://openemail.uk/docs/python/reference/bookings#getPage); Ruby [`bookings.get_page`](https://openemail.uk/docs/ruby/reference/bookings#getPage); PHP [`bookings->getPage`](https://openemail.uk/docs/php/reference/bookings#getPage); Go [`Bookings.GetPage`](https://openemail.uk/docs/go/reference/bookings#getPage); Java [`bookings().getPage`](https://openemail.uk/docs/java/reference/bookings#getPage); C# [`Bookings.GetPageAsync`](https://openemail.uk/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 OpenEmail.
- `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.
  - `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.
  - `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`)
  - `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://openemail.uk/docs/api/reference/booking-pages#post-booking-pages); TypeScript [`bookings.createPage()`](https://openemail.uk/docs/sdk/reference/bookings#createPage); Python [`bookings.create_page()`](https://openemail.uk/docs/python/reference/bookings#createPage); Ruby [`bookings.create_page`](https://openemail.uk/docs/ruby/reference/bookings#createPage); PHP [`bookings->createPage`](https://openemail.uk/docs/php/reference/bookings#createPage); Go [`Bookings.CreatePage`](https://openemail.uk/docs/go/reference/bookings#createPage); Java [`bookings().createPage`](https://openemail.uk/docs/java/reference/bookings#createPage); C# [`Bookings.CreatePageAsync`](https://openemail.uk/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. Left out, it is made from the name. It is unique across OpenEmail.
- `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. 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.
  - `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.
  - `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`)
  - `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 [`PATCH /booking-pages/{id}`](https://openemail.uk/docs/api/reference/booking-pages#patch-booking-pages-id); TypeScript [`bookings.updatePage()`](https://openemail.uk/docs/sdk/reference/bookings#updatePage); Python [`bookings.update_page()`](https://openemail.uk/docs/python/reference/bookings#updatePage); Ruby [`bookings.update_page`](https://openemail.uk/docs/ruby/reference/bookings#updatePage); PHP [`bookings->updatePage`](https://openemail.uk/docs/php/reference/bookings#updatePage); Go [`Bookings.UpdatePage`](https://openemail.uk/docs/go/reference/bookings#updatePage); Java [`bookings().updatePage`](https://openemail.uk/docs/java/reference/bookings#updatePage); C# [`Bookings.UpdatePageAsync`](https://openemail.uk/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://openemail.uk/docs/api/reference/booking-pages#delete-booking-pages-id); TypeScript [`bookings.deletePage()`](https://openemail.uk/docs/sdk/reference/bookings#deletePage); Python [`bookings.delete_page()`](https://openemail.uk/docs/python/reference/bookings#deletePage); Ruby [`bookings.delete_page`](https://openemail.uk/docs/ruby/reference/bookings#deletePage); PHP [`bookings->deletePage`](https://openemail.uk/docs/php/reference/bookings#deletePage); Go [`Bookings.DeletePage`](https://openemail.uk/docs/go/reference/bookings#deletePage); Java [`bookings().deletePage`](https://openemail.uk/docs/java/reference/bookings#deletePage); C# [`Bookings.DeletePageAsync`](https://openemail.uk/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.

- 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.

### `listBookings`

List the meetings guests booked: upcoming, waiting for approval, past, or declined and cancelled.

- 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.
- `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://openemail.uk/docs/api/reference/booking-pages#get-bookings); TypeScript [`bookings.list()`](https://openemail.uk/docs/sdk/reference/bookings#list), [`bookings.listAll()`](https://openemail.uk/docs/sdk/reference/bookings#listAll), [`bookings.iterate()`](https://openemail.uk/docs/sdk/reference/bookings#iterate); Python [`bookings.list()`](https://openemail.uk/docs/python/reference/bookings#list), [`bookings.list_all()`](https://openemail.uk/docs/python/reference/bookings#listAll), [`bookings.iterate()`](https://openemail.uk/docs/python/reference/bookings#iterate); Ruby [`bookings.list`](https://openemail.uk/docs/ruby/reference/bookings#list), [`bookings.list_all`](https://openemail.uk/docs/ruby/reference/bookings#listAll), [`bookings.iterate`](https://openemail.uk/docs/ruby/reference/bookings#iterate); PHP [`bookings->list`](https://openemail.uk/docs/php/reference/bookings#list), [`bookings->listAll`](https://openemail.uk/docs/php/reference/bookings#listAll), [`bookings->iterate`](https://openemail.uk/docs/php/reference/bookings#iterate); Go [`Bookings.List`](https://openemail.uk/docs/go/reference/bookings#list), [`Bookings.ListAll`](https://openemail.uk/docs/go/reference/bookings#listAll), [`Bookings.Iterate`](https://openemail.uk/docs/go/reference/bookings#iterate); Java [`bookings().list`](https://openemail.uk/docs/java/reference/bookings#list), [`bookings().listAll`](https://openemail.uk/docs/java/reference/bookings#listAll), [`bookings().iterate`](https://openemail.uk/docs/java/reference/bookings#iterate); C# [`Bookings.ListAsync`](https://openemail.uk/docs/csharp/reference/bookings#list), [`Bookings.ListAllAsync`](https://openemail.uk/docs/csharp/reference/bookings#listAll), [`Bookings.IterateAsync`](https://openemail.uk/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://openemail.uk/docs/api/reference/booking-pages#get-bookings-id); TypeScript [`bookings.get()`](https://openemail.uk/docs/sdk/reference/bookings#get); Python [`bookings.get()`](https://openemail.uk/docs/python/reference/bookings#get); Ruby [`bookings.get`](https://openemail.uk/docs/ruby/reference/bookings#get); PHP [`bookings->get`](https://openemail.uk/docs/php/reference/bookings#get); Go [`Bookings.Get`](https://openemail.uk/docs/go/reference/bookings#get); Java [`bookings().get`](https://openemail.uk/docs/java/reference/bookings#get); C# [`Bookings.GetAsync`](https://openemail.uk/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://openemail.uk/docs/api/reference/booking-pages#post-bookings-id-approve); TypeScript [`bookings.approve()`](https://openemail.uk/docs/sdk/reference/bookings#approve); Python [`bookings.approve()`](https://openemail.uk/docs/python/reference/bookings#approve); Ruby [`bookings.approve`](https://openemail.uk/docs/ruby/reference/bookings#approve); PHP [`bookings->approve`](https://openemail.uk/docs/php/reference/bookings#approve); Go [`Bookings.Approve`](https://openemail.uk/docs/go/reference/bookings#approve); Java [`bookings().approve`](https://openemail.uk/docs/java/reference/bookings#approve); C# [`Bookings.ApproveAsync`](https://openemail.uk/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://openemail.uk/docs/api/reference/booking-pages#post-bookings-id-decline); TypeScript [`bookings.decline()`](https://openemail.uk/docs/sdk/reference/bookings#decline); Python [`bookings.decline()`](https://openemail.uk/docs/python/reference/bookings#decline); Ruby [`bookings.decline`](https://openemail.uk/docs/ruby/reference/bookings#decline); PHP [`bookings->decline`](https://openemail.uk/docs/php/reference/bookings#decline); Go [`Bookings.Decline`](https://openemail.uk/docs/go/reference/bookings#decline); Java [`bookings().decline`](https://openemail.uk/docs/java/reference/bookings#decline); C# [`Bookings.DeclineAsync`](https://openemail.uk/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://openemail.uk/docs/api/reference/booking-pages#post-bookings-id-cancel); TypeScript [`bookings.cancel()`](https://openemail.uk/docs/sdk/reference/bookings#cancel); Python [`bookings.cancel()`](https://openemail.uk/docs/python/reference/bookings#cancel); Ruby [`bookings.cancel`](https://openemail.uk/docs/ruby/reference/bookings#cancel); PHP [`bookings->cancel`](https://openemail.uk/docs/php/reference/bookings#cancel); Go [`Bookings.Cancel`](https://openemail.uk/docs/go/reference/bookings#cancel); Java [`bookings().cancel`](https://openemail.uk/docs/java/reference/bookings#cancel); C# [`Bookings.CancelAsync`](https://openemail.uk/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://openemail.uk/docs/api/reference/booking-pages#post-bookings-id-resend); TypeScript [`bookings.resendEmail()`](https://openemail.uk/docs/sdk/reference/bookings#resendEmail); Python [`bookings.resend_email()`](https://openemail.uk/docs/python/reference/bookings#resendEmail); Ruby [`bookings.resend_email`](https://openemail.uk/docs/ruby/reference/bookings#resendEmail); PHP [`bookings->resendEmail`](https://openemail.uk/docs/php/reference/bookings#resendEmail); Go [`Bookings.ResendEmail`](https://openemail.uk/docs/go/reference/bookings#resendEmail); Java [`bookings().resendEmail`](https://openemail.uk/docs/java/reference/bookings#resendEmail); C# [`Bookings.ResendEmailAsync`](https://openemail.uk/docs/csharp/reference/bookings#resendEmail).
