Skip to main content
POST
/
v4
/
meeting-type
Create Meeting Type
curl --request POST \
  --url https://api.example.com/v4/meeting-type
Create a new meeting type that defines the rules for a type of meeting, such as its title and duration.

Endpoint

POST /v4/meeting-type

Request Headers

HeaderRequiredDescription
AuthorizationYesBearer <your-api-key>
x-meetergo-api-user-idYesUUID of the user who owns the meeting type
Content-TypeYesapplication/json

Request Body

FieldTypeRequiredDescription
meetingInfoobjectYesCore meeting configuration
meetingOptionsobjectNoMeeting options (channels, channel availability, etc.)
slugstringNoURL-friendly identifier (auto-generated if omitted)
availabilityIdstringNoID of existing availability to use
availabilityobjectNoCreate new availability inline (mutually exclusive with availabilityId)
locationsstring[]NoAddress(es) for in-person meetings. When multiple locations are provided, the attendee can choose.
metadataobjectNoKey-value pairs for external system correlation
optionsobjectNoRequest options (e.g., createOneTimeLink)

meetingInfo (required)

FieldTypeRequiredDescription
namestringYesDisplay name for the meeting type
descriptionstringYesDescription shown on booking page
durationnumberYesDuration in minutes
channelstringYesgoogle_meet, zoom, teams, phone, in_person, whereby, custom
bufferBeforenumberNoMinutes blocked before meeting (default: 0)
bufferAfternumberNoMinutes blocked after meeting (default: 0)
colorstringNoColor in RGB format, e.g. rgb(0, 153, 255)
customChannelNamestringNoDisplay label for a custom meeting channel (used when channel is custom)
customChannelLinkstringNoURL for the custom meeting channel (required when channel is custom)

meetingOptions

FieldTypeRequiredDescription
allowedChannelsstring[]NoChannel options the attendee can choose from (e.g., ["zoom", "phone", "local"]). When more than one channel is provided, channel selection is automatically enabled on the booking page.
channelAvailabilitiesobjectNoPer-channel availability overrides. Each key is a channel name, each value is a UUID string (existing availability) or an inline availability object. See Channel Availabilities.
allowedDurationsnumber[]NoAdditional duration options in minutes (shown alongside the primary duration)
allowAddingGuestsbooleanNoAllow attendees to invite additional guests
allowPhoneOnlyBookingbooleanNoAllow bookings without attendee email (phone as identifier). For voice AI / phone scheduling use cases. See Voice AI Bot
doubleOptInstringNoDouble opt-in setting: useCompanySettings, enabled, disabled

channelAvailabilities

Override the default availability for specific channels. Each value can be:
  • A UUID string referencing an existing availability
  • An inline availability object (same structure as top-level availability) that will be created automatically
{
  "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": [] }
      }
    }
  }
}
Channels not included in channelAvailabilities use the meeting type’s default availability.
Omit schedule from an inline availability object to create an exceptions-only availability (all days disabled by default). This is useful for channels available only at specific times.

availability

Create availability inline instead of referencing an existing availabilityId. Uses the same structure as the Availability API.
FieldTypeRequiredDescription
namestringYesName for the availability schedule
timezonestringYesIANA timezone (e.g., Europe/Berlin)
scheduleobjectNoWeekly recurring schedule (format). If omitted, all days default to disabled.
exceptionsarrayNoDate-specific overrides (format)
For ticket-based scheduling with specific time slots, omit schedule and use only exceptions. See Exceptions-Only Availability.

metadata

Key-value pairs for integration with external systems. Included in webhook payloads.
ConstraintLimit
Max keys20
Max value length500 characters
Value typeString only

options

FieldTypeDescription
createOneTimeLinkbooleanCreate and return a one-time booking link

Examples

Basic Request

curl -X POST "https://api.meetergo.com/v4/meeting-type" \
  -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": "Quick 15min Chat",
      "description": "A quick call to discuss your questions",
      "duration": 15,
      "channel": "google_meet"
    },
    "slug": "quick-chat"
  }'

With Buffers

{
  "meetingInfo": {
    "name": "Product Demo",
    "description": "A 45-minute walkthrough of our product features",
    "duration": 45,
    "channel": "zoom",
    "bufferBefore": 15,
    "bufferAfter": 10
  },
  "slug": "product-demo"
}

With Custom Channel

{
  "meetingInfo": {
    "name": "Webinar Session",
    "description": "Join our interactive webinar",
    "duration": 60,
    "channel": "custom",
    "customChannelName": "Company Webinar Platform",
    "customChannelLink": "https://webinar.example.com/room/abc123"
  }
}

With In-Person Location

{
  "meetingInfo": {
    "name": "Office Consultation",
    "description": "In-person meeting at our office",
    "duration": 45,
    "channel": "local"
  },
  "locations": ["123 Main St, Suite 200, Berlin"]
}
When multiple locations are provided, the attendee can choose on the booking page:
{
  "meetingInfo": {
    "name": "On-Site Visit",
    "description": "Meet us at one of our offices",
    "duration": 60,
    "channel": "local"
  },
  "locations": ["Berlin Office - Friedrichstr. 123", "Munich Office - Marienplatz 5"]
}

With Metadata

