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
}
}'
Video Conferencing
Specify the video conferencing channel when booking:
| 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 |
in_person | In-person meeting |
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": "[email protected]",
"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": "[email protected]" }
}
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
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