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

# Meeting Types

> Configure meeting templates with durations, buffers, and conferencing

Meeting Types are templates that define the rules for a specific type of meeting. Each meeting type has its own booking URL and settings.

## Meeting Type Properties

| Property   | Description                            |
| ---------- | -------------------------------------- |
| `name`     | Display name shown on booking pages    |
| `duration` | Length in minutes                      |
| `slug`     | URL-friendly identifier                |
| `buffer`   | Time blocked before/after meetings     |
| `channel`  | Video conferencing platform            |
| `metadata` | Custom key-value data for integrations |

## Create a Meeting Type

<CodeGroup>
  ```bash cURL theme={null}
  curl -X POST "https://api.meetergo.com/v4/meeting-type" \
    -H "Authorization: Bearer YOUR_API_KEY" \
    -H "x-meetergo-api-user-id: {userId}" \
    -H "Content-Type: application/json" \
    -d '{
      "meetingInfo": {
        "name": "Discovery Call",
        "description": "Learn about your needs",
        "duration": 30,
        "channel": "google"
      },
      "slug": "discovery-call"
    }'
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch('https://api.meetergo.com/v4/meeting-type', {
    method: 'POST',
    headers: {
      'Authorization': 'Bearer YOUR_API_KEY',
      'x-meetergo-api-user-id': userId,
      'Content-Type': 'application/json'
    },
    body: JSON.stringify({
      meetingInfo: {
        name: 'Discovery Call',
        description: 'Learn about your needs',
        duration: 30,
        channel: 'google'
      },
      slug: 'discovery-call'
    })
  });
  ```
</CodeGroup>

### Request Body

| Field                      | Type   | Required | Description                                                                                               |
| -------------------------- | ------ | -------- | --------------------------------------------------------------------------------------------------------- |
| `meetingInfo`              | object | Yes      | Core meeting configuration                                                                                |
| `meetingInfo.name`         | string | Yes      | Display name (e.g., "30 Minute Call")                                                                     |
| `meetingInfo.description`  | string | Yes      | Description shown on booking page                                                                         |
| `meetingInfo.duration`     | number | Yes      | Duration in minutes                                                                                       |
| `meetingInfo.channel`      | string | Yes      | `google`, `zoom`, `teamsForBusiness2`, `phone`, `local`, `whereby`, `custom`, `connect`, `webex`, `jitsi` |
| `meetingInfo.bufferBefore` | number | No       | Minutes blocked before meeting                                                                            |
| `meetingInfo.bufferAfter`  | number | No       | Minutes blocked after meeting                                                                             |
| `slug`                     | string | No       | URL slug (auto-generated if not provided)                                                                 |
| `metadata`                 | object | No       | Key-value pairs for custom data                                                                           |
| `availability`             | object | No       | Inline availability with schedule and/or exceptions                                                       |
| `options`                  | object | No       | Options like `createOneTimeLink`                                                                          |

### Response

```json theme={null}
{
  "id": "770e8400-e29b-41d4-a716-446655440002",
  "slug": "discovery-call",
  "meetingInfo": {
    "name": "Discovery Call",
    "description": "Learn about your needs",
    "duration": 30,
    "channel": "google"
  },
  "bookingUrl": "https://cal.meetergo.com/john-smith/discovery-call"
}
```

## List Meeting Types

Get all meeting types for a user:

```bash theme={null}
curl -X GET "https://api.meetergo.com/v4/meeting-type" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "x-meetergo-api-user-id: {userId}"
```

### Response

```json theme={null}
[
  {
    "id": "770e8400-e29b-41d4-a716-446655440002",
    "slug": "discovery-call",
    "meetingInfo": {
      "name": "Discovery Call",
      "description": "Let's discuss your needs",
      "duration": 30,
      "channel": "google"
    },
    "bookingUrl": "https://cal.meetergo.com/john-smith/discovery-call"
  },
  {
    "id": "770e8400-e29b-41d4-a716-446655440003",
    "slug": "demo",
    "meetingInfo": {
      "name": "Demo Session",
      "description": "See our product in action",
      "duration": 60,
      "channel": "zoom"
    },
    "bookingUrl": "https://cal.meetergo.com/john-smith/demo"
  }
]
```

## Update a Meeting Type

```bash theme={null}
curl -X PATCH "https://api.meetergo.com/v4/meeting-type/{meetingTypeId}" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "x-meetergo-api-user-id: {userId}" \
  -H "Content-Type: application/json" \
  -d '{
    "meetingInfo": {
      "name": "Quick Chat",
      "duration": 15
    }
  }'
```

## Channels

Specify the conferencing or meeting channel:

