---
title: "openemail bookings"
description: "Every command in this namespace, with its arguments, flags and examples."
url: "https://openemail.uk/docs/cli/reference/bookings"
area: "CLI"
category: "Reference"
---

# openemail bookings

Every command in this namespace, with its arguments, flags and examples.

## Commands

### `openemail bookings list-pages`

List the booking pages of the person

```bash
openemail bookings list-pages [flags]
```

Resolves every booking page of the person, oldest first. A booking page is a public link, `/book/<slug>`, where somebody picks a free time and books a meeting on the calendar of that person. Each page comes with its settings in `config`, the link to hand to guests in `url`, and in `counts` how many of its bookings are upcoming and how many wait for approval.

`status` is `active` while the page takes bookings and `paused` while its link works but offers no times. `problem` says what stops a page from taking bookings and is null when nothing does. `away` lists the out of office periods that close the page. A person holds at most 25 pages, so the list comes whole and is never paged.

- Scopes: `calendar:read`.
- Needs a sign-in.

**Examples**

```bash
openemail bookings list-pages
```

Print the raw JSON

```bash
openemail bookings list-pages --json
```

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

### `openemail bookings get-page`

Read one booking page by id

```bash
openemail bookings get-page <id> [flags]
```

Looks up a single booking page and returns it in the same shape as a row of `listPages`, with every setting in `config`: the meeting lengths, where the meeting happens, the weekly hours and the dates with their own hours, the notice, the buffers and the daily limit, whether a booking waits for approval, the address its emails come from, the questions a guest is asked, how the page looks and what a guest may change afterwards.

`config.availability.weekly` holds seven lists, Sunday first, of the hours open on that weekday, each as minutes after midnight in `config.availability.timezone`. `problem` says what stops the page from taking bookings, and `away` lists the out of office periods of `config.fromEmail` that are running or still to come. While `config.busy.outOfOffice` is true the page offers no times inside them.

- Scopes: `calendar:read`.
- Needs a sign-in.

**Arguments**

- `<id>` (required): Booking page id such as `bkp_5c1e9a7b3d2f48e6a0b4c7d1`, as `listPages` returns it.

**Examples**

```bash
openemail bookings get-page bkp_5c1e9a7b3d2f48e6a0b4c7d1
```

Print the raw JSON

```bash
openemail bookings get-page bkp_5c1e9a7b3d2f48e6a0b4c7d1 --json
```

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

### `openemail bookings create-page`

Create a booking page

```bash
openemail bookings create-page --name <value> [flags]
openemail bookings create-page --data <json|@file|-> [flags]
```

Creates a booking page and resolves with it as it is stored. The page takes bookings at once, at the link in `url`. Only `name` is required: the page starts with weekdays from 09:00 to 17:00, 30 minute meetings, four hours of notice, times up to 60 days ahead and the first address the person may send from. Anything in `config` replaces that default, and what it leaves out keeps it.

`slug` is the last part of the public link, `/book/<slug>`. Left out, it is made from the name. `timezone` says which time zone the working hours are read in when `config.availability.timezone` is not sent.

The times a page offers are its working hours with everything taken out that makes the person busy: their calendar events, invitations they have not declined, calendars they subscribed to, bookings they already have, the gaps the page keeps around meetings, and the days they are out of office. A booking is a calendar event organised by `config.fromEmail`, and the guest is told by email from that address, so the call needs `emails:send` beside `calendar:write`.

- Scopes: `calendar:write`, `emails:send`.
- Needs a sign-in.

**Flags**

