Skip to the documentation
CLI

nextmail bookings

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

Commands

Public links where somebody books a meeting on a person's calendar: create a booking page, change its hours, questions and rules, pause or delete it, read the times it offers, list the meetings guests booked, and approve, decline or cancel one. An API key acts for the workspace owner, and an app for the person who connected it.

Every command here also takes the global flags, such as --json, --profile and --dry-run. See the global flags

openemail bookings list-pages

List the booking pages of the person

Scopescalendar:readNeeds a sign-in

Usage

nextmail bookings list-pages [flags]

Resolves the booking pages of the person, oldest first unless sort says otherwise. q searches the name and the link, status keeps the active or the paused pages, and since and until keep the pages made in a window. 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.

Flags

--q <value>

Only the pages whose name or link contains this text, at most 200 characters. Case and accents are ignored.

--status <value>

active for the pages that take bookings, paused for the ones that do not. Left out, both.

--since <when>

Only the pages made at or after this instant, as a Date or an ISO 8601 string.

--until <when>

Only the pages made before this instant, later than since.

--sort <value>

oldest (the default) or newest by when the page was made, name from A to Z, or upcoming with the most upcoming meetings first.

Examples

nextmail bookings list-pages
Print the raw JSON
nextmail bookings list-pages --json

Also available in

API
GET /booking-pages
TypeScript
nextmail.bookings.listPages()
Python
bookings.list_pages()
Ruby
bookings.list_pages
PHP
bookings->listPages
Go
Bookings.ListPages
Java
bookings().listPages
C#
Bookings.ListPagesAsync

openemail bookings get-page

Read one booking page by id

Scopescalendar:readNeeds a sign-in

Usage

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

Arguments

<id>Required

Booking page id such as bkp_5c1e9a7b3d2f48e6a0b4c7d1, as listPages returns it.

Examples

nextmail bookings get-page bkp_5c1e9a7b3d2f48e6a0b4c7d1
Print the raw JSON
nextmail bookings get-page bkp_5c1e9a7b3d2f48e6a0b4c7d1 --json

Also available in

API
GET /booking-pages/{id}
TypeScript
nextmail.bookings.getPage()
Python
bookings.get_page()
Ruby
bookings.get_page
PHP
bookings->getPage
Go
Bookings.GetPage
Java
bookings().getPage
C#
Bookings.GetPageAsync

openemail bookings create-page

Create a booking page

Scopescalendar:writeemails:sendNeeds a sign-in

Usage

nextmail bookings create-page --name <value> [flags]
nextmail 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.

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 Nextmail. 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, placeholder }. 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. placeholder is optional example text shown in the empty field of a text, long-text or phone question, up to 160 characters. 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-appearance-background <value>

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, or a colour as #rrggbb. Defaults to default. image shows the photo uploaded with uploadBackground, so a new page cannot start with it: that answers 422 invalid_booking_page.

--config-appearance-fonts-primary <value>

The font of the text: one of the ids in BRAND_FONT_IDS, such as inter or georgia, or null for the default. Defaults to null.

--config-appearance-fonts-secondary <value>

The font of the title, such as instrument-serif, or null to keep the title in the font of the text. Defaults to null.

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

--config-reminders-guest <n,n>Repeatable

When the guest gets a reminder email, in minutes before the meeting: up to three of 10, 30, 60, 120, 1440, 2880 and 10080. Defaults to one day before, and an empty list sends none.

--config-reminders-host <n,n>Repeatable

The reminders each booked meeting carries on your own calendar, in minutes before it: up to three of 0, 5, 10, 15, 30, 60 and 1440. Defaults to 10.

--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
nextmail bookings create-page --name 'Intro call'
With optional flags
nextmail 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
nextmail bookings create-page --data @booking.json

Also available in

API
POST /booking-pages
TypeScript
nextmail.bookings.createPage()
Python
bookings.create_page()
Ruby
bookings.create_page
PHP
bookings->createPage
Go
Bookings.CreatePage
Java
bookings().createPage
C#
Bookings.CreatePageAsync

