> ## Documentation Index
> Fetch the complete documentation index at: https://developer.meetergo.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Update Meeting Type

> Update an existing meeting type

Update an existing meeting type to change its name, duration, or other settings.

## Endpoint

```
PATCH /v4/meeting-type/{meetingTypeId}
```

## Request Headers

| Header                   | Required | Description                                |
| ------------------------ | -------- | ------------------------------------------ |
| `Authorization`          | Yes      | `Bearer <your-api-key>`                    |
| `x-meetergo-api-user-id` | Yes      | UUID of the user who owns the meeting type |
| `Content-Type`           | Yes      | `application/json`                         |

## Path Parameters

| Parameter       | Type   | Required | Description                        |
| --------------- | ------ | -------- | ---------------------------------- |
| `meetingTypeId` | string | Yes      | UUID of the meeting type to update |

<Tip>
  Get the `meetingTypeId` from the response when [creating a user](/api-reference/users/create-user) or [creating a meeting type](/api-reference/meeting-types/create-meeting-type).
</Tip>

## Request Body

All fields are optional. Only include the fields you want to update.

| Field              | Type      | Description                                                                          |
| ------------------ | --------- | ------------------------------------------------------------------------------------ |
| `meetingInfo`      | object    | Core meeting configuration (name, duration, channel, buffers, etc.)                  |
| `meetingOptions`   | object    | Meeting options (channels, channel availability, etc.)                               |
| `enabled`          | boolean   | Enable or disable the meeting type                                                   |
| `slug`             | string    | URL-friendly identifier                                                              |
| `timeslotInterval` | number    | Timeslot interval in minutes (5-60)                                                  |
| `spots`            | number    | Available spots per timeslot (1-100)                                                 |
| `bookingMinimum`   | number    | Minimum booking notice in minutes                                                    |
| `locations`        | string\[] | Address(es) for in-person meetings. When multiple are provided, attendee can choose. |
| `availabilityId`   | string    | ID of an existing availability to associate                                          |
| `ics`              | object    | Calendar invite settings (title, description, location). See [ics](#ics) below.      |

### meetingInfo

| Field               | Type   | Description                                                                  |
| ------------------- | ------ | ---------------------------------------------------------------------------- |
| `name`              | string | Display name for the meeting type                                            |
| `description`       | string | Description shown on the booking page                                        |
| `duration`          | number | Meeting duration in minutes (5-480)                                          |
| `channel`           | string | Meeting channel type                                                         |
| `customChannelName` | string | Display label for a custom meeting channel (used when `channel` is `custom`) |
| `customChannelLink` | string | URL for the custom meeting channel (required when `channel` is `custom`)     |
| `bufferBefore`      | number | Minutes blocked before meeting (0-120)                                       |
| `bufferAfter`       | number | Minutes blocked after meeting (0-120)                                        |

### meetingOptions

| Field                   | Type      | Description                                                                                                                                                                                                                  |
| ----------------------- | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `allowedChannels`       | string\[] | Channel options the attendee can choose from. When more than one channel is provided, channel selection is automatically enabled.                                                                                            |
| `channelAvailabilities` | object    | Per-channel availability overrides. Each value is a UUID string or an inline availability object. See [Create Meeting Type - channelAvailabilities](/api-reference/meeting-types/create-meeting-type#channelavailabilities). |
| `allowedDurations`      | number\[] | Additional duration options in minutes                                                                                                                                                                                       |
| `allowAddingGuests`     | boolean   | Allow attendees to invite additional guests                                                                                                                                                                                  |
| `allowPhoneOnlyBooking` | boolean   | Allow bookings without attendee email (phone as identifier). See [Voice AI Bot](/developer-docs/recipes/voice-ai-bot)                                                                                                        |

### ics

Customize the calendar invite (ICS) that attendees and hosts receive. Each field accepts either a **plain string** or a **multi-language object**.

| Field         | Type             | Description                         |
| ------------- | ---------------- | ----------------------------------- |
| `title`       | string \| object | Calendar event title template       |
| `description` | string \| object | Calendar event description template |
| `location`    | string \| object | Calendar event location template    |

When you pass a **plain string**, it is stored under the meeting type's default language. When you pass an **object**, each key is a language code (e.g. `en`, `de`) mapping to the template for that language.

Partial updates are supported: sending only `description` preserves the existing `title` and `location`. Sending `{ "de": "..." }` preserves other languages within that field.

#### Dynamic Tags

Use these placeholders in your templates — they are replaced with actual values when the calendar invite is generated.

**Guest:**

| Tag                              | Description      |
| -------------------------------- | ---------------- |
| `{!M.Guest.Fullname}`            | Full name        |
| `{!M.Guest.FirstName}`           | First name       |
| `{!M.Guest.LastName}`            | Last name        |
| `{!M.Guest.Email}`               | Email address    |
| `{!M.Guest.Phone}`               | Phone number     |
| `{!M.Guest.QuestionsAndAnswers}` | All form answers |

**Host:**

| Tag                  | Description   |
| -------------------- | ------------- |
| `{!M.Host.Fullname}` | Full name     |
| `{!M.Host.Email}`    | Email address |

**Meeting:**

| Tag                        | Description              |
| -------------------------- | ------------------------ |
| `{!M.Meeting.Name}`        | Meeting type name        |
| `{!M.Meeting.Description}` | Meeting type description |
| `{!M.Meeting.Location}`    | Meeting location         |
| `{!M.Meeting.Link}`        | Join link                |
| `{!M.Meeting.Venue}`       | Venue / address          |
| `{!M.Meeting.Start}`       | Start date and time      |
| `{!M.Meeting.Reschedule}`  | Reschedule link          |
| `{!M.Meeting.Cancel}`      | Cancellation link        |

## Examples

### Update Name and Duration

<CodeGroup>
  ```bash cURL theme={null}
  curl -X PATCH "https://api.meetergo.com/v4/meeting-type/770e8400-e29b-41d4-a716-446655440002" \
    -H "Authorization: Bearer YOUR_API_KEY" \
    -H "x-meetergo-api-user-id: 550e8400-e29b-41d4-a716-446655440000" \
    -H "Content-Type: application/json" \
    -d '{
      "meetingInfo": {
        "name": "Updated Meeting Name",
        "duration": 60,
        "description": "A longer consultation meeting"
      }
    }'
  ```

  ```javascript JavaScript theme={null}
  const meetingTypeId = '770e8400-e29b-41d4-a716-446655440002';

  const response = await fetch(`https://api.meetergo.com/v4/meeting-type/${meetingTypeId}`, {
    method: 'PATCH',
    headers: {
      'Authorization': 'Bearer YOUR_API_KEY',
      'x-meetergo-api-user-id': '550e8400-e29b-41d4-a716-446655440000',
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      meetingInfo: {
        name: 'Updated Meeting Name',
        duration: 60,
        description: 'A longer consultation meeting'
      }
    })
  });

  const meetingType = await response.json();
  ```

  ```python Python theme={null}
  import requests

  meeting_type_id = '770e8400-e29b-41d4-a716-446655440002'

  response = requests.patch(
      f'https://api.meetergo.com/v4/meeting-type/{meeting_type_id}',
      headers={
          'Authorization': 'Bearer YOUR_API_KEY',
          'x-meetergo-api-user-id': '550e8400-e29b-41d4-a716-446655440000',
          'Content-Type': 'application/json'
      },
      json={
          'meetingInfo': {
              'name': 'Updated Meeting Name',
              'duration': 60,
              'description': 'A longer consultation meeting'
          }
      }
  )

  meeting_type = response.json()
  ```
</CodeGroup>

### Update Custom Channel

```json theme={null}
{
  "meetingInfo": {
    "channel": "custom",
    "customChannelName": "Company Webinar Platform",
    "customChannelLink": "https://webinar.example.com/room/abc123"
  }
}
```

### Update In-Person Location

```json theme={null}
{
  "locations": ["Berlin Office - Friedrichstr. 123", "Munich Office - Marienplatz 5"]
}
```

<Note>
  The `locations` field is used with the `local` (in-person at host) channel. When multiple locations are provided, the attendee can choose on the booking page.
</Note>

### Update Channel Availabilities

Add or replace per-channel availability overrides:

```json theme={null}
{
  "meetingOptions": {
    "allowedChannels": ["zoom", "phone", "local"],
    "channelAvailabilities": {
      "phone": {
        "name": "Phone Hours",
        "timezone": "Europe/Berlin",
        "schedule": {
          "monday": { "enabled": true, "hours": [{ "start": "08:00", "end": "12:00" }] },
          "tuesday": { "enabled": true, "hours": [{ "start": "08:00", "end": "12:00" }] },
          "wednesday": { "enabled": false, "hours": [] },
          "thursday": { "enabled": false, "hours": [] },
          "friday": { "enabled": false, "hours": [] },
          "saturday": { "enabled": false, "hours": [] },
          "sunday": { "enabled": false, "hours": [] }
        }
      },
      "local": {
        "name": "In-Person Exceptions",
        "timezone": "Europe/Berlin",
        "exceptions": [
          { "available": false, "start": "2026-05-01T00:00", "end": "2026-05-01T23:59", "title": "Office Closed" }
        ]
      }
    }
  }
}
```

<Note>
  Inline availability objects are created automatically and stored as UUIDs. On subsequent reads, `channelAvailabilities` values are always UUID strings.
</Note>

### Update Calendar Invite

Customize what appears in the calendar event description:

```json theme={null}
{
  "ics": {
    "description": "{!M.Meeting.Name}\n\nEmail: {!M.Guest.Email}\nPhone: {!M.Guest.Phone}\n\nReschedule: {!M.Meeting.Reschedule}\nCancel: {!M.Meeting.Cancel}"
  }
}
```

### Update Calendar Invite (Multi-Language)

Provide different templates per language:

```json theme={null}
{
  "ics": {
    "title": {
      "en": "{!M.Meeting.Name}: {!M.Guest.Fullname} & {!M.Host.Fullname}",
      "de": "{!M.Meeting.Name}: {!M.Guest.Fullname} & {!M.Host.Fullname}"
    },
    "description": {
      "en": "{!M.Meeting.Name}\n\nEmail: {!M.Guest.Email}\nPhone: {!M.Guest.Phone}\n\nReschedule: {!M.Meeting.Reschedule}\nCancel: {!M.Meeting.Cancel}",
      "de": "{!M.Meeting.Name}\n\nE-Mail: {!M.Guest.Email}\nTelefon: {!M.Guest.Phone}\n\nVerschieben: {!M.Meeting.Reschedule}\nAbsagen: {!M.Meeting.Cancel}"
    },
    "location": "{!M.Meeting.Venue}"
  }
}
```

<Note>
  You can mix string and object formats within the same request. In the example above, `location` is a plain string while `title` and `description` use multi-language objects.
</Note>

## Response

### Success (200 OK)

```json theme={null}
{
  "id": "770e8400-e29b-41d4-a716-446655440002",
  "meetingInfo": {
    "name": "Updated Meeting Name",
    "duration": 60,
    "description": "A longer consultation meeting"
  },
  "slug": "john-smith-45min",
  "bookingUrl": "https://cal.meetergo.com/john-smith/john-smith-45min",
  "updatedAt": "2024-01-15T11:00:00Z"
}
```

### Error Responses

#### 404 Not Found

```json theme={null}
{
  "statusCode": 404,
  "message": "Meeting type not found",
  "error": "Not Found"
}
```

#### 400 Bad Request - Validation Error

```json theme={null}
{
  "statusCode": 400,
  "message": "Validation failed",
  "errors": [
    {
      "field": "duration",
      "message": "Duration must be a positive number"
    }
  ]
}
```

## Related Endpoints

<CardGroup cols={2}>
  <Card title="Create Meeting Type" icon="plus" href="/api-reference/meeting-types/create-meeting-type">
    Create a new meeting type
  </Card>

  <Card title="List Meeting Types" icon="list" href="/api-reference/meeting-types/list-meeting-types">
    Get all meeting types
  </Card>
</CardGroup>
