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
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_meet"
},
"slug": "discovery-call"
}'
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_meet, zoom, teams, phone, in_person, whereby, custom |
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
{
"id": "770e8400-e29b-41d4-a716-446655440002",
"slug": "discovery-call",
"meetingInfo": {
"name": "Discovery Call",
"description": "Learn about your needs",
"duration": 30,
"channel": "google_meet"
},
"bookingUrl": "https://cal.meetergo.com/john-smith/discovery-call"
}
List Meeting Types
Get all meeting types for a user:
curl -X GET "https://api.meetergo.com/v4/meeting-type" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "x-meetergo-api-user-id: {userId}"
Response
[
{
"id": "770e8400-e29b-41d4-a716-446655440002",
"slug": "discovery-call",
"meetingInfo": {
"name": "Discovery Call",
"description": "Let's discuss your needs",
"duration": 30,
"channel": "google_meet"
},
"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
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_meet | Google Meet link (requires integration) |
zoom | Zoom meeting (requires integration) |
teams | Microsoft Teams (requires integration) |
whereby | Whereby room |
phone | Phone call |
local | In-person meeting |
custom | Custom channel with a link |
Multiple Channels
Allow attendees to choose their preferred channel by setting meetingOptions.allowedChannels:
{
"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:
{
"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
- An inline availability object with
name, timezone, and optional schedule and exceptions
Channels not listed in channelAvailabilities use the meeting type’s default availability.
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).
When creating a booking, specify the channel:
{
"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:
{
"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:
{
"meetingInfo": {
"name": "Consultation",
"description": "Choose your preferred meeting length",
"durations": [15, 30, 60],
"defaultDuration": 30,
"channel": "google_meet"
}
}
When booking, specify the duration:
{
"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
{
"meetingInfo": {
"name": "Discovery Call",
"description": "Let's learn about your business and goals",
"duration": 30,
"channel": "google_meet",
"bufferAfter": 10
}
}
Technical Demo
{
"meetingInfo": {
"name": "Product Demo",
"description": "See our product in action",
"duration": 45,
"channel": "zoom",
"bufferBefore": 15,
"bufferAfter": 15
}
}
Quick Support
{
"meetingInfo": {
"name": "Quick Support",
"description": "Fast help for simple questions",
"duration": 15,
"channel": "phone"
}
}
Strategy Session
{
"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:
{
"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
}
}
Store custom key-value data on meeting types for integration with external systems. Metadata is included in webhook payloads for correlation.
{
"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:
{
"meetingInfo": {
"name": "Scheduled Callback",
"description": "One-time callback for support case",
"duration": 30,
"channel": "phone"
},
"options": {
"createOneTimeLink": true
}
}
Response includes the one-time link:
{
"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:
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:
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}"
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.
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.
Best Practices
Use descriptive names - “30 Minute Discovery Call” is clearer than “Call”
Add buffer times - Give yourself time to prepare and wrap up
Keep slugs short - discovery is better than 30-minute-discovery-call-with-sales
Slug uniqueness - Each meeting type slug must be unique per user