openemail bookings update-page

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

Scopescalendar:writeemails:sendNeeds a sign-in

Usage

nextmail 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, seo and reminders each field is merged on its own, and so is each font in appearance.fonts, 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.

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 Nextmail. 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, placeholder }. 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. placeholder is optional example text shown in the empty field of a text, long-text or phone question, up to 160 characters. 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-appearance-background <value>

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, a colour as #rrggbb, or image for the photo uploaded with uploadBackground. image without an uploaded photo is a 422 invalid_booking_page.

--config-appearance-fonts-primary <value>

The font of the text: one of the ids in BRAND_FONT_IDS, such as inter or georgia, or null for the default. Left out, it keeps its value.

--config-appearance-fonts-secondary <value>

The font of the title, such as instrument-serif, or null to keep the title in the font of the text. Left out, it keeps its value.

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

--config-reminders-guest <n,n>Repeatable

When the guest gets a reminder email, in minutes before the meeting: up to three of 10, 30, 60, 120, 1440, 2880 and 10080. An empty list sends none.

--config-reminders-host <n,n>Repeatable

The reminders each new booking carries on your own calendar, in minutes before it: up to three of 0, 5, 10, 15, 30, 60 and 1440.

--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
nextmail bookings update-page bkp_5c1e9a7b3d2f48e6a0b4c7d1 --config-durations 45 --config-rules-buffer-after-minutes 15 --config-rules-daily-limit 4
Print the raw JSON
nextmail 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}
TypeScript
nextmail.bookings.updatePage()
Python
bookings.update_page()
Ruby
bookings.update_page
PHP
bookings->updatePage
Go
Bookings.UpdatePage
Java
bookings().updatePage
C#
Bookings.UpdatePageAsync

openemail bookings upload-background

Upload the background photo of a booking page

Scopescalendar:writeemails:sendNeeds a sign-in

Usage

nextmail bookings upload-background <id> <data> [flags]

Sends the image bytes as the request body, replacing the photo there was, and resolves with the page. The photo fills the public page behind the card: config.appearance.background becomes image and config.appearance.backgroundImage holds the address of the stored photo.

Up to 5 MB goes in, and it is fitted into 2560 by 1600 pixels and stored as WebP. It takes PNG, JPEG, WebP or GIF, and an animated image keeps its first frame. The type is read from --content-type, or from a Blob's own type when that is left out, and without either the server refuses the bytes with 422 invalid_image.

To go back to a preset or a colour and keep the photo for later, set config.appearance.background with updatePage. removeBackground deletes the photo.

Arguments

<id>Required

Booking page id such as bkp_5c1e9a7b3d2f48e6a0b4c7d1, as listPages returns it.

<data>Required

The image: a Blob, ArrayBuffer or Uint8Array.

Flags

--content-type <value>

image/png, image/jpeg, image/webp or image/gif. Required unless data is a Blob with a type.

Examples

The required values only
nextmail bookings upload-background bkp_5c1e9a7b3d2f48e6a0b4c7d1 ./photo.jpg
With optional flags
nextmail bookings upload-background bkp_5c1e9a7b3d2f48e6a0b4c7d1 ./photo.jpg --content-type image/jpeg

Also available in

API
PUT /booking-pages/{id}/background
TypeScript
nextmail.bookings.uploadBackground()
Python
bookings.upload_background()
Ruby
bookings.upload_background
PHP
bookings->uploadBackground
Go
Bookings.UploadBackground
Java
bookings().uploadBackground
C#
Bookings.UploadBackgroundAsync

openemail bookings remove-background

Remove the background photo of a booking page

Scopescalendar:writeemails:sendNeeds a sign-in
Asks you to confirm

Usage

nextmail bookings remove-background <id> [flags]

Deletes the stored background photo of a booking page and resolves with the page. A page that showed the photo goes back to the default background, and one that showed a preset or a colour keeps it. Removing a photo that is not set changes nothing.

Arguments

<id>Required

