curl --request POST \
--url https://{your-subdomain}.neetocal.com/api/external/v2/bookings \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <x-api-key>' \
--data '
{
"meeting_slug": "meeting-with-oliver-smith",
"name": "Eve Smith",
"email": "eve@example.com",
"time_zone": "Asia/Kolkata",
"slot_date": "2025-07-15",
"slot_start_time": "01:30 PM",
"preferred_meeting_spot": "jitsi",
"form_responses": {
"guest_email_s": [
"sam@example.com",
"charlie@example.com"
],
"language": "English"
},
"add_on_service_ids": [
"77150ec6-d4f0-4665-98f0-34bda69f7b3a"
],
"override_availability": false,
"host_email": "oliver@example.com",
"reserve_slot": false,
"send_payment_link": true,
"metadata": {
"metadata": {
"pre_bookings": [
{
"duration": 15,
"starts_at": "2025-11-28T02:30:00+00:00"
},
{
"duration": 15,
"starts_at": "2025-12-05T02:30:00+00:00"
}
]
}
}
}
'const options = {
method: 'POST',
headers: {'X-Api-Key': '<x-api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
meeting_slug: 'meeting-with-oliver-smith',
name: 'Eve Smith',
email: 'eve@example.com',
time_zone: 'Asia/Kolkata',
slot_date: '2025-07-15',
slot_start_time: '01:30 PM',
preferred_meeting_spot: 'jitsi',
form_responses: {guest_email_s: ['sam@example.com', 'charlie@example.com'], language: 'English'},
add_on_service_ids: ['77150ec6-d4f0-4665-98f0-34bda69f7b3a'],
override_availability: false,
host_email: 'oliver@example.com',
reserve_slot: false,
send_payment_link: true,
metadata: {
metadata: {
pre_bookings: [
{duration: 15, starts_at: '2025-11-28T02:30:00+00:00'},
{duration: 15, starts_at: '2025-12-05T02:30:00+00:00'}
]
}
}
})
};
fetch('https://{your-subdomain}.neetocal.com/api/external/v2/bookings', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{your-subdomain}.neetocal.com/api/external/v2/bookings"
payload = {
"meeting_slug": "meeting-with-oliver-smith",
"name": "Eve Smith",
"email": "eve@example.com",
"time_zone": "Asia/Kolkata",
"slot_date": "2025-07-15",
"slot_start_time": "01:30 PM",
"preferred_meeting_spot": "jitsi",
"form_responses": {
"guest_email_s": ["sam@example.com", "charlie@example.com"],
"language": "English"
},
"add_on_service_ids": ["77150ec6-d4f0-4665-98f0-34bda69f7b3a"],
"override_availability": False,
"host_email": "oliver@example.com",
"reserve_slot": False,
"send_payment_link": True,
"metadata": { "metadata": { "pre_bookings": [
{
"duration": 15,
"starts_at": "2025-11-28T02:30:00+00:00"
},
{
"duration": 15,
"starts_at": "2025-12-05T02:30:00+00:00"
}
] } }
}
headers = {
"X-Api-Key": "<x-api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "<string>",
"sid": "<string>",
"parent_booking_id": "<string>",
"email": "<string>",
"name": "<string>",
"host_name": "<string>",
"host_email": "<string>",
"is_multihost": true,
"multihosts": [
{
"name": "<string>",
"email": "<string>"
}
],
"starts_at": "2023-11-07T05:31:56Z",
"ends_at": "2023-11-07T05:31:56Z",
"time_zone": "<string>",
"starts_at_for_client": "<string>",
"ends_at_for_client": "<string>",
"status": "<string>",
"cancel_reason": "<string>",
"cancelled_by": "<string>",
"reschedule_requested": true,
"preferred_meeting_spot": "<string>",
"room_type": "daily",
"room_url": "<string>",
"room_id": "<string>",
"spot_details": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"meeting_id": "<string>",
"meeting": {
"name": "<string>"
},
"no_show": true,
"is_overridden": true,
"bypassed_rules": [
"<string>"
],
"meeting_outcome": {
"id": "59413def-60eb-47c6-b390-098fcf583b66",
"name": "Pricing Discussion",
"color": "yellow",
"kind": "custom",
"color_hex": "#EAB308",
"is_system": false,
"is_organization_owned": true
},
"notes_url": "<string>",
"internal_notes": "<string>",
"metadata": {},
"admin_booking_url": "<string>",
"client_booking_url": "<string>",
"form_responses": [
{
"field": "<string>",
"value": "<string>",
"type": "<string>",
"field_code": "<string>"
}
],
"form_responses_as_hash": {},
"add_on_services": [
{
"id": "0d3c1e8a-58b7-4c1f-a7f3-3c2f5d1b9e10",
"add_on_service_id": "77150ec6-d4f0-4665-98f0-34bda69f7b3a",
"name": "Sauna",
"duration": 30,
"amount": "25.5",
"currency": "USD",
"free": false
}
],
"payment": {
"id": "f46c9ddf-221d-4238-afb2-280c1c6b3185",
"external_id": "pi_3ThCkv2c3CtEndqE1BwejQno",
"provider": "stripe",
"amount": "100.0",
"currency": "USD",
"status": "successful",
"successful": true,
"payment_at": "2026-06-11T17:51:09.321Z"
}
}Create booking
Create a booking. Omit slot_date and slot_start_time to book the first available slot.
To book a time outside the scheduling link’s availability, pass override_availability: true. Use the List available slots endpoint with the same flag to see which times can be booked.
curl --request POST \
--url https://{your-subdomain}.neetocal.com/api/external/v2/bookings \
--header 'Content-Type: application/json' \
--header 'X-Api-Key: <x-api-key>' \
--data '
{
"meeting_slug": "meeting-with-oliver-smith",
"name": "Eve Smith",
"email": "eve@example.com",
"time_zone": "Asia/Kolkata",
"slot_date": "2025-07-15",
"slot_start_time": "01:30 PM",
"preferred_meeting_spot": "jitsi",
"form_responses": {
"guest_email_s": [
"sam@example.com",
"charlie@example.com"
],
"language": "English"
},
"add_on_service_ids": [
"77150ec6-d4f0-4665-98f0-34bda69f7b3a"
],
"override_availability": false,
"host_email": "oliver@example.com",
"reserve_slot": false,
"send_payment_link": true,
"metadata": {
"metadata": {
"pre_bookings": [
{
"duration": 15,
"starts_at": "2025-11-28T02:30:00+00:00"
},
{
"duration": 15,
"starts_at": "2025-12-05T02:30:00+00:00"
}
]
}
}
}
'const options = {
method: 'POST',
headers: {'X-Api-Key': '<x-api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
meeting_slug: 'meeting-with-oliver-smith',
name: 'Eve Smith',
email: 'eve@example.com',
time_zone: 'Asia/Kolkata',
slot_date: '2025-07-15',
slot_start_time: '01:30 PM',
preferred_meeting_spot: 'jitsi',
form_responses: {guest_email_s: ['sam@example.com', 'charlie@example.com'], language: 'English'},
add_on_service_ids: ['77150ec6-d4f0-4665-98f0-34bda69f7b3a'],
override_availability: false,
host_email: 'oliver@example.com',
reserve_slot: false,
send_payment_link: true,
metadata: {
metadata: {
pre_bookings: [
{duration: 15, starts_at: '2025-11-28T02:30:00+00:00'},
{duration: 15, starts_at: '2025-12-05T02:30:00+00:00'}
]
}
}
})
};
fetch('https://{your-subdomain}.neetocal.com/api/external/v2/bookings', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://{your-subdomain}.neetocal.com/api/external/v2/bookings"
payload = {
"meeting_slug": "meeting-with-oliver-smith",
"name": "Eve Smith",
"email": "eve@example.com",
"time_zone": "Asia/Kolkata",
"slot_date": "2025-07-15",
"slot_start_time": "01:30 PM",
"preferred_meeting_spot": "jitsi",
"form_responses": {
"guest_email_s": ["sam@example.com", "charlie@example.com"],
"language": "English"
},
"add_on_service_ids": ["77150ec6-d4f0-4665-98f0-34bda69f7b3a"],
"override_availability": False,
"host_email": "oliver@example.com",
"reserve_slot": False,
"send_payment_link": True,
"metadata": { "metadata": { "pre_bookings": [
{
"duration": 15,
"starts_at": "2025-11-28T02:30:00+00:00"
},
{
"duration": 15,
"starts_at": "2025-12-05T02:30:00+00:00"
}
] } }
}
headers = {
"X-Api-Key": "<x-api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"id": "<string>",
"sid": "<string>",
"parent_booking_id": "<string>",
"email": "<string>",
"name": "<string>",
"host_name": "<string>",
"host_email": "<string>",
"is_multihost": true,
"multihosts": [
{
"name": "<string>",
"email": "<string>"
}
],
"starts_at": "2023-11-07T05:31:56Z",
"ends_at": "2023-11-07T05:31:56Z",
"time_zone": "<string>",
"starts_at_for_client": "<string>",
"ends_at_for_client": "<string>",
"status": "<string>",
"cancel_reason": "<string>",
"cancelled_by": "<string>",
"reschedule_requested": true,
"preferred_meeting_spot": "<string>",
"room_type": "daily",
"room_url": "<string>",
"room_id": "<string>",
"spot_details": "<string>",
"created_at": "2023-11-07T05:31:56Z",
"updated_at": "2023-11-07T05:31:56Z",
"meeting_id": "<string>",
"meeting": {
"name": "<string>"
},
"no_show": true,
"is_overridden": true,
"bypassed_rules": [
"<string>"
],
"meeting_outcome": {
"id": "59413def-60eb-47c6-b390-098fcf583b66",
"name": "Pricing Discussion",
"color": "yellow",
"kind": "custom",
"color_hex": "#EAB308",
"is_system": false,
"is_organization_owned": true
},
"notes_url": "<string>",
"internal_notes": "<string>",
"metadata": {},
"admin_booking_url": "<string>",
"client_booking_url": "<string>",
"form_responses": [
{
"field": "<string>",
"value": "<string>",
"type": "<string>",
"field_code": "<string>"
}
],
"form_responses_as_hash": {},
"add_on_services": [
{
"id": "0d3c1e8a-58b7-4c1f-a7f3-3c2f5d1b9e10",
"add_on_service_id": "77150ec6-d4f0-4665-98f0-34bda69f7b3a",
"name": "Sauna",
"duration": 30,
"amount": "25.5",
"currency": "USD",
"free": false
}
],
"payment": {
"id": "f46c9ddf-221d-4238-afb2-280c1c6b3185",
"external_id": "pi_3ThCkv2c3CtEndqE1BwejQno",
"provider": "stripe",
"amount": "100.0",
"currency": "USD",
"status": "successful",
"successful": true,
"payment_at": "2026-06-11T17:51:09.321Z"
}
}{your-subdomain} with your workspace’s subdomain. Learn how to find your subdomain in Workspace subdomain.
Headers
Use the X-Api-Key header to provide your workspace API key. Refer to Authentication for more information.
Body
Slug of scheduling link you want to book.
"meeting-with-oliver-smith"
Name of person making the booking.
"Eve Smith"
Email of person making the booking.
"eve@example.com"
Time zone of person making the booking.
"Asia/Kolkata"
Date on which you want to book. This should be in "YYYY-MM-DD" format. If slot_date and slot_start_time are not provided then the first available slot will be booked. Both are required when override_availability is true.
"2025-07-15"
Start time for the booking. This should be in "HH:MM AM/PM" format.
"01:30 PM"
Your preferred meeting place. This field is optional. Before passing this value, ensure that the corresponding meeting place is configured in the "Where" section of the scheduling link.
custom, jitsi, in_person, daily, zoom, whereby, google_meet, teams "jitsi"
Responses for the questions of booking form (optional). The key of the field should be the field code of the question. The field code can be found in scheduling link's Settings -> Questions -> 3 dot menu of the question -> Edit -> Advanced properties. You can specify guest emails using the guest_email_s field code.
Hide child attributes
Hide child attributes
Array of guest emails for the booking. The default field code is "guest_email_s". You can change this by editing the Guest email(s) question, and changing the field code in advanced properties.
{
"guest_email_s": ["sam@example.com", "charlie@example.com"],
"language": "English"
}
IDs of the add-on services to include in the booking. The booking's duration and the amount charged include the chosen add-on services. When slot_date and slot_start_time are omitted, the first slot long enough for the add-on services is booked. Returns a 422 error if an ID does not belong to the scheduling link, or if more than one is passed while the scheduling link's allow_multiple_add_on_services is false.
["77150ec6-d4f0-4665-98f0-34bda69f7b3a"]
When true, books the requested time even if it is outside the scheduling link's availability, the same way a host can override availability in the app. See the schedule meetings on behalf of the client help article for more. Available hours, minimum notice, buffer time, booking limits, the maximum bookings per slot of a group meeting, holidays, calendar conflicts and existing bookings are ignored. The time must still be in the future, and a host cannot have two overridden bookings at the same time. Requires a valid slot_date and slot_start_time. The response includes is_overridden and bypassed_rules.
Email of the host to assign the booking to, for scheduling links with more than one host. Allowed only when override_availability is true or the scheduling link lets clients choose the host. When omitted, the host is assigned automatically. You can get the host emails from the hosts array in the Get scheduling link response.
"oliver@example.com"
When true, the booking is created with pre_booked status and the slot is reserved for a paid booking. The scheduling link must have a fee configured. If send_payment_link is not explicitly set to false, a payment link email will be sent to the client.
Only applicable when reserve_slot is true. When true, a payment link email is sent to the client after the slot is reserved. When false, the slot is reserved without sending any payment link email.
Additional data to be stored with the booking. To pre-create future bookings, pass pre_bookings containing the duration (in minutes) and UTC start datetime of each booking that should be created ahead of time.
Note: If the provided slot time is not available, that slot will be skipped. Please use the List available slots API to get the available slots before creating pre-bookings.
Pre-bookings are made asynchronously. Use the parent_booking_id filter on the List bookings endpoint to check the status of the pre-bookings.
Hide child attributes
Hide child attributes
The ID of the fee to be used for the paid booking reservation. Only applicable when reserve_slot is true. You can get the fee ID from the fees array in the Get scheduling link response.
"a1b2c3d4-e5f6-7890-abcd-ef1234567890"
List of future bookings to be created along with the primary booking.
20{
"metadata": {
"pre_bookings": [
{
"duration": 15,
"starts_at": "2025-11-28T02:30:00+00:00"
},
{
"duration": 15,
"starts_at": "2025-12-05T02:30:00+00:00"
}
]
}
}
Response
Created - Booking created successfully
Unique identifier for the booking.
Short identifier (SID) for the booking, used in URLs and API calls.
Reference to the parent booking if this is a group booking.
Email address of the person who made the booking.
Name of the person who made the booking.
Name of the primary host for the meeting.
Email address of the primary host for the meeting.
Whether the meeting has multiple hosts.
Start time of the booking in UTC.
End time of the booking in UTC.
Time zone of the booking location.
Start time of the booking in the client's local time zone.
End time of the booking in the client's local time zone.
Current status of the booking (e.g., confirmed, cancelled, awaiting_approval, rejected).
Reason provided when the booking was cancelled.
Name of the person who cancelled the booking.
Whether a reschedule has been requested for this booking.
Preferred meeting platform or location type selected by the client.
Type of meeting room or platform being used.
daily, zoom, jitsi, google_meet, teams, whereby, in_person, custom, phone_call URL for the meeting room or platform.
Unique identifier for the meeting room or platform.
Additional details about the meeting place.
Timestamp when the booking was created.
Timestamp when the booking was last updated.
Unique identifier of the scheduling link this booking belongs to.
Whether the booking is marked as no-show by the host.
Whether the booking was made or rescheduled outside the scheduling link's availability.
Messages for the availability checks skipped by override_availability (e.g., "Host is not available at the time"). Only included in the response to that create or update request.
Meeting outcome assigned to the booking.
Hide child attributes
Hide child attributes
Unique identifier for the meeting outcome.
"59413def-60eb-47c6-b390-098fcf583b66"
Name of the meeting outcome.
"Pricing Discussion"
Color assigned to the meeting outcome.
blue, orange, gray, red, yellow, violet, pink, teal, cyan, green "yellow"
Kind of the meeting outcome.
"custom"
Hex color code for the meeting outcome.
"#EAB308"
Whether this is a system-defined meeting outcome. System outcomes cannot be modified or deleted.
false
Whether this outcome belongs to the organization.
true
URL to access notes or additional information about the booking.
Internal notes about the booking visible only to hosts and admins.
Additional custom data associated with the booking.
URL for hosts and admins to view and manage the booking.
URL for clients to view their booking details.
Responses submitted through the booking form.
Hide child attributes
Hide child attributes
Add-on services chosen for the booking.
Hide child attributes
Hide child attributes
Unique identifier for the booking's add-on service record.
"0d3c1e8a-58b7-4c1f-a7f3-3c2f5d1b9e10"
ID of the scheduling link's add-on service.
"77150ec6-d4f0-4665-98f0-34bda69f7b3a"
"Sauna"
Minutes the add-on service added to the booking.
30
Price charged for the add-on service.
"25.5"
"USD"
Whether the add-on service was free.
false
Payment details for the booking. Included only when a payment exists for the booking.
Hide child attributes
Hide child attributes
Unique identifier of the payment record.
"f46c9ddf-221d-4238-afb2-280c1c6b3185"
Payment reference ID from the payment provider.
"pi_3ThCkv2c3CtEndqE1BwejQno"
Payment provider that processed the payment.
"stripe"
Payment amount.
"100.0"
Currency code. Follows the ISO 4217 standard.
"USD"
Current status of the payment.
"successful"
Whether the payment was completed successfully.
true
Timestamp when the payment was made.
"2026-06-11T17:51:09.321Z"