{"openapi":"3.0.0","info":{"description":"OnceHub (ScheduleOnce) Booking Calendars API v2 — bookings (list/get, cancel, request-reschedule, reassign, no-show), booking calendars (list/get, available time-slots, slot booking, one-time links), SMS notifications, users (+scheduling-availability), teams, contacts, webhook subscriptions (api.oncehub.com/v2, live 401 {\"type\":\"authentication_error\"} on every path incl. GET /test). Auth: API-Key header (account gear → Account Integrations → APIs & Webhooks; up to 25 active keys, shown once). Rate limits: 5 req/s per account, 200 req/5 min per IP (429 rate_limit_error, doc-quoted). Cursor pagination (limit max 100). Current version v2.0.0.","version":"v2"},"servers":[{"description":"OnceHub (ScheduleOnce) Booking Calendars API v2 — bookings (list/get, cancel, request-reschedule, reassign, no-show), booking calendars (list/get, available time-slots, slot booking, one-time links), SMS notifications, users (+scheduling-availability), teams, contacts, webhook subscriptions (api.oncehub.com/v2, live 401 {\"type\":\"authentication_error\"} on every path incl. GET /test). Auth: API-Key header (account gear → Account Integrations → APIs & Webhooks; up to 25 active keys, shown once). Rate limits: 5 req/s per account, 200 req/5 min per IP (429 rate_limit_error, doc-quoted). Cursor pagination (limit max 100). Current version v2.0.0.","url":"https://api.apirails.com/scheduleonce"}],"paths":{"/test":{"get":{"tags":["Authentication"],"parameters":[],"responses":{"401":{"description":"Bearer token required (Authorization header)","content":{"application/json":{}}}},"externalDocs":{"api_ref":"https://help.oncehub.com/developers/api/","api_endpoint":"https://api.oncehub.com/v2/test"},"summary":"Validate API key","description":"Validate API key — Enter your API key in the headers section below and click on \"Try it\" to test it.","security":[{"bearerAuth":[]}]}},"/booking-calendars":{"get":{"tags":["Booking Calendars"],"parameters":[{"name":"after","in":"query","description":"A cursor for use in pagination. after is an object ID that defines your place in the list. For instance, if you make a list request and receive 30 objects, ending with OBJ-XXXX, your subsequent call can include after=OBJ-XXXX in order to fetch the next page of the list.","required":false,"schema":{"type":"string","example":""}},{"name":"before","in":"query","description":"A cursor for use in pagination. before is an object ID that defines your place in the list. For instance, if you make a list request and receive 30 objects, starting with OBJ-XXXX, your subsequent call can include before=OBJ-XXXX in order to fetch the previous page of the list.","required":false,"schema":{"type":"string","example":""}},{"name":"host","in":"query","description":"Filter booking calendars hosted by this user ID or team ID","required":false,"schema":{"type":"string","example":""}},{"name":"limit","in":"query","description":"Determines 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.","required":false,"schema":{"type":"number","example":""}}],"responses":{"401":{"description":"Bearer token required (Authorization header)","content":{"application/json":{}}}},"externalDocs":{"api_ref":"https://help.oncehub.com/developers/api/","api_endpoint":"https://api.oncehub.com/v2/booking-calendars"},"summary":"List all booking calendars","description":"List all booking calendars — Returns a list of all booking calendars in your account","security":[{"bearerAuth":[]}]}},"/booking-calendars/{id}":{"get":{"tags":["Booking Calendars"],"parameters":[{"name":"id","in":"path","description":"ID of the booking calendar","required":true,"schema":{"type":"string","example":""}}],"responses":{"401":{"description":"Bearer token required (Authorization header)","content":{"application/json":{}}}},"externalDocs":{"api_ref":"https://help.oncehub.com/developers/api/","api_endpoint":"https://api.oncehub.com/v2/booking-calendars/{id}"},"summary":"Get a single booking calendar","description":"Get a single booking calendar — Returns a single booking calendar by ID","security":[{"bearerAuth":[]}]}},"/booking-calendars/{id}/one-time-links":{"post":{"tags":["Booking Calendars"],"parameters":[{"name":"id","in":"path","description":"ID of the booking calendar","required":true,"schema":{"type":"string","example":""}}],"responses":{"401":{"description":"Bearer token required (Authorization header)","content":{"application/json":{}}}},"externalDocs":{"api_ref":"https://help.oncehub.com/developers/api/","api_endpoint":"https://api.oncehub.com/v2/booking-calendars/{id}/one-time-links"},"summary":"Create a one-time link","description":"Create a one-time link — 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.","security":[{"bearerAuth":[]}],"requestBody":{"description":"","required":true,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{"booking_form":{"type":"object","description":"An object containing information about the guest","properties":{"array_custom_field":{"type":"array","description":"A placeholder for a custom field that accepts multiple values. Replace `array_custom_field` with the mapped_field_name of your Multi-Select Picklist question. The value must be an array of strings."},"email":{"type":"string","description":"Email of the guest"},"name":{"type":"string","description":"Name of the guest"},"phone":{"type":"string","description":"Phone of the guest"},"string_custom_field":{"type":"string","description":"A placeholder for a custom field that accepts a single text value. Replace `string_custom_field` with the `mapped_field_name` of your Text or Single-Select Picklist question."}}},"booking_settings":{"type":"object","description":"Settings for the booking calendar when the one-time link is used.","properties":{"co_hosts":{"type":"string","description":"A 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":{"type":"number","description":"The 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":{"type":"string","description":"The 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":{"type":"array","description":"List of booking flow steps to skip (e.g., contact_info, questions, co_hosts)."}}},"hide_url_params":{"type":"boolean","description":"When set to `true`, the API generates a short one-time-use link with no visible query parameters.","enum":[true,false]},"utm_params":{"type":"object","description":"Object containing captured values for the 5 standard [UTM parameters](https://en.wikipedia.org/wiki/UTM_parameters).","properties":{"campaign":{"type":"string","description":"Identifies a specific product promotion or strategic campaign"},"content":{"type":"string","description":"Identifies what specifically was clicked to bring the user to the site"},"medium":{"type":"string","description":"Identifies what type of link was used"},"source":{"type":"string","description":"Identifies which site sent the traffic"},"term":{"type":"string","description":"Identifies search terms"}}}}},"example":{"booking_form":{},"booking_settings":{},"hide_url_params":true,"utm_params":{}}}}}}},"/booking-calendars/{id}/schedule":{"post":{"tags":["Booking Calendars"],"parameters":[{"name":"id","in":"path","description":"ID of the booking calendar","required":true,"schema":{"type":"string","example":""}}],"responses":{"401":{"description":"Bearer token required (Authorization header)","content":{"application/json":{}}}},"externalDocs":{"api_ref":"https://help.oncehub.com/developers/api/","api_endpoint":"https://api.oncehub.com/v2/booking-calendars/{id}/schedule"},"summary":"Book a time slot","description":"Book a time slot — Book a time from the available time slots Notes On Using This Endpoint Using Custom FieldsIn 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: Please note that for picklist fields, any values that do not match a pre-configured option will be ignored by the system during booking.","security":[{"bearerAuth":[]}],"requestBody":{"description":"","required":true,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{"booking_form":{"type":"object","description":"booking_form parameter","required":true},"guest_time_zone":{"type":"string","description":"The guest's timezone in [IANA timezone format](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)","required":true},"location":{"type":"object","description":"The location object is optional. If omitted, the system automatically selects an available host's pre-set location (such as `virtual`, `virtual_static` or `physical`), prioritizing `virtual` whenever 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 like `in_person_by_guest` or `guest_phone`, the value must be explicitly provided.","properties":{"type":{"type":"string","description":"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.","enum":["physical","virtual","virtual_static","guest_phone","in_person_by_guest"]},"value":{"type":"string","description":"The 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`, or `zoom`. * `virtual_static`: Use `null`. * `guest_phone`: The guest's phone number in E164 format. * `in_person_by_guest`: The address provided by the guest."}}},"start_time":{"type":"string","description":"The date and time of the time slot","required":true}}},"example":{"booking_form":{},"guest_time_zone":"guest_time_zone_value","location":{},"start_time":"2026-01-01T00:00:00Z"}}}}}},"/booking-calendars/{id}/time-slots":{"get":{"tags":["Booking Calendars"],"parameters":[{"name":"id","in":"path","description":"ID of the booking calendar","required":true,"schema":{"type":"string","example":""}},{"name":"end_time","in":"query","description":"The date and time up to which to check for available slots. If not provided, the system defaults to one week from start_time.","required":false,"schema":{"type":"string","example":""}},{"name":"start_time","in":"query","description":"The date and time from which to begin checking for available slots. If not provided, the system defaults to current time.","required":false,"schema":{"type":"string","example":""}}],"responses":{"401":{"description":"Bearer token required (Authorization header)","content":{"application/json":{}}}},"externalDocs":{"api_ref":"https://help.oncehub.com/developers/api/","api_endpoint":"https://api.oncehub.com/v2/booking-calendars/{id}/time-slots"},"summary":"Get available time slots for a booking calendar","description":"Get available time slots for a booking calendar — Returns a list of available time slots for a booking calendar Notes On Using This Endpoint","security":[{"bearerAuth":[]}]}},"/bookings":{"get":{"tags":["Bookings"],"parameters":[{"name":"after","in":"query","description":"A cursor for use in pagination. after is an object ID that defines your place in the list. For instance, if you make a list request and receive 30 objects, ending with OBJ-XXXX, your subsequent call can include after=OBJ-XXXX in order to fetch the next page of the list.","required":false,"schema":{"type":"string","example":""}},{"name":"before","in":"query","description":"A cursor for use in pagination. before is an object ID that defines your place in the list. For instance, if you make a list request and receive 30 objects, starting with OBJ-XXXX, your subsequent call can include before=OBJ-XXXX in order to fetch the previous page of the list.","required":false,"schema":{"type":"string","example":""}},{"name":"booking_calendar","in":"query","description":"Only return bookings that were created from the booking calendar with the provided ID.","required":false,"schema":{"type":"string","example":""}},{"name":"contact","in":"query","description":"Only return bookings that were scheduled with the contact with the provided ID.","required":false,"schema":{"type":"string","example":""}},{"name":"creation_time.gt","in":"query","description":"Return bookings with creation time greater than the given date.","required":false,"schema":{"type":"string","example":""}},{"name":"creation_time.lt","in":"query","description":"Return bookings with creation time less than the given date.","required":false,"schema":{"type":"string","example":""}},{"name":"expand","in":"query","description":"A comma separated list of fields that you want to expand. Possible values are owner, contact, conversation.","required":false,"schema":{"type":"string","example":""}},{"name":"host","in":"query","description":"Only return bookings hosted or co-hosted by a user with a specific user ID.","required":false,"schema":{"type":"string","example":""}},{"name":"last_updated_time.gt","in":"query","description":"Return bookings with last updated time greater than the given date.","required":false,"schema":{"type":"string","example":""}},{"name":"last_updated_time.lt","in":"query","description":"Return bookings with last updated time less than the given date.","required":false,"schema":{"type":"string","example":""}},{"name":"limit","in":"query","description":"Determines 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.","required":false,"schema":{"type":"number","example":""}},{"name":"owner","in":"query","description":"Only return booking owned by a user with a specific user ID.","required":false,"schema":{"type":"string","example":""}},{"name":"starting_time.gt","in":"query","description":"Return bookings with starting time greater than the given date.","required":false,"schema":{"type":"string","example":""}},{"name":"starting_time.lt","in":"query","description":"Return bookings with starting time less than the given date.","required":false,"schema":{"type":"string","example":""}},{"name":"status","in":"query","description":"Only return bookings that have the given status.","required":false,"schema":{"type":"string","example":""}}],"responses":{"401":{"description":"Bearer token required (Authorization header)","content":{"application/json":{}}}},"externalDocs":{"api_ref":"https://help.oncehub.com/developers/api/","api_endpoint":"https://api.oncehub.com/v2/bookings"},"summary":"List all bookings","description":"List all bookings — Returns a list of all bookings in the account","security":[{"bearerAuth":[]}]}},"/bookings/{id}":{"get":{"tags":["Bookings"],"parameters":[{"name":"id","in":"path","description":"ID of the booking","required":true,"schema":{"type":"string","example":""}}],"responses":{"401":{"description":"Bearer token required (Authorization header)","content":{"application/json":{}}}},"externalDocs":{"api_ref":"https://help.oncehub.com/developers/api/","api_endpoint":"https://api.oncehub.com/v2/bookings/{id}"},"summary":"Get a single booking","description":"Get a single booking — Returns a single booking by ID","security":[{"bearerAuth":[]}]}},"/bookings/{id}/cancel":{"post":{"tags":["Bookings"],"parameters":[{"name":"id","in":"path","description":"ID of the booking","required":true,"schema":{"type":"string","example":""}}],"responses":{"401":{"description":"Bearer token required (Authorization header)","content":{"application/json":{}}}},"externalDocs":{"api_ref":"https://help.oncehub.com/developers/api/","api_endpoint":"https://api.oncehub.com/v2/bookings/{id}/cancel"},"summary":"Cancel a booking","description":"Cancel a booking — Cancel a booking by ID","security":[{"bearerAuth":[]}],"requestBody":{"description":"","required":true,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{"cancellation_reason":{"type":"string","description":"Reason for cancelling the meeting (optional)"},"send_cancellation_email":{"type":"boolean","description":"Whether a cancellation email should be sent","enum":[true,false]}}},"example":{"cancellation_reason":"cancellation_reason_value","send_cancellation_email":true}}}}}},"/bookings/{id}/no-show":{"post":{"tags":["Bookings"],"parameters":[{"name":"id","in":"path","description":"ID of the booking","required":true,"schema":{"type":"string","example":""}}],"responses":{"401":{"description":"Bearer token required (Authorization header)","content":{"application/json":{}}}},"externalDocs":{"api_ref":"https://help.oncehub.com/developers/api/","api_endpoint":"https://api.oncehub.com/v2/bookings/{id}/no-show"},"summary":"Set a booking as no-show","description":"Set a booking as no-show — Update the booking status to no-show by ID","security":[{"bearerAuth":[]}],"requestBody":{"description":"","required":true,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{}},"example":{}}}}}},"/bookings/{id}/reassign":{"post":{"tags":["Bookings"],"parameters":[{"name":"id","in":"path","description":"The unique ID of the booking.","required":true,"schema":{"type":"string","example":""}}],"responses":{"401":{"description":"Bearer token required (Authorization header)","content":{"application/json":{}}}},"externalDocs":{"api_ref":"https://help.oncehub.com/developers/api/","api_endpoint":"https://api.oncehub.com/v2/bookings/{id}/reassign"},"summary":"Reassign a booking","description":"Reassign a booking — Reassign an existing booking to a new host by ID. Effects of reassignment:","security":[{"bearerAuth":[]}],"requestBody":{"description":"","required":true,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{"location":{"type":"object","description":"Optional. Determines how the location is handled when a meeting is reassigned to a new host. **Case 1: When `location` object 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: 1. Google Meet 2. Microsoft Teams 3. Zoom 4. Webex Meetings 5. GoTo Meeting - *In-person/ Phone Meetings:* The location remains unchanged for the new host. >[!NOTE] 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 `location` object is included:** The system applies the specific `type` and `value` for 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. >[!IMPORTANT] 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.","properties":{"type":{"type":"string","description":"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.","required":true,"enum":["virtual"]},"value":{"type":"string","description":"Supported Values: The specific service to be used.","required":true,"enum":["google_meet","microsoft_teams","webex","gotomeeting","zoom"]}}},"new_host":{"type":"string","description":"The 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.","required":true}}},"example":{"location":{},"new_host":"new_host_value"}}}}}},"/bookings/{id}/request-reschedule":{"post":{"tags":["Bookings"],"parameters":[{"name":"id","in":"path","description":"ID of the booking","required":true,"schema":{"type":"string","example":""}}],"responses":{"401":{"description":"Bearer token required (Authorization header)","content":{"application/json":{}}}},"externalDocs":{"api_ref":"https://help.oncehub.com/developers/api/","api_endpoint":"https://api.oncehub.com/v2/bookings/{id}/request-reschedule"},"summary":"Request a reschedule","description":"Request a reschedule — Request to reschedule a booking by ID","security":[{"bearerAuth":[]}],"requestBody":{"description":"","required":true,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{"reschedule_reason":{"type":"string","description":"Reason for requesting the customer to reschedule the meeting (optional)"}}},"example":{"reschedule_reason":"reschedule_reason_value"}}}}}},"/contacts":{"get":{"tags":["Contacts"],"parameters":[{"name":"after","in":"query","description":"A cursor for use in pagination. after is an object ID that defines your place in the list. For instance, if you make a list request and receive 30 objects, ending with OBJ-XXXX, your subsequent call can include after=OBJ-XXXX in order to fetch the next page of the list.","required":false,"schema":{"type":"string","example":""}},{"name":"before","in":"query","description":"A cursor for use in pagination. before is an object ID that defines your place in the list. For instance, if you make a list request and receive 30 objects, starting with OBJ-XXXX, your subsequent call can include before=OBJ-XXXX in order to fetch the previous page of the list.","required":false,"schema":{"type":"string","example":""}},{"name":"creation_time.gt","in":"query","description":"Return contacts with creation time greater than the given date.","required":false,"schema":{"type":"string","example":""}},{"name":"creation_time.lt","in":"query","description":"Return contacts with creation time less than the given date.","required":false,"schema":{"type":"string","example":""}},{"name":"email","in":"query","description":"Filter by the contact's email address","required":false,"schema":{"type":"string","example":""}},{"name":"last_updated_time.gt","in":"query","description":"Return contacts with last updated time greater than the given date.","required":false,"schema":{"type":"string","example":""}},{"name":"last_updated_time.lt","in":"query","description":"Return contacts with last updated time less than the given date.","required":false,"schema":{"type":"string","example":""}},{"name":"limit","in":"query","description":"Determines 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.","required":false,"schema":{"type":"number","example":""}}],"responses":{"401":{"description":"Bearer token required (Authorization header)","content":{"application/json":{}}}},"externalDocs":{"api_ref":"https://help.oncehub.com/developers/api/","api_endpoint":"https://api.oncehub.com/v2/contacts"},"summary":"List all contacts","description":"List all contacts — List all contacts in your account","security":[{"bearerAuth":[]}]},"post":{"tags":["Contacts"],"parameters":[],"responses":{"401":{"description":"Bearer token required (Authorization header)","content":{"application/json":{}}}},"externalDocs":{"api_ref":"https://help.oncehub.com/developers/api/","api_endpoint":"https://api.oncehub.com/v2/contacts"},"summary":"Add a new contact","description":"Add a new contact — Create a new contact in your OnceHub account Either email or mobile_phone is required - at least one must be provided","security":[{"bearerAuth":[]}],"requestBody":{"description":"","required":true,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{"city":{"type":"string","description":"City of the contact"},"company":{"type":"string","description":"Company name"},"company_size":{"type":"string","description":"Size of the contact's company"},"country":{"type":"string","description":"Country of the contact"},"creation_time":{"type":"string","description":"The date and time when the contact was created"},"custom_fields":{"type":"array","description":"Custom fields associated with the contact","items":{"type":"object","properties":{"name":{"type":"string","description":"name parameter"},"value":{"type":"string","description":"Value of the custom field"}}}},"email":{"type":"string","description":"Email address of the contact"},"employees":{"type":"number","description":"Number of employees"},"first_name":{"type":"string","description":"First name of the contact"},"has_consent":{"type":"boolean","description":"Whether the contact has given consent","enum":[true,false]},"id":{"type":"string","description":"Unique identifier for the contact"},"job_title":{"type":"string","description":"Job title of the contact"},"last_interacted_time":{"type":"string","description":"The date and time of the last interaction with the contact"},"last_name":{"type":"string","description":"Last name of the contact"},"last_updated_time":{"type":"string","description":"The date and time the contact was last updated"},"mobile_phone":{"type":"string","description":"Mobile phone number in [E.164](https://en.wikipedia.org/wiki/E.164) format"},"object":{"type":"string","description":"String representing the object's type"},"owner":{"type":"string","description":"The ID of the owner of the contact"},"phone":{"type":"string","description":"Phone number in [E.164](https://en.wikipedia.org/wiki/E.164) format"},"post_code":{"type":"string","description":"Postal code"},"salutation":{"type":"string","description":"Salutation"},"state":{"type":"string","description":"State or province"},"status":{"type":"string","description":"The status of the contact. Accepted values are `Qualified`, `Sales qualified`, `Marketing qualified`, or `Disqualified`. If any other value is provided or no value is provided, the status will be set to null.","enum":["Qualified","Sales qualified","Marketing qualified","Disqualified"]},"street_address":{"type":"string","description":"Street address"},"terms_of_sevice":{"type":"boolean","description":"Whether terms of service were accepted","enum":[true,false]},"timezone":{"type":"string","description":"Timezone of the contact"}}},"example":{"city":"city_value","company":"company_value","company_size":"company_size_value","country":"country_value","creation_time":"2026-01-01T00:00:00Z","custom_fields":[],"email":"email_value","employees":1,"first_name":"first_name_value","has_consent":true,"id":"id_value","job_title":"job_title_value","last_interacted_time":"2026-01-01T00:00:00Z","last_name":"last_name_value","last_updated_time":"2026-01-01T00:00:00Z","mobile_phone":"mobile_phone_value","object":"object_value","owner":"owner_value","phone":"phone_value","post_code":"post_code_value","salutation":"salutation_value","state":"state_value","status":"Qualified","street_address":"street_address_value","terms_of_sevice":true,"timezone":"timezone_value"}}}}}},"/contacts/{id}":{"get":{"tags":["Contacts"],"parameters":[{"name":"id","in":"path","description":"ID of the contact","required":true,"schema":{"type":"string","example":""}}],"responses":{"401":{"description":"Bearer token required (Authorization header)","content":{"application/json":{}}}},"externalDocs":{"api_ref":"https://help.oncehub.com/developers/api/","api_endpoint":"https://api.oncehub.com/v2/contacts/{id}"},"summary":"Get a single contact","description":"Get a single contact — Get a single contact","security":[{"bearerAuth":[]}]},"patch":{"tags":["Contacts"],"parameters":[{"name":"id","in":"path","description":"ID of the contact to update","required":true,"schema":{"type":"string","example":""}}],"responses":{"401":{"description":"Bearer token required (Authorization header)","content":{"application/json":{}}}},"externalDocs":{"api_ref":"https://help.oncehub.com/developers/api/","api_endpoint":"https://api.oncehub.com/v2/contacts/{id}"},"summary":"Update a contact","description":"Update a contact — Update an existing contact in your OnceHub account Notes On Using This Endpoint","security":[{"bearerAuth":[]}],"requestBody":{"description":"","required":true,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{"city":{"type":"string","description":"City of the contact"},"company":{"type":"string","description":"Company name"},"company_size":{"type":"string","description":"Size of the contact's company"},"country":{"type":"string","description":"Country of the contact"},"custom_fields":{"type":"array","description":"Custom fields to update. Only the custom fields provided will be updated.","items":{"type":"object","properties":{"name":{"type":"string","description":"name parameter"},"value":{"type":"string","description":"Value of the custom field"}}}},"employees":{"type":"number","description":"Number of employees"},"first_name":{"type":"string","description":"First name of the contact"},"has_consent":{"type":"boolean","description":"Whether the contact has given consent","enum":[true,false]},"job_title":{"type":"string","description":"Job title of the contact"},"last_name":{"type":"string","description":"Last name of the contact"},"owner":{"type":"string","description":"The ID of the owner of the contact"},"phone":{"type":"string","description":"Phone number in [E.164](https://en.wikipedia.org/wiki/E.164) format"},"post_code":{"type":"string","description":"Postal code"},"salutation":{"type":"string","description":"Salutation"},"state":{"type":"string","description":"State or province"},"status":{"type":"string","description":"The status of the contact. Accepted values are `Qualified`, `Sales qualified`, `Marketing qualified`, or `Disqualified`. If any other value is provided or no value is provided, the status will be set to null.","enum":["Qualified","Sales qualified","Marketing qualified","Disqualified"]},"street_address":{"type":"string","description":"Street address"},"terms_of_sevice":{"type":"boolean","description":"Whether terms of service were accepted","enum":[true,false]},"timezone":{"type":"string","description":"Timezone of the contact"}}},"example":{"city":"city_value","company":"company_value","company_size":"company_size_value","country":"country_value","custom_fields":[],"employees":1,"first_name":"first_name_value","has_consent":true,"job_title":"job_title_value","last_name":"last_name_value","owner":"owner_value","phone":"phone_value","post_code":"post_code_value","salutation":"salutation_value","state":"state_value","status":"Qualified","street_address":"street_address_value","terms_of_sevice":true,"timezone":"timezone_value"}}}}},"delete":{"tags":["Contacts"],"parameters":[{"name":"id","in":"path","description":"ID of the contact","required":true,"schema":{"type":"string","example":""}}],"responses":{"401":{"description":"Bearer token required (Authorization header)","content":{"application/json":{}}}},"externalDocs":{"api_ref":"https://help.oncehub.com/developers/api/","api_endpoint":"https://api.oncehub.com/v2/contacts/{id}"},"summary":"Delete a contact","description":"Delete a contact — Delete a contact","security":[{"bearerAuth":[]}],"requestBody":{"description":"","required":true,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{}},"example":{}}}}}},"/notifications/sms":{"get":{"tags":["Notifications"],"parameters":[{"name":"after","in":"query","description":"A cursor for use in pagination. after is an object ID that defines your place in the list. For instance, if you make a list request and receive 30 objects, ending with OBJ-XXXX, your subsequent call can include after=OBJ-XXXX in order to fetch the next page of the list.","required":false,"schema":{"type":"string","example":""}},{"name":"before","in":"query","description":"A cursor for use in pagination. before is an object ID that defines your place in the list. For instance, if you make a list request and receive 30 objects, starting with OBJ-XXXX, your subsequent call can include before=OBJ-XXXX in order to fetch the previous page of the list.","required":false,"schema":{"type":"string","example":""}},{"name":"creation_time.gt","in":"query","description":"Return SMS notifications created after this date","required":false,"schema":{"type":"string","example":""}},{"name":"creation_time.lt","in":"query","description":"Return SMS notifications created before this date","required":false,"schema":{"type":"string","example":""}},{"name":"expand","in":"query","description":"A comma-separated list of fields to expand. Currently supports: recipient.","required":false,"schema":{"type":"string","example":""}},{"name":"limit","in":"query","description":"Determines 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.","required":false,"schema":{"type":"number","example":""}},{"name":"recipient","in":"query","description":"Filter by specific recipient ID (contact or user ID).","required":false,"schema":{"type":"string","example":""}},{"name":"recipient_type","in":"query","description":"Filter by recipient type. Valid values are contact or user.","required":false,"schema":{"type":"string","example":"","items":{"type":"string","enum":["contact","user"]}}}],"responses":{"401":{"description":"Bearer token required (Authorization header)","content":{"application/json":{}}}},"externalDocs":{"api_ref":"https://help.oncehub.com/developers/api/","api_endpoint":"https://api.oncehub.com/v2/notifications/sms"},"summary":"List all SMS notifications","description":"List all SMS 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.","security":[{"bearerAuth":[]}]}},"/teams":{"get":{"tags":["Teams"],"parameters":[{"name":"after","in":"query","description":"A cursor for use in pagination. after is an object ID that defines your place in the list. For instance, if you make a list request and receive 30 objects, ending with OBJ-XXXX, your subsequent call can include after=OBJ-XXXX in order to fetch the next page of the list.","required":false,"schema":{"type":"string","example":""}},{"name":"before","in":"query","description":"A cursor for use in pagination. before is an object ID that defines your place in the list. For instance, if you make a list request and receive 30 objects, starting with OBJ-XXXX, your subsequent call can include before=OBJ-XXXX in order to fetch the previous page of the list.","required":false,"schema":{"type":"string","example":""}},{"name":"limit","in":"query","description":"Determines 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.","required":false,"schema":{"type":"number","example":""}},{"name":"user","in":"query","description":"Return all teams that the provided user is a member of.","required":false,"schema":{"type":"string","example":""}}],"responses":{"401":{"description":"Bearer token required (Authorization header)","content":{"application/json":{}}}},"externalDocs":{"api_ref":"https://help.oncehub.com/developers/api/","api_endpoint":"https://api.oncehub.com/v2/teams"},"summary":"List all teams","description":"List all teams — Returns a list of all teams in your account","security":[{"bearerAuth":[]}]}},"/teams/{id}":{"get":{"tags":["Teams"],"parameters":[{"name":"id","in":"path","description":"ID of the team.","required":true,"schema":{"type":"string","example":""}}],"responses":{"401":{"description":"Bearer token required (Authorization header)","content":{"application/json":{}}}},"externalDocs":{"api_ref":"https://help.oncehub.com/developers/api/","api_endpoint":"https://api.oncehub.com/v2/teams/{id}"},"summary":"Get a single team","description":"Get a single team — Returns a single team by ID","security":[{"bearerAuth":[]}]}},"/users":{"get":{"tags":["Users"],"parameters":[{"name":"after","in":"query","description":"A cursor for use in pagination. after is an object ID that defines your place in the list. For instance, if you make a list request and receive 30 objects, ending with OBJ-XXXX, your subsequent call can include after=OBJ-XXXX in order to fetch the next page of the list.","required":false,"schema":{"type":"string","example":""}},{"name":"before","in":"query","description":"A cursor for use in pagination. before is an object ID that defines your place in the list. For instance, if you make a list request and receive 30 objects, starting with OBJ-XXXX, your subsequent call can include before=OBJ-XXXX in order to fetch the previous page of the list.","required":false,"schema":{"type":"string","example":""}},{"name":"email","in":"query","description":"Filter by email address","required":false,"schema":{"type":"string","example":""}},{"name":"limit","in":"query","description":"Determines 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.","required":false,"schema":{"type":"number","example":""}}],"responses":{"401":{"description":"Bearer token required (Authorization header)","content":{"application/json":{}}}},"externalDocs":{"api_ref":"https://help.oncehub.com/developers/api/","api_endpoint":"https://api.oncehub.com/v2/users"},"summary":"List all users","description":"List all users — Returns a list of all users in your account","security":[{"bearerAuth":[]}]},"post":{"tags":["Users"],"parameters":[],"responses":{"401":{"description":"Bearer token required (Authorization header)","content":{"application/json":{}}}},"externalDocs":{"api_ref":"https://help.oncehub.com/developers/api/","api_endpoint":"https://api.oncehub.com/v2/users"},"summary":"Add a new user","description":"Add a new user — Add or invite a new user to your OnceHub account Notes On Using This Endpoint","security":[{"bearerAuth":[]}],"requestBody":{"description":"","required":true,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{"email":{"type":"string","description":"Email address of the new user","required":true},"first_name":{"type":"string","description":"First name of the new user","required":true},"last_name":{"type":"string","description":"Last name of the new user","required":true},"role_name":{"type":"string","description":"The role to assign to the user. Valid values are `Administrator`, `Member`, or `Team Manager`. Defaults to `Member` if not specified.","enum":["Administrator","Member","Team Manager"]},"teams":{"type":"array","description":"Array of team external IDs to add the user to. Each team ID must exist in the account.","items":{"type":"string"}}}},"example":{"email":"user@example.com","first_name":"first_name_value","last_name":"last_name_value","role_name":"Administrator","teams":[]}}}}}},"/users/{id}":{"get":{"tags":["Users"],"parameters":[{"name":"id","in":"path","description":"ID of the user","required":true,"schema":{"type":"string","example":""}}],"responses":{"401":{"description":"Bearer token required (Authorization header)","content":{"application/json":{}}}},"externalDocs":{"api_ref":"https://help.oncehub.com/developers/api/","api_endpoint":"https://api.oncehub.com/v2/users/{id}"},"summary":"Get a single user","description":"Get a single user — Returns a single user by ID","security":[{"bearerAuth":[]}]},"patch":{"tags":["Users"],"parameters":[{"name":"id","in":"path","description":"ID of the user to update","required":true,"schema":{"type":"string","example":""}}],"responses":{"401":{"description":"Bearer token required (Authorization header)","content":{"application/json":{}}}},"externalDocs":{"api_ref":"https://help.oncehub.com/developers/api/","api_endpoint":"https://api.oncehub.com/v2/users/{id}"},"summary":"Update a user","description":"Update a user — Update an existing user's information in your OnceHub account Notes On Using This Endpoint","security":[{"bearerAuth":[]}],"requestBody":{"description":"","required":true,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{"first_name":{"type":"string","description":"User's first name"},"last_name":{"type":"string","description":"User's last name"},"role_name":{"type":"string","description":"The role to assign to the user. Valid values are `Administrator`, `Member`, or `Team Manager`.","enum":["Administrator","Member","Team Manager"]},"teams":{"type":"array","description":"Array of team external IDs to assign the user to. This will replace existing team assignments.","items":{"type":"string"}}}},"example":{"first_name":"first_name_value","last_name":"last_name_value","role_name":"Administrator","teams":[]}}}}},"delete":{"tags":["Users"],"parameters":[{"name":"id","in":"path","description":"ID of the user","required":true,"schema":{"type":"string","example":""}}],"responses":{"401":{"description":"Bearer token required (Authorization header)","content":{"application/json":{}}}},"externalDocs":{"api_ref":"https://help.oncehub.com/developers/api/","api_endpoint":"https://api.oncehub.com/v2/users/{id}"},"summary":"Delete a user","description":"Delete a user — Deletes a single user by ID.","security":[{"bearerAuth":[]}],"requestBody":{"description":"","required":true,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{}},"example":{}}}}}},"/users/{id}/scheduling-availability":{"get":{"tags":["Users"],"parameters":[{"name":"id","in":"path","description":"ID of the user","required":true,"schema":{"type":"string","example":""}}],"responses":{"401":{"description":"Bearer token required (Authorization header)","content":{"application/json":{}}}},"externalDocs":{"api_ref":"https://help.oncehub.com/developers/api/","api_endpoint":"https://api.oncehub.com/v2/users/{id}/scheduling-availability"},"summary":"Get scheduling availability","description":"Get scheduling availability — Returns the scheduling availability for a user","security":[{"bearerAuth":[]}]},"patch":{"tags":["Users"],"parameters":[{"name":"id","in":"path","description":"string","required":true,"schema":{"type":"string","example":""}}],"responses":{"401":{"description":"Bearer token required (Authorization header)","content":{"application/json":{}}}},"externalDocs":{"api_ref":"https://help.oncehub.com/developers/api/","api_endpoint":"https://api.oncehub.com/v2/users/{id}/scheduling-availability"},"summary":"Update scheduling availability","description":"Update scheduling availability — Updates the scheduling availability for a user","security":[{"bearerAuth":[]}],"requestBody":{"description":"","required":true,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{"overrides":{"type":"array","description":"An array of objects, each defining an exception for a specific date. Any date provided will have its override schedule completely overwritten.","items":{"type":"object","properties":{"date":{"type":"string","description":"The specific date for the override in `YYYY-MM-DD` format. The date cannot be in the past. Duplicate dates are not allowed."},"working_hours":{"type":"array","description":"An 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 to `null`.","required":true}}}},"weekly":{"type":"array","description":"An 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":{"type":"object","properties":{"day":{"type":"string","description":"The day of the week (e.g., \"Monday\", \"Tuesday\"). Must be a valid, case-sensitive day name. Duplicate days are not allowed.","required":true},"working_hours":{"type":"array","description":"An array of time slot objects for the day. To clear all availability for a day, provide an empty array (`[]`). This field cannot be `null`. Time slots for a single day cannot overlap.","required":true}}}}}},"example":{"overrides":[],"weekly":[]}}}}}},"/webhooks":{"get":{"tags":["Webhooks"],"parameters":[{"name":"after","in":"query","description":"A cursor for use in pagination. after is an object ID that defines your place in the list. For instance, if you make a list request and receive 30 objects, ending with OBJ-XXXX, your subsequent call can include after=OBJ-XXXX in order to fetch the next page of the list.","required":false,"schema":{"type":"string","example":""}},{"name":"before","in":"query","description":"A cursor for use in pagination. before is an object ID that defines your place in the list. For instance, if you make a list request and receive 30 objects, starting with OBJ-XXXX, your subsequent call can include before=OBJ-XXXX in order to fetch the previous page of the list.","required":false,"schema":{"type":"string","example":""}},{"name":"limit","in":"query","description":"Determines 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.","required":false,"schema":{"type":"number","example":""}}],"responses":{"401":{"description":"Bearer token required (Authorization header)","content":{"application/json":{}}}},"externalDocs":{"api_ref":"https://help.oncehub.com/developers/api/","api_endpoint":"https://api.oncehub.com/v2/webhooks"},"summary":"List all webhooks","description":"List all webhooks — Returns a list of your webhook subscriptions, sorted by creation date.","security":[{"bearerAuth":[]}]},"post":{"tags":["Webhooks"],"parameters":[],"responses":{"401":{"description":"Bearer token required (Authorization header)","content":{"application/json":{}}}},"externalDocs":{"api_ref":"https://help.oncehub.com/developers/api/","api_endpoint":"https://api.oncehub.com/v2/webhooks"},"summary":"Create a webhook","description":"Create a webhook — Creates a webhook subscription.","security":[{"bearerAuth":[]}],"requestBody":{"description":"","required":true,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{"events":{"type":"array","description":"An array of Booking lifecycle events that will trigger the Webhook.","items":{"type":"string"}},"name":{"type":"string","description":"Unique name for your Webhook subscription. This name is only used by you for reference."},"url":{"type":"string","description":"URL for receiving POST messages from OnceHub"}}},"example":{"events":[],"name":"name_value","url":"url_value"}}}}}},"/webhooks/{id}":{"get":{"tags":["Webhooks"],"parameters":[{"name":"id","in":"path","description":"ID of the webhook","required":true,"schema":{"type":"string","example":""}}],"responses":{"401":{"description":"Bearer token required (Authorization header)","content":{"application/json":{}}}},"externalDocs":{"api_ref":"https://help.oncehub.com/developers/api/","api_endpoint":"https://api.oncehub.com/v2/webhooks/{id}"},"summary":"Get a single webhook","description":"Get a single webhook — Returns a single webhook subscription by ID.","security":[{"bearerAuth":[]}]},"delete":{"tags":["Webhooks"],"parameters":[{"name":"id","in":"path","description":"ID of the webhook","required":true,"schema":{"type":"string","example":""}}],"responses":{"401":{"description":"Bearer token required (Authorization header)","content":{"application/json":{}}}},"externalDocs":{"api_ref":"https://help.oncehub.com/developers/api/","api_endpoint":"https://api.oncehub.com/v2/webhooks/{id}"},"summary":"Delete a webhook","description":"Delete a webhook — Deletes a single webhook subscription by ID.","security":[{"bearerAuth":[]}],"requestBody":{"description":"","required":true,"content":{"application/json":{"schema":{"type":"object","required":[],"properties":{}},"example":{}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer"}}},"security":[{"bearerAuth":[]}]}