Build your own booking page

Read as Markdown

Instead of sending the recipient to Cronofy’s booking page, your application can offer the times itself, for example in your own booking page, a chat, or an AI agent’s conversation. Cronofy still books the event exactly as its own booking page would, with the same calendar writes, notifications, and webhooks.

You’ll need a Scheduling Request from Create a request with the API, or from the Embed. Create a new one if you’ve already booked it.

Find the operations #

A Scheduling Request lists the actions your application can take in its integration_operations. If you created the request with the API, they’re in the response. Otherwise, query the request by its scheduling_request_id:

POST /v1/scheduling_requests/query HTTP/1.1
Host: {data_center_url}
Authorization: Bearer {ACCESS_TOKEN}
Content-Type: application/json; charset=utf-8

{
  "scheduling_request_ids": ["{SCHEDULING_REQUEST_ID}"]
}
{
  "integration_operations": {
    "simple_available_slots_url": "{SIMPLE_AVAILABLE_SLOTS_URL}"
  }
}

Use these URLs exactly as Cronofy gives them to you. Don’t build them yourself or rely on their format, as it can change.

simple_available_slots_url is only there when a time is all the request needs. A request that asks the recipient for more, such as a phone number, needs Cronofy’s booking page.

List the times #

Call simple_available_slots_url with the same access token:

POST {SIMPLE_AVAILABLE_SLOTS_URL} HTTP/1.1
Authorization: Bearer {ACCESS_TOKEN}
{
  "integration_operation_result": {
    "type": "available_slots",
    "result": "success",
    "integration_operations": {
      "simple_select_slot_url": "{SIMPLE_SELECT_SLOT_URL}"
    },
    "available_slots": [
      { "start": "2026-11-13T09:00:00Z", "end": "2026-11-13T09:30:00Z" },
      { "start": "2026-11-13T09:30:00Z", "end": "2026-11-13T10:00:00Z" },
      { "start": "2026-11-13T14:00:00Z", "end": "2026-11-13T14:30:00Z" }
    ],
    "suggested_slots": [
      { "start": "2026-11-13T09:00:00Z", "end": "2026-11-13T09:30:00Z" },
      { "start": "2026-11-13T14:00:00Z", "end": "2026-11-13T14:30:00Z" }
    ]
  },
  "scheduling_request": { ... }
}

Show the recipient the available_slots, or the suggested_slots if you want to offer a short, spread-out list. Times are in UTC, so convert them to the recipient’s time zone for display.

Book the chosen time #

Post the start of the time the recipient picks to simple_select_slot_url:

POST {SIMPLE_SELECT_SLOT_URL} HTTP/1.1
Authorization: Bearer {ACCESS_TOKEN}
Content-Type: application/json; charset=utf-8

{
  "start": "2026-11-13T09:30:00Z"
}
{
  "integration_operation_result": {
    "type": "select_slot",
    "result": "accepted",
    "integration_operations": {},
    "selected_slot": {
      "start": "2026-11-13T09:30:00Z",
      "end": "2026-11-13T10:00:00Z"
    }
  },
  "scheduling_request": { ... }
}

An accepted result means Cronofy has taken the booking. The event is written to the calendars moments later, and you receive the invitation.

Your webhook URL receives the same scheduling_request_time_chosen webhook as when a recipient books on Cronofy’s booking page, so the rest of your application handles both the same way.

Handle a time that’s gone #

If someone else books the time first, the result is not_possible with a result_detail of slot_unavailable. The response includes a fresh list of times and a new simple_select_slot_url, so ask the recipient to pick again.

If the request can no longer be booked this way, for example because it’s been cancelled, the result_detail says why. Where a person can still act, send them to the request’s recipient_operations.view_url.

Integration Operations covers every result, and Available Slots and Select Slot have the full detail of each call.

In your product #

In an applicant tracking system

Offer the times in your candidate portal or careers site, or through an AI agent that is already talking to the candidate.

Link to this
In talent management

Offer the times in your employee self-service portal, or through an AI agent in the tools your customers’ employees already use.

Link to this
In a CRM

Offer the times on a booking page in your product, or through an AI agent in the conversation with the prospect.

Link to this
In healthtech

Offer the times in your patient portal or app, so patients book without leaving it.

Link to this

Next #

Use Selection Rules and Templates so Cronofy chooses the host, and requests come from predefined meeting types.