---
name: "calendar_save_meeting_type"
area: "calendar"
title: "Save a meeting type"
price: "$0.001"
method: "POST"
url: "https://api.conecto.chat/v1/tools/calendar_save_meeting_type"
mcp_server: "https://api.conecto.chat/mcp/calendar"
auth: "Authorization: Bearer <conecto_sk_ key>"
docs_url: "https://conecto.chat/tools/calendar/calendar_save_meeting_type"
---

# Save a meeting type (`calendar_save_meeting_type`)

Creates or changes a kind of meeting people can book, on the business's calendar or a person's, taken by one host, a round robin or everyone.

Create or change a kind of meeting people can book, like a Cal.com event type. It gets its own booking page. Only the fields you pass change. With person it is on that person's own calendar. A business type can be hosted by people like a Cal.com team event, once you choose how (there is no default): round_robin gives each booking to one host free then (the highest priority, then the fewest of this type that month for their weight, then whoever was booked longest ago; fixed hosts join every meeting), collective needs every host free and invites them all. Hosts use their own calendars' hours and Google calendars, unless the type sets hours of its own. Each host keeps their own page, which lists the business types they take; a round robin booked there goes to them. Location kinds: video (a link), phone (we call the attendee), call_us (they call a number), in_person (an address), custom.

Price: $0.001 a call. A call that fails costs nothing.

## Use it when

The business offers a new kind of appointment, an appointment's length, place, hours or questions change, a kind of meeting should go to whichever of several people is free, or each booking should get a Google Meet room of its own (location kind google_meet).

- For the calendar's own hours, time zone and closed days, use [calendar_setup](https://conecto.chat/tools/calendar/calendar_setup.md).

## Say this to your agent

> Add a 45-minute bike fitting in the workshop on Saturdays, and ask people for their height when they book.

## Inputs

| Name | Type | Required | Description | Allowed values | Default |
|---|---|---|---|---|---|
| `slug` | string | yes | Its address on the booking page, e.g. "intro-call". Matches ^[a-z0-9][a-z0-9-]{0,59}$. |  |  |
| `person` | string | no | Put it on this person's own calendar (their email) instead of the business's. Up to 254 characters. |  |  |
| `title` | string | no | 1 to 120 characters. |  |  |
| `description` | string | no | Up to 2,000 characters. |  |  |
| `length_minutes` | integer | no | 5 to 480. |  |  |
| `location` | object | no | Where it happens. google_meet gives each booking a Google Meet room of its own once the calendar that takes it is connected to Google (a video link on meet.google.com does the same); video is one fixed link, phone means you call them, call_us your number in value, in_person an address. |  |  |
| `location.kind` | string | no |  | `""`, `"video"`, `"google_meet"`, `"phone"`, `"call_us"`, `"in_person"`, `"custom"` |  |
| `location.value` | string | no | Up to 500 characters. |  |  |
| `assignment` | string | no | How a business type's hosts take its bookings, required with hosts (no default): round_robin or collective; "" takes the hosts off, back to the business's own calendar. | `""`, `"round_robin"`, `"collective"` |  |
| `hosts` | array of objects | no | The people who take its bookings, replacing the list. Each is on the account; their calendar is made with their name if they have none. Up to 50 items. |  |  |
| `hosts[].person` | string | yes, in each item of `hosts` | Up to 254 characters. |  |  |
| `hosts[].fixed` | boolean | no | In every meeting (round robin). |  |  |
| `hosts[].priority` | string | no | Round robin: higher goes first (default medium). | `"lowest"`, `"low"`, `"medium"`, `"high"`, `"highest"` |  |
| `hosts[].weight` | integer | no | Round robin: 200 takes twice the share of 100 (default 100). 1 to 1,000. |  |  |
| `buffer_before` | integer | no | 0 to 240. |  |  |
| `buffer_after` | integer | no | 0 to 240. |  |  |
| `notice_minutes` | integer | no | Minimum notice before a booking. 0 to 43,200. |  |  |
| `days_ahead` | integer | no | 1 to 365. |  |  |
| `slot_interval` | integer | no | Minutes between possible start times (default: the length). 5 to 480. |  |  |
| `max_per_day` | integer | no | The most of this type a day; for a hosted type, each host's most. 1 to 200. |  |  |
| `hours` | array of objects | no | Its own weekly hours; leave out to use the calendar's (for hosts, each one's own). Up to 50 items. |  |  |
| `hours[].day` | string | yes, in each item of `hours` |  | `"monday"`, `"tuesday"`, `"wednesday"`, `"thursday"`, `"friday"`, `"saturday"`, `"sunday"` |  |
| `hours[].start` | string | yes, in each item of `hours` | Matches ^([01][0-9]\|2[0-3]):[0-5][0-9]$\|^24:00$. |  |  |
| `hours[].end` | string | yes, in each item of `hours` | Matches ^([01][0-9]\|2[0-3]):[0-5][0-9]$\|^24:00$. |  |  |
| `questions` | array of objects | no | Extra questions on the booking form: {label, type: text\|long_text\|select\|checkbox\|number\|email\|phone, required, options}. Up to 20 items. |  |  |
| `ask_phone` | string | no |  | `"off"`, `"optional"`, `"required"` |  |
| `offer_confirmation_call` | boolean | no | Offer "call me the day before to confirm" on the form. |  |  |
| `phone_assistant_books_this` | boolean | no | What the phone assistant books when a caller asks (a business type). |  |  |
| `active` | boolean | no |  |  |  |

