Booking pages

Get a booking page

Returns one active booking page with the host's public profile and the questions to ask guests. This is everything you need to render a booking form. Scope: booking_pages:read. Keys: secret and publishable.

GET/booking-pages/{slug}getBookingPage

Authorizations

bearerAuthhttp (bearer)

Authorization: Bearer clndr_sk_… (secret) or clndr_pk_… (publishable).

apiKeyHeaderapiKey

The same key in a custom header, for clients that can't set Authorization.

Server

https://www.clndr.pro/api/v1

Production

Path Parameters

slugstringrequired

The booking page's slug.

Example: intro-call

Responses

200The booking page, its host and its questions.application/json
dataobjectrequired
bookingPageobjectrequired

The full booking page row.

idstring<uuid>required

Pass this as bookingPageId when you create a booking.

slugstringrequired

URL segment, unique per account. Lowercase letters, digits and hyphens.

titlestringrequired
descriptionstringnullrequired

Markdown, written by the host. Render it as Markdown, not as plain text.

duration_minutesintegerrequired

Length of every slot.

booking_typeenum("direct", "approval")required

direct bookings are confirmed on the spot. approval bookings start as pending until the host confirms or cancels them.

max_days_aheadintegernullrequired

How many days ahead guests can book. Slots further out are not returned. null means no limit.

buffer_time_minutesintegernullrequired

Gap the host keeps between consecutive slots.

visibilityenum("public", "private", "team")required

Who can open the hosted booking page at www.clndr.pro/{username}/{slug}. private pages need an access code; team pages need a signed-in team member. API keys see all of their owner's pages regardless.

auto_generate_meet_linkbooleannullrequired

When true, confirmed bookings get a Google Calendar event with a Google Meet link.

is_activebooleannullrequired

Inactive pages still appear in List booking pages, but can't be fetched, offer no slots and can't be booked.

created_atstring<date-time>required
user_idstring<uuid>required

The host's clndr.pro account id.

updated_atstring<date-time>required
availability_set_idstring,null<uuid>

The availability schedule this page uses. null means all of the host's schedules.

allowed_team_idstring,null<uuid>

The team allowed to book a team page.

show_access_code_promptbooleanrequired

Whether the hosted page asks visitors of a private page for an access code.

show_on_profilebooleanrequired

Whether the page is listed on the host's public profile at www.clndr.pro/{username}.

userProfileobjectrequired

The host's public profile.

usernamestringrequired

3–30 characters: lowercase letters, digits, _ and -.

full_namestringnullrequired
biostringnullrequired
avatar_urlstring,null<uri>required
timezonestringrequired

IANA timezone the host's availability is defined in.

questionsarray<object>required

Active questions, sorted by order_index.

idstring<uuid>required

Send as responses[].questionId.

question_textstringrequired
question_typeenum("text", "email", "textarea", "phone", "select", "checkbox")required

Which input to render. The dashboard creates text, email, textarea and phone; select comes with options.

optionsarraynullrequired

Choices for a select question.

is_requiredbooleannullrequired

Collect an answer before you submit. The API doesn't reject bookings with missing answers, so enforce this in your form.

order_indexintegerrequired

Show questions in ascending order.

401The key is missing, unknown, revoked or expired.application/json
errorstringrequired

What went wrong, in plain English.

403The key doesn't have the scope this endpoint needs.application/json
errorstringrequired

What went wrong, in plain English.

404No active booking page with this slug on the key's account.application/json
errorstringrequired

What went wrong, in plain English.

429Too many requests from this key in the current 60-second window.application/json
errorstringrequired

What went wrong, in plain English.

500Something failed on our side. Retry with exponential backoff.application/json
errorstringrequired

What went wrong, in plain English.

curl https://www.clndr.pro/api/v1/booking-pages/intro-call \
  --header 'Authorization: Bearer <token>'
{
  "data": {
    "bookingPage": {
      "id": "8b6f2c1e-4a1d-4f0b-9a63-2f0c5d7e9b14",
      "slug": "intro-call",
      "title": "Intro call",
      "description": "A 30 minute call to see if we're a fit.\n\n- What you're building\n- Timeline and budget",
      "duration_minutes": 30,
      "booking_type": "direct",
      "max_days_ahead": 30,
      "buffer_time_minutes": 10,
      "visibility": "public",
      "auto_generate_meet_link": true,
      "is_active": true,
      "created_at": "2026-09-02T08:14:55.120+00:00",
      "user_id": "5d2e9f40-7c1b-4e8a-b0d6-3a9f1c2e8d77",
      "updated_at": "2026-09-30T11:02:10.004+00:00",
      "availability_set_id": "a1f0c2d3-4e5b-4c6d-8e7f-9a0b1c2d3e4f",
      "allowed_team_id": null,
      "show_access_code_prompt": true,
      "show_on_profile": true
    },
    "userProfile": {
      "username": "ada",
      "full_name": "Ada Lovelace",
      "bio": "Building analytical engines.",
      "avatar_url": "https://www.clndr.pro/avatars/ada.png",
      "timezone": "Europe/London"
    },
    "questions": [
      {
        "id": "0e4b7a2c-9d1f-4b3e-a6c8-5f2d1e9b7c40",
        "question_text": "What would you like to talk about?",
        "question_type": "textarea",
        "options": null,
        "is_required": true,
        "order_index": 0
      },
      {
        "id": "6f1c3e8a-2d7b-4a9e-b5c1-8e0d4f2a6b93",
        "question_text": "Phone number",
        "question_type": "phone",
        "options": null,
        "is_required": false,
        "order_index": 1
      }
    ]
  }
}