Skip to main content
Creates a new appointment booking with a specified host for a given meeting type and time slot.

Endpoint

POST /v4/booking

Request Headers

HeaderRequiredDescription
AuthorizationYesBearer <your-api-key>
Content-TypeYesapplication/json

Request Body

Required Fields

FieldTypeDescription
meetingTypeIdstringThe ID of the meeting type to book
startstringStart time in ISO 8601 format (e.g., 2024-01-15T09:00:00+01:00)
attendeeobjectInformation about the person booking
hostIdsstring[]Array of host IDs for the booking (required for one-on-one bookings)

Attendee Object

FieldTypeRequiredDescription
emailstringYesEmail address of the attendee
firstnamestringNoFirst name of the attendee
lastnamestringNoLast name of the attendee
phonestringNoPhone number
companystringNoCompany name
customFieldsobjectNoCustom field values as key-value pairs

Optional Fields

FieldTypeDescription
queueIdstringQueue ID for round-robin meeting types
durationnumberDuration in minutes (for meeting types with multiple options)
channelstringVideo conferencing: google_meet, zoom, teams, whereby, phone, in_person
locationstringLocation for in-person meetings
skipNotificationsbooleanSkip sending email notifications (default: false)
icsTitlestringCustom calendar invite title
icsDescriptionstringCustom calendar invite description

Examples

Basic Booking

curl -X POST "https://api.meetergo.com/v4/booking" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "meetingTypeId": "770e8400-e29b-41d4-a716-446655440002",
    "start": "2024-01-15T09:00:00+01:00",
    "hostIds": ["550e8400-e29b-41d4-a716-446655440000"],
    "attendee": {
      "email": "[email protected]",
      "firstname": "Jane",
      "lastname": "Smith"
    }
  }'

With Custom Fields and Video Conferencing

{
  "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",
    "lastname": "Smith",
    "company": "Acme Inc",
    "phone": "+1-555-123-4567",
    "customFields": {
      "referral_source": "Website",
      "company_size": "50-200"
    }
  }
}

Response

Success (201 Created) - Standard Booking

{
  "appointmentId": "appt-uuid-456",
  "secret": "secret-token-789"
}
FieldDescription
appointmentIdUUID of the created appointment
secretSecret token for managing the appointment (cancel/reschedule)
Store the secret securely. It’s required to cancel or reschedule the appointment without authentication.

Success (201 Created) - Double Opt-In

If the meeting type requires confirmation:
{
  "bookingType": "DoubleOptIn",
  "provisionalBookingId": "provisional-uuid-123"
}
FieldDescription
bookingTypeDoubleOptIn or RequireHostConfirmation
provisionalBookingIdID of provisional booking (finalized after confirmation)

Error Responses

400 Bad Request - Time Slot Unavailable

{
  "statusCode": 400,
  "message": "The selected time slot is no longer available",
  "error": "Bad Request"
}

400 Bad Request - Missing Host

{
  "statusCode": 400,
  "message": "hostIds or queueId is required",
  "error": "Bad Request"
}

400 Bad Request - Invalid Duration

{
  "statusCode": 400,
  "message": "Duration must match one of the allowed durations for this meeting type",
  "error": "Bad Request"
}

Webhooks

When a booking is created, meetergo sends a booking_created webhook event:
{
  "event": "booking_created",
  "data": {
    "appointmentId": "appt-uuid-456",
    "meetingTypeId": "770e8400-e29b-41d4-a716-446655440002",
    "start": "2024-01-15T09:00:00+01:00",
    "end": "2024-01-15T09:30:00+01:00",
    "attendee": {
      "email": "[email protected]",
      "firstname": "Jane",
      "lastname": "Smith"
    },
    "hostIds": ["550e8400-e29b-41d4-a716-446655440000"]
  }
}

Notes

  • Use Get Booking Availability first to find available slots
  • For round-robin meeting types, provide queueId instead of hostIds to let the system select the next available host
  • If double opt-in is enabled, the attendee must confirm via email before the appointment is finalized