---
title: "Create an event type"
method: POST
path: "/api/v1/event-types"
tags: ["account"]
---

# Create an event type

`POST /api/v1/event-types`

## Request

- Base URL: `https://meettempi.com`
- URL: `https://meettempi.com/api/v1/event-types`
- Auth: one of:
  - HTTP bearer
  - API key in cookie `tempi_session`

Creates an event type in a team (default: your personal team). Requires admin. Only `title` and `durationMinutes` are required. For team scheduling, set `kind` to round_robin or collective and list `hostIds`. Round robin, collective and paid event types need the Team plan (402 upgrade_required). Returns the event type with its public `url`.

## Request body

- object
  - `team` string: the id or slug of a team you belong to
  - `title` string, required: its name, as invitees see it (at most 120 characters, no web addresses)
  - `durationMinutes` integer, required: a duration in minutes between 5 and 480
  - `slug` string: the last part of the booking link (<team link>/<slug>): 1-40 lowercase letters, digits or dashes
  - `description` string: what invitees read about it on its booking page (at most 2000 characters)
  - `kind` 'one_on_one' | 'round_robin' | 'collective': one_on_one (one host) | round_robin (one free host per booking, load-balanced) | collective (all hosts attend, only when everyone is free)
  - `hostIds` string[]: the user ids of team members who host it (on create, defaults to you)
  - `where` union[]: where it happens: [] for nowhere, or one place. A video call without `link` uses each host's own (their Google Meet, Teams or own link, set with set_my_video_call). Prefer this to locationType and location, which still work.
    - union: a place: { kind: video, link? } | { kind: place, address } | { kind: phone } | { kind: other, text }
      - object
        - `kind` 'video', required: video: a video call
        - `link` string, uri: a Google Meet, Zoom, Microsoft Teams or Webex link (https)
      - object
        - `kind` 'place', required: place: in person
        - `address` string, required: a string that will be trimmed
      - object
        - `kind` 'phone', required: phone: the host calls the invitee at the number they give when booking
      - object
        - `kind` 'other', required: other: somewhere else, in your words
        - `text` string, required: a string that will be trimmed
  - `locationType` 'none' | 'google_meet' | 'teams' | 'zoom' | 'custom': none | google_meet (adds a Meet link when the organizer's booking calendar is Google Calendar) | teams (adds a Microsoft Teams link when the organizer's booking calendar is Outlook with Teams, a work or school account) | zoom (every booking gets the Zoom link in `location`) | custom (uses `location`)
  - `location` string: where it happens, when you write the place yourself: an address, a room or a phone number (at most 500 characters)
  - `minNoticeMinutes` integer: the minimum notice in minutes before a booking can start (0-43200)
  - `maxDaysAhead` integer: how many days ahead invitees can book (1-365)
  - `bufferBeforeMinutes` integer: free minutes to keep before each meeting (0-240)
  - `bufferAfterMinutes` integer: free minutes to keep after each meeting (0-240)
  - `maxPerDay` integer, nullable: a number between 1 and 100
  - `maxPerWeek` integer, nullable: a number between 1 and 500
  - `maxPerMonth` integer, nullable: a number between 1 and 2000
  - `inviteeLimit` integer, nullable: a number between 1 and 50
  - `inviteeLimitPeriod` 'upcoming' | 'week' | 'month': upcoming (future bookings at one time) | week (per calendar week) | month (per calendar month), in the first host's time zone
  - `inviteeChangeCutoffHours` integer: how many hours before the start invitees can still cancel or reschedule (0-720, 0 = until it starts, hosts always can)
  - `inviteeCanCancel` boolean: false to let invitees reschedule but not cancel (hosts still can)
  - `priceCents` integer, nullable: a number between 50 and 10000000
  - `currency` string: a lowercase ISO 4217 currency code, such as usd
  - `refundWindowHours` integer: how many hours before the start an invitee can cancel with a full refund (0-720, host cancellations are always refunded)
  - `color` 'orange' | 'yellow' | 'green' | 'teal' | 'blue' | 'purple' | 'red' | 'gray': its color in the Tempi app: orange | yellow | green | teal | blue | purple | red | gray (default: one picked for it)
  - `schedule` object, nullable: its own hours, used instead of every host's working hours: { timezone, rules: [{ weekday, start, end }], overrides: [{ date, windows }] }, such as Fridays 14:00-17:00 only. Hosts' days off, calendars, bookings and caps still count. null (the default): each host's own working hours
    - `timezone` string, required: an IANA time zone such as "America/New_York" (abbreviations like EST and offsets like UTC+8 work too)
    - `rules` object[], required: weekly hours: one window per rule, several rules for a split day
      - `weekday` 0 | 1 | 2 | 3 | 4 | 5 | 6, required: a weekday number, 0 = Sunday … 6 = Saturday
      - `start` string, required: a 24-hour time as HH:MM, or "24:00" for the end of the day
      - `end` string, required: a 24-hour time as HH:MM, or "24:00" for the end of the day
    - `overrides` object[]: dates with other hours than the weekly ones, or none
      - `date` string, date, required: a date as YYYY-MM-DD
      - `windows` object[], required: the hours that date, or [] for none
        - `start` string, required: a 24-hour time as HH:MM, or "24:00" for the end of the day
        - `end` string, required: a 24-hour time as HH:MM, or "24:00" for the end of the day
  - `repeatMax` integer, nullable: a number between 2 and 52
  - `requiresApproval` boolean: true: each booking is a request that holds the time until a host approves it (approve_booking) or declines it (decline_booking), and lapses if nobody does before it starts. Not with a price or repeatMax
  - `remindInvitees` boolean: true (the default) to email invitees a day and an hour before each booking, false for no reminders
  - `cover` string, nullable: a painted cover for the booking page, the confirmation, link previews and the invitee's emails: a cover id from list_covers, "sky" (the sky at the meeting's time of day), "hand", "light" or "still" (a different painting of that family for each booking), or null for none (the default)

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