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
emailstringYes*Email 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
*Not required when phoneOnlyBooking is true and the meeting type has allowPhoneOnlyBooking enabled. In this case, phone becomes required instead. See Voice AI Bot for details.

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)
phoneOnlyBookingbooleanWhen true, attendee email is not required and phone becomes the identifier. The meeting type must have allowPhoneOnlyBooking enabled. See Voice AI Bot
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": "client@example.com",
      "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": "client@example.com",
    "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": "client@example.com",
      "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