Store custom data for integration with external systems:
{
  "meetingInfo": {
    "name": "Property Evaluation",
    "description": "On-site property evaluation",
    "duration": 60,
    "channel": "phone"
  },
  "metadata": {
    "ticketId": "EVAL-12345",
    "propertyAddress": "123 Main St",
    "source": "crm-integration"
  }
}

With Specific Time Slots (Exceptions Only)

Create availability with specific datetime slots only—no recurring weekly schedule:
{
  "meetingInfo": {
    "name": "Ticket Consultation",
    "description": "One-time consultation for ticket #12345",
    "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-27T14:00", "end": "2026-01-27T15:00" },
      { "available": true, "start": "2026-01-28T09:00", "end": "2026-01-28T10:00" }
    ]
  },
  "metadata": {
    "ticketId": "EVAL-12345"
  }
}
When schedule is omitted from availability, the weekly schedule defaults to all days disabled. Only the specified exceptions define available booking windows.
Create a meeting type with a one-time booking link in a single API call:
{
  "meetingInfo": {
    "name": "Scheduled Callback",
    "description": "One-time callback for support case",
    "duration": 30,
    "channel": "phone"
  },
  "availability": {
    "name": "Callback Availability",
    "timezone": "Europe/Berlin",
    "exceptions": [
      { "available": true, "start": "2026-01-27T10:00", "end": "2026-01-27T11:00" }
    ]
  },
  "metadata": {
    "caseId": "CASE-789"
  },
  "options": {
    "createOneTimeLink": true
  }
}

With Multiple Channels and Channel Availabilities

Create a meeting type where the attendee can choose between channels, each with its own availability:
{
  "meetingInfo": {
    "name": "Sales Call",
    "description": "Choose your preferred meeting format",
    "duration": 30,
    "channel": "zoom"
  },
  "meetingOptions": {
    "allowedChannels": ["zoom", "phone", "local"],
    "channelAvailabilities": {
      "phone": "660e8400-e29b-41d4-a716-446655440001",
      "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": [] }
        }
      },
      "zoom": {
        "name": "No Zoom Fridays",
        "timezone": "Europe/Berlin",
        "exceptions": [
          { "available": false, "start": "2026-03-07T00:00", "end": "2026-03-07T23:59", "title": "No Zoom Friday" }
        ]
      }
    }
  },
  "availability": {
    "name": "Default Schedule",
    "timezone": "Europe/Berlin",
    "schedule": {
      "monday": { "enabled": true, "hours": [{ "start": "09:00", "end": "17:00" }] },
      "tuesday": { "enabled": true, "hours": [{ "start": "09:00", "end": "17:00" }] },
      "wednesday": { "enabled": true, "hours": [{ "start": "09:00", "end": "17:00" }] },
      "thursday": { "enabled": true, "hours": [{ "start": "09:00", "end": "17:00" }] },
      "friday": { "enabled": true, "hours": [{ "start": "09:00", "end": "17:00" }] },
      "saturday": { "enabled": false, "hours": [] },
      "sunday": { "enabled": false, "hours": [] }
    }
  }
}
When allowedChannels has more than one entry, channel selection is automatically enabled on the booking page. You don’t need to set allowSelectChannel explicitly.

Response

Success (201 Created)

{
  "id": "770e8400-e29b-41d4-a716-446655440002",
  "slug": "quick-chat",
  "meetingInfo": {
    "name": "Quick 15min Chat",
    "description": "A quick call to discuss your questions",
    "duration": 15,
    "channel": "google_meet"
  },
  "bookingUrl": "https://cal.meetergo.com/john-smith/quick-chat",
  "createdAt": "2024-01-15T10:30:00Z"
}
When options.createOneTimeLink is true:
{
  "id": "770e8400-e29b-41d4-a716-446655440002",
  "slug": "property-evaluation-abc123",
  "meetingInfo": {
    "name": "Property Evaluation",
    "description": "On-site property evaluation",
    "duration": 60,
    "channel": "phone"
  },
  "bookingUrl": "https://cal.meetergo.com/john-smith/property-evaluation-abc123",
  "metadata": {
    "ticketId": "EVAL-12345",
    "source": "crm-integration"
  },
  "availabilityId": "880e8400-e29b-41d4-a716-446655440003",
  "oneTimeLink": {
    "id": "abc123xyz",
    "url": "https://cal.meetergo.com/1t/abc123xyz",
    "meetingTypeId": "770e8400-e29b-41d4-a716-446655440002"
  },
  "createdAt": "2024-01-15T10:30:00Z"
}
FieldDescription
idUUID of the created meeting type
slugURL-friendly identifier
meetingInfoCore meeting configuration
meetingInfo.nameDisplay name
meetingInfo.durationDuration in minutes
meetingInfo.channelMeeting channel type
bookingUrlPublic booking URL
metadataCustom key-value data (if provided)
availabilityIdID of created availability (if availability was provided)
oneTimeLinkOne-time link details (if options.createOneTimeLink was true)
oneTimeLink.urlFull URL for the one-time booking page
createdAtCreation timestamp

Error Responses

400 Bad Request - Validation Error

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

409 Conflict - Slug Already Exists

{
  "statusCode": 409,
  "message": "A meeting type with this slug already exists",
  "error": "Conflict"
}

Common Durations

DurationUse Case
15 minQuick check-ins, brief consultations
30 minStandard meetings, initial calls
45 minDiscovery calls, demos
60 minDeep-dive sessions, workshops
90 minTraining sessions, comprehensive reviews