- `--name <value>`: What the page is called, shown to guests as its heading, such as `Intro call`. Trimmed, 1 to 80 characters. Required, here or in `--data`.
- `--slug <value>`: The last part of the public link: 3 to 60 lowercase letters and digits, with single hyphens between words. It is unique across OpenEmail. Left out, it is made from the name.
- `--timezone <value>`: The IANA time zone the working hours are read in, such as `Europe/Berlin`, when `config.availability.timezone` is not sent. Defaults to `UTC`.
- `--config-description <value>`: Text shown under the name of the page, up to 2,000 characters. Basic Markdown works: bold, italic, links and lists. Defaults to none.
- `--config-host-name <value>`: The name guests see as the person they meet, up to 80 characters. Defaults to the name of the account.
- `--config-durations <n,n>` (repeatable): The meeting lengths a guest can pick, in minutes: 1 to 4 of them, each a multiple of 5 between 5 and 720. Defaults to `[30]`.
- `--config-location-kind <value>`: Where the meeting happens: `video` with a fixed link in `value`, `phone`, where the guest is asked for a number, `in-person` with the address in `value`, or `none`. Defaults to `none`.
- `--config-location-value <value>`: The `https://` link of a `video` meeting or the address of an `in-person` one, up to 500 characters. It is dropped for `phone` and `none`.
- `--config-availability-timezone <value>`: The IANA time zone the hours of the page are read in. Defaults to `timezone`.
- `--config-availability-weekly <json|@file|->`: Seven lists, Sunday first, of the hours open on that weekday. Each range is `{ start, end }` in minutes after midnight, so `{ start: 540, end: 1020 }` is 09:00 to 17:00. An empty list closes the day, and a day takes at most 6 ranges. Defaults to 09:00 to 17:00 from Monday to Friday. JSON shaped as `Array<Array<BookingTimeRange>>`, inline or from a file with @path.
- `--config-availability-overrides <json|@file|->`: Dates with their own hours, at most 180, each `{ date, ranges }`. `date` is `YYYY-MM-DD` in the time zone of the page, and an empty `ranges` closes that date. Defaults to none. JSON shaped as `Array<BookingDateOverride>`, inline or from a file with @path.
- `--config-rules-notice-minutes <n>`: How many minutes ahead a booking has to be made, from 0 to 43,200. Defaults to 240.
- `--config-rules-horizon-days <n>`: How many days ahead the page offers times, from 1 to 365. Defaults to 60.
- `--config-rules-interval-minutes <n>`: Minutes between two start times: 5, 10, 15, 20, 30, 45, 60, 90 or 120. Null, the default, steps by the length of the meeting.
- `--config-rules-buffer-before-minutes <n>`: Minutes kept free before every meeting, from 0 to 240. Defaults to 0.
- `--config-rules-buffer-after-minutes <n>`: Minutes kept free after every meeting, from 0 to 240. Defaults to 0.
- `--config-rules-daily-limit <n>`: The most bookings the page takes on one day, from 1 to 50. Null, the default, sets no limit.
- `--config-approval`: True holds each new booking as a request until `approve` or `decline` answers it. False, the default, confirms it at once.
- `--config-from-email <value>`: 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. Defaults to the first such address.
- `--config-notify-host`: Whether `fromEmail` gets an email about each new, moved or cancelled booking. Defaults to true.
- `--config-questions <json|@file|->`: What the guest is asked besides their name and email, at most 10, each `{ id, kind, label, required, options }`. `id` is a stable key for the answers: 4 to 16 lowercase letters and digits, unique on the page. `kind` is `text`, `long-text`, `phone`, `choice` or `checkbox`. `options` holds the answers of a `choice` question, from 2 to 12, and is empty for the other kinds. Defaults to none. JSON shaped as `Array<BookingQuestion>`, inline or from a file with @path.
- `--config-confirmation <value>`: Text shown to the guest after booking and added to the confirmation email, up to 1,000 characters. Defaults to none.
- `--config-redirect-url <value>`: An `https://` page to send the guest to after booking, or an empty string for none, which is the default.
- `--config-appearance-accent <value>`: The colour of buttons and the picked day, as `#rrggbb`. Defaults to `#18181b`.
- `--config-appearance-theme <value>`: `auto` follows the device of the guest, and `light` or `dark` forces one. Defaults to `auto`.
- `--config-appearance-show-avatar`: Whether the page shows the photo of the person, or their initials when they have none. Defaults to true.
- `--config-guest-changes-cancel`: Whether a guest may cancel from the link in their emails. Defaults to true.
- `--config-guest-changes-reschedule`: Whether a guest may move the meeting from the link in their emails. Defaults to true.
- `--config-guest-changes-cutoff-minutes <n>`: How many minutes before the meeting those changes close, from 0 to 20,160. Defaults to 0.
- `--config-busy-addresses <a,b>` (repeatable): The addresses whose invitations block time unless declined, at most 50. Null, the default, checks every address the person holds.
- `--config-busy-subscriptions`: Whether events from calendars the person subscribed to block time. Defaults to true.
- `--config-busy-out-of-office`: Whether the page offers no times while `fromEmail` is out of office. Defaults to true.
- `--config-seo-title <value>`: The title of the browser tab and of a search result, up to 120 characters. Empty, the default, uses the name of the page and the host.
- `--config-seo-description <value>`: The summary under the title in a search result, up to 300 characters. Empty, the default, uses the start of the description.
- `--config-seo-indexable`: Whether search engines may list the page. Defaults to false, which asks them not to.
- `--config-extra-guests <n>`: 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.
- `--data <json|@file|->`: The whole `body` as JSON, inline, from a file with @path, or - for standard input. Flags override its keys.