Booking page id such as bkp_5c1e9a7b3d2f48e6a0b4c7d1, as listPages returns it.

Examples

nextmail bookings remove-background bkp_5c1e9a7b3d2f48e6a0b4c7d1
Skip the confirmation, for scripts
nextmail bookings remove-background bkp_5c1e9a7b3d2f48e6a0b4c7d1 --yes

Also available in

API
DELETE /booking-pages/{id}/background
TypeScript
nextmail.bookings.removeBackground()
Python
bookings.remove_background()
Ruby
bookings.remove_background
PHP
bookings->removeBackground
Go
Bookings.RemoveBackground
Java
bookings().removeBackground
C#
Bookings.RemoveBackgroundAsync

openemail bookings delete-page

Delete a booking page

Scopescalendar:writeNeeds a sign-in
Asks you to confirm

Usage

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

Arguments

<id>Required

Booking page id such as bkp_5c1e9a7b3d2f48e6a0b4c7d1, as listPages returns it.

Examples

nextmail bookings delete-page bkp_5c1e9a7b3d2f48e6a0b4c7d1
Skip the confirmation, for scripts
nextmail bookings delete-page bkp_5c1e9a7b3d2f48e6a0b4c7d1 --yes

Also available in

API
DELETE /booking-pages/{id}
TypeScript
nextmail.bookings.deletePage()
Python
bookings.delete_page()
Ruby
bookings.delete_page
PHP
bookings->deletePage
Go
Bookings.DeletePage
Java
bookings().deletePage
C#
Bookings.DeletePageAsync

openemail bookings list-times

List the times a booking page offers

Scopescalendar:readNeeds a sign-in

Usage

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

With --booking-id the times are the ones that booking can move to with reschedule: its own time counts as free, and they are for its length.

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

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.

--booking-id <value>

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 --duration-minutes is ignored.

Examples

The required values only
nextmail bookings list-times bkp_5c1e9a7b3d2f48e6a0b4c7d1
With optional flags
nextmail bookings list-times bkp_5c1e9a7b3d2f48e6a0b4c7d1 --duration-minutes 30
Print the raw JSON
nextmail bookings list-times bkp_5c1e9a7b3d2f48e6a0b4c7d1 --json

Also available in

API
GET /booking-pages/{id}/times
TypeScript
nextmail.bookings.listTimes()
Python
bookings.list_times()
Ruby
bookings.list_times
PHP
bookings->listTimes
Go
Bookings.ListTimes
Java
bookings().listTimes
C#
Bookings.ListTimesAsync

openemail bookings list

List the meetings guests booked, a page at a time

Scopescalendar:readNeeds a sign-inAliasesls

Usage

nextmail bookings list [flags]

Resolves one page of bookings: the meetings guests booked on the booking pages of the person, or on some of them with --page-ids. q searches the guest and the page, and from and to keep the meetings that start in a window. 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.

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.

--page-ids <a,b>Repeatable

Only the bookings of these booking pages, at most 25 ids. Left out, every page of the person.

--q <value>

Only the bookings whose guest name, guest email or page name contains this text, at most 200 characters. Case and accents are ignored.

--from <when>

Only the meetings that start at or after this instant, as a Date or an ISO 8601 string.

--to <when>

Only the meetings that start before this instant, later than from.

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

nextmail bookings list
With optional flags
nextmail bookings list --view pending
Walk every page and stop after 100 items
nextmail bookings list --all --max 100
One JSON object per line when piped
nextmail bookings list --all > bookings.ndjson

Also available in

API
GET /bookings
TypeScript
nextmail.bookings.list()
Python
bookings.list()
Ruby
bookings.list
PHP
bookings->list
Go
Bookings.List
Java
bookings().list
C#
Bookings.ListAsync

openemail bookings get

Read one booking by id

Scopescalendar:readNeeds a sign-inAliasesshowview

Usage

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

Arguments

<id>Required

Booking id such as bkg_2b8d4f6a1c3e5079b6d8f0a2, as list returns it.

Examples

