Skip to main content
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

PropertyDescription
nameDisplay name shown on booking pages
durationLength in minutes
slugURL-friendly identifier
bufferTime blocked before/after meetings
channelVideo conferencing platform
metadataCustom 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

FieldTypeRequiredDescription
meetingInfoobjectYesCore meeting configuration
meetingInfo.namestringYesDisplay name (e.g., “30 Minute Call”)
meetingInfo.descriptionstringYesDescription shown on booking page
meetingInfo.durationnumberYesDuration in minutes
meetingInfo.channelstringYesgoogle_meet, zoom, teams, phone, in_person, whereby, custom
meetingInfo.bufferBeforenumberNoMinutes blocked before meeting
meetingInfo.bufferAfternumberNoMinutes blocked after meeting
slugstringNoURL slug (auto-generated if not provided)
metadataobjectNoKey-value pairs for custom data
availabilityobjectNoInline availability with schedule and/or exceptions
optionsobjectNoOptions 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:
ChannelDescription
google_meetGoogle Meet link (requires integration)
zoomZoom meeting (requires integration)
teamsMicrosoft Teams (requires integration)
wherebyWhereby room
phonePhone call
localIn-person meeting
customCustom 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 TimeAvailability
9:00-9:15Blocked (buffer before)
9:15-10:15Meeting
10:15-10:30Blocked (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
  }
}

Metadata

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"
  }
}
ConstraintLimit
Max keys20
Max value length500 characters
Value typeString only
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