**Examples**

The required values only

```bash
openemail bookings create-page --name 'Intro call'
```

With optional flags

```bash
openemail bookings create-page --name 'Intro call' --timezone Europe/Berlin --config-description 'A first conversation about your project.' --config-durations 30,60
```

Read the whole body from a JSON file

```bash
openemail bookings create-page --data @booking.json
```

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

### `openemail bookings update-page`

Change the name, the link, the status or any setting of a booking page

```bash
openemail bookings update-page <id> [flags]
```

Changes a booking page and resolves with it as it is stored. Send only what changes: a field left out stays as it is, and a patch with nothing in it is a 422.

`config` is merged, not replaced. A top-level value such as `approval` or `fromEmail` replaces the stored one. Inside `location`, `availability`, `rules`, `appearance`, `guestChanges`, `busy` and `seo` each field is merged on its own, so `rules: { dailyLimit: 4 }` leaves the notice and the buffers alone. A list is replaced whole: send every entry of `durations`, `questions`, `availability.weekly` or `availability.overrides` again, not only the ones that change.

Set `status` to `paused` to stop offering times without losing the link, and to `active` to offer them again. Bookings already made keep their time whatever changes. A new `slug` moves the page to a new link and the old one stops working, so links already handed out break.

- Scopes: `calendar:write`, `emails:send`.
- Needs a sign-in.

**Arguments**

- `<id>` (required): Booking page id such as `bkp_5c1e9a7b3d2f48e6a0b4c7d1`, as `listPages` returns it.

**Flags**