nextmail bookings get bkg_2b8d4f6a1c3e5079b6d8f0a2
Print the raw JSON
nextmail bookings get bkg_2b8d4f6a1c3e5079b6d8f0a2 --json

Also available in

API
GET /bookings/{id}
TypeScript
nextmail.bookings.get()
Python
bookings.get()
Ruby
bookings.get
PHP
bookings->get
Go
Bookings.Get
Java
bookings().get
C#
Bookings.GetAsync

openemail bookings approve

Confirm a booking that waits for approval

Scopescalendar:writeemails:sendNeeds a sign-in
Asks you to confirm

Usage

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

Arguments

<id>Required

Booking id such as bkg_2b8d4f6a1c3e5079b6d8f0a2, as list returns it.

Examples

nextmail bookings approve bkg_2b8d4f6a1c3e5079b6d8f0a2
Skip the confirmation, for scripts
nextmail bookings approve bkg_2b8d4f6a1c3e5079b6d8f0a2 --yes

Also available in

API
POST /bookings/{id}/approve
TypeScript
nextmail.bookings.approve()
Python
bookings.approve()
Ruby
bookings.approve
PHP
bookings->approve
Go
Bookings.Approve
Java
bookings().approve
C#
Bookings.ApproveAsync

openemail bookings decline

Turn down a booking that waits for approval

Scopescalendar:writeemails:sendNeeds a sign-in
Asks you to confirm

Usage

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

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
nextmail bookings decline bkg_2b8d4f6a1c3e5079b6d8f0a2
With optional flags
nextmail bookings decline bkg_2b8d4f6a1c3e5079b6d8f0a2 --reason 'I am away that week. Please pick a time after the 20th.'
Skip the confirmation, for scripts
nextmail bookings decline bkg_2b8d4f6a1c3e5079b6d8f0a2 --yes

Also available in

API
POST /bookings/{id}/decline
TypeScript
nextmail.bookings.decline()
Python
bookings.decline()
Ruby
bookings.decline
PHP
bookings->decline
Go
Bookings.Decline
Java
bookings().decline
C#
Bookings.DeclineAsync

openemail bookings cancel

Cancel a booked meeting

Scopescalendar:writeemails:sendNeeds a sign-in
Asks you to confirm

Usage

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

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
nextmail bookings cancel bkg_2b8d4f6a1c3e5079b6d8f0a2
With optional flags
nextmail bookings cancel bkg_2b8d4f6a1c3e5079b6d8f0a2 --reason 'Something urgent came up. Please book another time.'
Skip the confirmation, for scripts
nextmail bookings cancel bkg_2b8d4f6a1c3e5079b6d8f0a2 --yes

Also available in

API
POST /bookings/{id}/cancel
TypeScript
nextmail.bookings.cancel()
Python
bookings.cancel()
Ruby
bookings.cancel
PHP
bookings->cancel
Go
Bookings.Cancel
Java
bookings().cancel
C#
Bookings.CancelAsync

openemail bookings resend-email

Send the guest the email about their booking again

Scopescalendar:writeemails:sendNeeds a sign-in

Usage

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

Arguments

<id>Required

Booking id such as bkg_2b8d4f6a1c3e5079b6d8f0a2, as list returns it.

Examples

nextmail bookings resend-email bkg_2b8d4f6a1c3e5079b6d8f0a2
Print the raw JSON
nextmail bookings resend-email bkg_2b8d4f6a1c3e5079b6d8f0a2 --json

Also available in

API
POST /bookings/{id}/resend
TypeScript
nextmail.bookings.resendEmail()
Python
bookings.resend_email()
Ruby
bookings.resend_email
PHP
bookings->resendEmail
Go
Bookings.ResendEmail
Java
bookings().resendEmail
C#
Bookings.ResendEmailAsync

openemail bookings analytics

Read how the booking pages did over a window

Scopescalendar:readNeeds a sign-in

Usage

nextmail bookings analytics [flags]

Returns the numbers behind the Analytics tab of Booking in one request: the bookings guests made over a window, what became of them, the pages and weekdays they went to, and the meetings still to come right now.

