Booking Calendars API
OnceHub Booking Calendars API
- OpenAPI Version:
3.2.0 - API Version:
2.0.0 - License: Proprietary
The OnceHub Booking Calendars API allows you to manage bookings, calendars, event types, and scheduling resources programmatically.
Note: This documentation is for the Booking Calendars product. Booking Calendars is our current and recommended scheduling solution.
Contents
Operations
- GET /test
- GET /bookings
- GET /bookings/{id}
- POST /bookings/{id}/cancel
- POST /bookings/{id}/request-reschedule
- POST /bookings/{id}/reassign
- POST /bookings/{id}/no-show
- GET /booking-calendars
- GET /booking-calendars/{id}
- GET /booking-calendars/{id}/time-slots
- POST /booking-calendars/{id}/schedule
- POST /booking-calendars/{id}/one-time-links
- GET /notifications/sms
- GET /users
- POST /users
- GET /users/{id}
- PATCH /users/{id}
- DELETE /users/{id}
- GET /users/{id}/scheduling-availability
- PATCH /users/{id}/scheduling-availability
- GET /teams
- GET /teams/{id}
- GET /contacts
- POST /contacts
- GET /contacts/{id}
- PATCH /contacts/{id}
- DELETE /contacts/{id}
- POST /webhooks
- GET /webhooks
- GET /webhooks/{id}
- DELETE /webhooks/{id}
Webhooks
- POST booking.scheduled
- POST booking.rescheduled
- POST booking.reassigned
- POST booking.canceled_then_rescheduled
- POST booking.canceled_reschedule_requested
- POST booking.canceled
- POST booking.completed
- POST booking.no_show
- POST conversation.started
- POST conversation.closed
- POST conversation.abandoned
Schemas
- Booking
- BookingList
- Contact
- ContactList
- BookingPage
- BookingPageList
- Team
- TeamList
- EventType
- EventTypeList
- Webhook
- WebhookList
- WebhookEvent
- BookingWebhookData
- BookingWebhookCancelData
- BookingWithCancelInfo
- ConversationWebhookData
- BookingCalendar
- BookingCalendarList
- User
- UserList
- SmsNotification
- SmsNotificationList
- Error
- MasterPage
- BookingBase
- Bot
- Website
- Audience
- Conversation
- UtmParams
- BookingForm
- DeletedObject
Servers
- URL:
https://api.oncehub.com/v2
Authentication
- ApiKey: API key in header
API-Key
Tags
Authentication
Validate API credentials and manage authentication for OnceHub API access. All API requests require an API key to be passed in the API-Key header.
Bookings
Manage booking appointments and their lifecycle. Bookings represent scheduled meetings between contacts and users. Use these endpoints to list, retrieve, and perform actions on bookings such as canceling, requesting reschedules, or marking as no-show.
Booking Calendars
Manage booking calendars and their availability. Booking calendars define available time slots for appointments and can be used to schedule meetings. Use these endpoints to list calendars, retrieve availability, schedule appointments, and create one-time booking links.
Contacts
Manage contact information and relationships. Contacts represent people who have scheduled or may schedule appointments through your booking pages. Use these endpoints to list contacts, retrieve contact details, and manage contact records.
Notifications
Notifications are messages sent by OnceHub to contacts and users through various channels such as SMS, email, or push notifications. The notifications API allows you to retrieve and monitor notification delivery status and details.
Teams
Manage teams and team memberships. Teams allow you to organize users into groups for shared calendars, permissions, and resource management. Use these endpoints to retrieve team information and manage team-related operations.
Users
Manage user accounts and their properties. Users represent team members who can schedule appointments, manage calendars, and access the OnceHub platform. Use these endpoints to list users, retrieve user details, manage user accounts, and check scheduling availability.
Webhooks
Manage webhook subscriptions to receive real-time notifications for booking lifecycle events.
Webhook Events
Event payloads sent to your webhook endpoints when booking and conversation lifecycle events occur.
These schemas define the structure of the HTTP POST requests that OnceHub sends to your configured webhook URLs. Each event includes metadata about when it occurred and a data object containing the relevant booking or conversation information.
To start receiving webhook events, create a webhook subscription with your desired event triggers.
Operations
Validate API key
- Method:
GET - Path:
/test - Operation ID:
validate-api-key - Tags: Authentication
Enter your API key in the headers section below and click on "Try it" to test it.
Servers: Inherited servers
Authentication: Global authentication
Responses
200 200
Content type: application/json
message:string
Example: Result
{
"message": "The API key is valid for account: admin@example.com"
}
401 401 - Unauthorized
Content type: application/json
Example: Result
{
"type": "authentication_error",
"message": "Invalid API key."
}
403 403 - Forbidden
Content type: application/json
Example: Result
{
"type": "authentication_error",
"message": "Your account plan does not support API access. To use the OnceHub API, you must upgrade to the Enterprise plan."
}
429 429 - Too Many Requests
Content type: application/json
Example: Result
{
"type": "rate_limit_error",
"message": "Request rate limit exceeded"
}
List all bookings
- Method:
GET - Path:
/bookings - Operation ID:
list-all-bookings - Tags: Bookings
Returns a list of all bookings in the account
Servers: Inherited servers
Authentication: Global authentication
Query parameters
status:stringOnly return bookings that have the given status.
owner:stringOnly return booking owned by a user with a specific user ID.
contact:stringOnly return bookings that were scheduled with the contact with the provided ID.
creation_time.gt:string, format:dateReturn bookings with creation time greater than the given date.
creation_time.lt:string, format:dateReturn bookings with creation time less than the given date.
starting_time.gt:string, format:dateReturn bookings with starting time greater than the given date.
starting_time.lt:string, format:dateReturn bookings with starting time less than the given date.
last_updated_time.gt:string, format:dateReturn bookings with last updated time greater than the given date.
last_updated_time.lt:string, format:dateReturn bookings with last updated time less than the given date.
expand:stringA comma separated list of fields that you want to expand. Possible values are
owner,contact,conversation.before:stringA cursor for use in pagination.
beforeis an object ID that defines your place in the list. For instance, if you make a list request and receive 30 objects, starting withOBJ-XXXX, your subsequent call can includebefore=OBJ-XXXXin order to fetch the previous page of the list.Example:
"OBJ-PREV123"after:stringA cursor for use in pagination.
afteris an object ID that defines your place in the list. For instance, if you make a list request and receive 30 objects, ending withOBJ-XXXX, your subsequent call can includeafter=OBJ-XXXXin order to fetch the next page of the list.Example:
"OBJ-NEXT456"limit:integer, default:10, minimum:1, maximum:100Determines the number of objects that will be returned on each page. Defaults to 10 if not specified and has a maximum limit of 100 objects per page.
Example:
25booking_calendar:string, default:""Only return bookings that were created from the booking calendar with the provided ID.
host:string, default:""Only return bookings hosted or co-hosted by a user with a specific user ID.
Responses
200 200
Content type: application/json
Generated example:
{
"object": "list",
"data": [
{
"object": "booking",
"id": "BKNG-J4FR05BKEWEX",
"tracking_id": "D36E0002",
"subject": "Live demo",
"status": "scheduled",
"in_trash": false,
"creation_time": "2020-03-22T09:48:48Z",
"starting_time": "2020-03-22T04:30:00Z",
"customer_timezone": "America/New_York",
"last_updated_time": "2020-03-22T09:48:48Z",
"duration_minutes": 60,
"virtual_conferencing": {
"join_url": "https://meet.google.com/izv-daci-fyi"
},
"location_description": "123 Office Street",
"rescheduled_booking_id": "BKNG-J4FR05BKEWEX",
"cancel_reschedule_information": null,
"attendees": [
"andrea.hartie@example.com"
],
"form_submission": {
"name": "Carrie Customer",
"email": "carrie.customer@gmail.com",
"phone": null,
"mobile_phone": "1-2025550195",
"note": "I want to discuss whether your product can work for our office.",
"company": null,
"guests": [
""
],
"custom_fields": [
{
"name": "Title",
"value": "Executive Assistant"
}
]
},
"external_calendar": {
"type": "google",
"name": "andrea.hartie@example.com",
"id": "andrea.hartie@example.com",
"event_id": "8kvu74dda8kcv0gmmlm3folrhc"
},
"ics_url": "https://oncehub.com/api/bookings/ics/62ad3bdd-a09f-dfbdffbef389-axs01j",
"booking_calendar": "BKC-03WJV0R52Z",
"cancel_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL/cancel",
"reschedule_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL",
"payment_information": {
"amount_charged": 5000,
"currency": "USD",
"transaction_id": "ch_1234567890ABCDEFGHIJ"
},
"custom_fields": [
{
"name": "discussion_points",
"value": "Need support on new product"
}
],
"owner": "USR-FSD423423",
"conversation": "CVR-ZLS0AG3YXZTH",
"utm_params": {
"source": "facebook",
"medium": "social",
"campaign": "webinar_signup",
"term": "online+meeting+scheduler",
"content": "logolink"
},
"contact": "CTC-262WER5NR9CG38"
}
],
"has_more": false
}
400 400
Content type: application/json
Example: invalid_date_range
Invalid last_updated_time date range
{
"type": "invalid_request_error",
"message": "last_updated_time.gt cannot be later than last_updated_time.lt",
"param": "last_updated_time.gt"
}
Example: out_of_range_limit
Out of range limit
{
"type": "invalid_request_error",
"message": "Out of range value: 500. Please provide a number between 1 and 100.",
"param": "limit"
}
Example: both_before_and_after
Both before and after provided
{
"type": "invalid_request_error",
"message": "Received both before and after parameters. Please provide only one."
}
401 401 - Unauthorized
Content type: application/json
Example: Result
{
"type": "authentication_error",
"message": "Invalid API key."
}
429 429 - Too Many Requests
Content type: application/json
Example: Result
{
"type": "rate_limit_error",
"message": "Request rate limit exceeded"
}
Get a single booking
- Method:
GET - Path:
/bookings/{id} - Operation ID:
get-a-single-booking - Tags: Bookings
Returns a single booking by ID
Servers: Inherited servers
Authentication: Global authentication
Path parameters
id(required):stringID of the booking
Responses
200 200
Content type: application/json
Generated example:
{
"object": "booking",
"id": "BKNG-J4FR05BKEWEX",
"tracking_id": "D36E0002",
"subject": "Live demo",
"status": "scheduled",
"in_trash": false,
"creation_time": "2020-03-22T09:48:48Z",
"starting_time": "2020-03-22T04:30:00Z",
"customer_timezone": "America/New_York",
"last_updated_time": "2020-03-22T09:48:48Z",
"duration_minutes": 60,
"virtual_conferencing": {
"join_url": "https://meet.google.com/izv-daci-fyi"
},
"location_description": "123 Office Street",
"rescheduled_booking_id": "BKNG-J4FR05BKEWEX",
"cancel_reschedule_information": null,
"attendees": [
"andrea.hartie@example.com"
],
"form_submission": {
"name": "Carrie Customer",
"email": "carrie.customer@gmail.com",
"phone": null,
"mobile_phone": "1-2025550195",
"note": "I want to discuss whether your product can work for our office.",
"company": null,
"guests": [
""
],
"custom_fields": [
{
"name": "Title",
"value": "Executive Assistant"
}
]
},
"external_calendar": {
"type": "google",
"name": "andrea.hartie@example.com",
"id": "andrea.hartie@example.com",
"event_id": "8kvu74dda8kcv0gmmlm3folrhc"
},
"ics_url": "https://oncehub.com/api/bookings/ics/62ad3bdd-a09f-dfbdffbef389-axs01j",
"booking_calendar": "BKC-03WJV0R52Z",
"cancel_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL/cancel",
"reschedule_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL",
"payment_information": {
"amount_charged": 5000,
"currency": "USD",
"transaction_id": "ch_1234567890ABCDEFGHIJ"
},
"custom_fields": [
{
"name": "discussion_points",
"value": "Need support on new product"
}
],
"owner": "USR-FSD423423",
"conversation": "CVR-ZLS0AG3YXZTH",
"utm_params": {
"source": "facebook",
"medium": "social",
"campaign": "webinar_signup",
"term": "online+meeting+scheduler",
"content": "logolink"
},
"contact": "CTC-262WER5NR9CG38"
}
401 401 - Unauthorized
Content type: application/json
Example: Result
{
"type": "authentication_error",
"message": "Invalid API key."
}
404 404
Content type: application/json
Example: Result
{
"type": "invalid_request_error",
"message": "No such booking: '123'",
"param": "id"
}
429 429 - Too Many Requests
Content type: application/json
Example: Result
{
"type": "rate_limit_error",
"message": "Request rate limit exceeded"
}
Cancel a booking
- Method:
POST - Path:
/bookings/{id}/cancel - Operation ID:
cancel-booking - Tags: Bookings
Cancel a booking by ID
Servers: Inherited servers
Authentication: Global authentication
Path parameters
id(required):stringID of the booking
Request body
Content type: application/json
cancellation_reason:stringReason for cancelling the meeting (optional)
send_cancellation_email:boolean, default:trueWhether a cancellation email should be sent
Generated example:
{
"cancellation_reason": "",
"send_cancellation_email": true
}
Responses
200 200
Content type: application/json
Generated example:
{
"object": "booking",
"id": "BKNG-J4FR05BKEWEX",
"tracking_id": "D36E0002",
"subject": "Live demo",
"status": "scheduled",
"in_trash": false,
"creation_time": "2020-03-22T09:48:48Z",
"starting_time": "2020-03-22T04:30:00Z",
"customer_timezone": "America/New_York",
"last_updated_time": "2020-03-22T09:48:48Z",
"duration_minutes": 60,
"virtual_conferencing": {
"join_url": "https://meet.google.com/izv-daci-fyi"
},
"location_description": "123 Office Street",
"rescheduled_booking_id": "BKNG-J4FR05BKEWEX",
"cancel_reschedule_information": {
"reason": "Change in schedule",
"actioned_by": "user",
"user_id": "USR-FSD423423"
},
"attendees": [
"andrea.hartie@example.com"
],
"form_submission": {
"name": "Carrie Customer",
"email": "carrie.customer@gmail.com",
"phone": null,
"mobile_phone": "1-2025550195",
"note": "I want to discuss whether your product can work for our office.",
"company": null,
"guests": [
""
],
"custom_fields": [
{
"name": "Title",
"value": "Executive Assistant"
}
]
},
"external_calendar": {
"type": "google",
"name": "andrea.hartie@example.com",
"id": "andrea.hartie@example.com",
"event_id": "8kvu74dda8kcv0gmmlm3folrhc"
},
"ics_url": "https://oncehub.com/api/bookings/ics/62ad3bdd-a09f-dfbdffbef389-axs01j",
"booking_calendar": "BKC-03WJV0R52Z",
"cancel_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL/cancel",
"reschedule_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL",
"payment_information": {
"amount_charged": 5000,
"currency": "USD",
"transaction_id": "ch_1234567890ABCDEFGHIJ"
},
"custom_fields": [
{
"name": "discussion_points",
"value": "Need support on new product"
}
]
}
401 401 - Unauthorized
Content type: application/json
Example: Result
{
"type": "authentication_error",
"message": "Invalid API key."
}
404 404
Content type: application/json
Example: Result
{
"type": "invalid_request_error",
"message": "No such booking: '123'",
"param": "id"
}
409 409
Content type: application/json
Example: Result
{
"type": "invalid_request_error",
"message": "Booking cannot be cancelled: '123'",
"param": "id"
}
422 422
Content type: application/json
Example: Result
{
"type": "invalid_request_error",
"message": "Paid bookings cannot be canceled through this endpoint. Please login to OnceHub and use the Activity Stream to cancel paid bookings."
}
429 429 - Too Many Requests
Content type: application/json
Example: Result
{
"type": "rate_limit_error",
"message": "Request rate limit exceeded"
}
Request a reschedule
- Method:
POST - Path:
/bookings/{id}/request-reschedule - Operation ID:
request-reschedule - Tags: Bookings
Request to reschedule a booking by ID
Servers: Inherited servers
Authentication: Global authentication
Path parameters
id(required):stringID of the booking
Request body
Content type: application/json
reschedule_reason:stringReason for requesting the customer to reschedule the meeting (optional)
Generated example:
{
"reschedule_reason": ""
}
Responses
200 200
Content type: application/json
401 401 - Unauthorized
Content type: application/json
Example: Result
{
"type": "authentication_error",
"message": "Invalid API key."
}
404 404
Content type: application/json
Example: Result
{
"type": "invalid_request_error",
"message": "No such booking: '123'",
"param": "id"
}
409 409
Content type: application/json
Example: Result
{
"type": "invalid_request_error",
"message": "Booking cannot be cancelled: '123'",
"param": "id"
}
422 422
Content type: application/json
Example: Result
{
"type": "invalid_request_error",
"message": "Paid bookings can only be requested for reschedule in your OnceHub account. Log in and use the activity stream to submit a reschedule request for this booking."
}
429 429 - Too Many Requests
Content type: application/json
Example: Result
{
"type": "rate_limit_error",
"message": "Request rate limit exceeded"
}
Reassign a booking
- Method:
POST - Path:
/bookings/{id}/reassign - Operation ID:
reassign-booking - Tags: Bookings
Reassign an existing booking to a new host by ID.
Effects of reassignment:
- The original calendar event is deleted, and a new event is created in the new host's integrated calendar.
- Reassignment notifications are sent to guests and hosts.
Servers: Inherited servers
Authentication: Global authentication
Path parameters
id(required):stringThe unique ID of the booking.
Request body
Required: true
Content type: application/json
new_host(required):stringThe OnceHub user ID for the new host. The user must belong to the same account, hold an active seat license, and cannot be the current host of the booking.
location:objectOptional. Determines how the location is handled when a meeting is reassigned to a new host.
Case 1: When
locationobject is omitted: The system applies the following logic based on the original booking's location type:Online Meetings: The system first tries to use the same Video Conference Service provider as the original host. If that specific Video Conference Service provider is not connected to the new host, it automatically selects the best available integration based on this priority:
- Google Meet
- Microsoft Teams
- Zoom
- Webex Meetings
- GoTo Meeting
In-person/ Phone Meetings: The location remains unchanged for the new host.
Missing Integration: If the original meeting was virtual but the new host has no Video Conference Service integrations connected, the booking will be reassigned successfully but will proceed without a virtual link. To avoid meetings without links, it is recommended to verify host integrations before reassignment.
Case 2: When
locationobject is included: The system applies the specifictypeandvaluefor the new host. Currently, this object only supports virtual updates and cannot be used to switch a virtual meeting to an In-person location. The selected Video Conference Service must be connected and active in the new host's OnceHub account.Reassignment Failure: If the specified Video Conference Service is not connected for the new host, the reassignment request will fail. In this case, the API will return an error along with a list of connected Video Conference Service options available for that host.
type(required):string, possible values:"virtual"Fixed Value: virtual.
The required location type for virtual conferencing.
Note: virtual is currently the only supported override type. In-person and Phone locations can only be maintained by omitting the location object.
value(required):string, possible values:"google_meet", "microsoft_teams", "webex", "gotomeeting", "zoom"Supported Values: The specific service to be used.
Generated example:
{
"new_host": "",
"location": {
"type": "virtual",
"value": "google_meet"
}
}
Responses
200 200
Content type: application/json
401 401 - Unauthorized
Content type: application/json
Example: Result
{
"type": "authentication_error",
"message": "Invalid API key."
}
404 404
Content type: application/json
Example: BookingNotFound
{
"type": "invalid_request_error",
"message": "No such booking: '123'",
"param": "id"
}
Example: UserNotFound
{
"type": "invalid_request_error",
"message": "No such user: 'USR-XXXXXXXXXX'",
"param": "new_host"
}
409 409
Content type: application/json
Example: UserInactive
{
"type": "invalid_request_error",
"message": "User is inactive.",
"param": "new_host"
}
Example: PlanRestriction
{
"type": "invalid_request_error",
"message": "Reassign is available on the Route plan and above."
}
Example: SameHost
{
"type": "invalid_request_error",
"message": "Booking cannot be reassigned to the same host.",
"param": "new_host"
}
Example: BookingsStatus
{
"type": "invalid_request_error",
"message": "Booking cannot be reassigned in its current status.",
"param": "id"
}
Example: InvalidLocation
{
"type": "invalid_request_error",
"message": "Invalid location: 'Webex' is not connected for this user. Connected Video Conference Service options: google_meet, microsoft_teams.",
"param": "location.value"
}
Example: HostSeat
{
"type": "invalid_request_error",
"message": "Cannot reassign booking: The new host requires an assigned seat."
}
429 429 - Too Many Requests
Content type: application/json
Example: Result
{
"type": "rate_limit_error",
"message": "Request rate limit exceeded"
}
Set a booking as no-show
- Method:
POST - Path:
/bookings/{id}/no-show - Operation ID:
no-show - Tags: Bookings
Update the booking status to no-show by ID
Servers: Inherited servers
Authentication: Global authentication
Path parameters
id(required):stringID of the booking
Responses
200 200
Content type: application/json
401 401 - Unauthorized
Content type: application/json
Example: Result
{
"type": "authentication_error",
"message": "Invalid API key."
}
404 404
Content type: application/json
Example: Result
{
"type": "invalid_request_error",
"message": "No such booking: '123'",
"param": "id"
}
409 409
Content type: application/json
Example: Result
{
"type": "invalid_request_error",
"message": "Cannot update booking status to no_show: '123'",
"param": "id"
}
429 429 - Too Many Requests
Content type: application/json
Example: Result
{
"type": "rate_limit_error",
"message": "Request rate limit exceeded"
}
List all booking calendars
- Method:
GET - Path:
/booking-calendars - Operation ID:
list-all-booking-calendars - Tags: Booking Calendars
Returns a list of all booking calendars in your account
Servers: Inherited servers
Authentication: Global authentication
Query parameters
host:stringFilter booking calendars hosted by this user ID or team ID
before:stringA cursor for use in pagination.
beforeis an object ID that defines your place in the list. For instance, if you make a list request and receive 30 objects, starting withOBJ-XXXX, your subsequent call can includebefore=OBJ-XXXXin order to fetch the previous page of the list.Example:
"OBJ-PREV123"after:stringA cursor for use in pagination.
afteris an object ID that defines your place in the list. For instance, if you make a list request and receive 30 objects, ending withOBJ-XXXX, your subsequent call can includeafter=OBJ-XXXXin order to fetch the next page of the list.Example:
"OBJ-NEXT456"limit:integer, default:10, minimum:1, maximum:100Determines the number of objects that will be returned on each page. Defaults to 10 if not specified and has a maximum limit of 100 objects per page.
Example:
25
Responses
200 200
Content type: application/json
Generated example:
{
"object": "list",
"data": [
{
"object": "booking_calendar",
"id": "BKC-LDJ878496X",
"host": "USR-HYPGJXN3A8",
"name": "Andrea Hartie booking calendar",
"subject": "Meeting with Andrea Hartie",
"url": "https://oncehub.com/andreahartie",
"published": true,
"duration_minutes": 30
}
],
"has_more": false
}
400 400
Content type: application/json
Example: out_of_range_limit
Out of range limit
{
"type": "invalid_request_error",
"message": "Out of range value: 500. Please provide a number between 1 and 100.",
"param": "limit"
}
Example: both_before_and_after
Both before and after provided
{
"type": "invalid_request_error",
"message": "Received both before and after parameters. Please provide only one."
}
401 401 - Unauthorized
Content type: application/json
Example: Result
{
"type": "authentication_error",
"message": "Invalid API key."
}
429 429 - Too Many Requests
Content type: application/json
Example: Result
{
"type": "rate_limit_error",
"message": "Request rate limit exceeded"
}
Get a single booking calendar
- Method:
GET - Path:
/booking-calendars/{id} - Operation ID:
get-a-single-booking-calendar - Tags: Booking Calendars
Returns a single booking calendar by ID
Servers: Inherited servers
Authentication: Global authentication
Path parameters
id(required):stringID of the booking calendar
Responses
200 200
Content type: application/json
Generated example:
{
"object": "booking_calendar",
"id": "BKC-LDJ878496X",
"host": "USR-HYPGJXN3A8",
"name": "Andrea Hartie booking calendar",
"subject": "Meeting with Andrea Hartie",
"url": "https://oncehub.com/andreahartie",
"published": true,
"duration_minutes": 30
}
401 401 - Unauthorized
Content type: application/json
Example: Result
{
"type": "authentication_error",
"message": "Invalid API key."
}
404 404
Content type: application/json
Example: Result
{
"type": "invalid_request_error",
"message": "No such booking calendar: '123'",
"param": "id"
}
429 429 - Too Many Requests
Content type: application/json
Example: Result
{
"type": "rate_limit_error",
"message": "Request rate limit exceeded"
}
Get available time slots for a booking calendar
- Method:
GET - Path:
/booking-calendars/{id}/time-slots - Operation ID:
get-available-time-slots-for-booking-calendar - Tags: Booking Calendars
Returns a list of available time slots for a booking calendar
Notes On Using This Endpoint
- All datetime strings are ISO 8601 in full form. For example,
2024-11-29T09:30:00.000Z. - All datetime strings are in UTC.
- The difference between
start_timeandend_timemust be less than or equal to 30 days.
Servers: Inherited servers
Authentication: Global authentication
Path parameters
id(required):stringID of the booking calendar
Query parameters
start_time:string, format:date-time, default:""The date and time from which to begin checking for available slots. If not provided, the system defaults to current time.
end_time:string, format:date-time, default:""The date and time up to which to check for available slots. If not provided, the system defaults to one week from
start_time.
Responses
200 200
Content type: application/json
Array of:
locations(required):arrayAvailable location options for this time slot
Items:
id(required):string | nullThe location ID:
physical: The address ID (e.g.,ADD-1234).virtual,virtual_static,guest_phone,in_person_by_guest:null.
type(required):string, possible values:"virtual", "virtual_static", "physical", "guest_phone", "in_person_by_guest"The type of location:
virtual: Online meetings with dynamic links.virtual_static: Online meetings with static links.physical: In-person meetings.guest_phone: Phone calls.in_person_by_guest: Guest provides the meeting location.
value(required):string | nullThe value returned depends on the location
type:virtual: Video conferencing platform (e.g.,google_meet,microsoft_teams,zoom,webex,gotomeeting).virtual_static:null(the actual custom link is not known in advance).physical: Actual address string (e.g., "123 Business Lane").guest_phone:null(the actual phone number is not known in advance).in_person_by_guest:null(the actual address is not known in advance).
start_time(required):string, format:date-timeThe start time of the available slot in ISO 8601 format
Example: Result
[
{
"start_time": "2024-12-02T06:30:00.000Z",
"locations": [
{
"type": "virtual",
"value": "google_meet",
"id": null
},
{
"type": "virtual_static",
"value": null,
"id": null
},
{
"type": "guest_phone",
"value": null,
"id": null
}
]
},
{
"start_time": "2024-12-05T14:30:00.000Z",
"locations": [
{
"type": "physical",
"value": "123 Business Lane, Suite 400, New York, NY",
"id": "ADD-17SE9FWWOC"
},
{
"type": "in_person_by_guest",
"value": null,
"id": null
}
]
}
]
400 400
Content type: application/json
Example: Result
{
"type": "invalid_request_error",
"message": "End time must be after the start time.",
"param": "end_time"
}
401 401 - Unauthorized
Content type: application/json
Example: Result
{
"type": "authentication_error",
"message": "Invalid API key."
}
402 402
Content type: application/json
Example: Result
{
"type": "invalid_request_error",
"message": "Time slots cannot be retrieved when the host doesn't have a seat assigned."
}
422 422
Content type: application/json
Example: Result
{
"type": "invalid_request_error",
"message": "Time slots cannot be retrieved from an unpublished booking calendar.",
"param": "id"
}
429 429 - Too Many Requests
Content type: application/json
Example: Result
{
"type": "rate_limit_error",
"message": "Request rate limit exceeded"
}
Book a time slot
- Method:
POST - Path:
/booking-calendars/{id}/schedule - Operation ID:
book-a-time-slot-for-a-booking-calendar - Tags: Booking Calendars
Book a time from the available time slots
Notes On Using This Endpoint
- This endpoint is designed to be used with the "Get available time slots" endpoint. First, retrieve available time slots for a specific time range, and then use this endpoint to book one of those slots.
- You can only select a location from those offered within the available time slots.
- All datetime strings are ISO 8601 in full form. For example,
2024-11-29T09:30:00.000Z.
Using Custom Fields
In addition to the standard fields, you can pass your own data by including custom key-value pairs within the booking_form object in the request body.
Field Name (Key): The key for each custom field must exactly match the mapped field name of the corresponding question configured in your Booking page's form settings.
Field Value: The data type of the value must match the question's type:
- For Text and Picklist (single-select) questions, provide a string.
- For Picklist (multi-select) questions, provide an array of strings.
Please note that for picklist fields, any values that do not match a pre-configured option will be ignored by the system during booking.
Servers: Inherited servers
Authentication: Global authentication
Path parameters
id(required):stringID of the booking calendar
Request body
Content type: application/json
booking_form(required)All of:
-
An object containing information about the guest
objectemail(required):stringname(required):string
-
guest_time_zone(required):stringThe guest's timezone in IANA timezone format
start_time(required):string, format:date-timeThe date and time of the time slot
location:objectThe location object is optional. If omitted, the system automatically selects an available host's pre-set location (such as
virtual,virtual_staticorphysical), prioritizingvirtualwhenever it is an available option. Note: If only a single location is available for the slot, that location will be automatically selected. To use a guest-driven location type likein_person_by_guestorguest_phone, the value must be explicitly provided.type:string, possible values:"physical", "virtual", "virtual_static", "guest_phone", "in_person_by_guest"The type of location:
physical: In-person meetings.virtual: Online meetings with dynamic links.virtual_static: Online meetings with static links.guest_phone: Phone calls.in_person_by_guest: Guest provides the meeting location.
value:string | nullThe value to provide depends on the location
type:physical: The location's address ID (e.g.,ADD-1234).virtual: One of the following:google_meet,microsoft_teams,gotomeeting,webex, orzoom.virtual_static: Usenull.guest_phone: The guest's phone number in E164 format.in_person_by_guest: The address provided by the guest.
Generated example:
{
"start_time": "",
"guest_time_zone": "",
"booking_form": {
"name": "",
"email": "",
"phone": "+12025550195",
"string_custom_field": "Executive Assistant",
"array_custom_field": [
"Marketing",
"Sales"
]
},
"location": {
"type": "physical",
"value": null
}
}
Responses
200 200
Content type: application/json
id:string
Example: Result
{
"id": "BKNG-J4FR05BKEWEX"
}
400 400
Content type: application/json
Example: Required fields missing
{
"type": "invalid_request_error",
"message": "Required fields are missing.",
"param": "booking_form"
}
Example: Time slot unavailable
{
"type": "invalid_request_error",
"message": "The selected start time is not available.",
"param": "start_time"
}
401 401 - Unauthorized
Content type: application/json
Example: Result
{
"type": "authentication_error",
"message": "Invalid API key."
}
402 402
Content type: application/json
Example: Result
{
"type": "invalid_request_error",
"message": "Meeting cannot be scheduled when the host doesn't have a seat assigned."
}
422 422
Content type: application/json
Example: Result
{
"type": "invalid_request_error",
"message": "Meeting cannot be scheduled on an unpublished booking calendar.",
"param": "id"
}
429 429 - Too Many Requests
Content type: application/json
Example: Result
{
"type": "rate_limit_error",
"message": "Request rate limit exceeded"
}
Create a one-time link
- Method:
POST - Path:
/booking-calendars/{id}/one-time-links - Operation ID:
booking-calendars-create-a-one-time-link - Tags: Booking Calendars
Creates a one time link for a Booking Calendar.
One-time links are only available for published booking calendars.
One-time links that haven't been consumed will be automatically deleted after 90 days.
Servers: Inherited servers
Authentication: Global authentication
Path parameters
id(required):stringID of the booking calendar
Request body
Content type: application/json
booking_form: BookingFormAn object containing information about the guest
booking_settings:objectSettings for the booking calendar when the one-time link is used.
co_hosts:stringA comma-separated list of email addresses for co-hosts to be added to the booking. All co-hosts must share the same OnceHub account, possess an active license, and must not be deleted. Multiple email addresses should be separated strictly by commas (e.g.,
cohost1@example.com,cohost2@example.com).duration_minutes:integerThe meeting duration in minutes. Must be one of the durations configured in the booking calendar settings. When set, the guest cannot change the duration.
host:stringThe email of the team member who should host the booking. Only supported on team booking calendars. If the host is not a part of the team or doesn't have a license, the host is ignored and the distribution method continues as configured.
skip:array of stringList of booking flow steps to skip (e.g., contact_info, questions, co_hosts).
hide_url_params:boolean, default:trueWhen set to
true, the API generates a short one-time-use link with no visible query parameters.utm_params: UtmParamsObject containing captured values for the 5 standard UTM parameters.
Example:
{
"booking_form": {
"name": "Carrie Customer",
"email": "carrie.customer@example.com"
},
"utm_params": {
"source": "facebook",
"medium": "social",
"campaign": "webinar_signup",
"term": "onlinemeeting+scheduler",
"content": "logolink"
},
"booking_settings": {
"host": "teamlead@example.com",
"co_hosts": "cohost3@example.com,cohost4@example.com",
"duration_minutes": 30,
"skip": [
"contact_info"
]
}
}
Responses
200 200
Content type: application/json
creation_time:stringid:stringurl:string
Example: Result
{
"id": "QUHVEKLPD93M",
"url": "https://oncehub.com/.QUHVEKLPD93M",
"creation_time": "2024-06-18T14:28:19Z"
}
400 400
Content type: application/json
Example: Result
{
"type": "invalid_request_error",
"message": "This booking calendar does not allow creation of one time links: 'BKC-1234'",
"param": "id"
}
401 401 - Unauthorized
Content type: application/json
Example: Result
{
"type": "authentication_error",
"message": "Invalid API key."
}
404 404
Content type: application/json
Example: Result
{
"type": "invalid_request_error",
"message": "No such booking calendar: '123'",
"param": "id"
}
429 429 - Too Many Requests
Content type: application/json
Example: Result
{
"type": "rate_limit_error",
"message": "Request rate limit exceeded"
}
List all SMS notifications
- Method:
GET - Path:
/notifications/sms - Operation ID:
list-all-sms-notifications - Tags: Notifications
Returns a list of SMS notifications sent from your account, sorted by creation date. You can filter by recipient, recipient type, and creation time.
The recipient field can be expanded to include full contact or user details.
Servers: Inherited servers
Authentication: Global authentication
Query parameters
creation_time.gt:string, format:date-timeReturn SMS notifications created after this date
Example:
"2025-11-01T00:00:00Z"creation_time.lt:string, format:date-timeReturn SMS notifications created before this date
Example:
"2025-12-01T00:00:00Z"recipient:stringFilter by specific recipient ID (contact or user ID).
Example:
"CTC-555444333"recipient_type:string, possible values:"contact", "user"Filter by recipient type. Valid values are
contactoruser.Example:
"contact"before:stringA cursor for use in pagination.
beforeis an object ID that defines your place in the list. For instance, if you make a list request and receive 30 objects, starting withOBJ-XXXX, your subsequent call can includebefore=OBJ-XXXXin order to fetch the previous page of the list.Example:
"OBJ-PREV123"after:stringA cursor for use in pagination.
afteris an object ID that defines your place in the list. For instance, if you make a list request and receive 30 objects, ending withOBJ-XXXX, your subsequent call can includeafter=OBJ-XXXXin order to fetch the next page of the list.Example:
"OBJ-NEXT456"limit:integer, default:10, minimum:1, maximum:100Determines the number of objects that will be returned on each page. Defaults to 10 if not specified and has a maximum limit of 100 objects per page.
Example:
25expand:stringA comma-separated list of fields to expand. Currently supports:
recipient.Example:
"recipient"
Responses
200 200
Content type: application/json
Generated example:
{
"object": "list",
"data": [
{
"object": "notification",
"id": "SMS-8X92M293",
"type": "sms",
"status": "delivered",
"creation_time": "2025-11-25T14:30:00Z",
"recipient": "CTC-555444333",
"recipient_type": "contact",
"details": {
"delivered_to": "+12025550195",
"message_body": "Hi Carrie, see you at 3PM!",
"segment_count": 1
}
}
]
}
400 400
Content type: application/json
Example: invalid_recipient_type
Invalid recipient type
{
"type": "invalid_request_error",
"message": "Invalid string: customer",
"param": "recipient_type"
}
Example: invalid_date_range
Invalid creation_time date range
{
"type": "invalid_request_error",
"message": "creation_time.gt cannot be later than creation_time.lt",
"param": "creation_time.gt"
}
Example: invalid_expansion
Invalid expansion property
{
"type": "invalid_request_error",
"message": "This property cannot be expanded: invalid_property",
"param": "expand"
}
Example: out_of_range_limit
Out of range limit
{
"type": "invalid_request_error",
"message": "Out of range value: 500. Please provide a number between 1 and 100.",
"param": "limit"
}
Example: both_before_and_after
Both before and after provided
{
"type": "invalid_request_error",
"message": "Received both before and after parameters. Please provide only one."
}
401 401 - Unauthorized
Content type: application/json
Example: Result
{
"type": "authentication_error",
"message": "Invalid API key."
}
403 403 - Forbidden
Content type: application/json
Example: Result
{
"type": "authentication_error",
"message": "Your account plan does not support API access. To use the OnceHub API, you must upgrade to the Enterprise plan."
}
429 429 - Too Many Requests
Content type: application/json
Example: Result
{
"type": "rate_limit_error",
"message": "Request rate limit exceeded"
}
List all users
- Method:
GET - Path:
/users - Operation ID:
list-all-users - Tags: Users
Returns a list of all users in your account
Servers: Inherited servers
Authentication: Global authentication
Query parameters
email:string, format:emailFilter by email address
Example:
"user@example.com"before:stringA cursor for use in pagination.
beforeis an object ID that defines your place in the list. For instance, if you make a list request and receive 30 objects, starting withOBJ-XXXX, your subsequent call can includebefore=OBJ-XXXXin order to fetch the previous page of the list.Example:
"OBJ-PREV123"after:stringA cursor for use in pagination.
afteris an object ID that defines your place in the list. For instance, if you make a list request and receive 30 objects, ending withOBJ-XXXX, your subsequent call can includeafter=OBJ-XXXXin order to fetch the next page of the list.Example:
"OBJ-NEXT456"limit:integer, default:10, minimum:1, maximum:100Determines the number of objects that will be returned on each page. Defaults to 10 if not specified and has a maximum limit of 100 objects per page.
Example:
25
Responses
200 200
Content type: application/json
Generated example:
{
"object": "list",
"data": [
{
"object": "user",
"id": "USR-FSD423423",
"first_name": "Andrea",
"last_name": "Hartie",
"email": "AndreaHartie@example.com",
"status": "active",
"role_name": "Member",
"timezone": "America/Chicago",
"teams": [
"TM-GCJU8DLBTPY1"
]
}
],
"has_more": false
}
400 400
Content type: application/json
Example: out_of_range_limit
Out of range limit
{
"type": "invalid_request_error",
"message": "Out of range value: 500. Please provide a number between 1 and 100.",
"param": "limit"
}
Example: both_before_and_after
Both before and after provided
{
"type": "invalid_request_error",
"message": "Received both before and after parameters. Please provide only one."
}
401 401 - Unauthorized
Content type: application/json
Example: Result
{
"type": "authentication_error",
"message": "Invalid API key."
}
429 429 - Too Many Requests
Content type: application/json
Example: Result
{
"type": "rate_limit_error",
"message": "Request rate limit exceeded"
}
Add a new user
- Method:
POST - Path:
/users - Operation ID:
add-a-new-user - Tags: Users
Add or invite a new user to your OnceHub account
Notes On Using This Endpoint
- The user will be added with Member role by default if no role is specified
- An invitation email will be sent to the user
- User limits apply based on your account plan (500 for purchased accounts, 30 for trial accounts)
- The Account Owner role cannot be assigned through the API
Servers: Inherited servers
Authentication: Global authentication
Request body
Required: true
Content type: application/json
email(required):string, format:emailEmail address of the new user
first_name(required):stringFirst name of the new user
last_name(required):stringLast name of the new user
role_name:string, possible values:"Administrator", "Member", "Team Manager"The role to assign to the user. Valid values are
Administrator,Member, orTeam Manager. Defaults toMemberif not specified.teams:array of stringArray of team external IDs to add the user to. Each team ID must exist in the account.
Generated example:
{
"email": "carrie.customer@gmail.com",
"first_name": "Carrie",
"last_name": "Customer",
"role_name": "Administrator",
"teams": [
"TM-GCJU8DLBTPY1",
"TM-ABC123DEF456"
]
}
Responses
200 200
Content type: application/json
Example: Result
{
"id": "USR-FSD423423",
"object": "user",
"first_name": "Carrie",
"last_name": "Customer",
"email": "carrie.customer@gmail.com",
"status": "active",
"role_name": "Administrator",
"timezone": "America/Chicago",
"teams": [
"TM-GCJU8DLBTPY1"
]
}
400 400
Content type: application/json
Example: Required fields missing
{
"type": "invalid_request_error",
"message": "Required fields are missing.",
"param": "email"
}
Example: Invalid first name
{
"type": "invalid_request_error",
"message": "Invalid first_name: 'fir[/*st_na*/]?me'",
"param": "first_name"
}
Example: Invalid last name
{
"type": "invalid_request_error",
"message": "Invalid last_name: 'la[/*st_na*/]?me'",
"param": "last_name"
}
Example: Unsupported fields
{
"type": "invalid_request_error",
"message": "Unsupported fields",
"param": "{param_name}"
}
Example: Email already exists
{
"type": "invalid_request_error",
"message": "Email already exists: 'carrie.customer@gmail.com'",
"param": "email"
}
Example: Invalid role name
{
"type": "invalid_request_error",
"message": "Invalid role name: 'Super Admin'",
"param": "role_name"
}
Example: Invalid teams
{
"type": "invalid_request_error",
"message": "Invalid team(s): 'TM-INVALID1', 'TM-INVALID2'",
"param": "teams"
}
401 401 - Unauthorized
Content type: application/json
Example: Result
{
"type": "authentication_error",
"message": "Invalid API key."
}
422 422
Content type: application/json
Example: User limit exceeded
{
"type": "invalid_request_error",
"message": "You have reached the user limit for your current plan. To add more users, please upgrade your account."
}
429 429 - Too Many Requests
Content type: application/json
Example: Result
{
"type": "rate_limit_error",
"message": "Request rate limit exceeded"
}
500 500
Content type: application/json
Example: Internal server error
{
"type": "api_error",
"message": "An unexpected error occurred. Please try again later."
}
Get a single user
- Method:
GET - Path:
/users/{id} - Operation ID:
get-a-single-user - Tags: Users
Returns a single user by ID
Servers: Inherited servers
Authentication: Global authentication
Path parameters
id(required):stringID of the user
Responses
200 200
Content type: application/json
Generated example:
{
"object": "user",
"id": "USR-FSD423423",
"first_name": "Andrea",
"last_name": "Hartie",
"email": "AndreaHartie@example.com",
"status": "active",
"role_name": "Member",
"timezone": "America/Chicago",
"teams": [
"TM-GCJU8DLBTPY1"
]
}
401 401 - Unauthorized
Content type: application/json
Example: Result
{
"type": "authentication_error",
"message": "Invalid API key."
}
404 404
Content type: application/json
Example: Result
{
"type": "invalid_request_error",
"message": "No such user: '123'",
"param": "id"
}
429 429 - Too Many Requests
Content type: application/json
Example: Result
{
"type": "rate_limit_error",
"message": "Request rate limit exceeded"
}
Update a user
- Method:
PATCH - Path:
/users/{id} - Operation ID:
update-a-user - Tags: Users
Update an existing user's information in your OnceHub account
Notes On Using This Endpoint
- At least one field must be provided to update
- The Account Owner role cannot be assigned or updated through the APIs
Servers: Inherited servers
Authentication: Global authentication
Path parameters
id(required):stringID of the user to update
Request body
Required: true
Content type: application/json
first_name:stringUser's first name
last_name:stringUser's last name
role_name:string, possible values:"Administrator", "Member", "Team Manager"The role to assign to the user. Valid values are
Administrator,Member, orTeam Manager.teams:array of stringArray of team external IDs to assign the user to. This will replace existing team assignments.
Example: Update name and role
{
"first_name": "Andrea",
"last_name": "Hartie",
"role_name": "Administrator"
}
Example: Update teams only
{
"teams": [
"TM-GCJU8DLBTPY1"
]
}
Responses
200 200
Content type: application/json
Example: Result
{
"id": "USR-FSD423423",
"object": "user",
"first_name": "Andrea",
"last_name": "Hartie",
"email": "AndreaHartie@example.com",
"status": "active",
"role_name": "Administrator",
"timezone": "America/Chicago",
"teams": [
"TM-GCJU8DLBTPY1"
]
}
400 400
Content type: application/json
Example: No fields provided
{
"type": "invalid_request_error",
"message": "At least one field must be provided to update.",
"param": "body"
}
Example: Invalid first name
{
"type": "invalid_request_error",
"message": "Invalid first name: ''",
"param": "first_name"
}
Example: Invalid role name
{
"type": "invalid_request_error",
"message": "Invalid role name: 'InvalidRole'",
"param": "role_name"
}
Example: Account Owner role not allowed
{
"type": "invalid_request_error",
"message": "The 'Account Owner' role cannot be assigned directly via the API.",
"param": "role_name"
}
Example: Invalid teams format
{
"type": "invalid_request_error",
"message": "Must be an array of strings.",
"param": "teams"
}
Example: Invalid team IDs
{
"type": "invalid_request_error",
"message": "Invalid team(s): 'TM-INVALID1', 'TM-INVALID2'",
"param": "teams"
}
Example: Unsupported field
{
"type": "invalid_request_error",
"message": "Unsupported field",
"param": "{param_name}"
}
401 401 - Unauthorized
Content type: application/json
Example: Result
{
"type": "authentication_error",
"message": "Invalid API key."
}
403 403
Content type: application/json
Example: Cannot update Account Owner
{
"type": "invalid_request_error",
"message": "Cannot update 'Account Owner' user."
}
404 404
Content type: application/json
Example: User not found
{
"type": "invalid_request_error",
"message": "No such user: 'USR-NOTFOUND'",
"param": "id"
}
410 410
Content type: application/json
Example: User deleted
{
"type": "invalid_request_error",
"message": "User cannot be modified as they have been deleted: 'USR-A1B2C3'",
"param": "id"
}
429 429 - Too Many Requests
Content type: application/json
Example: Result
{
"type": "rate_limit_error",
"message": "Request rate limit exceeded"
}
Delete a user
- Method:
DELETE - Path:
/users/{id} - Operation ID:
delete-a-user - Tags: Users
Deletes a single user by ID.
Servers: Inherited servers
Authentication: Global authentication
Path parameters
id(required):stringID of the user
Responses
200 200
Content type: application/json
Generated example:
{
"id": "OBJ-123ABC",
"deleted": true
}
401 401 - Unauthorized
Content type: application/json
Example: Result
{
"type": "authentication_error",
"message": "Invalid API key."
}
404 404
Content type: application/json
Example: Result
{
"type": "invalid_request_error",
"message": "No such user: '123'",
"param": "id"
}
429 429 - Too Many Requests
Content type: application/json
Example: Result
{
"type": "rate_limit_error",
"message": "Request rate limit exceeded"
}
Get scheduling availability
- Method:
GET - Path:
/users/{id}/scheduling-availability - Operation ID:
get_user_scheduling_availability - Tags: Users
Returns the scheduling availability for a user
Servers: Inherited servers
Authentication: Global authentication
Path parameters
id(required):stringID of the user
Responses
200
Content type: application/json
Example: Result
Result
{
"object": "schedule",
"timezone": "America/Chicago",
"weekly": [
{
"day": "Monday",
"working_hours": [
{
"start_time": "09:00",
"end_time": "12:00",
"locations": [
{
"type": "online_dynamic_link",
"value": "google_meet",
"id": null
}
]
},
{
"start_time": "13:00",
"end_time": "17:00",
"locations": [
{
"type": "online_dynamic_link",
"value": "zoom",
"id": null
},
{
"type": "in_person_by_host",
"value": "123 Office Street, New York, NY",
"id": "ADD-K8E9X"
},
{
"type": "in_person_by_guest",
"value": null,
"id": null
}
]
}
]
},
{
"day": "Wednesday",
"working_hours": [
{
"start_time": "10:00",
"end_time": "15:00",
"locations": [
{
"type": "online_static_link",
"value": "https://meet.example.com/team-meeting",
"id": null
}
]
}
]
}
],
"overrides": [
{
"date": "2025-11-27",
"day": "Thursday",
"working_hours": []
},
{
"date": "2025-12-24",
"day": "Wednesday",
"working_hours": [
{
"start_time": "09:00",
"end_time": "12:00",
"locations": [
{
"type": "online_dynamic_link",
"value": "google_meet",
"id": null
}
]
}
]
}
]
}
400 Bad Request
Content type: application/json
Example: New Example 1
{
"type": "invalid_request_error",
"message": "Received unknown parameter: start_date",
"param": "start_date"
}
Example: Result 1
Result 1
{
"type": "invalid_request_error",
"message": "Invalid date format for overrides_start_time. Expected format: YYYY-MM-DD",
"param": "overrides_start_time"
}
401 401 - Unauthorized
Content type: application/json
Example: Result
{
"type": "authentication_error",
"message": "Invalid API key."
}
429 429 - Too Many Requests
Content type: application/json
Example: Result
{
"type": "rate_limit_error",
"message": "Request rate limit exceeded"
}
Update scheduling availability
- Method:
PATCH - Path:
/users/{id}/scheduling-availability - Operation ID:
patch_user_scheduling_availability - Tags: Users
Updates the scheduling availability for a user
Servers: Inherited servers
Authentication: Global authentication
Path parameters
id(required):string
Request body
Content type: application/json
overrides:arrayAn array of objects, each defining an exception for a specific date. Any date provided will have its override schedule completely overwritten.
Items:
working_hours(required):arrayAn array of time slot objects for the specific date. To make a user unavailable for the entire date, provide an empty array (
[]). To delete an existing override for a date, set this value tonull.Items:
end_time(required):stringThe end time of an availability slot for the override date in
HH:MMformat. Must be a multiple of 15 minutes and occur after thestart_time.locations(required):arrayAn array of location objects available for the time slot on the override date. Can be empty.
Items:
type(required):stringThe type of location for the override slot. Valid options are:
in_person_by_host,in_person_by_guest,online_dynamic_link,online_static_link,phone_by_guest.id:stringThe unique identifier for a physical address. This field is required and only used when the type is
in_person_by_host.value:stringThe value depends on the location type. For
online_static_link, this is the static meeting URL. Forin_person_by_guest, this is the guest-provided meeting location. This field is required only when the type isonline_static_linkorin_person_by_host.
start_time(required):stringThe start time of an availability slot for the override date in
HH:MMformat. The time must be a multiple of 15 minutes.
date:stringThe specific date for the override in
YYYY-MM-DDformat. The date cannot be in the past. Duplicate dates are not allowed.
weekly:arrayAn array of objects, each defining the full availability for a specific day of the week. Any day provided will have its schedule completely overwritten.
Items:
day(required):stringThe day of the week (e.g., "Monday", "Tuesday"). Must be a valid, case-sensitive day name. Duplicate days are not allowed.
working_hours(required):arrayAn array of time slot objects for the day. To clear all availability for a day, provide an empty array (
[]). This field cannot benull. Time slots for a single day cannot overlap.Items:
end_time(required):stringThe end time of an availability slot in
HH:MMformat. Must be a multiple of 15 minutes and occur after the start_time.locations(required):arrayAn array of location objects available for the time slot. Can be empty. You cannot mix
online_dynamic_linkandonline_static_linktypes in the same slot.Items:
type(required):stringThe type of location. Valid options are:
in_person_by_host,in_person_by_guest,online_dynamic_link,online_static_link,phone_by_guest. Duplicate types are not allowed within the same slot.id:stringThe unique identifier for a physical address. This field is required and only used when the type is
in_person_by_host.value:stringThe value depends on the location type. For
online_static_link, this is the static meeting URL. Forin_person_by_guest, this is the guest-provided meeting location. This field is required only when the type isonline_static_linkorin_person_by_host.
start_time(required):stringThe start time of an availability slot in
HH:MMformat. The time must be a multiple of 15 minutes.
Generated example:
{
"weekly": [
{
"day": "",
"working_hours": [
{
"start_time": "",
"end_time": "",
"locations": [
{
"type": "",
"id": "",
"value": ""
}
]
}
]
}
],
"overrides": [
{
"date": "",
"working_hours": [
{
"start_time": "",
"end_time": "",
"locations": [
{
"type": "",
"id": "",
"value": ""
}
]
}
]
}
]
}
Responses
200
Content type: application/json
Example: Example
Example
{
"object": "schedule",
"timezone": "America/Chicago",
"weekly": [
{
"day": "Monday",
"working_hours": [
{
"start_time": "10:00",
"end_time": "16:00",
"locations": [
{
"type": "online_dynamic_link",
"value": "zoom",
"id": null
}
]
}
]
},
{
"day": "Wednesday",
"working_hours": [
{
"start_time": "10:00",
"end_time": "15:00",
"locations": [
{
"type": "online_static_link",
"value": "https://meet.example.com/team-meeting",
"id": null
}
]
}
]
},
{
"day": "Saturday",
"working_hours": []
}
],
"overrides": [
{
"date": "2025-12-25",
"day": "Thursday",
"working_hours": [
{
"start_time": "10:00",
"end_time": "12:00",
"locations": [
{
"type": "online_dynamic_link",
"value": "google_meet",
"id": null
},
{
"type": "in_person_by_guest",
"value": null,
"id": null
}
]
}
]
}
]
}
400 Bad Request
Content type: application/json
Example: Response
Response
{
"type": "invalid_request_error",
"message": "availability range is overlapping: '09:00-11:00'",
"param": "weekly.working_hours"
}
Example: Response 1
Response 1
{
"type": "invalid_request_error",
"message": "start time should be multiple of 15: '09:05'",
"param": "weekly.working_hours.start_time"
}
Example: Response 2
Response 2
{
"type": "invalid_request_error",
"message": "Date cannot be in the past: '2024-01-01'",
"param": "overrides.date"
}
Example: New Example
{
"type": "invalid_request_error",
"message": "Duplicate entry for day or date: 'Monday'",
"param": "weekly"
}
401 401 - Unauthorized
Content type: application/json
Example: Result
{
"type": "authentication_error",
"message": "Invalid API key."
}
422 Unprocessable Entity
Content type: application/json
Example: New Example
{
"type": "invalid_request_error",
"message": "You can set either online_dynamic_link or online_static_link",
"param": "weekly.working_hours.locations"
}
429 429 - Too Many Requests
Content type: application/json
Example: Result
{
"type": "rate_limit_error",
"message": "Request rate limit exceeded"
}
List all teams
- Method:
GET - Path:
/teams - Operation ID:
list-all-teams - Tags: Teams
Returns a list of all teams in your account
Servers: Inherited servers
Authentication: Global authentication
Query parameters
user:stringReturn all teams that the provided user is a member of.
before:stringA cursor for use in pagination.
beforeis an object ID that defines your place in the list. For instance, if you make a list request and receive 30 objects, starting withOBJ-XXXX, your subsequent call can includebefore=OBJ-XXXXin order to fetch the previous page of the list.Example:
"OBJ-PREV123"after:stringA cursor for use in pagination.
afteris an object ID that defines your place in the list. For instance, if you make a list request and receive 30 objects, ending withOBJ-XXXX, your subsequent call can includeafter=OBJ-XXXXin order to fetch the next page of the list.Example:
"OBJ-NEXT456"limit:integer, default:10, minimum:1, maximum:100Determines the number of objects that will be returned on each page. Defaults to 10 if not specified and has a maximum limit of 100 objects per page.
Example:
25
Responses
200 200
Content type: application/json
Generated example:
{
"object": "list",
"data": [
{
"object": "team",
"id": "TM-GCJU8DLBTPY1",
"name": "Sales"
}
],
"has_more": false
}
400 400
Content type: application/json
Example: out_of_range_limit
Out of range limit
{
"type": "invalid_request_error",
"message": "Out of range value: 500. Please provide a number between 1 and 100.",
"param": "limit"
}
Example: both_before_and_after
Both before and after provided
{
"type": "invalid_request_error",
"message": "Received both before and after parameters. Please provide only one."
}
401 401 - Unauthorized
Content type: application/json
Example: Result
{
"type": "authentication_error",
"message": "Invalid API key."
}
429 429 - Too Many Requests
Content type: application/json
Example: Result
{
"type": "rate_limit_error",
"message": "Request rate limit exceeded"
}
Get a single team
- Method:
GET - Path:
/teams/{id} - Operation ID:
get-a-single-team - Tags: Teams
Returns a single team by ID
Servers: Inherited servers
Authentication: Global authentication
Path parameters
id(required):stringID of the team.
Responses
200 200
Content type: application/json
Generated example:
{
"object": "team",
"id": "TM-GCJU8DLBTPY1",
"name": "Sales"
}
401 401 - Unauthorized
Content type: application/json
Example: Result
{
"type": "authentication_error",
"message": "Invalid API key."
}
404 404
Content type: application/json
Example: Result
{
"type": "invalid_request_error",
"message": "No such team: '123'",
"param": "id"
}
429 429 - Too Many Requests
Content type: application/json
Example: Result
{
"type": "rate_limit_error",
"message": "Request rate limit exceeded"
}
List all contacts
- Method:
GET - Path:
/contacts - Operation ID:
list-all-contacts - Tags: Contacts
List all contacts in your account
Servers: Inherited servers
Authentication: Global authentication
Query parameters
email:stringFilter by the contact's email address
creation_time.lt:string, format:dateReturn contacts with creation time less than the given date.
last_updated_time.gt:string, format:dateReturn contacts with last updated time greater than the given date.
last_updated_time.lt:string, format:dateReturn contacts with last updated time less than the given date.
creation_time.gt:string, format:dateReturn contacts with creation time greater than the given date.
before:stringA cursor for use in pagination.
beforeis an object ID that defines your place in the list. For instance, if you make a list request and receive 30 objects, starting withOBJ-XXXX, your subsequent call can includebefore=OBJ-XXXXin order to fetch the previous page of the list.Example:
"OBJ-PREV123"after:stringA cursor for use in pagination.
afteris an object ID that defines your place in the list. For instance, if you make a list request and receive 30 objects, ending withOBJ-XXXX, your subsequent call can includeafter=OBJ-XXXXin order to fetch the next page of the list.Example:
"OBJ-NEXT456"limit:integer, default:10, minimum:1, maximum:100Determines the number of objects that will be returned on each page. Defaults to 10 if not specified and has a maximum limit of 100 objects per page.
Example:
25
Responses
200 200
Content type: application/json
Generated example:
{
"object": "list",
"data": [
{
"object": "contact",
"id": "CTC-J4FR05BKEW",
"creation_time": "2020-03-22T09:48:48Z",
"last_updated_time": "2020-03-22T09:48:48Z",
"last_interacted_time": null,
"owner": "USR-FSD423423",
"status": "Qualified",
"city": "New York",
"company_size": "50-100",
"company": "Acme Inc",
"country": "United States",
"email": "carrie.customer@gmail.com",
"employees": 1,
"first_name": "Carrie",
"has_consent": false,
"job_title": "Executive Assistant",
"last_name": "Customer",
"mobile_phone": "+12025550195",
"phone": "+12025550100",
"post_code": "10001",
"salutation": "Ms.",
"state": "New York",
"street_address": "123 Main Street",
"terms_of_sevice": false,
"timezone": "America/New_York",
"custom_fields": []
}
],
"has_more": false
}
400 400
Content type: application/json
Example: invalid_date_range
Invalid last_updated_time date range
{
"type": "invalid_request_error",
"message": "last_updated_time.gt cannot be later than last_updated_time.lt",
"param": "last_updated_time.gt"
}
Example: out_of_range_limit
Out of range limit
{
"type": "invalid_request_error",
"message": "Out of range value: 500. Please provide a number between 1 and 100.",
"param": "limit"
}
Example: both_before_and_after
Both before and after provided
{
"type": "invalid_request_error",
"message": "Received both before and after parameters. Please provide only one."
}
401 401 - Unauthorized
Content type: application/json
Example: Result
{
"type": "authentication_error",
"message": "Invalid API key."
}
429 429 - Too Many Requests
Content type: application/json
Example: Result
{
"type": "rate_limit_error",
"message": "Request rate limit exceeded"
}
Add a new contact
- Method:
POST - Path:
/contacts - Operation ID:
add-a-new-contact - Tags: Contacts
Create a new contact in your OnceHub account
Either email or mobile_phone is required - at least one must be provided
Servers: Inherited servers
Authentication: Global authentication
Request body
Required: true
Content type: application/json
All of:
objectRequired fields:
first_name, last_name
Example: Minimal required fields
{
"email": "carrie.customer@gmail.com",
"first_name": "Carrie",
"last_name": "Customer"
}
Example: With additional fields
{
"email": "carrie.customer@gmail.com",
"mobile_phone": "+12025550195",
"first_name": "Carrie",
"last_name": "Customer",
"company": "Acme Inc",
"job_title": "Executive Assistant",
"status": "Qualified",
"city": "New York",
"state": "New York",
"country": "United States",
"timezone": "America/New_York"
}
Responses
201 201
Content type: application/json
Example: Result
{
"object": "contact",
"id": "CTC-J4FR05BKEW",
"creation_time": "2025-09-24T04:29:41.270Z",
"last_updated_time": "2025-09-24T04:29:41.270Z",
"last_interacted_time": null,
"owner": "USR-FSD423423",
"status": "Qualified",
"city": null,
"company_size": null,
"company": null,
"country": null,
"email": "carrie.customer@gmail.com",
"employees": 1,
"first_name": "Carrie",
"has_consent": false,
"job_title": null,
"last_name": "Customer",
"mobile_phone": "+12025550195",
"phone": null,
"post_code": null,
"salutation": null,
"state": null,
"street_address": null,
"terms_of_sevice": false,
"timezone": "America/New_York",
"custom_fields": []
}
400 400
Content type: application/json
Example: Required fields missing
{
"type": "invalid_request_error",
"message": "At least one of 'email' or 'mobile_phone' is required.",
"param": "email"
}
Example: First name required
{
"type": "invalid_request_error",
"message": "first_name is required",
"param": "first_name"
}
Example: Last name required
{
"type": "invalid_request_error",
"message": "last_name is required",
"param": "last_name"
}
Example: Invalid email format
{
"type": "invalid_request_error",
"message": "Invalid email format: 'john.doe@invalid'",
"param": "email"
}
Example: Invalid mobile phone
{
"type": "invalid_request_error",
"message": "Invalid phone format: '+91999999'",
"param": "mobile_phone"
}
Example: Unsupported fields
{
"type": "invalid_request_error",
"message": "Unsupported fields",
"param": "{param_name}"
}
401 401 - Unauthorized
Content type: application/json
Example: Result
{
"type": "authentication_error",
"message": "Invalid API key."
}
409 409
Content type: application/json
Example: Contact already exists with email
{
"type": "invalid_request_error",
"message": "Contact already exists: 'carrie.customer@gmail.com'",
"param": "email"
}
Example: Contact already exists with phone
{
"type": "invalid_request_error",
"message": "Contact already exists: '+12025550195'",
"param": "mobile_phone"
}
429 429 - Too Many Requests
Content type: application/json
Example: Result
{
"type": "rate_limit_error",
"message": "Request rate limit exceeded"
}
Get a single contact
- Method:
GET - Path:
/contacts/{id} - Operation ID:
get-a-single-contact - Tags: Contacts
Get a single contact
Servers: Inherited servers
Authentication: Global authentication
Path parameters
id(required):stringID of the contact
Responses
200 200
Content type: application/json
Generated example:
{
"object": "contact",
"id": "CTC-J4FR05BKEW",
"creation_time": "2020-03-22T09:48:48Z",
"last_updated_time": "2020-03-22T09:48:48Z",
"last_interacted_time": null,
"owner": "USR-FSD423423",
"status": "Qualified",
"city": "New York",
"company_size": "50-100",
"company": "Acme Inc",
"country": "United States",
"email": "carrie.customer@gmail.com",
"employees": 1,
"first_name": "Carrie",
"has_consent": false,
"job_title": "Executive Assistant",
"last_name": "Customer",
"mobile_phone": "+12025550195",
"phone": "+12025550100",
"post_code": "10001",
"salutation": "Ms.",
"state": "New York",
"street_address": "123 Main Street",
"terms_of_sevice": false,
"timezone": "America/New_York",
"custom_fields": []
}
401 401 - Unauthorized
Content type: application/json
Example: Result
{
"type": "authentication_error",
"message": "Invalid API key."
}
404 404
Content type: application/json
Example: Result
{
"type": "invalid_request_error",
"message": "No such contact: '123'",
"param": "id"
}
429 429 - Too Many Requests
Content type: application/json
Example: Result
{
"type": "rate_limit_error",
"message": "Request rate limit exceeded"
}
Update a contact
- Method:
PATCH - Path:
/contacts/{id} - Operation ID:
update-a-contact - Tags: Contacts
Update an existing contact in your OnceHub account
Notes On Using This Endpoint
- At least one field must be provided to update
- Identifier fields (email, mobile_phone) cannot be updated via this endpoint
- Only the custom fields provided will be updated - partial updates are supported
Servers: Inherited servers
Authentication: Global authentication
Path parameters
id(required):stringID of the contact to update
Request body
Required: true
Content type: application/json
city:stringCity of the contact
company:stringCompany name
company_size:stringSize of the contact's company
country:stringCountry of the contact
custom_fields:arrayCustom fields to update. Only the custom fields provided will be updated.
Items:
name:stringvalue:string | number | boolean | array | object | nullValue of the custom field
employees:integerNumber of employees
first_name:stringFirst name of the contact
has_consent:booleanWhether the contact has given consent
job_title:stringJob title of the contact
last_name:stringLast name of the contact
owner:stringThe ID of the owner of the contact
phone:stringPhone number in E.164 format
post_code:stringPostal code
salutation:stringSalutation
state:stringState or province
status:string, possible values:"Qualified", "Sales qualified", "Marketing qualified", "Disqualified"The status of the contact. Accepted values are
Qualified,Sales qualified,Marketing qualified, orDisqualified. If any other value is provided or no value is provided, the status will be set to null.street_address:stringStreet address
terms_of_sevice:booleanWhether terms of service were accepted
timezone:stringTimezone of the contact
Example: Update basic fields
{
"first_name": "Carrie",
"last_name": "Customer",
"company": "Acme Inc",
"job_title": "Senior Executive Assistant",
"timezone": "America/New_York"
}
Example: Update with custom fields
{
"first_name": "Carrie",
"company": "Acme Inc",
"custom_fields": [
{
"name": "resume",
"value": "https://example.com/updated-resume.pdf"
}
]
}
Responses
200 200
Content type: application/json
Example: Result
{
"object": "contact",
"id": "CTC-J4FR05BKEW",
"creation_time": "2025-09-24T04:29:41.270Z",
"last_updated_time": "2025-09-24T10:15:30.500Z",
"last_interacted_time": null,
"owner": "USR-FSD423423",
"status": "Qualified",
"city": "New York",
"company_size": null,
"company": "Acme Inc",
"country": "United States",
"email": "carrie.customer@gmail.com",
"employees": 1,
"first_name": "Carrie",
"has_consent": false,
"job_title": "Senior Executive Assistant",
"last_name": "Customer",
"mobile_phone": "+12025550195",
"phone": null,
"post_code": "10001",
"salutation": null,
"state": "New York",
"street_address": null,
"terms_of_sevice": false,
"timezone": "America/New_York",
"custom_fields": [
{
"name": "resume",
"value": "https://example.com/updated-resume.pdf"
}
]
}
400 400
Content type: application/json
Example: No fields provided
{
"type": "invalid_request_error",
"message": "At least one field must be provided to update.",
"param": "body"
}
Example: Identifier field error (email)
{
"type": "invalid_request_error",
"message": "Identifier fields (email, mobile_phone) cannot be updated via this endpoint",
"param": "email"
}
Example: Identifier field error (mobile_phone)
{
"type": "invalid_request_error",
"message": "Identifier fields (email, mobile_phone) cannot be updated via this endpoint",
"param": "mobile_phone"
}
Example: Invalid phone format
{
"type": "invalid_request_error",
"message": "Invalid phone format: '+91999999'",
"param": "phone"
}
Example: Invalid timezone
{
"type": "invalid_request_error",
"message": "Invalid timezone: 'Invalid/Timezone'",
"param": "timezone"
}
Example: Invalid email format
{
"type": "invalid_request_error",
"message": "Invalid email format: 'invalid-email'",
"param": "email"
}
Example: Custom field not in field library
{
"type": "invalid_request_error",
"message": "Custom field 'unknown_field' does not exist in field library",
"param": "custom_fields"
}
Example: Unsupported field
{
"type": "invalid_request_error",
"message": "Unsupported field",
"param": "{param_name}"
}
401 401 - Unauthorized
Content type: application/json
Example: Result
{
"type": "authentication_error",
"message": "Invalid API key."
}
404 404
Content type: application/json
Example: Contact not found
{
"type": "invalid_request_error",
"message": "No such contact: 'CTC-NOTFOUND'",
"param": "id"
}
429 429 - Too Many Requests
Content type: application/json
Example: Result
{
"type": "rate_limit_error",
"message": "Request rate limit exceeded"
}
500 500
Content type: application/json
Example: Internal server error
{
"type": "api_error",
"message": "An internal error occurred while processing your request"
}
Delete a contact
- Method:
DELETE - Path:
/contacts/{id} - Operation ID:
delete-a-contact - Tags: Contacts
Delete a contact
Servers: Inherited servers
Authentication: Global authentication
Path parameters
id(required):stringID of the contact
Responses
200 200
Content type: application/json
401 401 - Unauthorized
Content type: application/json
Example: Result
{
"type": "authentication_error",
"message": "Invalid API key."
}
404 404
Content type: application/json
Example: Result
{
"type": "invalid_request_error",
"message": "No such contact: '123'",
"param": "id"
}
429 429 - Too Many Requests
Content type: application/json
Example: Result
{
"type": "rate_limit_error",
"message": "Request rate limit exceeded"
}
Create a webhook
- Method:
POST - Path:
/webhooks - Operation ID:
create-a-webhook - Tags: Webhooks
Creates a webhook subscription.
Servers: Inherited servers
Authentication: Global authentication
Request body
Content type: application/json
events:array of stringAn array of Booking lifecycle events that will trigger the Webhook.
name:stringUnique name for your Webhook subscription. This name is only used by you for reference.
url:stringURL for receiving POST messages from OnceHub
Generated example:
{
"url": "",
"name": "",
"events": [
""
]
}
Responses
200 200
Content type: application/json
Generated example:
{
"object": "webhook",
"id": "WHK-7JD9LBVZTQ",
"api_version": "v2",
"name": "New booking webhook",
"url": "https://mywebsite.com/webhooks/booking",
"events": [
"booking.completed",
"booking.rescheduled"
],
"creation_time": "2020-09-06T20:57:17.467Z",
"secret": "d7686b8c83f04913929079aeae40189e"
}
401 401 - Unauthorized
Content type: application/json
Example: Result
{
"type": "authentication_error",
"message": "Invalid API key."
}
409 409
Content type: application/json
Example: Result
{
"type": "invalid_request_error",
"message": "A webhook subscription with this name already exists: 'New Bookings'",
"param": "name"
}
429 429 - Too Many Requests
Content type: application/json
Example: Result
{
"type": "rate_limit_error",
"message": "Request rate limit exceeded"
}
List all webhooks
- Method:
GET - Path:
/webhooks - Operation ID:
list-all-webhooks - Tags: Webhooks
Returns a list of your webhook subscriptions, sorted by creation date.
Servers: Inherited servers
Authentication: Global authentication
Query parameters
before:stringA cursor for use in pagination.
beforeis an object ID that defines your place in the list. For instance, if you make a list request and receive 30 objects, starting withOBJ-XXXX, your subsequent call can includebefore=OBJ-XXXXin order to fetch the previous page of the list.Example:
"OBJ-PREV123"after:stringA cursor for use in pagination.
afteris an object ID that defines your place in the list. For instance, if you make a list request and receive 30 objects, ending withOBJ-XXXX, your subsequent call can includeafter=OBJ-XXXXin order to fetch the next page of the list.Example:
"OBJ-NEXT456"limit:integer, default:10, minimum:1, maximum:100Determines the number of objects that will be returned on each page. Defaults to 10 if not specified and has a maximum limit of 100 objects per page.
Example:
25
Responses
200 200
Content type: application/json
Generated example:
{
"object": "list",
"data": [
{
"object": "webhook",
"id": "WHK-7JD9LBVZTQ",
"api_version": "v2",
"name": "New booking webhook",
"url": "https://mywebsite.com/webhooks/booking",
"events": [
"booking.completed",
"booking.rescheduled"
],
"creation_time": "2020-09-06T20:57:17.467Z",
"secret": "d7686b8c83f04913929079aeae40189e"
}
],
"has_more": false
}
400 400
Content type: application/json
Example: out_of_range_limit
Out of range limit
{
"type": "invalid_request_error",
"message": "Out of range value: 500. Please provide a number between 1 and 100.",
"param": "limit"
}
Example: both_before_and_after
Both before and after provided
{
"type": "invalid_request_error",
"message": "Received both before and after parameters. Please provide only one."
}
401 401 - Unauthorized
Content type: application/json
Example: Result
{
"type": "authentication_error",
"message": "Invalid API key."
}
429 429 - Too Many Requests
Content type: application/json
Example: Result
{
"type": "rate_limit_error",
"message": "Request rate limit exceeded"
}
Get a single webhook
- Method:
GET - Path:
/webhooks/{id} - Operation ID:
get-a-single-webhook - Tags: Webhooks
Returns a single webhook subscription by ID.
Servers: Inherited servers
Authentication: Global authentication
Path parameters
id(required):stringID of the webhook
Responses
200 200
Content type: application/json
401 401 - Unauthorized
Content type: application/json
Example: Result
{
"type": "authentication_error",
"message": "Invalid API key."
}
404 404
Content type: application/json
Example: Result
{
"type": "invalid_request_error",
"message": "No such webhook: '123'",
"param": "id"
}
429 429 - Too Many Requests
Content type: application/json
Example: Result
{
"type": "rate_limit_error",
"message": "Request rate limit exceeded"
}
Delete a webhook
- Method:
DELETE - Path:
/webhooks/{id} - Operation ID:
delete-a-webhook - Tags: Webhooks
Deletes a single webhook subscription by ID.
Servers: Inherited servers
Authentication: Global authentication
Path parameters
id(required):stringID of the webhook
Responses
200 200
Content type: application/json
401 401 - Unauthorized
Content type: application/json
Example: Result
{
"type": "authentication_error",
"message": "Invalid API key."
}
404 404
Content type: application/json
Example: Result
{
"type": "invalid_request_error",
"message": "No such webhook: '123'",
"param": "id"
}
429 429 - Too Many Requests
Content type: application/json
Example: Result
{
"type": "rate_limit_error",
"message": "Request rate limit exceeded"
}
Webhooks
Booking Scheduled Event
- Method:
POST - Webhook:
booking.scheduled - Operation ID:
webhook-booking-scheduled - Tags: Webhook Events
Triggered when:
- Customer schedules a booking
- User approves a booking requested by a Customer
Servers: Inherited servers
Authentication: Global authentication
Request body
Content type: application/json
All of:
-
Base webhook event structure sent to your webhook URL
objectdata: BookingWebhookDataThe booking object containing relevant data associated with the event
type:string, possible values:"booking.scheduled"
Generated example:
{
"id": "EVNT-KN56U3YL7C",
"object": "event",
"creation_time": "2020-03-22T09:49:12Z",
"type": "booking.scheduled",
"api_version": "v2",
"data": {
"object": "booking",
"id": "BKNG-J4FR05BKEWEX",
"tracking_id": "D36E0002",
"subject": "Live demo",
"status": "scheduled",
"in_trash": false,
"creation_time": "2020-03-22T09:48:48Z",
"starting_time": "2020-03-22T04:30:00Z",
"customer_timezone": "America/New_York",
"last_updated_time": "2020-03-22T09:48:48Z",
"duration_minutes": 60,
"virtual_conferencing": {
"join_url": "https://meet.google.com/izv-daci-fyi"
},
"location_description": "123 Office Street",
"rescheduled_booking_id": "BKNG-J4FR05BKEWEX",
"cancel_reschedule_information": null,
"attendees": [
"andrea.hartie@example.com"
],
"form_submission": {
"name": "Carrie Customer",
"email": "carrie.customer@gmail.com",
"phone": null,
"mobile_phone": "1-2025550195",
"note": "I want to discuss whether your product can work for our office.",
"company": null,
"guests": [
""
],
"custom_fields": [
{
"name": "Title",
"value": "Executive Assistant"
}
]
},
"external_calendar": {
"type": "google",
"name": "andrea.hartie@example.com",
"id": "andrea.hartie@example.com",
"event_id": "8kvu74dda8kcv0gmmlm3folrhc"
},
"ics_url": "https://oncehub.com/api/bookings/ics/62ad3bdd-a09f-dfbdffbef389-axs01j",
"booking_calendar": "BKC-03WJV0R52Z",
"cancel_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL/cancel",
"reschedule_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL",
"payment_information": {
"amount_charged": 5000,
"currency": "USD",
"transaction_id": "ch_1234567890ABCDEFGHIJ"
},
"custom_fields": [
{
"name": "discussion_points",
"value": "Need support on new product"
}
],
"owner": "USR-FSD423423",
"conversation": {
"id": "CVR-022EAEA41C",
"object": "conversation",
"creation_time": "2021-07-13T12:28:24Z",
"initiated_by": "contact",
"last_updated_time": "2021-07-13T12:33:54Z",
"last_interacted_time": "2021-07-13T12:33:54Z",
"contact": "CTC-9QEG09XXYN",
"owner": "USR-GNSBE50D6A",
"status": "closed",
"bot": "BOT-62774A40FB",
"website": "WEB-B1D45D12BB",
"audience": "AUD-123ABC456",
"answers": [
{
"id": "INT-5D22DCBE36",
"internal_label": "",
"question": "Full name",
"value": "Carrie Customer"
}
],
"bookings": [
"BKNG-3KM0HY2BF9SL"
]
},
"cancel_reschedule_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL"
}
}
Responses
200 Webhook received successfully
Booking Rescheduled Event
- Method:
POST - Webhook:
booking.rescheduled - Operation ID:
webhook-booking-rescheduled - Tags: Webhook Events
Triggered when:
- Customer reschedules a booking on the same booking calendar
- Customer reschedules a booking following a request from the User to reschedule
Servers: Inherited servers
Authentication: Global authentication
Request body
Content type: application/json
All of:
-
Base webhook event structure sent to your webhook URL
objectdata: BookingWebhookCancelDataThe booking object containing relevant data associated with the event
type:string, possible values:"booking.rescheduled"
Generated example:
{
"id": "EVNT-KN56U3YL7C",
"object": "event",
"creation_time": "2020-03-22T09:49:12Z",
"type": "booking.rescheduled",
"api_version": "v2",
"data": {
"object": "booking",
"id": "BKNG-J4FR05BKEWEX",
"tracking_id": "D36E0002",
"subject": "Live demo",
"status": "scheduled",
"in_trash": false,
"creation_time": "2020-03-22T09:48:48Z",
"starting_time": "2020-03-22T04:30:00Z",
"customer_timezone": "America/New_York",
"last_updated_time": "2020-03-22T09:48:48Z",
"duration_minutes": 60,
"virtual_conferencing": {
"join_url": "https://meet.google.com/izv-daci-fyi"
},
"location_description": "123 Office Street",
"rescheduled_booking_id": "BKNG-J4FR05BKEWEX",
"cancel_reschedule_information": {
"reason": "Change in schedule",
"actioned_by": "user",
"user_id": "USR-FSD423423"
},
"attendees": [
"andrea.hartie@example.com"
],
"form_submission": {
"name": "Carrie Customer",
"email": "carrie.customer@gmail.com",
"phone": null,
"mobile_phone": "1-2025550195",
"note": "I want to discuss whether your product can work for our office.",
"company": null,
"guests": [
""
],
"custom_fields": [
{
"name": "Title",
"value": "Executive Assistant"
}
]
},
"external_calendar": {
"type": "google",
"name": "andrea.hartie@example.com",
"id": "andrea.hartie@example.com",
"event_id": "8kvu74dda8kcv0gmmlm3folrhc"
},
"ics_url": "https://oncehub.com/api/bookings/ics/62ad3bdd-a09f-dfbdffbef389-axs01j",
"booking_calendar": "BKC-03WJV0R52Z",
"cancel_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL/cancel",
"reschedule_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL",
"payment_information": {
"amount_charged": 5000,
"currency": "USD",
"transaction_id": "ch_1234567890ABCDEFGHIJ"
},
"custom_fields": [
{
"name": "discussion_points",
"value": "Need support on new product"
}
],
"owner": "USR-FSD423423",
"conversation": {
"id": "CVR-022EAEA41C",
"object": "conversation",
"creation_time": "2021-07-13T12:28:24Z",
"initiated_by": "contact",
"last_updated_time": "2021-07-13T12:33:54Z",
"last_interacted_time": "2021-07-13T12:33:54Z",
"contact": "CTC-9QEG09XXYN",
"owner": "USR-GNSBE50D6A",
"status": "closed",
"bot": "BOT-62774A40FB",
"website": "WEB-B1D45D12BB",
"audience": "AUD-123ABC456",
"answers": [
{
"id": "INT-5D22DCBE36",
"internal_label": "",
"question": "Full name",
"value": "Carrie Customer"
}
],
"bookings": [
"BKNG-3KM0HY2BF9SL"
]
},
"cancel_reschedule_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL"
}
}
Responses
200 Webhook received successfully
Booking Reassigned Event
- Method:
POST - Webhook:
booking.reassigned - Operation ID:
webhook-booking-reassigned - Tags: Webhook Events
Triggered when a booking is reassigned to a different user.
Servers: Inherited servers
Authentication: Global authentication
Request body
Content type: application/json
All of:
-
Base webhook event structure sent to your webhook URL
objectdata: BookingWebhookDataThe booking object containing relevant data associated with the event
type:string, possible values:"booking.reassigned"
Generated example:
{
"id": "EVNT-KN56U3YL7C",
"object": "event",
"creation_time": "2020-03-22T09:49:12Z",
"type": "booking.reassigned",
"api_version": "v2",
"data": {
"object": "booking",
"id": "BKNG-J4FR05BKEWEX",
"tracking_id": "D36E0002",
"subject": "Live demo",
"status": "scheduled",
"in_trash": false,
"creation_time": "2020-03-22T09:48:48Z",
"starting_time": "2020-03-22T04:30:00Z",
"customer_timezone": "America/New_York",
"last_updated_time": "2020-03-22T09:48:48Z",
"duration_minutes": 60,
"virtual_conferencing": {
"join_url": "https://meet.google.com/izv-daci-fyi"
},
"location_description": "123 Office Street",
"rescheduled_booking_id": "BKNG-J4FR05BKEWEX",
"cancel_reschedule_information": null,
"attendees": [
"andrea.hartie@example.com"
],
"form_submission": {
"name": "Carrie Customer",
"email": "carrie.customer@gmail.com",
"phone": null,
"mobile_phone": "1-2025550195",
"note": "I want to discuss whether your product can work for our office.",
"company": null,
"guests": [
""
],
"custom_fields": [
{
"name": "Title",
"value": "Executive Assistant"
}
]
},
"external_calendar": {
"type": "google",
"name": "andrea.hartie@example.com",
"id": "andrea.hartie@example.com",
"event_id": "8kvu74dda8kcv0gmmlm3folrhc"
},
"ics_url": "https://oncehub.com/api/bookings/ics/62ad3bdd-a09f-dfbdffbef389-axs01j",
"booking_calendar": "BKC-03WJV0R52Z",
"cancel_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL/cancel",
"reschedule_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL",
"payment_information": {
"amount_charged": 5000,
"currency": "USD",
"transaction_id": "ch_1234567890ABCDEFGHIJ"
},
"custom_fields": [
{
"name": "discussion_points",
"value": "Need support on new product"
}
],
"owner": "USR-FSD423423",
"conversation": {
"id": "CVR-022EAEA41C",
"object": "conversation",
"creation_time": "2021-07-13T12:28:24Z",
"initiated_by": "contact",
"last_updated_time": "2021-07-13T12:33:54Z",
"last_interacted_time": "2021-07-13T12:33:54Z",
"contact": "CTC-9QEG09XXYN",
"owner": "USR-GNSBE50D6A",
"status": "closed",
"bot": "BOT-62774A40FB",
"website": "WEB-B1D45D12BB",
"audience": "AUD-123ABC456",
"answers": [
{
"id": "INT-5D22DCBE36",
"internal_label": "",
"question": "Full name",
"value": "Carrie Customer"
}
],
"bookings": [
"BKNG-3KM0HY2BF9SL"
]
},
"cancel_reschedule_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL"
}
}
Responses
200 Webhook received successfully
Booking Canceled Then Rescheduled Event
- Method:
POST - Webhook:
booking.canceled_then_rescheduled - Operation ID:
webhook-booking-canceled-then-rescheduled - Tags: Webhook Events
Triggered when Customer cancels a booking and then reschedules on a different booking page.
Servers: Inherited servers
Authentication: Global authentication
Request body
Content type: application/json
All of:
-
Base webhook event structure sent to your webhook URL
objectdata: BookingWebhookDataThe booking object containing relevant data associated with the event
type:string, possible values:"booking.canceled_then_rescheduled"
Generated example:
{
"id": "EVNT-KN56U3YL7C",
"object": "event",
"creation_time": "2020-03-22T09:49:12Z",
"type": "booking.canceled_then_rescheduled",
"api_version": "v2",
"data": {
"object": "booking",
"id": "BKNG-J4FR05BKEWEX",
"tracking_id": "D36E0002",
"subject": "Live demo",
"status": "scheduled",
"in_trash": false,
"creation_time": "2020-03-22T09:48:48Z",
"starting_time": "2020-03-22T04:30:00Z",
"customer_timezone": "America/New_York",
"last_updated_time": "2020-03-22T09:48:48Z",
"duration_minutes": 60,
"virtual_conferencing": {
"join_url": "https://meet.google.com/izv-daci-fyi"
},
"location_description": "123 Office Street",
"rescheduled_booking_id": "BKNG-J4FR05BKEWEX",
"cancel_reschedule_information": null,
"attendees": [
"andrea.hartie@example.com"
],
"form_submission": {
"name": "Carrie Customer",
"email": "carrie.customer@gmail.com",
"phone": null,
"mobile_phone": "1-2025550195",
"note": "I want to discuss whether your product can work for our office.",
"company": null,
"guests": [
""
],
"custom_fields": [
{
"name": "Title",
"value": "Executive Assistant"
}
]
},
"external_calendar": {
"type": "google",
"name": "andrea.hartie@example.com",
"id": "andrea.hartie@example.com",
"event_id": "8kvu74dda8kcv0gmmlm3folrhc"
},
"ics_url": "https://oncehub.com/api/bookings/ics/62ad3bdd-a09f-dfbdffbef389-axs01j",
"booking_calendar": "BKC-03WJV0R52Z",
"cancel_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL/cancel",
"reschedule_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL",
"payment_information": {
"amount_charged": 5000,
"currency": "USD",
"transaction_id": "ch_1234567890ABCDEFGHIJ"
},
"custom_fields": [
{
"name": "discussion_points",
"value": "Need support on new product"
}
],
"owner": "USR-FSD423423",
"conversation": {
"id": "CVR-022EAEA41C",
"object": "conversation",
"creation_time": "2021-07-13T12:28:24Z",
"initiated_by": "contact",
"last_updated_time": "2021-07-13T12:33:54Z",
"last_interacted_time": "2021-07-13T12:33:54Z",
"contact": "CTC-9QEG09XXYN",
"owner": "USR-GNSBE50D6A",
"status": "closed",
"bot": "BOT-62774A40FB",
"website": "WEB-B1D45D12BB",
"audience": "AUD-123ABC456",
"answers": [
{
"id": "INT-5D22DCBE36",
"internal_label": "",
"question": "Full name",
"value": "Carrie Customer"
}
],
"bookings": [
"BKNG-3KM0HY2BF9SL"
]
},
"cancel_reschedule_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL"
}
}
Responses
200 Webhook received successfully
Booking Canceled Reschedule Requested Event
- Method:
POST - Webhook:
booking.canceled_reschedule_requested - Operation ID:
webhook-booking-canceled-reschedule-requested - Tags: Webhook Events
Triggered when User cancels and sends a request to the Customer to reschedule.
Servers: Inherited servers
Authentication: Global authentication
Request body
Content type: application/json
All of:
-
Base webhook event structure sent to your webhook URL
objectdata: BookingWebhookDataThe booking object containing relevant data associated with the event
type:string, possible values:"booking.canceled_reschedule_requested"
Generated example:
{
"id": "EVNT-KN56U3YL7C",
"object": "event",
"creation_time": "2020-03-22T09:49:12Z",
"type": "booking.canceled_reschedule_requested",
"api_version": "v2",
"data": {
"object": "booking",
"id": "BKNG-J4FR05BKEWEX",
"tracking_id": "D36E0002",
"subject": "Live demo",
"status": "scheduled",
"in_trash": false,
"creation_time": "2020-03-22T09:48:48Z",
"starting_time": "2020-03-22T04:30:00Z",
"customer_timezone": "America/New_York",
"last_updated_time": "2020-03-22T09:48:48Z",
"duration_minutes": 60,
"virtual_conferencing": {
"join_url": "https://meet.google.com/izv-daci-fyi"
},
"location_description": "123 Office Street",
"rescheduled_booking_id": "BKNG-J4FR05BKEWEX",
"cancel_reschedule_information": null,
"attendees": [
"andrea.hartie@example.com"
],
"form_submission": {
"name": "Carrie Customer",
"email": "carrie.customer@gmail.com",
"phone": null,
"mobile_phone": "1-2025550195",
"note": "I want to discuss whether your product can work for our office.",
"company": null,
"guests": [
""
],
"custom_fields": [
{
"name": "Title",
"value": "Executive Assistant"
}
]
},
"external_calendar": {
"type": "google",
"name": "andrea.hartie@example.com",
"id": "andrea.hartie@example.com",
"event_id": "8kvu74dda8kcv0gmmlm3folrhc"
},
"ics_url": "https://oncehub.com/api/bookings/ics/62ad3bdd-a09f-dfbdffbef389-axs01j",
"booking_calendar": "BKC-03WJV0R52Z",
"cancel_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL/cancel",
"reschedule_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL",
"payment_information": {
"amount_charged": 5000,
"currency": "USD",
"transaction_id": "ch_1234567890ABCDEFGHIJ"
},
"custom_fields": [
{
"name": "discussion_points",
"value": "Need support on new product"
}
],
"owner": "USR-FSD423423",
"conversation": {
"id": "CVR-022EAEA41C",
"object": "conversation",
"creation_time": "2021-07-13T12:28:24Z",
"initiated_by": "contact",
"last_updated_time": "2021-07-13T12:33:54Z",
"last_interacted_time": "2021-07-13T12:33:54Z",
"contact": "CTC-9QEG09XXYN",
"owner": "USR-GNSBE50D6A",
"status": "closed",
"bot": "BOT-62774A40FB",
"website": "WEB-B1D45D12BB",
"audience": "AUD-123ABC456",
"answers": [
{
"id": "INT-5D22DCBE36",
"internal_label": "",
"question": "Full name",
"value": "Carrie Customer"
}
],
"bookings": [
"BKNG-3KM0HY2BF9SL"
]
},
"cancel_reschedule_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL"
}
}
Responses
200 Webhook received successfully
Booking Canceled Event
- Method:
POST - Webhook:
booking.canceled - Operation ID:
webhook-booking-canceled - Tags: Webhook Events
Triggered when User or Customer cancels a booking.
Servers: Inherited servers
Authentication: Global authentication
Request body
Content type: application/json
All of:
-
Base webhook event structure sent to your webhook URL
objectdata: BookingWebhookCancelDataThe booking object containing relevant data associated with the event.
type:string, possible values:"booking.canceled"
Generated example:
{
"id": "EVNT-KN56U3YL7C",
"object": "event",
"creation_time": "2020-03-22T09:49:12Z",
"type": "booking.canceled",
"api_version": "v2",
"data": {
"object": "booking",
"id": "BKNG-J4FR05BKEWEX",
"tracking_id": "D36E0002",
"subject": "Live demo",
"status": "scheduled",
"in_trash": false,
"creation_time": "2020-03-22T09:48:48Z",
"starting_time": "2020-03-22T04:30:00Z",
"customer_timezone": "America/New_York",
"last_updated_time": "2020-03-22T09:48:48Z",
"duration_minutes": 60,
"virtual_conferencing": {
"join_url": "https://meet.google.com/izv-daci-fyi"
},
"location_description": "123 Office Street",
"rescheduled_booking_id": "BKNG-J4FR05BKEWEX",
"cancel_reschedule_information": {
"reason": "Change in schedule",
"actioned_by": "user",
"user_id": "USR-FSD423423"
},
"attendees": [
"andrea.hartie@example.com"
],
"form_submission": {
"name": "Carrie Customer",
"email": "carrie.customer@gmail.com",
"phone": null,
"mobile_phone": "1-2025550195",
"note": "I want to discuss whether your product can work for our office.",
"company": null,
"guests": [
""
],
"custom_fields": [
{
"name": "Title",
"value": "Executive Assistant"
}
]
},
"external_calendar": {
"type": "google",
"name": "andrea.hartie@example.com",
"id": "andrea.hartie@example.com",
"event_id": "8kvu74dda8kcv0gmmlm3folrhc"
},
"ics_url": "https://oncehub.com/api/bookings/ics/62ad3bdd-a09f-dfbdffbef389-axs01j",
"booking_calendar": "BKC-03WJV0R52Z",
"cancel_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL/cancel",
"reschedule_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL",
"payment_information": {
"amount_charged": 5000,
"currency": "USD",
"transaction_id": "ch_1234567890ABCDEFGHIJ"
},
"custom_fields": [
{
"name": "discussion_points",
"value": "Need support on new product"
}
],
"owner": "USR-FSD423423",
"conversation": {
"id": "CVR-022EAEA41C",
"object": "conversation",
"creation_time": "2021-07-13T12:28:24Z",
"initiated_by": "contact",
"last_updated_time": "2021-07-13T12:33:54Z",
"last_interacted_time": "2021-07-13T12:33:54Z",
"contact": "CTC-9QEG09XXYN",
"owner": "USR-GNSBE50D6A",
"status": "closed",
"bot": "BOT-62774A40FB",
"website": "WEB-B1D45D12BB",
"audience": "AUD-123ABC456",
"answers": [
{
"id": "INT-5D22DCBE36",
"internal_label": "",
"question": "Full name",
"value": "Carrie Customer"
}
],
"bookings": [
"BKNG-3KM0HY2BF9SL"
]
},
"cancel_reschedule_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL"
}
}
Responses
200 Webhook received successfully
Booking Completed Event
- Method:
POST - Webhook:
booking.completed - Operation ID:
webhook-booking-completed - Tags: Webhook Events
Triggered when booking end time has passed.
Servers: Inherited servers
Authentication: Global authentication
Request body
Content type: application/json
All of:
-
Base webhook event structure sent to your webhook URL
objectdata: BookingWebhookDataThe booking object containing relevant data associated with the event
type:string, possible values:"booking.completed"
Generated example:
{
"id": "EVNT-KN56U3YL7C",
"object": "event",
"creation_time": "2020-03-22T09:49:12Z",
"type": "booking.completed",
"api_version": "v2",
"data": {
"object": "booking",
"id": "BKNG-J4FR05BKEWEX",
"tracking_id": "D36E0002",
"subject": "Live demo",
"status": "scheduled",
"in_trash": false,
"creation_time": "2020-03-22T09:48:48Z",
"starting_time": "2020-03-22T04:30:00Z",
"customer_timezone": "America/New_York",
"last_updated_time": "2020-03-22T09:48:48Z",
"duration_minutes": 60,
"virtual_conferencing": {
"join_url": "https://meet.google.com/izv-daci-fyi"
},
"location_description": "123 Office Street",
"rescheduled_booking_id": "BKNG-J4FR05BKEWEX",
"cancel_reschedule_information": null,
"attendees": [
"andrea.hartie@example.com"
],
"form_submission": {
"name": "Carrie Customer",
"email": "carrie.customer@gmail.com",
"phone": null,
"mobile_phone": "1-2025550195",
"note": "I want to discuss whether your product can work for our office.",
"company": null,
"guests": [
""
],
"custom_fields": [
{
"name": "Title",
"value": "Executive Assistant"
}
]
},
"external_calendar": {
"type": "google",
"name": "andrea.hartie@example.com",
"id": "andrea.hartie@example.com",
"event_id": "8kvu74dda8kcv0gmmlm3folrhc"
},
"ics_url": "https://oncehub.com/api/bookings/ics/62ad3bdd-a09f-dfbdffbef389-axs01j",
"booking_calendar": "BKC-03WJV0R52Z",
"cancel_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL/cancel",
"reschedule_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL",
"payment_information": {
"amount_charged": 5000,
"currency": "USD",
"transaction_id": "ch_1234567890ABCDEFGHIJ"
},
"custom_fields": [
{
"name": "discussion_points",
"value": "Need support on new product"
}
],
"owner": "USR-FSD423423",
"conversation": {
"id": "CVR-022EAEA41C",
"object": "conversation",
"creation_time": "2021-07-13T12:28:24Z",
"initiated_by": "contact",
"last_updated_time": "2021-07-13T12:33:54Z",
"last_interacted_time": "2021-07-13T12:33:54Z",
"contact": "CTC-9QEG09XXYN",
"owner": "USR-GNSBE50D6A",
"status": "closed",
"bot": "BOT-62774A40FB",
"website": "WEB-B1D45D12BB",
"audience": "AUD-123ABC456",
"answers": [
{
"id": "INT-5D22DCBE36",
"internal_label": "",
"question": "Full name",
"value": "Carrie Customer"
}
],
"bookings": [
"BKNG-3KM0HY2BF9SL"
]
},
"cancel_reschedule_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL"
}
}
Responses
200 Webhook received successfully
Booking No-Show Event
- Method:
POST - Webhook:
booking.no_show - Operation ID:
webhook-booking-no-show - Tags: Webhook Events
Triggered when User sets the completed booking to No-show.
Servers: Inherited servers
Authentication: Global authentication
Request body
Content type: application/json
All of:
-
Base webhook event structure sent to your webhook URL
objectdata: BookingWebhookDataThe booking object containing relevant data associated with the event
type:string, possible values:"booking.no_show"
Generated example:
{
"id": "EVNT-KN56U3YL7C",
"object": "event",
"creation_time": "2020-03-22T09:49:12Z",
"type": "booking.no_show",
"api_version": "v2",
"data": {
"object": "booking",
"id": "BKNG-J4FR05BKEWEX",
"tracking_id": "D36E0002",
"subject": "Live demo",
"status": "scheduled",
"in_trash": false,
"creation_time": "2020-03-22T09:48:48Z",
"starting_time": "2020-03-22T04:30:00Z",
"customer_timezone": "America/New_York",
"last_updated_time": "2020-03-22T09:48:48Z",
"duration_minutes": 60,
"virtual_conferencing": {
"join_url": "https://meet.google.com/izv-daci-fyi"
},
"location_description": "123 Office Street",
"rescheduled_booking_id": "BKNG-J4FR05BKEWEX",
"cancel_reschedule_information": null,
"attendees": [
"andrea.hartie@example.com"
],
"form_submission": {
"name": "Carrie Customer",
"email": "carrie.customer@gmail.com",
"phone": null,
"mobile_phone": "1-2025550195",
"note": "I want to discuss whether your product can work for our office.",
"company": null,
"guests": [
""
],
"custom_fields": [
{
"name": "Title",
"value": "Executive Assistant"
}
]
},
"external_calendar": {
"type": "google",
"name": "andrea.hartie@example.com",
"id": "andrea.hartie@example.com",
"event_id": "8kvu74dda8kcv0gmmlm3folrhc"
},
"ics_url": "https://oncehub.com/api/bookings/ics/62ad3bdd-a09f-dfbdffbef389-axs01j",
"booking_calendar": "BKC-03WJV0R52Z",
"cancel_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL/cancel",
"reschedule_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL",
"payment_information": {
"amount_charged": 5000,
"currency": "USD",
"transaction_id": "ch_1234567890ABCDEFGHIJ"
},
"custom_fields": [
{
"name": "discussion_points",
"value": "Need support on new product"
}
],
"owner": "USR-FSD423423",
"conversation": {
"id": "CVR-022EAEA41C",
"object": "conversation",
"creation_time": "2021-07-13T12:28:24Z",
"initiated_by": "contact",
"last_updated_time": "2021-07-13T12:33:54Z",
"last_interacted_time": "2021-07-13T12:33:54Z",
"contact": "CTC-9QEG09XXYN",
"owner": "USR-GNSBE50D6A",
"status": "closed",
"bot": "BOT-62774A40FB",
"website": "WEB-B1D45D12BB",
"audience": "AUD-123ABC456",
"answers": [
{
"id": "INT-5D22DCBE36",
"internal_label": "",
"question": "Full name",
"value": "Carrie Customer"
}
],
"bookings": [
"BKNG-3KM0HY2BF9SL"
]
},
"cancel_reschedule_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL"
}
}
Responses
200 Webhook received successfully
Conversation Started Event
- Method:
POST - Webhook:
conversation.started - Operation ID:
webhook-conversation-started - Tags: Webhook Events
Triggered when website visitor starts interacting with a chatbot.
Servers: Inherited servers
Authentication: Global authentication
Request body
Content type: application/json
All of:
-
Base webhook event structure sent to your webhook URL
objectdata: ConversationWebhookDataThe conversation object containing relevant data associated with the event
type:string, possible values:"conversation.started"
Generated example:
{
"id": "EVNT-KN56U3YL7C",
"object": "event",
"creation_time": "2020-03-22T09:49:12Z",
"type": "conversation.started",
"api_version": "v2",
"data": {
"id": "CVR-022EAEA41C",
"object": "conversation",
"creation_time": "2021-07-13T12:28:24Z",
"initiated_by": "contact",
"last_updated_time": "2021-07-13T12:33:54Z",
"last_interacted_time": "2021-07-13T12:33:54Z",
"contact": {
"owner": "USR-FSD423423",
"status": "Qualified",
"city": "New York",
"company_size": "50-100",
"company": "Acme Inc",
"country": "United States",
"email": "carrie.customer@gmail.com",
"employees": 1,
"first_name": "Carrie",
"has_consent": false,
"job_title": "Executive Assistant",
"last_name": "Customer",
"mobile_phone": "+12025550195",
"phone": "+12025550100",
"post_code": "10001",
"salutation": "Ms.",
"state": "New York",
"street_address": "123 Main Street",
"terms_of_sevice": false,
"timezone": "America/New_York",
"custom_fields": []
},
"owner": {
"first_name": "Andrea",
"last_name": "Hartie",
"email": "AndreaHartie@example.com",
"role_name": "Member",
"timezone": "America/Chicago",
"teams": [
"TM-GCJU8DLBTPY1"
]
},
"status": "closed",
"bot": "BOT-62774A40FB",
"website": "WEB-B1D45D12BB",
"audience": "AUD-123ABC456",
"answers": [
{
"id": "INT-5D22DCBE36",
"internal_label": "",
"question": "Full name",
"value": "Carrie Customer"
}
],
"bookings": [
"BKNG-3KM0HY2BF9SL"
]
}
}
Responses
200 Webhook received successfully
Conversation Closed Event
- Method:
POST - Webhook:
conversation.closed - Operation ID:
webhook-conversation-closed - Tags: Webhook Events
Triggered when:
- Website visitor reaches the end of the conversation flow
- Website visitor starts a new conversation with a different chatbot
Servers: Inherited servers
Authentication: Global authentication
Request body
Content type: application/json
All of:
-
Base webhook event structure sent to your webhook URL
objectdata: ConversationWebhookDataThe conversation object containing relevant data associated with the event
type:string, possible values:"conversation.closed"
Generated example:
{
"id": "EVNT-KN56U3YL7C",
"object": "event",
"creation_time": "2020-03-22T09:49:12Z",
"type": "conversation.closed",
"api_version": "v2",
"data": {
"id": "CVR-022EAEA41C",
"object": "conversation",
"creation_time": "2021-07-13T12:28:24Z",
"initiated_by": "contact",
"last_updated_time": "2021-07-13T12:33:54Z",
"last_interacted_time": "2021-07-13T12:33:54Z",
"contact": {
"owner": "USR-FSD423423",
"status": "Qualified",
"city": "New York",
"company_size": "50-100",
"company": "Acme Inc",
"country": "United States",
"email": "carrie.customer@gmail.com",
"employees": 1,
"first_name": "Carrie",
"has_consent": false,
"job_title": "Executive Assistant",
"last_name": "Customer",
"mobile_phone": "+12025550195",
"phone": "+12025550100",
"post_code": "10001",
"salutation": "Ms.",
"state": "New York",
"street_address": "123 Main Street",
"terms_of_sevice": false,
"timezone": "America/New_York",
"custom_fields": []
},
"owner": {
"first_name": "Andrea",
"last_name": "Hartie",
"email": "AndreaHartie@example.com",
"role_name": "Member",
"timezone": "America/Chicago",
"teams": [
"TM-GCJU8DLBTPY1"
]
},
"status": "closed",
"bot": "BOT-62774A40FB",
"website": "WEB-B1D45D12BB",
"audience": "AUD-123ABC456",
"answers": [
{
"id": "INT-5D22DCBE36",
"internal_label": "",
"question": "Full name",
"value": "Carrie Customer"
}
],
"bookings": [
"BKNG-3KM0HY2BF9SL"
]
}
}
Responses
200 Webhook received successfully
Conversation Abandoned Event
- Method:
POST - Webhook:
conversation.abandoned - Operation ID:
webhook-conversation-abandoned - Tags: Webhook Events
Triggered when website visitor stops interacting with a bot for more than 10 minutes.
Servers: Inherited servers
Authentication: Global authentication
Request body
Content type: application/json
All of:
-
Base webhook event structure sent to your webhook URL
objectdata: ConversationWebhookDataThe conversation object containing relevant data associated with the event
type:string, possible values:"conversation.abandoned"
Generated example:
{
"id": "EVNT-KN56U3YL7C",
"object": "event",
"creation_time": "2020-03-22T09:49:12Z",
"type": "conversation.abandoned",
"api_version": "v2",
"data": {
"id": "CVR-022EAEA41C",
"object": "conversation",
"creation_time": "2021-07-13T12:28:24Z",
"initiated_by": "contact",
"last_updated_time": "2021-07-13T12:33:54Z",
"last_interacted_time": "2021-07-13T12:33:54Z",
"contact": {
"owner": "USR-FSD423423",
"status": "Qualified",
"city": "New York",
"company_size": "50-100",
"company": "Acme Inc",
"country": "United States",
"email": "carrie.customer@gmail.com",
"employees": 1,
"first_name": "Carrie",
"has_consent": false,
"job_title": "Executive Assistant",
"last_name": "Customer",
"mobile_phone": "+12025550195",
"phone": "+12025550100",
"post_code": "10001",
"salutation": "Ms.",
"state": "New York",
"street_address": "123 Main Street",
"terms_of_sevice": false,
"timezone": "America/New_York",
"custom_fields": []
},
"owner": {
"first_name": "Andrea",
"last_name": "Hartie",
"email": "AndreaHartie@example.com",
"role_name": "Member",
"timezone": "America/Chicago",
"teams": [
"TM-GCJU8DLBTPY1"
]
},
"status": "closed",
"bot": "BOT-62774A40FB",
"website": "WEB-B1D45D12BB",
"audience": "AUD-123ABC456",
"answers": [
{
"id": "INT-5D22DCBE36",
"internal_label": "",
"question": "Full name",
"value": "Carrie Customer"
}
],
"bookings": [
"BKNG-3KM0HY2BF9SL"
]
}
}
Responses
200 Webhook received successfully
Schemas
Booking
All of:
- BookingBase
objectcontactThe ID of the contact the booking was scheduled with.
Expandable: Use
expand=contactto include the full Contact object.One of:
stringContact ID (when not expanded)
conversationThe ID of the conversation that this booking was scheduled from, null if the booking did not come from a conversation.
Expandable: Use
expand=conversationto include the full Conversation object.One of:
stringConversation ID (when not expanded)
nullNo conversation associated
ownerThe ID of the owner of the booking. This is the User who originally accepted the booking, and remains unchanged even if the booking was reassigned to a new booking page.
Expandable: Use
expand=ownerto include the full User object.One of:
stringUser ID (when not expanded)
utm_params: UtmParams |nullIf no UTM params exist on the booking, object will return null.
BookingList
Type: object
data: array of Booking, minItems:0has_more:booleanWhether there are more items available
object:string
Generated example:
{
"object": "list",
"data": [
{
"object": "booking",
"id": "BKNG-J4FR05BKEWEX",
"tracking_id": "D36E0002",
"subject": "Live demo",
"status": "scheduled",
"in_trash": false,
"creation_time": "2020-03-22T09:48:48Z",
"starting_time": "2020-03-22T04:30:00Z",
"customer_timezone": "America/New_York",
"last_updated_time": "2020-03-22T09:48:48Z",
"duration_minutes": 60,
"virtual_conferencing": {
"join_url": "https://meet.google.com/izv-daci-fyi"
},
"location_description": "123 Office Street",
"rescheduled_booking_id": "BKNG-J4FR05BKEWEX",
"cancel_reschedule_information": null,
"attendees": [
"andrea.hartie@example.com"
],
"form_submission": {
"name": "Carrie Customer",
"email": "carrie.customer@gmail.com",
"phone": null,
"mobile_phone": "1-2025550195",
"note": "I want to discuss whether your product can work for our office.",
"company": null,
"guests": [
""
],
"custom_fields": [
{
"name": "Title",
"value": "Executive Assistant"
}
]
},
"external_calendar": {
"type": "google",
"name": "andrea.hartie@example.com",
"id": "andrea.hartie@example.com",
"event_id": "8kvu74dda8kcv0gmmlm3folrhc"
},
"ics_url": "https://oncehub.com/api/bookings/ics/62ad3bdd-a09f-dfbdffbef389-axs01j",
"booking_calendar": "BKC-03WJV0R52Z",
"cancel_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL/cancel",
"reschedule_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL",
"payment_information": {
"amount_charged": 5000,
"currency": "USD",
"transaction_id": "ch_1234567890ABCDEFGHIJ"
},
"custom_fields": [
{
"name": "discussion_points",
"value": "Need support on new product"
}
],
"owner": "USR-FSD423423",
"conversation": "CVR-ZLS0AG3YXZTH",
"utm_params": {
"source": "facebook",
"medium": "social",
"campaign": "webinar_signup",
"term": "online+meeting+scheduler",
"content": "logolink"
},
"contact": "CTC-262WER5NR9CG38"
}
],
"has_more": false
}
Contact
Type: object
city:string | nullCity of the contact
company:string | nullCompany name
company_size:string | nullSize of the contact's company
country:string | nullCountry of the contact
creation_time:string, format:date-time, readOnlyThe date and time when the contact was created
custom_fields:arrayCustom fields associated with the contact
Items:
name:stringvalue:string | number | boolean | array | object | nullValue of the custom field
email:stringEmail address of the contact
employees:integerNumber of employees
first_name:string | nullFirst name of the contact
has_consent:booleanWhether the contact has given consent
id:string, readOnlyUnique identifier for the contact
job_title:string | nullJob title of the contact
last_interacted_time:string | null, format:date-time, readOnlyThe date and time of the last interaction with the contact
last_name:string | nullLast name of the contact
last_updated_time:string, format:date-time, readOnlyThe date and time the contact was last updated
mobile_phone:string | nullMobile phone number in E.164 format
object:string, readOnlyString representing the object's type
owner:stringThe ID of the owner of the contact
phone:string | nullPhone number in E.164 format
post_code:string | nullPostal code
salutation:string | nullSalutation
state:string | nullState or province
status:string | null, possible values:"Qualified", "Sales qualified", "Marketing qualified", "Disqualified", nullThe status of the contact. Accepted values are
Qualified,Sales qualified,Marketing qualified, orDisqualified. If any other value is provided or no value is provided, the status will be set to null.street_address:string | nullStreet address
terms_of_sevice:booleanWhether terms of service were accepted
timezone:stringTimezone of the contact
Generated example:
{
"object": "contact",
"id": "CTC-J4FR05BKEW",
"creation_time": "2020-03-22T09:48:48Z",
"last_updated_time": "2020-03-22T09:48:48Z",
"last_interacted_time": null,
"owner": "USR-FSD423423",
"status": "Qualified",
"city": "New York",
"company_size": "50-100",
"company": "Acme Inc",
"country": "United States",
"email": "carrie.customer@gmail.com",
"employees": 1,
"first_name": "Carrie",
"has_consent": false,
"job_title": "Executive Assistant",
"last_name": "Customer",
"mobile_phone": "+12025550195",
"phone": "+12025550100",
"post_code": "10001",
"salutation": "Ms.",
"state": "New York",
"street_address": "123 Main Street",
"terms_of_sevice": false,
"timezone": "America/New_York",
"custom_fields": []
}
ContactList
Type: object
data: array of Contact, minItems:0has_more:booleanWhether there are more items available
object:string
Generated example:
{
"object": "list",
"data": [
{
"object": "contact",
"id": "CTC-J4FR05BKEW",
"creation_time": "2020-03-22T09:48:48Z",
"last_updated_time": "2020-03-22T09:48:48Z",
"last_interacted_time": null,
"owner": "USR-FSD423423",
"status": "Qualified",
"city": "New York",
"company_size": "50-100",
"company": "Acme Inc",
"country": "United States",
"email": "carrie.customer@gmail.com",
"employees": 1,
"first_name": "Carrie",
"has_consent": false,
"job_title": "Executive Assistant",
"last_name": "Customer",
"mobile_phone": "+12025550195",
"phone": "+12025550100",
"post_code": "10001",
"salutation": "Ms.",
"state": "New York",
"street_address": "123 Main Street",
"terms_of_sevice": false,
"timezone": "America/New_York",
"custom_fields": []
}
],
"has_more": false
}
BookingPage
Type: object
active:booleanTrue if this booking page is enabled and accepts bookings
id:stringUnique identifier for the object
label:stringThe internal label of the booking page
name:stringThe customer-facing name of the booking page
object:stringString representing the object's type
timezone:stringThe Booking page timezone. Displayed in IANA timezone format.
url:string, format:uriThe URL of the booking page
Generated example:
{
"object": "booking_page",
"id": "BP-3F7JAWT4UA",
"name": "Andrea Hartie",
"label": "AndreaHartie",
"url": "https://go.oncehub.com/andreahartie",
"active": true,
"timezone": "America/Chicago"
}
BookingPageList
Type: object
data: array of BookingPage, minItems:0has_more:booleanWhether there are more items available
object:string
Generated example:
{
"object": "list",
"data": [
{
"object": "booking_page",
"id": "BP-3F7JAWT4UA",
"name": "Andrea Hartie",
"label": "AndreaHartie",
"url": "https://go.oncehub.com/andreahartie",
"active": true,
"timezone": "America/Chicago"
}
],
"has_more": false
}
Team
Type: object
id:stringUnique identifier for the team
name:stringThe name of the team
object:stringString representing the object's type
Generated example:
{
"object": "team",
"id": "TM-GCJU8DLBTPY1",
"name": "Sales"
}
TeamList
Type: object
data: array of Team, minItems:0has_more:booleanWhether there are more items available
object:string
Generated example:
{
"object": "list",
"data": [
{
"object": "team",
"id": "TM-GCJU8DLBTPY1",
"name": "Sales"
}
],
"has_more": false
}
EventType
Type: object
description:stringThe description of the event type
id:stringUnique identifier for the event type
name:stringThe name of the event type
object:stringString representing the object's type
Generated example:
{
"object": "event_type",
"id": "ET-7I7PKDTFJS",
"name": "Live demo",
"description": "Schedule a live demo with us for an in-depth look at our enterprise solutions."
}
EventTypeList
Type: object
data: array of EventType, minItems:0has_more:booleanWhether there are more items available
object:string
Generated example:
{
"object": "list",
"data": [
{
"object": "event_type",
"id": "ET-7I7PKDTFJS",
"name": "Live demo",
"description": "Schedule a live demo with us for an in-depth look at our enterprise solutions."
}
],
"has_more": false
}
Webhook
Type: object
api_version:stringThe API version used for the webhook
creation_time:stringThe time when the webhook was created
events:array of stringBooking lifecycle events that trigger the webhook
id:stringUnique identifier for the webhook
name:stringUnique name for your webhook subscription
object:stringString representing the object's type
secret:stringSecret key for webhook signature verification
url:stringURL for receiving POST messages from OnceHub
Generated example:
{
"object": "webhook",
"id": "WHK-7JD9LBVZTQ",
"api_version": "v2",
"name": "New booking webhook",
"url": "https://mywebsite.com/webhooks/booking",
"events": [
"booking.completed",
"booking.rescheduled"
],
"creation_time": "2020-09-06T20:57:17.467Z",
"secret": "d7686b8c83f04913929079aeae40189e"
}
WebhookList
Type: object
data: array of Webhook, minItems:0has_more:booleanWhether there are more items available
object:string
Generated example:
{
"object": "list",
"data": [
{
"object": "webhook",
"id": "WHK-7JD9LBVZTQ",
"api_version": "v2",
"name": "New booking webhook",
"url": "https://mywebsite.com/webhooks/booking",
"events": [
"booking.completed",
"booking.rescheduled"
],
"creation_time": "2020-09-06T20:57:17.467Z",
"secret": "d7686b8c83f04913929079aeae40189e"
}
],
"has_more": false
}
WebhookEvent
Type: object
Base webhook event structure sent to your webhook URL
api_version(required):stringThe OnceHub API version used to render the data object
creation_time(required):string, format:date-timeThe time the event object was created
id(required):stringUnique alphanumeric identifier for the event object
object(required):stringString representing the object's type
type(required):stringThe type of the event (e.g., booking.scheduled, conversation.started)
Generated example:
{
"id": "EVNT-KN56U3YL7C",
"object": "event",
"creation_time": "2020-03-22T09:49:12Z",
"type": "booking.scheduled",
"api_version": "v2"
}
BookingWebhookData
All of:
objectBooking object as sent in webhook events.
Important differences from REST API:
- The
contactfield is NOT included in the webhook payload. - The
conversationfield is ALWAYS expanded to the full Conversation object. - The
cancel_reschedule_urlfield is included. - The
utm_paramsfield is NOT included in webhook payloads.
cancel_reschedule_url:stringURL for cancelling and rescheduling the booking
conversation: Conversation |nullThe conversation object if booking came from a conversation
owner:stringThe ID of the owner of the booking.
- The
BookingWebhookCancelData
All of:
- BookingWebhookData
objectcancel_reschedule_information:objectAn object containing information about the cancel / reschedule event.
actioned_by:string, possible values:"user", "customer"Indicates the entity that performed the action. Valid options are user (person in your team) and customer (person who made the booking).
reason:stringThe reason given for canceling or rescheduling a meeting.
user_id:stringIf the cancel reschedule was done by the user, this field will contain their user id.
Note: When a meeting is cancelled via the API, the
user_iddepends on the booking source:- Booking Calendars: The
user_idis booking host's user ID. - Booking Pages: The
user_idis the account owner's user ID.
- Booking Calendars: The
BookingWithCancelInfo
All of:
- BookingBase
objectcancel_reschedule_information:objectAn object containing information about the cancel / reschedule event.
actioned_by:string, possible values:"user", "customer"Indicates the entity that performed the action. Valid options are user (person in your team) and customer (person who made the booking).
reason:stringThe reason given for canceling or rescheduling a meeting.
user_id:stringIf the cancel reschedule was done by the user, this field will contain their user id.
Note: When a meeting is cancelled via the API, the
user_iddepends on the booking source:- Booking Calendars: The
user_idis booking host's user ID. - Booking Pages: The
user_idis the account owner's user ID.
- Booking Calendars: The
ConversationWebhookData
All of:
objectConversation object as sent in webhook events.
Important differences from REST API:
- The
contactfield is always expanded to the full Contact object - The
ownerfield is always expanded to the full User object - The
botfield is always expanded to the full Bot object - The
websitefield is always expanded to the full Website object
- The
BookingCalendar
Type: object
duration_minutes:numberMeeting duration in minutes.
host:stringThe user id / team id of the booking calendar meeting host. Additional attendees are not included.
id:stringUnique identifier for the object.
name:stringThe internal label / name of the booking calendar.
object:stringString representing the object's type. Objects of the same type share the same value. The type here is booking_calendar.
published:booleanTrue if this booking calendar is enabled and accepts bookings.
subject:stringThe customer-facing subject of the booking calendar.
url:string, format:uriThe URL of the booking calendar.
Generated example:
{
"object": "booking_calendar",
"id": "BKC-LDJ878496X",
"host": "USR-HYPGJXN3A8",
"name": "Andrea Hartie booking calendar",
"subject": "Meeting with Andrea Hartie",
"url": "https://oncehub.com/andreahartie",
"published": true,
"duration_minutes": 30
}
BookingCalendarList
Type: object
data: array of BookingCalendarhas_more:booleanWhether there are more items available
object:string
Generated example:
{
"object": "list",
"data": [
{
"object": "booking_calendar",
"id": "BKC-LDJ878496X",
"host": "USR-HYPGJXN3A8",
"name": "Andrea Hartie booking calendar",
"subject": "Meeting with Andrea Hartie",
"url": "https://oncehub.com/andreahartie",
"published": true,
"duration_minutes": 30
}
],
"has_more": false
}
User
Type: object
email:string, format:emailUser's email.
first_name:stringUser's first name.
id:string, readOnlyUnique identifier for the object.
last_name:stringUser's last name.
object:string, readOnlyString representing the object's type. Objects of the same type share the same value. The type here is user.
role_name:string, possible values:"Account Owner", "Administrator", "Member", "Team Manager"The name of the role associated with the user, for example - Administrator, Member, Team Manager, or Account Owner.
status:string, possible values:"active", "invited", readOnlyThe status of the user. The user can have one of the following statuses - active or invited.
teams:array of stringThe teams the user belongs to.
timezone:stringUser's timezone. Displayed in IANA timezone format
Generated example:
{
"object": "user",
"id": "USR-FSD423423",
"first_name": "Andrea",
"last_name": "Hartie",
"email": "AndreaHartie@example.com",
"status": "active",
"role_name": "Member",
"timezone": "America/Chicago",
"teams": [
"TM-GCJU8DLBTPY1"
]
}
UserList
Type: object
data: array of User, minItems:0has_more:booleanWhether there are more items available
object:string
Generated example:
{
"object": "list",
"data": [
{
"object": "user",
"id": "USR-FSD423423",
"first_name": "Andrea",
"last_name": "Hartie",
"email": "AndreaHartie@example.com",
"status": "active",
"role_name": "Member",
"timezone": "America/Chicago",
"teams": [
"TM-GCJU8DLBTPY1"
]
}
],
"has_more": false
}
SmsNotification
Type: object
creation_time(required):string, format:date-timeThe date and time when the SMS notification was created.
details(required):objectSMS-specific delivery details.
delivered_to(required):stringThe phone number where the SMS was delivered.
message_body(required):stringThe content of the SMS message that was sent.
segment_count(required):integerThe number of segments the SMS was split into. SMS messages are charged per segment.
id(required):stringUnique identifier for the object.
object(required):stringString representing the object's type. Objects of the same type share the same value.
recipient(required):string| Contact | UserThe ID of the recipient who received the SMS. Can be either a contact ID or a user ID. When expanded, this will include the full contact or user object.
recipient_type(required):string, possible values:"contact", "user"Indicates whether the recipient is a contact or a user.
status(required):string, possible values:"sent", "failed", "delivered", "rejected"The delivery status of the SMS notification.
type(required):stringThe type of notification. For SMS notifications, this is always "sms".
Generated example:
{
"object": "notification",
"id": "SMS-8X92M293",
"type": "sms",
"status": "delivered",
"creation_time": "2025-11-25T14:30:00Z",
"recipient": "CTC-555444333",
"recipient_type": "contact",
"details": {
"delivered_to": "+12025550195",
"message_body": "Hi Carrie, see you at 3PM!",
"segment_count": 1
}
}
SmsNotificationList
Type: object
data(required): array of SmsNotificationArray of SMS notification objects.
object(required):stringString representing the object's type. Always "list" for list responses.
Generated example:
{
"object": "list",
"data": [
{
"object": "notification",
"id": "SMS-8X92M293",
"type": "sms",
"status": "delivered",
"creation_time": "2025-11-25T14:30:00Z",
"recipient": "CTC-555444333",
"recipient_type": "contact",
"details": {
"delivered_to": "+12025550195",
"message_body": "Hi Carrie, see you at 3PM!",
"segment_count": 1
}
}
]
}
Error
Type: object
message(required):stringA human-readable message providing more details about the error
type(required):string, possible values:"authentication_error", "invalid_request_error", "rate_limit_error", "api_error"The type of error returned
param:stringIf the error is parameter-specific, the parameter related to the error
Generated example:
{
"type": "invalid_request_error",
"message": "No such booking: '123'",
"param": "id"
}
MasterPage
Type: object
The master page object contains the name, label and URL for master pages on your account and indicates whether the master page is enabled to receive bookings.
active:boolean, default:trueTrue if this master page is enabled and accepts bookings.
id:stringUnique identifier for the object.
label:stringThe internal label of the master page.
name:stringThe customer facing name of the master page.
object:stringString representing the object's type. Objects of the same type share the same value. The type here is master_page.
url:string, format:uriThe URL of the master page.
Generated example:
{
"object": "master_page",
"id": "MP-73E6RHFU77",
"name": "Star Software LLC",
"label": "Dana",
"url": "https://go.oncehub.com/dana",
"active": true
}
BookingBase
Type: object
attendees:array of stringList of all meeting attendees (emails).
booking_calendar:stringThe ID of the booking calendar used to make this booking.
cancel_reschedule_information:object | nullAn object containing information about the cancel / reschedule event. This field is
nullif the booking has not been cancelled or rescheduled.cancel_url:stringURL for cancelling the booking. Only sent for bookings scheduled via booking calendars.
creation_time:string, format:date-timeThe date and time when the booking was created.
custom_fields:arrayAny custom fields that have been added to the field library for the meeting object type on your account will be listed in the array of custom fields.
Items:
name:stringName of the custom field.
value:anyValue of the custom field.
customer_timezone:stringThe timezone selected by the customer when making the booking. Displayed in IANA timezone format.
duration_minutes:integerThe length of the meeting, in minutes.
external_calendar:objectObject containing information about the calendar used in the booking.
event_id:stringThe id of the booking event that was created in the external calendar.
id:stringThe ID of the external calendar to which the booking was added.
name:stringThe name of the external calendar to which the booking was added.
type:string, possible values:"google", "exchange", "office_365", "icloud"Type of calendar
form_submission:objectThe object containing information entered by the customer into the booking form. This will include any system fields and custom fields defined in your booking form.
company:string | nullThe company provided by your customer in the booking form.
custom_fields:arrayThe array containing custom Booking form fields.
Items:
name:stringvalue:anyValue of the custom field.
email:stringThe email provided by the customer in the booking form.
guests:array of stringList of additional attendees (emails) invited by the customer.
mobile_phone:stringThe mobile phone number provided by the customer in the booking form.
name:stringThe name provided by the customer in the booking form.
note:stringThe note provided by the customer in the booking form.
phone:string | nullThe phone number provided by the customer in the booking form.
ics_url:stringA direct, publicly accessible URL that downloads an ICS (.ics) calendar file for the booking.
id:stringUnique identifier for the object.
in_trash:booleanThe booking was moved to trash in the activity stream. While this value is true, the activity can still be found in the trash and has not been hard deleted yet.
last_updated_time:string, format:date-timeThe date and time the booking was last updated.
location_description:stringInformation about the physical location in case of physical meeting.
object:stringString representing the object's type. Objects of the same type share the same value.
payment_information:object | nullPayment information for the booking if payment was collected via Stripe.
amount_charged:integerThe amount charged in the smallest currency unit (e.g., cents for USD).
currency:stringISO 4217 currency code for the transaction.
transaction_id:stringStripe charge ID associated with the transaction.
reschedule_url:stringURL for rescheduling the booking. Only sent for bookings scheduled via booking calendars.
rescheduled_booking_id:stringThe ID of the booking that was rescheduled.
starting_time:string, format:date-timeThe date and time when the meeting is scheduled to start.
status:string, possible values:"requested", "scheduled", "rescheduled", "completed", "canceled", "no_show"The status of the booking event. Can be: requested, scheduled, rescheduled, completed, canceled, or no_show
subject:stringThe name of the service or subject as defined in the booking form.
tracking_id:stringA unique ID automatically assigned to every booking.
virtual_conferencing:objectThe object containing information about the video conference in case of virtual meeting.
join_url:stringThe URL to join the video conference meeting.
Generated example:
{
"object": "booking",
"id": "BKNG-J4FR05BKEWEX",
"tracking_id": "D36E0002",
"subject": "Live demo",
"status": "scheduled",
"in_trash": false,
"creation_time": "2020-03-22T09:48:48Z",
"starting_time": "2020-03-22T04:30:00Z",
"customer_timezone": "America/New_York",
"last_updated_time": "2020-03-22T09:48:48Z",
"duration_minutes": 60,
"virtual_conferencing": {
"join_url": "https://meet.google.com/izv-daci-fyi"
},
"location_description": "123 Office Street",
"rescheduled_booking_id": "BKNG-J4FR05BKEWEX",
"cancel_reschedule_information": null,
"attendees": [
"andrea.hartie@example.com"
],
"form_submission": {
"name": "Carrie Customer",
"email": "carrie.customer@gmail.com",
"phone": null,
"mobile_phone": "1-2025550195",
"note": "I want to discuss whether your product can work for our office.",
"company": null,
"guests": [
""
],
"custom_fields": [
{
"name": "Title",
"value": "Executive Assistant"
}
]
},
"external_calendar": {
"type": "google",
"name": "andrea.hartie@example.com",
"id": "andrea.hartie@example.com",
"event_id": "8kvu74dda8kcv0gmmlm3folrhc"
},
"ics_url": "https://oncehub.com/api/bookings/ics/62ad3bdd-a09f-dfbdffbef389-axs01j",
"booking_calendar": "BKC-03WJV0R52Z",
"cancel_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL/cancel",
"reschedule_url": "https://oncehub.com/m/BKNG-3KM0HY2BF9SL",
"payment_information": {
"amount_charged": 5000,
"currency": "USD",
"transaction_id": "ch_1234567890ABCDEFGHIJ"
},
"custom_fields": [
{
"name": "discussion_points",
"value": "Need support on new product"
}
]
}
Bot
Type: object
id:stringUnique alphanumeric identifier for the object. The prefix of the Bot ID is BOT-.
name:stringThe name of the bot.
object:stringString representing the object's type. Objects of the same type share the same value. The value here is bot.
Generated example:
{
"id": "BOT-62774A40FB",
"object": "bot",
"name": "Sales Assistant Bot"
}
Website
Type: object
id:stringUnique alphanumeric identifier for the object. The prefix of the Website ID is WEB-.
name:stringThe name of the website.
object:stringString representing the object's type. Objects of the same type share the same value. The value here is website.
url:string, format:uriThe URL of the website.
Generated example:
{
"id": "WEB-B1D45D12BB",
"object": "website",
"name": "Company Website",
"url": "https://www.example.com"
}
Audience
Type: object
id:stringUnique alphanumeric identifier for the object. The prefix of the Audience ID is AUD-.
name:stringThe name of the audience.
object:stringString representing the object's type. Objects of the same type share the same value. The value here is audience.
Generated example:
{
"id": "AUD-123ABC456",
"object": "audience",
"name": "Enterprise Customers"
}
Conversation
Type: object
answers:arrayAnswers to the questions asked during the conversation.
Items:
id:stringUnique identifier for the interaction.
internal_label:string | nullInternal label for the question.
question:stringThe question asked during the conversation.
value:stringThe answer provided by the contact.
audienceThe audience associated with this conversation.
Expandable: Use
expand=audienceto include the full Audience object.One of:
stringAudience ID (when not expanded)
nullNo audience associated
bookings:array of stringBookings that are associated to the conversation.
botThe bot that facilitated the conversation.
Expandable: Use
expand=botto include the full Bot object.One of:
stringBot ID (when not expanded)
contactThe contact / customer involved in this conversation.
Expandable: Use
expand=contactto include the full Contact object.One of:
stringContact ID (when not expanded)
creation_time:string, format:date-timeThe date and time the conversation was created.
id:stringUnique alphanumeric identifier for the object. The prefix of the Conversation ID is CVR-.
initiated_by:string, possible values:"bot", "contact"Either bot (auto reach out) or contact (website visitor clicked on a CTA).
last_interacted_time:string, format:date-timeThe date and time of the last conversation interaction.
last_updated_time:string, format:date-timeThe date and time the conversation was last updated.
object:stringString representing the object's type. Objects of the same type share the same value. The value here is conversation.
ownerThe owner (user object) of the conversation.
Expandable: Use
expand=ownerto include the full User object.One of:
stringUser ID (when not expanded)
status:string, possible values:"started", "closed", "abandoned"The status of the conversation. Can be one of the following:
started- The website visitor has responded with a first message and the conversation is active from this point.closed- The conversation has been closed, this can be done by the conversation ending with a last message, or the visitor starting a different conversation.abandoned- If there is no response from the visitor for more than 10 minutes the conversation is ended in an abandoned state.
websiteThe website this conversation was triggered on.
Expandable: Use
expand=websiteto include the full Website object.One of:
stringWebsite ID (when not expanded)
Generated example:
{
"id": "CVR-022EAEA41C",
"object": "conversation",
"creation_time": "2021-07-13T12:28:24Z",
"initiated_by": "contact",
"last_updated_time": "2021-07-13T12:33:54Z",
"last_interacted_time": "2021-07-13T12:33:54Z",
"contact": "CTC-9QEG09XXYN",
"owner": "USR-GNSBE50D6A",
"status": "closed",
"bot": "BOT-62774A40FB",
"website": "WEB-B1D45D12BB",
"audience": "AUD-123ABC456",
"answers": [
{
"id": "INT-5D22DCBE36",
"internal_label": "",
"question": "Full name",
"value": "Carrie Customer"
}
],
"bookings": [
"BKNG-3KM0HY2BF9SL"
]
}
UtmParams
Type: object
Object containing captured values for the 5 standard UTM parameters.
campaign:stringIdentifies a specific product promotion or strategic campaign
content:stringIdentifies what specifically was clicked to bring the user to the site
medium:stringIdentifies what type of link was used
source:stringIdentifies which site sent the traffic
term:stringIdentifies search terms
Generated example:
{
"source": "facebook",
"medium": "social",
"campaign": "webinar_signup",
"term": "online+meeting+scheduler",
"content": "logolink"
}
BookingForm
Type: object
An object containing information about the guest
array_custom_field:array of stringA placeholder for a custom field that accepts multiple values. Replace
array_custom_fieldwith the mapped_field_name of your Multi-Select Picklist question. The value must be an array of strings.email:stringEmail of the guest
name:stringName of the guest
phone:stringPhone of the guest
string_custom_field:stringA placeholder for a custom field that accepts a single text value. Replace
string_custom_fieldwith themapped_field_nameof your Text or Single-Select Picklist question.
Generated example:
{
"name": "Carrie Customer",
"email": "carrie.customer@gmail.com",
"phone": "+12025550195",
"string_custom_field": "Executive Assistant",
"array_custom_field": [
"Marketing",
"Sales"
]
}
DeletedObject
Type: object
deleted(required):booleanWhether the object was deleted
id(required):stringID of the deleted object
Generated example:
{
"id": "OBJ-123ABC",
"deleted": true
}
Tag Descriptions
Authentication
Validate API credentials and manage authentication for OnceHub API access. All API requests require an API key to be passed in the API-Key header.
Bookings
Manage booking appointments and their lifecycle. Bookings represent scheduled meetings between contacts and users. Use these endpoints to list, retrieve, and perform actions on bookings such as canceling, requesting reschedules, or marking as no-show.
Booking Calendars
Manage booking calendars and their availability. Booking calendars define available time slots for appointments and can be used to schedule meetings. Use these endpoints to list calendars, retrieve availability, schedule appointments, and create one-time booking links.
Contacts
Manage contact information and relationships. Contacts represent people who have scheduled or may schedule appointments through your booking pages. Use these endpoints to list contacts, retrieve contact details, and manage contact records.
Notifications
Notifications are messages sent by OnceHub to contacts and users through various channels such as SMS, email, or push notifications. The notifications API allows you to retrieve and monitor notification delivery status and details.
Teams
Manage teams and team memberships. Teams allow you to organize users into groups for shared calendars, permissions, and resource management. Use these endpoints to retrieve team information and manage team-related operations.
Users
Manage user accounts and their properties. Users represent team members who can schedule appointments, manage calendars, and access the OnceHub platform. Use these endpoints to list users, retrieve user details, manage user accounts, and check scheduling availability.
Webhooks
Manage webhook subscriptions to receive real-time notifications for booking lifecycle events.
Webhook Events
Event payloads sent to your webhook endpoints when booking and conversation lifecycle events occur.
These schemas define the structure of the HTTP POST requests that OnceHub sends to your configured webhook URLs. Each event includes metadata about when it occurred and a data object containing the relevant booking or conversation information.
To start receiving webhook events, create a webhook subscription with your desired event triggers.
- How to Contact Us
- Live Chat
- Email Support
- System Status