- `--name <value>`: New name, shown to guests as the heading of the page. Trimmed, 1 to 80 characters. Left out, the name stays.
- `--slug <value>`: New last part of the public link: 3 to 60 lowercase letters and digits, with single hyphens between words. It is unique across OpenEmail. Left out, the link stays.
- `--status <value>`: `active` takes bookings. `paused` keeps the link working but offers no times. Left out, it stays.
- `--config-description <value>`: Text shown under the name of the page, up to 2,000 characters. Basic Markdown works: bold, italic, links and lists. An empty string clears it.
- `--config-host-name <value>`: The name guests see as the person they meet, up to 80 characters.
- `--config-durations <n,n>` (repeatable): The meeting lengths a guest can pick, in minutes, replacing the list the page had: 1 to 4 of them, each a multiple of 5 between 5 and 720.
- `--config-location-kind <value>`: Where the meeting happens: `video` with a fixed link in `value`, `phone`, where the guest is asked for a number, `in-person` with the address in `value`, or `none`.
- `--config-location-value <value>`: The `https://` link of a `video` meeting or the address of an `in-person` one, up to 500 characters. It is dropped for `phone` and `none`.
- `--config-availability-timezone <value>`: The IANA time zone the hours of the page are read in, such as `Europe/Berlin`.
- `--config-availability-weekly <json|@file|->`: All seven lists again, Sunday first, of the hours open on that weekday. Each range is `{ start, end }` in minutes after midnight, so `{ start: 540, end: 1020 }` is 09:00 to 17:00. An empty list closes the day, and a day takes at most 6 ranges. JSON shaped as `Array<Array<BookingTimeRange>>`, inline or from a file with @path.
- `--config-availability-overrides <json|@file|->`: Every date with its own hours again, at most 180, each `{ date, ranges }`. `date` is `YYYY-MM-DD` in the time zone of the page, and an empty `ranges` closes that date. An empty array removes them all. JSON shaped as `Array<BookingDateOverride>`, inline or from a file with @path.
- `--config-rules-notice-minutes <n>`: How many minutes ahead a booking has to be made, from 0 to 43,200.
- `--config-rules-horizon-days <n>`: How many days ahead the page offers times, from 1 to 365.
- `--config-rules-interval-minutes <n>`: Minutes between two start times: 5, 10, 15, 20, 30, 45, 60, 90 or 120. Null steps by the length of the meeting.
- `--config-rules-buffer-before-minutes <n>`: Minutes kept free before every meeting, from 0 to 240.
- `--config-rules-buffer-after-minutes <n>`: Minutes kept free after every meeting, from 0 to 240.
- `--config-rules-daily-limit <n>`: The most bookings the page takes on one day, from 1 to 50. Null sets no limit.
- `--config-approval`: True holds each new booking as a request until `approve` or `decline` answers it. False confirms it at once. Requests already waiting keep waiting.
- `--config-from-email <value>`: 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.
- `--config-notify-host`: Whether `fromEmail` gets an email about each new, moved or cancelled booking.
- `--config-questions <json|@file|->`: Every question again, at most 10, each `{ id, kind, label, required, options }`. `id` is a stable key for the answers: 4 to 16 lowercase letters and digits, unique on the page. `kind` is `text`, `long-text`, `phone`, `choice` or `checkbox`. `options` holds the answers of a `choice` question, from 2 to 12, and is empty for the other kinds. An empty array asks nothing more. JSON shaped as `Array<BookingQuestion>`, inline or from a file with @path.
- `--config-confirmation <value>`: Text shown to the guest after booking and added to the confirmation email, up to 1,000 characters. An empty string clears it.
- `--config-redirect-url <value>`: An `https://` page to send the guest to after booking, or an empty string for none.
- `--config-appearance-accent <value>`: The colour of buttons and the picked day, as `#rrggbb`.
- `--config-appearance-theme <value>`: `auto` follows the device of the guest, and `light` or `dark` forces one.
- `--config-appearance-show-avatar`: Whether the page shows the photo of the person, or their initials when they have none.
- `--config-guest-changes-cancel`: Whether a guest may cancel from the link in their emails.
- `--config-guest-changes-reschedule`: Whether a guest may move the meeting from the link in their emails.
- `--config-guest-changes-cutoff-minutes <n>`: How many minutes before the meeting those changes close, from 0 to 20,160.
- `--config-busy-addresses <a,b>` (repeatable): The addresses whose invitations block time unless declined, at most 50. Null checks every address the person holds.
- `--config-busy-subscriptions`: Whether events from calendars the person subscribed to block time.
- `--config-busy-out-of-office`: Whether the page offers no times while `fromEmail` is out of office.
- `--config-seo-title <value>`: The title of the browser tab and of a search result, up to 120 characters. An empty string goes back to the name of the page and the host.
- `--config-seo-description <value>`: The summary under the title in a search result, up to 300 characters. An empty string goes back to the start of the description.
- `--config-seo-indexable`: Whether search engines may list the page.
- `--config-extra-guests <n>`: How many other people a guest may add to a booking, 0 to 10. Each one gets the invitation and every later change. 0 hides the field.
- `--data <json|@file|->`: The whole `patch` as JSON, inline, from a file with @path, or - for standard input. Flags override its keys.

**Examples**

