Skip to the documentation
MCP server

Booking pages

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

Booking pages tools

ToolWhat it does
listBookingPagesThe person’s booking pages, with their public links and how many bookings are upcoming or wait for approval.
getBookingPageOne page in full: lengths, place, weekly hours, dates with other hours, rules, questions, and the out of office periods that close it.
createBookingPageCreate a page. Only name is needed, and it takes bookings at once on weekdays from 09:00 to 17:00 unless config says otherwise.
updateBookingPageChange the name, the link, the status or any setting. Send only what changes. status paused stops offering times.
deleteBookingPageDelete a page for good. Its meetings stay on the calendar. A chat always asks first.
listBookingTimesThe times a page offers in a window, after the calendar, other bookings and out of office are taken out.
listBookingsThe meetings guests booked: upcoming, pending, past or ended, for every page or one.
getBookingOne booking: the guest, the time, their answers and how it ended if it did.
approveBookingConfirm a booking that waits for approval. The guest gets the invitation.
declineBookingTurn down a booking that waits for approval, with an optional reason for the guest. A chat always asks first.
cancelBookingCancel a meeting that has not ended, with an optional reason for the guest. A chat always asks first.
resendBookingEmailSend 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

getBookingPage

Scopescalendar:readThe app's assistant runs it without askingToolkitcalendar

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.

Inputs

idstringRequired

The booking page, such as bkp_5c1e9a7b3d2f48e6a0b4c7d1, as listBookingPages shows it.

1 to 64 characters

Also available in

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

createBookingPage

Scopescalendar:writeemails:sendThe app's assistant asks first unless you asked for itToolkitcalendar

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.

Inputs

namestringRequired

What the page is called, shown to guests as its heading, such as Intro call.

1 to 80 characters
slugstring

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.

1 to 60 characters
timezonestring

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.

1 to 64 characters
configobject

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.

descriptionstring

Text shown under the name of the page. Basic Markdown works: bold, italic, links and lists.

Up to 2000 characters
hostNamestring

The name guests see as the person they meet. Defaults to the name of the account.

Up to 80 characters
durationsinteger[]

The meeting lengths a guest can pick, in minutes, each a multiple of 5 between 5 and 720.

1 to 4 items
approvalboolean

True holds each new booking as a request until it is approved or declined. False confirms it at once.

fromEmailstring

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.

Up to 320 characters
notifyHostboolean

Whether that address gets an email about each new, moved or cancelled booking.

questionsobject[]

What the guest is asked besides their name and email, at most 10.

Up to 10 items
idstringRequired

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.

Pattern^[a-z0-9]{4,16}$
kindstringRequired

text, long-text, phone, choice (one of options) or checkbox.

One of"text""long-text""phone""choice""checkbox"
labelstringRequired
1 to 120 characters
requiredbooleanRequired
optionsstring[]Required

The answers of a choice question, at least two. Empty for the other kinds.

Up to 12 items
confirmationstring

Text shown to the guest after booking, and added to the confirmation email.

Up to 1000 characters
redirectUrlstring

An https:// page to send the guest to after booking, or empty.

Up to 2000 characters
extraGuestsinteger

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.

At least 0At most 10
locationobject

Where the meeting happens.

kindstring

video with a fixed link in value, phone (the guest is asked for a number), in-person with the address in value, or none.

One of"video""phone""in-person""none"
valuestring

The https:// link of a video meeting or the address of an in-person one.

Up to 500 characters
availabilityobject

When the page offers times, before the calendar is taken out.

timezonestring

The IANA time zone the hours below are read in.

1 to 64 characters
weeklyobject[][]

Seven lists, Sunday first, of the hours open on that weekday. An empty list closes the day.

7 to 7 items
startintegerRequired

Minutes after midnight the range opens, so 540 is 09:00.

At least 0At most 1440
endintegerRequired

Minutes after midnight the range closes, later than start.

At least 0At most 1440
overridesobject[]

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.

Up to 180 items
datestringRequired
rangesobject[]Required
Up to 6 items
startintegerRequired

Minutes after midnight the range opens, so 540 is 09:00.

At least 0At most 1440
endintegerRequired

Minutes after midnight the range closes, later than start.

At least 0At most 1440
rulesobject

The limits on which of the open hours are offered.

noticeMinutesinteger

How many minutes ahead a booking has to be made.

At least 0At most 43200
horizonDaysinteger

How many days ahead the page offers times, up to 365.

At least 1At most 365
intervalMinutesinteger

Minutes between two start times, one of 5, 10, 15, 20, 30, 45, 60, 90, 120. Null steps by the length of the meeting.

Can be null
bufferBeforeMinutesinteger

Minutes kept free before every meeting, up to 240.

At least 0At most 240
bufferAfterMinutesinteger

Minutes kept free after every meeting, up to 240.

At least 0At most 240
dailyLimitinteger

The most bookings this page takes on one day, up to 50. Null for no limit.