| Channel             | Description                            |
| ------------------- | -------------------------------------- |
| `google`            | Google Meet (requires integration)     |
| `zoom`              | Zoom meeting (requires integration)    |
| `teamsForBusiness2` | Microsoft Teams (requires integration) |
| `connect`           | meetergo Connect (browser-based video) |
| `whereby`           | Whereby room                           |
| `webex`             | Webex                                  |
| `jitsi`             | Jitsi Meet                             |
| `phone`             | Outgoing phone call                    |
| `phone-incoming`    | Incoming phone call                    |
| `local`             | In-person at host's location           |
| `local-attendee`    | In-person at attendee's location       |
| `custom`            | Custom channel with a link             |

### Multiple Channels

Allow attendees to choose their preferred channel by setting `meetingOptions.allowedChannels`:

```json theme={null}
{
  "meetingInfo": {
    "name": "Consultation",
    "description": "Choose your preferred format",
    "duration": 30,
    "channel": "zoom"
  },
  "meetingOptions": {
    "allowedChannels": ["zoom", "phone", "local"]
  }
}
```

When `allowedChannels` has more than one entry, channel selection is automatically enabled on the booking page.

### Per-Channel Availability

Different channels can have different availability schedules. Use `meetingOptions.channelAvailabilities` to override the default availability for specific channels:

```json theme={null}
{
  "meetingOptions": {
    "allowedChannels": ["zoom", "phone", "local"],
    "channelAvailabilities": {
      "phone": "existing-availability-uuid",
      "local": {
        "name": "In-Person Hours",
        "timezone": "Europe/Berlin",
        "schedule": {
          "monday": { "enabled": true, "hours": [{ "start": "10:00", "end": "16:00" }] },
          "tuesday": { "enabled": true, "hours": [{ "start": "10:00", "end": "16:00" }] },
          "wednesday": { "enabled": false, "hours": [] },
          "thursday": { "enabled": false, "hours": [] },
          "friday": { "enabled": false, "hours": [] },
          "saturday": { "enabled": false, "hours": [] },
          "sunday": { "enabled": false, "hours": [] }
        }
      }
    }
  }
}
```

Each `channelAvailabilities` value can be:

* A **UUID string** referencing an existing [availability](/developer-docs/core-concepts/availability)
* An **inline availability object** with `name`, `timezone`, and optional `schedule` and `exceptions`

Channels not listed in `channelAvailabilities` use the meeting type's default availability.

<Tip>
  Omit `schedule` from an inline availability to create an exceptions-only availability. This is useful for channels that are only available at specific times (e.g., in-person hours at specific locations).
</Tip>

When creating a booking, specify the channel:

```json theme={null}
{
  "meetingTypeId": "770e8400-e29b-41d4-a716-446655440002",
  "start": "2024-01-15T09:00:00+01:00",
  "hostIds": ["550e8400-e29b-41d4-a716-446655440000"],
  "channel": "zoom",
  "attendee": {
    "email": "customer@example.com",
    "firstname": "Jane"
  }
}
```

## Buffer Times

Buffer times prevent back-to-back meetings. Set `bufferBefore` and `bufferAfter` in `meetingInfo`:

```json theme={null}
{
  "meetingInfo": {
    "name": "Strategy Session",
    "description": "Deep dive into your strategy",
    "duration": 60,
    "channel": "zoom",
    "bufferBefore": 15,
    "bufferAfter": 15
  }
}
```

This creates a 60-minute meeting with 15 minutes blocked before and after.

**Example schedule impact:**

| Actual Time | Availability            |
| ----------- | ----------------------- |
| 9:00-9:15   | Blocked (buffer before) |
| 9:15-10:15  | Meeting                 |
| 10:15-10:30 | Blocked (buffer after)  |
| 10:30+      | Available               |

## Multiple Durations

Some meeting types support multiple durations. The attendee chooses when booking:

```json theme={null}
{
  "meetingInfo": {
    "name": "Consultation",
    "description": "Choose your preferred meeting length",
    "durations": [15, 30, 60],
    "defaultDuration": 30,
    "channel": "google"
  }
}
```

When booking, specify the duration:

```json theme={null}
{
  "meetingTypeId": "770e8400-e29b-41d4-a716-446655440002",
  "start": "2024-01-15T09:00:00+01:00",
  "duration": 60,
  "hostIds": ["550e8400-e29b-41d4-a716-446655440000"],
  "attendee": { "email": "customer@example.com" }
}
```

## Common Patterns

### Sales Discovery

```json theme={null}
{
  "meetingInfo": {
    "name": "Discovery Call",
    "description": "Let's learn about your business and goals",
    "duration": 30,
    "channel": "google",
    "bufferAfter": 10
  }
}
```