With optional flags

```bash
openemail bookings update-page bkp_5c1e9a7b3d2f48e6a0b4c7d1 --config-durations 45 --config-rules-buffer-after-minutes 15 --config-rules-daily-limit 4
```

Print the raw JSON

```bash
openemail bookings update-page bkp_5c1e9a7b3d2f48e6a0b4c7d1 --config-durations 45 --config-rules-buffer-after-minutes 15 --config-rules-daily-limit 4 --json
```

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

### `openemail bookings delete-page`

Delete a booking page

```bash
openemail bookings delete-page <id> [flags]
```

Deletes a booking page for good. Its public link stops working and the list of its bookings goes with it, so `list` no longer shows them and guests can no longer move or cancel through the links in their emails. The meetings already booked stay on the calendar, where `calendar.cancelEvent` can still call one off.

There is no undo. To stop offering times and keep the page, its link and its bookings, use `updatePage` with `status` `paused`.

- Scopes: `calendar:write`.
- Needs a sign-in.
- Asks you to confirm.

**Arguments**

- `<id>` (required): Booking page id such as `bkp_5c1e9a7b3d2f48e6a0b4c7d1`, as `listPages` returns it.

**Examples**

```bash
openemail bookings delete-page bkp_5c1e9a7b3d2f48e6a0b4c7d1
```

Skip the confirmation, for scripts

```bash
openemail bookings delete-page bkp_5c1e9a7b3d2f48e6a0b4c7d1 --yes
```

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

### `openemail bookings list-times`

List the times a booking page offers

```bash
openemail bookings list-times <id> [flags]
```

Resolves the start times a guest could book on a page inside a window, in order. They are the hours of the page with everything taken out that makes the person busy: their calendar events, invitations they have not declined, calendars they subscribed to, bookings they already have, the gaps the page keeps around meetings, its daily limit, its notice and the out of office periods that close it.

The window starts at `from`, or now, and ends at `to`, or 14 days later. It covers at most 62 days, and a later `to` is cut back to that. `--duration-minutes` picks which meeting length the times are for and has to be one of the `durations` of the page. Left out, the shortest is used. Both bounds take a `Date` or an ISO 8601 string, and the SDK converts a `Date` with `toISOString()`.

A paused page still answers, so the times can be checked before it is turned on. A page with a `problem` offers nothing.

- Scopes: `calendar:read`.
- Needs a sign-in.

**Arguments**

- `<id>` (required): Booking page id such as `bkp_5c1e9a7b3d2f48e6a0b4c7d1`, as `listPages` returns it.

**Flags**

- `--from <when>`: The start of the window. Defaults to now.
- `--to <when>`: The end of the window, later than `from`. Defaults to 14 days after `from`, and counts for at most 62 days after it.
- `--duration-minutes <n>`: The meeting length in minutes, one of the `durations` of the page. Defaults to the shortest.

**Examples**

The required values only

```bash
openemail bookings list-times bkp_5c1e9a7b3d2f48e6a0b4c7d1
```

With optional flags

```bash
openemail bookings list-times bkp_5c1e9a7b3d2f48e6a0b4c7d1 --duration-minutes 30
```

Print the raw JSON

```bash
openemail bookings list-times bkp_5c1e9a7b3d2f48e6a0b4c7d1 --json
```

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

### `openemail bookings list`

List the meetings guests booked, a page at a time

```bash
openemail bookings list [flags]
```

Resolves one page of bookings: the meetings guests booked on the booking pages of the person, or on one page with `--page-id`. A booking is a calendar event with the guest invited, so it shows wherever the calendar does, and a meeting moved or cancelled in the calendar reads as moved or cancelled here.

`view` picks which bookings are listed. `upcoming`, the default, holds the confirmed meetings that are not over. `pending` holds the requests that wait for `approve` or `decline`, on a page whose `config.approval` is true. `past` holds the meetings that are over and the requests nobody answered in time, and `ended` holds the ones that were declined or cancelled. `upcoming` and `pending` come soonest first, `past` and `ended` latest first.