## Example

Written for Halverson Cycle & Repair, a bike shop with a repair workshop in Portland, Oregon.

MCP: call `calendar_save_meeting_type` on the MCP server `https://api.conecto.chat/mcp/calendar` with these arguments:

```json
{
  "slug": "bike-fitting",
  "title": "Bike fitting",
  "length_minutes": 45,
  "location": {
    "kind": "in_person",
    "value": "Halverson Cycle & Repair, 1830 SE Ash St, Portland, OR 97214"
  },
  "buffer_after": 15,
  "hours": [
    {
      "day": "saturday",
      "start": "10:00",
      "end": "16:00"
    }
  ],
  "questions": [
    {
      "label": "Your height in inches",
      "type": "number",
      "required": false
    }
  ]
}
```

REST:

```bash
curl https://api.conecto.chat/v1/tools/calendar_save_meeting_type \
  -H "Authorization: Bearer $CONECTO_KEY" \
  -H "Content-Type: application/json" \
  -d '{"slug": "bike-fitting", "title": "Bike fitting", "length_minutes": 45, "location": {"kind": "in_person", "value": "Halverson Cycle & Repair, 1830 SE Ash St, Portland, OR 97214"}, "buffer_after": 15, "hours": [{"day": "saturday", "start": "10:00", "end": "16:00"}], "questions": [{"label": "Your height in inches", "type": "number", "required": false}]}'
```

## Response

```json
{
  "call_id": "5f0c8a2e-3b7d-4c1e-9a64-2d8e1f7b0c93",
  "tool": "calendar_save_meeting_type",
  "status": "succeeded",
  "replayed": false,
  "cost_usd": "$0.001",
  "balance_usd": "$19.75",
  "result": {
    "meeting_type": {
      "slug": "bike-fitting",
      "meeting_type": "bike-fitting",
      "person": null,
      "title": "Bike fitting",
      "description": "",
      "length_minutes": 45,
      "location": {
        "kind": "in_person",
        "value": "Halverson Cycle & Repair, 1830 SE Ash St, Portland, OR 97214"
      },
      "buffer_before": 0,
      "buffer_after": 15,
      "notice_minutes": 120,
      "days_ahead": 60,
      "slot_interval": 45,
      "max_per_day": null,
      "hours": [
        {
          "day": "saturday",
          "start": "10:00",
          "end": "16:00"
        }
      ],
      "questions": [
        {
          "key": "your_height_in_inches",
          "label": "Your height in inches",
          "type": "number",
          "required": false,
          "options": []
        }
      ],
      "ask_phone": "optional",
      "offer_confirmation_call": true,
      "phone_assistant_books_this": false,
      "active": true,
      "booking_url": "https://cncto.co/book/halverson-cycle/bike-fitting"
    }
  }
}
```