### Technical Demo

```json theme={null}
{
  "meetingInfo": {
    "name": "Product Demo",
    "description": "See our product in action",
    "duration": 45,
    "channel": "zoom",
    "bufferBefore": 15,
    "bufferAfter": 15
  }
}
```

### Quick Support

```json theme={null}
{
  "meetingInfo": {
    "name": "Quick Support",
    "description": "Fast help for simple questions",
    "duration": 15,
    "channel": "phone"
  }
}
```

### Strategy Session

```json theme={null}
{
  "meetingInfo": {
    "name": "Strategy Session",
    "description": "Deep dive into your strategy",
    "duration": 90,
    "channel": "zoom",
    "bufferBefore": 30,
    "bufferAfter": 15
  }
}
```

### Ticket-Based Scheduling

Create meeting types with specific time slots and metadata for ticket correlation:

```json theme={null}
{
  "meetingInfo": {
    "name": "Property Evaluation",
    "description": "On-site property evaluation",
    "duration": 60,
    "channel": "phone"
  },
  "availability": {
    "name": "Ticket Availability",
    "timezone": "Europe/Berlin",
    "exceptions": [
      { "available": true, "start": "2026-01-27T10:00", "end": "2026-01-27T11:00" },
      { "available": true, "start": "2026-01-28T14:00", "end": "2026-01-28T15:00" }
    ]
  },
  "metadata": {
    "ticketId": "EVAL-12345",
    "source": "crm"
  },
  "options": {
    "createOneTimeLink": true
  }
}
```

## Metadata

Store custom key-value data on meeting types for integration with external systems. Metadata is included in [webhook payloads](/developer-docs/webhooks/events) for correlation.

```json theme={null}
{
  "meetingInfo": {
    "name": "Support Callback",
    "description": "Scheduled callback for support case",
    "duration": 30,
    "channel": "phone"
  },
  "metadata": {
    "ticketId": "SUPPORT-789",
    "customerId": "cust_abc123",
    "priority": "high"
  }
}
```

| Constraint       | Limit          |
| ---------------- | -------------- |
| Max keys         | 20             |
| Max value length | 500 characters |
| Value type       | String only    |

## One-Time Links

Create a single-use booking link in the same API call using `options.createOneTimeLink`:

```json theme={null}
{
  "meetingInfo": {
    "name": "Scheduled Callback",
    "description": "One-time callback for support case",
    "duration": 30,
    "channel": "phone"
  },
  "options": {
    "createOneTimeLink": true
  }
}
```

Response includes the one-time link:

```json theme={null}
{
  "id": "770e8400-e29b-41d4-a716-446655440002",
  "slug": "scheduled-callback",
  "meetingInfo": {
    "name": "Scheduled Callback",
    "description": "One-time callback for support case",
    "duration": 30,
    "channel": "phone"
  },
  "bookingUrl": "https://cal.meetergo.com/john-smith/scheduled-callback",
  "oneTimeLink": {
    "id": "abc123xyz",
    "url": "https://cal.meetergo.com/1t/abc123xyz",
    "meetingTypeId": "770e8400-e29b-41d4-a716-446655440002"
  }
}
```

One-time links expire after a single booking, making them ideal for ticket-based workflows.

## Delete a Meeting Type

Soft delete a meeting type when it's no longer needed:

```bash theme={null}
curl -X DELETE "https://api.meetergo.com/v4/meeting-type/{meetingTypeId}" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "x-meetergo-api-user-id: {userId}"
```

* The meeting type is marked as deleted but retained for historical records
* Existing bookings are preserved
* The booking URL stops accepting new bookings

### Delete with Associated Availability

To also delete the associated availability, add `?deleteAvailability=true`:

```bash theme={null}
curl -X DELETE "https://api.meetergo.com/v4/meeting-type/{meetingTypeId}?deleteAvailability=true" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "x-meetergo-api-user-id: {userId}"
```

<Warning>
  **Shared availability** - If the availability is used by other meeting types, the request will fail with a 409 Conflict error listing the meeting types that share it.
</Warning>

<Note>
  **Minimum availability** - Users must have at least one availability. If this would delete the user's last availability, the request will fail with a 400 error.
</Note>

## Best Practices

<Check>
  **Use descriptive names** - "30 Minute Discovery Call" is clearer than "Call"
</Check>

<Check>
  **Add buffer times** - Give yourself time to prepare and wrap up
</Check>

<Check>
  **Keep slugs short** - `discovery` is better than `30-minute-discovery-call-with-sales`
</Check>

<Warning>
  **Slug uniqueness** - Each meeting type slug must be unique per user
</Warning>
