Select Slot ALPHA

Read as Markdown Required plan: Scheduler

Description #

Books a time for a Scheduling Request by posting the start of the chosen slot.

This is the second of the two Time Selection integration operations. Read that page first for the shared response envelope, result vocabulary, authentication, and error shapes.

Only a start is required: the Scheduling Request already fixes the meeting length, so the end is derived from the request’s duration. The start must match the start of a slot returned by Available Slots.

Selecting a time here runs the exact same booking as the human booking page: the same calendar writes, notifications, and workflow triggers.

On success the response is 202 Accepted, not 200: the selection is taken but the calendar write finalizes moments later. The scheduling_request rides along and settles from pending to complete shortly after; query it again whenever you like to see the confirmed event.

You do not build this URL. It is returned as the opaque simple_select_slot_url by Available Slots, alongside the times. This operation requires the organizational_unit_scheduler scope.

Example Request #

Send the request to the simple_select_slot_url returned by Available Slots, exactly as given.

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

{
  "start": "2026-09-17T09:30:00Z"
}

Example Response #

HTTP/1.1 202 Accepted
Content-Type: application/json; charset=utf-8

{
  "integration_operation_result": {
    "type": "select_slot",
    "result": "accepted",
    "integration_operations": {},
    "selected_slot": {
      "start": "2026-09-17T09:30:00Z",
      "end": "2026-09-17T10:00:00Z"
    }
  },
  "scheduling_request": {
    "scheduling_request_id": "srq_7b9784257940f9bbbfcad097",
    "slot_selection": "pending",
    "primary_select_url": "https://app.cronofy.com/rts/wZ9tLbN4sWjH6yD1cF0a",
    "dashboard_url": "https://app.cronofy.com/scheduler/requests/7b9784257940f9bbbfcad097",
    "summary": "Intro call with Riya Patel"
  }
}

Request parameters #

start required  #

A Time in UTC (for example 2026-09-17T09:30:00Z) of the chosen slot. It must match the start of a slot returned by Available Slots. The end is not accepted; it is derived from the request’s fixed duration.

A missing or unparseable start returns invalid (422); see Error responses.

API_KEY required  #

An access token for the Organizational Unit with the organizational_unit_scheduler scope, or the client_secret of the linked Internal Application. See Authentication.

Response parameters #

integration_operation_result  #

An Object describing the outcome of the operation. See The response envelope.

integration_operation_result.type  #

A String of select_slot for this operation.

integration_operation_result.result  #

A String outcome, one of:

  • accepted: the selection was taken; the calendar write finalizes moments later (202).
  • conflict: a concurrent booking briefly held the slot; retry the same payload (409).
  • not_possible: the request’s state means this cannot be done (409); see result_detail.
  • invalid: the input was wrong, such as a missing or malformed start (422); see the top-level errors.
integration_operation_result.result_detail  #

Present only when result is not_possible. A String explaining why, one of slot_unavailable, superseded, no_longer_possible, requires_more_input, or configuration_error. See result_detail.

integration_operation_result.integration_operations  #

An Object of the actions available next. Empty on an accepted selection (nothing is left to do). On a slot_unavailable result it carries a simple_select_slot_url so you can re-pick without another call.

integration_operation_result.selected_slot  #

Present when result is accepted. An Object with the start and end of the booked slot.

integration_operation_result.selected_slot.start  #

A Time representing the UTC start of the booked slot.

integration_operation_result.selected_slot.end  #

A Time representing the UTC end of the booked slot, derived from the request’s fixed duration.

scheduling_request  #

The full Scheduling Request, in the same shape as the Query response. It travels alongside every envelope response so you can render the current state without a second call.

Error responses #

Beyond the shared errors for authentication, authorization, an unknown token, and rate limiting, this operation can return the following.

Chosen time already gone

not_possible with a result_detail of slot_unavailable (409): the request is still open, but that time has been taken. The response hands back a fresh available_slots / suggested_slots list and the simple_select_slot_url, so you can re-pick without another call.

{
  "integration_operation_result": {
    "type": "select_slot",
    "result": "not_possible",
    "result_detail": "slot_unavailable",
    "integration_operations": {
      "simple_select_slot_url": "{SIMPLE_SELECT_SLOT_URL}"
    },
    "available_slots": [
      { "start": "2026-09-17T10:00:00Z", "end": "2026-09-17T10:30:00Z" },
      { "start": "2026-09-17T14:00:00Z", "end": "2026-09-17T14:30:00Z" }
    ],
    "suggested_slots": [
      { "start": "2026-09-17T10:00:00Z", "end": "2026-09-17T10:30:00Z" }
    ]
  },
  "scheduling_request": { ... }
}
Concurrent booking held the slot

conflict (409): another booking briefly held the target calendars. Nothing is wrong; retry the same payload in a moment.

{
  "integration_operation_result": {
    "type": "select_slot",
    "result": "conflict",
    "integration_operations": {}
  },
  "scheduling_request": { ... }
}
Missing or malformed start

invalid (422): the start was absent or unparseable. A top-level errors map (the public API’s shape) names the offending field: errors.required when missing, errors.not_recognized when unparseable.

{
  "integration_operation_result": {
    "type": "select_slot",
    "result": "invalid",
    "integration_operations": {}
  },
  "errors": {
    "start": [
      { "key": "errors.required", "description": "required" }
    ]
  },
  "scheduling_request": { ... }
}
Request needs more than a time, or is no longer open

not_possible with a result_detail of requires_more_input, superseded, no_longer_possible, or configuration_error (409), depending on the request’s state. See result_detail for what each means and how to react.

{
  "integration_operation_result": {
    "type": "select_slot",
    "result": "not_possible",
    "result_detail": "no_longer_possible",
    "integration_operations": {}
  },
  "scheduling_request": { ... }
}