A booking counts in the window it was made in, whatever its meeting time. totals.booked is every booking made in the window, and confirmed, pending, expired, declined and cancelled split it by what became of each one, so they add up to booked. cancelledByGuest and cancelledByHost split cancelled, rescheduled counts the meetings moved at least once, and minutesBooked adds up the length of the confirmed meetings.

upcoming ignores the window: it counts the confirmed meetings that have not ended and the requests still waiting, and gives the start of the next meeting. series is sparse and oldest first, so a chart must fill the gaps. grain sets the bucket width and the key shape, YYYY-MM-DD, YYYY-MM-DDTHH or YYYY-MM-DDTHH:MM, and --offset-minutes shifts the boundaries and the weekdays so days break where the reader's day does. --page-ids narrows everything to some pages, such as one page for its own Analytics tab.

Flags

--page-ids <a,b>Repeatable

Count only these booking pages, at most 25, such as ['bkp_5c1e9a7b3d2f48e6a0b4c7d1']. Every page of the person when left out.

--days <n>

How far back to look, from 1 to 1095, defaulting to 30.

--minutes <n>

The window in minutes, from 1 to 1576800, which wins over days when both are sent.

--grain <value>

Bucket width: minute, hour or day, defaulting to day.

--offset-minutes <n>

Minutes east of UTC to cut the buckets and the weekdays in, from -840 to 840, defaulting to 0. Pass -new Date().getTimezoneOffset() for the local zone.

Examples

nextmail bookings analytics
With optional flags
nextmail bookings analytics --days 90
Print the raw JSON
nextmail bookings analytics --json

Also available in

API
GET /bookings/analytics
TypeScript
nextmail.bookings.analytics()
Python
bookings.analytics()
Ruby
bookings.analytics
PHP
bookings->analytics
Go
Bookings.Analytics
Java
bookings().analytics
C#
Bookings.AnalyticsAsync

openemail bookings reschedule

Move a booked meeting to a new time

Scopescalendar:writeemails:sendNeeds a sign-in

Usage

nextmail bookings reschedule <id> --start <when> [flags]
nextmail bookings reschedule <id> --data <json|@file|-> [flags]

Moves a meeting that has not started to a new time and moves its calendar event with it. The meeting keeps its length, so only start is sent. The time has to be one the page offers for this booking: listTimes with bookingId lists them, counting the current time of the booking as free. The page may be paused, and the cut-off that limits guests does not apply to the host.

The guest is told by email, sent from the address of the page with the updated invitation attached and with reason in it when one is given, and so is everyone the guest added. The host gets a copy at the same address unless config.notifyHost is false. A booking that waited for approval is confirmed at the new time, because the host chose it. The email goes out as config.fromEmail, so the call needs emails:send beside calendar:write.

Arguments

<id>Required

Booking id such as bkg_2b8d4f6a1c3e5079b6d8f0a2, as list returns it.

Flags

--start <when>

The new start, as a Date or an ISO 8601 string. It has to be one of the times listTimes returns for the page with this bookingId. Required, here or in --data.

--reason <value>

A sentence for the guest, trimmed, at most 500 characters, included in the email about the new time. 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
nextmail bookings reschedule bkp_5c1e9a7b3d2f48e6a0b4c7d1 --start 2026-10-01T00:00:00Z
With optional flags
nextmail bookings reschedule bkp_5c1e9a7b3d2f48e6a0b4c7d1 --start 2026-10-01T00:00:00Z --reason 'Something came up, so I moved us to the next free time.'
Read the whole body from a JSON file
nextmail bookings reschedule bkp_5c1e9a7b3d2f48e6a0b4c7d1 --data @booking.json

Also available in

API
POST /bookings/{id}/reschedule
TypeScript
nextmail.bookings.reschedule()
Python
bookings.reschedule()
Ruby
bookings.reschedule
PHP
bookings->reschedule
Go
Bookings.Reschedule
Java
bookings().reschedule
C#
Bookings.RescheduleAsync