Can be nullAt least 1At most 50
appearanceobject

How the public page looks.

accentstring

The colour of buttons and the picked day, as #rrggbb.

Pattern^#[0-9a-f]{6}$
themestring

auto follows the device of the guest, or force light or dark.

One of"auto""light""dark"
showAvatarboolean
guestChangesobject

What a guest may do from the link in their emails.

cancelboolean
rescheduleboolean
cutoffMinutesinteger

How many minutes before the meeting those changes close.

At least 0At most 20160
busyobject

What counts as busy besides the events the person made and the bookings they already have.

addressesstring[]

The addresses whose invitations block time unless declined. Null checks every address the person holds.

Can be nullUp to 50 items
subscriptionsboolean

Whether events from calendars the person subscribed to block time.

outOfOfficeboolean

Whether the page offers no times while fromEmail is out of office. Defaults to true.

Defaulttrue
seoobject

How the public page presents itself to browsers and search engines.

titlestring

The title of the browser tab and of a search result. Empty uses the name of the page and the host.

Up to 120 charactersDefault""
descriptionstring

The summary under the title in a search result. Empty uses the start of the description.

Up to 300 charactersDefault""
indexableboolean

Whether search engines may list the page. False, the default, asks them not to.

Defaultfalse

Also available in

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

updateBookingPage

Scopescalendar:writeemails:sendThe app's assistant asks first unless you asked for itToolkitcalendar

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.

Inputs

idstringRequired

The booking page, such as bkp_5c1e9a7b3d2f48e6a0b4c7d1, as listBookingPages shows it.

1 to 64 characters
namestring

What the page is called, shown to guests as its heading, such as Intro call.

1 to 80 characters
slugstring

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.

1 to 60 characters
statusstring

active takes bookings. paused keeps the link working but offers no times.

One of"active""paused"
configobject

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.

descriptionstring

Text shown under the name of the page. Basic Markdown works: bold, italic, links and lists.

Up to 2000 characters
hostNamestring

The name guests see as the person they meet. Defaults to the name of the account.

Up to 80 characters
durationsinteger[]

The meeting lengths a guest can pick, in minutes, each a multiple of 5 between 5 and 720.

1 to 4 items
approvalboolean

True holds each new booking as a request until it is approved or declined. False confirms it at once.

fromEmailstring

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.

Up to 320 characters
notifyHostboolean

Whether that address gets an email about each new, moved or cancelled booking.

questionsobject[]

What the guest is asked besides their name and email, at most 10.

Up to 10 items
idstringRequired

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.

Pattern^[a-z0-9]{4,16}$
kindstringRequired

text, long-text, phone, choice (one of options) or checkbox.

One of"text""long-text""phone""choice""checkbox"
labelstringRequired
1 to 120 characters
requiredbooleanRequired
optionsstring[]Required

The answers of a choice question, at least two. Empty for the other kinds.

Up to 12 items
confirmationstring

Text shown to the guest after booking, and added to the confirmation email.

Up to 1000 characters
redirectUrlstring

An https:// page to send the guest to after booking, or empty.

Up to 2000 characters
extraGuestsinteger

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.

At least 0At most 10
locationobject

Where the meeting happens.

kindstring

video with a fixed link in value, phone (the guest is asked for a number), in-person with the address in value, or none.

One of"video""phone""in-person""none"
valuestring

The https:// link of a video meeting or the address of an in-person one.

Up to 500 characters
availabilityobject

When the page offers times, before the calendar is taken out.

timezonestring

The IANA time zone the hours below are read in.

1 to 64 characters
weeklyobject[][]

Seven lists, Sunday first, of the hours open on that weekday. An empty list closes the day.

7 to 7 items
startintegerRequired

Minutes after midnight the range opens, so 540 is 09:00.

At least 0At most 1440
endintegerRequired

Minutes after midnight the range closes, later than start.

At least 0At most 1440
overridesobject[]

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.

Up to 180 items
datestringRequired
rangesobject[]Required
Up to 6 items
startintegerRequired

Minutes after midnight the range opens, so 540 is 09:00.

At least 0At most 1440
endintegerRequired

Minutes after midnight the range closes, later than start.

At least 0At most 1440
rulesobject

The limits on which of the open hours are offered.

noticeMinutesinteger

How many minutes ahead a booking has to be made.

At least 0At most 43200
horizonDaysinteger

How many days ahead the page offers times, up to 365.

At least 1At most 365
intervalMinutesinteger

Minutes between two start times, one of 5, 10, 15, 20, 30, 45, 60, 90, 120. Null steps by the length of the meeting.

Can be null
bufferBeforeMinutesinteger

Minutes kept free before every meeting, up to 240.

At least 0At most 240
bufferAfterMinutesinteger

Minutes kept free after every meeting, up to 240.

At least 0At most 240
dailyLimitinteger

The most bookings this page takes on one day, up to 50. Null for no limit.