Each booking names its page in `--page-id` and `pageName`, the guest in `guest`, what they answered in `answers` and its calendar event in `eventId`.

Add `--all` to walk every page: a table on a terminal, one JSON object per line when piped or with `--ndjson`, and one `{ items, hasMore, nextCursor }` document with `--json`. `--max <n>` stops after that many items.

- Scopes: `calendar:read`.
- Needs a sign-in.
- Aliases: `ls`.

**Flags**

- `--view <value>`: Which bookings to list: `upcoming`, `pending`, `past` or `ended`. Defaults to `upcoming`.
- `--page-id <value>`: Only the bookings of this booking page, by its id. Left out, the bookings of every page of the person are listed.
- `--limit <n>`: Page size, from 1 to 100. The server defaults to 30.
- `--cursor <value>`: The `nextCursor` of the previous page, passed back as it came. Leave it out for the first page.
- `--all`: Fetch every page and stream the items as they arrive.
- `--max <n>`: Stop after this many items. Implies `--all`.
- `--ndjson`: Print every item as one JSON object per line. Implies `--all`

**Examples**

```bash
openemail bookings list
```

With optional flags

```bash
openemail bookings list --view pending
```

Walk every page and stop after 100 items

```bash
openemail bookings list --all --max 100
```

One JSON object per line when piped

