---
title: "Book a meeting"
method: POST
path: "/api/v1/public/{handle}/{slug}/bookings"
tags: ["public"]
---

# Book a meeting

`POST /api/v1/public/{handle}/{slug}/bookings`

## Request

- Base URL: `https://meettempi.com`
- URL: `https://meettempi.com/api/v1/public/{handle}/{slug}/bookings`
- Auth: none required

Books `start`, which must be one of the `slots` from get_available_slots. Free events are confirmed at once, unless the event type has `requiresApproval`: then it's a request (status=pending_approval) that holds the time until a host approves or declines it, and the invitee hears either way by email. Nobody answering by its start (`holdExpiresAt`) lets it lapse. Tell the human it isn't confirmed yet. Paid events return status=pending_payment and a `paymentUrl`. Give it to the human to pay before `holdExpiresAt`, or the slot is released. Once confirmed, the event is added to the host's calendar if they connected one, and the invitee gets a confirmation email with a calendar file (.ics). Keep `manageUrl` and `token`: they are the only way to view, reschedule or cancel later. 409 slot_unavailable says why the time can't be booked and lists the `nearest` open times. The result's `when` is the start in the invitee's time zone, to tell them.

## Path parameters

- `handle` string, required: a handle, the first part of a booking link ("acme" in meettempi.com/acme/demo), or the whole link
- `slug` string, required: an event type slug from get_public_profile ("demo" in meettempi.com/acme/demo), or the whole link

## Request body

- object
  - `start` string, date-time, required: one of the `slots` values from get_available_slots, as given (ISO in UTC)
  - `name` string, required: the invitee's full name
  - `email` string, email, required: the invitee's email address, which gets the confirmation and its calendar file
  - `timezone` string, required: the invitee's time zone, an IANA id like America/New_York or an abbreviation like EST: their emails and reminders show times in it
  - `notes` string: anything the invitee wants the host to know
  - `phone` string: the invitee's phone number with its country code, like +1 415 555 0134: required when the event type is a phone call (whereKind phone on get_public_profile), where the host calls them
  - `repeat` object: book a series instead: `count` meetings, `every` 1, 2 or 4 weeks at the host's clock time, when the event type's repeatMax allows. All or nothing: check_series first. The result's `series.meetings` give each start as `when` in the invitee's time zone, and `series.clockNote` says when that moves
    - `every` 1 | 2 | 4, required: weeks between meetings: 1, 2 or 4
    - `count` integer, required: how many meetings, first included (2 up to the event type's repeatMax)
  - `cover` string: leave it out: the id of the painting the booking page showed, when the event type shows a different one each booking (cover "hand", "light" or "still"), so the booking keeps it. Anything else is ignored, and Tempi picks one

## Response `201`

Success

## Other responses

- `default`: Error

---

[API](https://skmtc.dev/meettempi/apis/tempi-api.md) · [All operations](https://skmtc.dev/meettempi/apis/tempi-api/llms.txt) · [OpenAPI document](https://skmtc.dev/meettempi/apis/tempi-api/revisions/36787210a2ce?raw)