Can be nullAt least 1At most 50
appearanceobject

How the public page looks.

accentstring

The colour of buttons and the picked day, as #rrggbb.

Pattern^#[0-9a-f]{6}$
themestring

auto follows the device of the guest, or force light or dark.

One of"auto""light""dark"
showAvatarboolean
guestChangesobject

What a guest may do from the link in their emails.

cancelboolean
rescheduleboolean
cutoffMinutesinteger

How many minutes before the meeting those changes close.

At least 0At most 20160
busyobject

What counts as busy besides the events the person made and the bookings they already have.

addressesstring[]

The addresses whose invitations block time unless declined. Null checks every address the person holds.

Can be nullUp to 50 items
subscriptionsboolean

Whether events from calendars the person subscribed to block time.

outOfOfficeboolean

Whether the page offers no times while fromEmail is out of office. Defaults to true.

Defaulttrue
seoobject

How the public page presents itself to browsers and search engines.

titlestring

The title of the browser tab and of a search result. Empty uses the name of the page and the host.

Up to 120 charactersDefault""
descriptionstring

The summary under the title in a search result. Empty uses the start of the description.

Up to 300 charactersDefault""
indexableboolean

Whether search engines may list the page. False, the default, asks them not to.

Defaultfalse

Also available in

API
PATCH /booking-pages/{id}
TypeScript
bookings.updatePage()
Python
bookings.update_page()
Ruby
bookings.update_page
PHP
bookings->updatePage
Go
Bookings.UpdatePage
Java
bookings().updatePage
C#
Bookings.UpdatePageAsync

deleteBookingPage

Scopescalendar:writeThe app's assistant always asks firstToolkitcalendar

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.

Inputs

idstringRequired

The booking page, such as bkp_5c1e9a7b3d2f48e6a0b4c7d1, as listBookingPages shows it.

1 to 64 characters

Also available in

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

listBookingTimes

Scopescalendar:readThe app's assistant runs it without askingToolkitcalendar

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.

Inputs

idstringRequired

The booking page, such as bkp_5c1e9a7b3d2f48e6a0b4c7d1, as listBookingPages shows it.

1 to 64 characters
fromstring

The start of the window as an ISO 8601 instant. Defaults to now.

Formatdate-time
tostring

The end of the window. Defaults to 14 days after from, and at most 62 days after it.

Formatdate-time
durationMinutesinteger

The meeting length in minutes, one of the durations of the page. Defaults to the shortest.

At least 1

listBookings

Scopescalendar:readThe app's assistant runs it without askingToolkitcalendar

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

Inputs

viewstring

upcoming (confirmed and not over, the default), pending (waiting for approval), past, or ended (declined and cancelled).

One of"upcoming""pending""past""ended"
pageIdstring

Only the bookings of this page.

1 to 64 characters
limitinteger

How many to return, 30 by default and at most 100.

At least 1At most 100
cursorstring

The nextCursor of the previous page.

1 to 256 characters

Also available in

API
GET /bookings
TypeScript
bookings.list()bookings.listAll()bookings.iterate()
Python
bookings.list()bookings.list_all()bookings.iterate()
Ruby
bookings.listbookings.list_allbookings.iterate
PHP
bookings->listbookings->listAllbookings->iterate
Go
Bookings.ListBookings.ListAllBookings.Iterate
Java
bookings().listbookings().listAllbookings().iterate
C#
Bookings.ListAsyncBookings.ListAllAsyncBookings.IterateAsync

approveBooking

Scopescalendar:writeemails:sendThe app's assistant asks first unless you asked for itToolkitcalendar

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

Inputs

idstringRequired

The booking, such as bkg_2b8d4f6a1c3e5079b6d8f0a2, as listBookings shows it.

1 to 64 characters

Also available in

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

declineBooking

Scopescalendar:writeemails:sendThe app's assistant always asks firstToolkitcalendar

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.

Inputs

idstringRequired

The booking, such as bkg_2b8d4f6a1c3e5079b6d8f0a2, as listBookings shows it.

1 to 64 characters
reasonstring

A sentence for the guest, at most 500 characters, included in the email they get.

Can be nullUp to 500 characters

Also available in

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

cancelBooking

Scopescalendar:writeemails:sendThe app's assistant always asks firstToolkitcalendar

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.

Inputs

idstringRequired

The booking, such as bkg_2b8d4f6a1c3e5079b6d8f0a2, as listBookings shows it.

1 to 64 characters
reasonstring

A sentence for the guest, at most 500 characters, included in the email they get.

Can be nullUp to 500 characters

Also available in

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

resendBookingEmail

Scopescalendar:writeemails:sendThe app's assistant asks first unless you asked for itToolkitcalendar

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

Inputs

idstringRequired

The booking, such as bkg_2b8d4f6a1c3e5079b6d8f0a2, as listBookings shows it.

1 to 64 characters

Also available in

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