```bash
openemail bookings list --all > bookings.ndjson
```

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); Python [`bookings.list()`](https://openemail.uk/docs/python/reference/bookings#list); Ruby [`bookings.list`](https://openemail.uk/docs/ruby/reference/bookings#list); PHP [`bookings->list`](https://openemail.uk/docs/php/reference/bookings#list); Go [`Bookings.List`](https://openemail.uk/docs/go/reference/bookings#list); Java [`bookings().list`](https://openemail.uk/docs/java/reference/bookings#list); C# [`Bookings.ListAsync`](https://openemail.uk/docs/csharp/reference/bookings#list).

### `openemail bookings get`

Read one booking by id

```bash
openemail bookings get <id> [flags]
```

Looks up a single booking and returns it in the same shape as a row of `list`: the booking page it was made on, the guest with the time zone they booked in, what they answered to the questions of the page, where the meeting happens as the guest was told, the calendar event it is and how it ended if it did.

A booking follows its calendar event. Reading one first catches up with the calendar, so a meeting that was moved there shows its new `start` and `end`, and one that was cancelled or deleted there reads `cancelled`, or `declined` when it still waited for approval. `endedBy` says whether the `host` or the `guest` declined or cancelled it, and `endReason` holds the reason they gave. `guestMailFailed` is true when the last email to the guest could not be sent, and `resendEmail` tries again.

- Scopes: `calendar:read`.
- Needs a sign-in.
- Aliases: `show`, `view`.

**Arguments**

- `<id>` (required): Booking id such as `bkg_2b8d4f6a1c3e5079b6d8f0a2`, as `list` returns it.

**Examples**

```bash
openemail bookings get bkg_2b8d4f6a1c3e5079b6d8f0a2
```

Print the raw JSON

```bash
openemail bookings get bkg_2b8d4f6a1c3e5079b6d8f0a2 --json
```

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

### `openemail bookings approve`

Confirm a booking that waits for approval

```bash
openemail bookings approve <id> [flags]
```

Confirms a booking that waits for approval, on a booking page whose `config.approval` is true. The hold on the calendar becomes a confirmed meeting, and the guest is told by email, sent from the address of the page with the calendar invitation attached. It takes no body.

The email goes out as `config.fromEmail`, so the call needs `emails:send` beside `calendar:write`. `list` with `view` `pending` reads the bookings that wait.

- Scopes: `calendar:write`, `emails:send`.
- Needs a sign-in.
- Asks you to confirm.

**Arguments**

- `<id>` (required): Booking id such as `bkg_2b8d4f6a1c3e5079b6d8f0a2`, as `list` returns it.

**Examples**

```bash
openemail bookings approve bkg_2b8d4f6a1c3e5079b6d8f0a2
```

Skip the confirmation, for scripts

```bash
openemail bookings approve bkg_2b8d4f6a1c3e5079b6d8f0a2 --yes
```

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

### `openemail bookings decline`

Turn down a booking that waits for approval

```bash
openemail bookings decline <id> [flags]
```

Turns down a booking that waits for approval and frees its time, so the page offers that time again. The guest is told by email, sent from the address of the page, with `reason` in it when one is given. Call it with no body to decline without a reason.

The email goes out as `config.fromEmail`, so the call needs `emails:send` beside `calendar:write`.

- Scopes: `calendar:write`, `emails:send`.
- Needs a sign-in.
- Asks you to confirm.

**Arguments**

- `<id>` (required): Booking id such as `bkg_2b8d4f6a1c3e5079b6d8f0a2`, as `list` returns it.

**Flags**

- `--reason <value>`: A sentence for the guest, trimmed, at most 500 characters, included in the email they get. Left out or null, the email gives no reason.
- `--data <json|@file|->`: The whole `body` as JSON, inline, from a file with @path, or - for standard input. Flags override its keys.

**Examples**

The required values only

```bash
openemail bookings decline bkg_2b8d4f6a1c3e5079b6d8f0a2
```

With optional flags

```bash
openemail bookings decline bkg_2b8d4f6a1c3e5079b6d8f0a2 --reason 'I am away that week. Please pick a time after the 20th.'
```

Skip the confirmation, for scripts

```bash
openemail bookings decline bkg_2b8d4f6a1c3e5079b6d8f0a2 --yes
```

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

### `openemail bookings cancel`

Cancel a booked meeting

```bash
openemail bookings cancel <id> [flags]
```

Cancels a meeting that has not ended yet and cancels its calendar event. The guest is told by email, sent from the address of the page with the cancellation attached, and with `reason` in it when one is given. Call it with no body to cancel without a reason.

A booking that still waits for approval is declined instead, so it ends as `declined`, not `cancelled`. The email goes out as `config.fromEmail`, so the call needs `emails:send` beside `calendar:write`.

- Scopes: `calendar:write`, `emails:send`.
- Needs a sign-in.
- Asks you to confirm.

**Arguments**

- `<id>` (required): Booking id such as `bkg_2b8d4f6a1c3e5079b6d8f0a2`, as `list` returns it.

**Flags**

- `--reason <value>`: A sentence for the guest, trimmed, at most 500 characters, included in the email they get. Left out or null, the email gives no reason.
- `--data <json|@file|->`: The whole `body` as JSON, inline, from a file with @path, or - for standard input. Flags override its keys.

**Examples**

The required values only

```bash
openemail bookings cancel bkg_2b8d4f6a1c3e5079b6d8f0a2
```

With optional flags

```bash
openemail bookings cancel bkg_2b8d4f6a1c3e5079b6d8f0a2 --reason 'Something urgent came up. Please book another time.'
```

Skip the confirmation, for scripts

```bash
openemail bookings cancel bkg_2b8d4f6a1c3e5079b6d8f0a2 --yes
```

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

### `openemail bookings resend-email`

Send the guest the email about their booking again

```bash
openemail bookings resend-email <id> [flags]
```

Sends the guest the email that matches where the booking stands now: the request while it waits for approval, the confirmation with its invitation once it is confirmed, or the notice that it was declined or cancelled, with the reason that was given. Use it when `guestMailFailed` is true. It takes no body and changes nothing else about the booking.

- Scopes: `calendar:write`, `emails:send`.
- Needs a sign-in.

**Arguments**

- `<id>` (required): Booking id such as `bkg_2b8d4f6a1c3e5079b6d8f0a2`, as `list` returns it.

**Examples**

```bash
openemail bookings resend-email bkg_2b8d4f6a1c3e5079b6d8f0a2
```

Print the raw JSON

```bash
openemail bookings resend-email bkg_2b8d4f6a1c3e5079b6d8f0a2 --json
```

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