`result`: The meeting type as saved: slug, title, length, location, buffers, notice, days ahead, hours, questions, phone and confirmation-call options, whether it is active and its booking URL; for a hosted type its hosts, each with their own link to it.

## Errors

| Code | Status | When | Fix |
|---|---|---|---|
| `not_set_up` | 404 | The calendar, or a host's own calendar, is not set up yet and the account has no name for them. | Run calendar_setup (with person and name for a host), then call again. |
| `not_found` | 404 | A host or person is not on the account. | Add them with admin_save_person, or leave them out. |
| `slug_taken` | 409 | A routing form on that calendar already has the slug. | Pick another slug. |
| `invalid_input` | 400 | A new meeting type has no title, its hours or questions are not valid, hosts came without an assignment, or hosts were given for a person's own type. | Give a title, hours as {day, start, end}, questions with a label and a type from the list, and hosts only on the business's types, with assignment round_robin or collective. |

The refusals every tool can give (401 key, 402 balance, 429 limits) are on the errors page: https://conecto.chat/docs/errors.md

## Related

- [calendar_setup](https://conecto.chat/tools/calendar/calendar_setup.md): Sets the business's calendar or a person's own: name, booking address, time zone, weekly hours, closed days, reminder emails and confirmation calls. $0.001 a call.
- [calendar_get_setup](https://conecto.chat/tools/calendar/calendar_get_setup.md): The calendar's settings, booking page, iCal link, connected Google calendar, meeting types, and its people's own calendars. Free up to 1,000,000 reads a month.
- [calendar_connect](https://conecto.chat/tools/calendar/calendar_connect.md): A link that opens a page naming the business, where the owner, or a person for their own page, connects Google Calendar in one click. Free up to 1,000,000 reads a month.
- [calendar_list_meeting_types](https://conecto.chat/tools/calendar/calendar_list_meeting_types.md): Every meeting type people can book, the business's and each person's own, with its hosts and booking page. Free up to 1,000,000 reads a month.
- [calendar_find_times](https://conecto.chat/tools/calendar/calendar_find_times.md): Free start times for a meeting type between two dates, in the time zone you ask for. Free up to 1,000,000 reads a month.
- [calendar_book](https://conecto.chat/tools/calendar/calendar_book.md): Books a free time for someone, who gets a confirmation email with an invite and a link to change it. $0.01 a call.
- [calendar_list_bookings](https://conecto.chat/tools/calendar/calendar_list_bookings.md): Bookings between two times (from now on by default), soonest first, with each one's hosts, guests and confirmation call. Free up to 1,000,000 reads a month.
- [calendar_move](https://conecto.chat/tools/calendar/calendar_move.md): Moves a booking to another free time and sends the attendee an updated invite. $0.01 a call.
- [calendar_cancel](https://conecto.chat/tools/calendar/calendar_cancel.md): Cancels a booking and tells the attendee by email, unless notify is false. $0.01 a call.
- [calendar_save_routing_form](https://conecto.chat/tools/calendar/calendar_save_routing_form.md): Creates or changes a routing form that asks visitors a few questions and sends each to the right meeting type, host, site or message. $0.001 a call.
- [calendar_list_routing_forms](https://conecto.chat/tools/calendar/calendar_list_routing_forms.md): The routing forms with their addresses, questions, routes and how many people answered each. Free up to 1,000,000 reads a month.
- [calendar_list_routing_responses](https://conecto.chat/tools/calendar/calendar_list_routing_responses.md): What people answered on the routing forms, newest first, where each was sent, and the booking it led to. Free up to 1,000,000 reads a month.
