Chronary Booking Pages API

The Booking Pages API from Chronary — 4 operation(s) for booking pages.

Operations 8

POST /v1/booking-pages Create a booking page #
GET /v1/booking-pages List booking pages #
GET /v1/booking-pages/{id} Get a booking page #
PATCH /v1/booking-pages/{id} Update a booking page #
DELETE /v1/booking-pages/{id} Delete a booking page #
GET /book/{slug} Hosted booking page (HTML) #
POST /book/{slug} Submit a booking #
GET /book/{slug}/slots List available booking slots (JSON) #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/chronary-ai:chronary-ai-booking-pages-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

chronary-ai-booking-pages-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Chronary Booking Pages API
  version: 1.0.0
  description: 'Calendar-as-a-service API for AI agents.


    Manage calendars, events, and availability for AI and human agents.

    All endpoints require an API key passed as a Bearer token.


    **Authentication:** `Authorization: Bearer chr_sk_...` or `Authorization: Bearer chr_ak_...`


    **Rate limit:** 10 requests/second per API key. Exceeds return HTTP 429.


    **Quotas:** Monthly operation limits by plan — see Billing & plans and Rate limits.


    **Agent bootstrap:** Custom extensions prefixed `x-agent-*` describe the self-signup flow for AI agents. These are not part of any registered OpenAPI extension — they are a Chronary convention.'
  contact:
    name: Chronary Support
    email: support@chronary.ai
    url: https://docs.chronary.ai
servers:
- url: https://api.chronary.ai
  description: Production
security:
- BearerAuth: []
tags:
- name: Booking Pages
paths:
  /v1/booking-pages:
    post:
      operationId: createBookingPage
      summary: Create a booking page
      description: Create a public scheduling link for a calendar. An agent creates the page, then shares the returned `booking_url` with a human; when the human picks a slot, a confirmed event is created on the calendar and an `event.created` webhook fires with a `booking_page_id` correlation field.
      tags:
      - Booking Pages
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CreateBookingPage'
      responses:
        '201':
          description: Booking page created
          headers:
            X-Chronary-Plan:
              description: The current plan of the authenticated organization (free | pro | scale)
              schema:
                type: string
                enum:
                - free
                - pro
                - scale
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BookingPage'
        '400':
          description: Validation error — invalid request body or query parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized — missing or invalid API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '403':
          description: Forbidden — quota exceeded or operation not permitted
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Resource not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Rate limited — 10 requests per second per key exceeded
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
    get:
      operationId: listBookingPages
      summary: List booking pages
      tags:
      - Booking Pages
      parameters:
      - schema:
          type: integer
          minimum: 1
          maximum: 200
          default: 50
        required: false
        name: limit
        in: query
      - schema:
          type:
          - integer
          - 'null'
          minimum: 0
          default: 0
        required: false
        name: offset
        in: query
      responses:
        '200':
          description: List of booking pages
          headers:
            X-Chronary-Plan:
              description: The current plan of the authenticated organization (free | pro | scale)
              schema:
                type: string
                enum:
                - free
                - pro
                - scale
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BookingPageList'
        '401':
          description: Unauthorized — missing or invalid API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Rate limited — 10 requests per second per key exceeded
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /v1/booking-pages/{id}:
    get:
      operationId: getBookingPage
      summary: Get a booking page
      tags:
      - Booking Pages
      parameters:
      - schema:
          type: string
          example: bkp_01H9X4M2P5R8T6V0
          description: Booking page ID
        required: true
        description: Booking page ID
        name: id
        in: path
      responses:
        '200':
          description: Booking page details
          headers:
            X-Chronary-Plan:
              description: The current plan of the authenticated organization (free | pro | scale)
              schema:
                type: string
                enum:
                - free
                - pro
                - scale
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BookingPage'
        '401':
          description: Unauthorized — missing or invalid API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Resource not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Rate limited — 10 requests per second per key exceeded
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
    patch:
      operationId: updateBookingPage
      summary: Update a booking page
      tags:
      - Booking Pages
      parameters:
      - schema:
          type: string
          example: bkp_01H9X4M2P5R8T6V0
          description: Booking page ID
        required: true
        description: Booking page ID
        name: id
        in: path
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/UpdateBookingPage'
      responses:
        '200':
          description: Updated booking page
          headers:
            X-Chronary-Plan:
              description: The current plan of the authenticated organization (free | pro | scale)
              schema:
                type: string
                enum:
                - free
                - pro
                - scale
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BookingPage'
        '400':
          description: Validation error — invalid request body or query parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '401':
          description: Unauthorized — missing or invalid API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Resource not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Rate limited — 10 requests per second per key exceeded
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
    delete:
      operationId: deleteBookingPage
      summary: Delete a booking page
      description: Soft-deletes the booking page. Its hosted URL stops resolving; existing booked events are unaffected.
      tags:
      - Booking Pages
      parameters:
      - schema:
          type: string
          example: bkp_01H9X4M2P5R8T6V0
          description: Booking page ID
        required: true
        description: Booking page ID
        name: id
        in: path
      responses:
        '204':
          description: Booking page deleted
        '401':
          description: Unauthorized — missing or invalid API key
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Resource not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Rate limited — 10 requests per second per key exceeded
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /book/{slug}:
    get:
      operationId: getBookingPageHosted
      summary: Hosted booking page (HTML)
      description: Public, server-rendered HTML scheduling page. No authentication — the unguessable slug is the credential. Pass `?slot=` to render the confirmation form for a chosen slot.
      tags:
      - Booking Pages
      security: []
      parameters:
      - schema:
          type: string
          example: a1b2c3d4e5f6g7h8i9j0k1
          description: Public booking page slug
        required: true
        description: Public booking page slug
        name: slug
        in: path
      - schema:
          type: string
          format: date-time
        required: false
        name: slot
        in: query
      responses:
        '200':
          description: Hosted booking page
          content:
            text/html:
              schema:
                type: string
        '404':
          description: Unknown or inactive slug
          content:
            text/html:
              schema:
                type: string
        '429':
          description: Rate limited
          content:
            text/plain:
              schema:
                type: string
    post:
      operationId: submitBooking
      summary: Submit a booking
      description: Public booking submission. No authentication — the slug is the credential. Accepts JSON (returns JSON) or an HTML form (returns an HTML confirmation). Re-validates the chosen slot against live availability, creates a confirmed event, and fires an `event.created` webhook with `booking_page_id`.
      tags:
      - Booking Pages
      security: []
      parameters:
      - schema:
          type: string
          example: a1b2c3d4e5f6g7h8i9j0k1
          description: Public booking page slug
        required: true
        description: Public booking page slug
        name: slug
        in: path
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SubmitBooking'
      responses:
        '201':
          description: Booking confirmed
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BookingSubmissionResult'
        '400':
          description: Validation error — invalid request body or query parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Resource not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '409':
          description: The slot is no longer available or was just taken
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Rate limited — 10 requests per second per key exceeded
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: The page is temporarily not accepting bookings
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /book/{slug}/slots:
    get:
      operationId: listBookingSlots
      summary: List available booking slots (JSON)
      description: Public JSON list of available slots for a booking page, for building a custom booking UI. No authentication. Slots are clamped to the page's min-notice and window.
      tags:
      - Booking Pages
      security: []
      parameters:
      - schema:
          type: string
          example: a1b2c3d4e5f6g7h8i9j0k1
          description: Public booking page slug
        required: true
        description: Public booking page slug
        name: slug
        in: path
      - schema:
          type: string
          format: date-time
        required: false
        name: from
        in: query
      - schema:
          type: string
          format: date-time
        required: false
        name: to
        in: query
      responses:
        '200':
          description: Available slots
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BookingSlotsResponse'
        '400':
          description: Validation error — invalid request body or query parameters
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '404':
          description: Resource not found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Rate limited — 10 requests per second per key exceeded
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    BookingSubmissionResult:
      type: object
      properties:
        booking_page_id:
          type: string
          example: bkp_01H9X4M2P5R8T6V0
        event:
          type: object
          properties:
            id:
              type: string
              example: evt_01H9X4M2P5R8T6V0
            title:
              type: string
              example: Intro call — Ada Lovelace
            start_time:
              type: string
              format: date-time
              example: '2026-07-15T16:00:00.000Z'
            end_time:
              type: string
              format: date-time
              example: '2026-07-15T16:30:00.000Z'
            status:
              type: string
              example: confirmed
          required:
          - id
          - title
          - start_time
          - end_time
          - status
      required:
      - booking_page_id
      - event
    BookingPageList:
      type: object
      properties:
        data:
          type: array
          items:
            $ref: '#/components/schemas/BookingPage'
        total:
          type: integer
          example: 1
        limit:
          type: integer
          example: 50
        offset:
          type: integer
          example: 0
      required:
      - data
      - total
      - limit
      - offset
    CreateBookingPage:
      type: object
      properties:
        calendar_id:
          type: string
          minLength: 1
        title:
          type: string
          minLength: 1
          maxLength: 200
        description:
          type: string
          maxLength: 2000
        duration_minutes:
          type: integer
          minimum: 5
          maximum: 480
          default: 30
        buffer_minutes:
          type: integer
          minimum: 0
          maximum: 120
          default: 0
        window_days:
          type: integer
          minimum: 1
          maximum: 365
          default: 14
        min_notice_minutes:
          type: integer
          minimum: 0
          maximum: 40320
          default: 0
        timezone:
          type: string
          minLength: 1
          maxLength: 64
          default: UTC
        availability_constraints:
          type:
          - object
          - 'null'
          properties:
            mon:
              type: object
              properties:
                start:
                  type: string
                  pattern: ^([01]\d|2[0-3]):[0-5]\d$
                end:
                  type: string
                  pattern: ^([01]\d|2[0-3]):[0-5]\d$
              required:
              - start
              - end
            tue:
              type: object
              properties:
                start:
                  type: string
                  pattern: ^([01]\d|2[0-3]):[0-5]\d$
                end:
                  type: string
                  pattern: ^([01]\d|2[0-3]):[0-5]\d$
              required:
              - start
              - end
            wed:
              type: object
              properties:
                start:
                  type: string
                  pattern: ^([01]\d|2[0-3]):[0-5]\d$
                end:
                  type: string
                  pattern: ^([01]\d|2[0-3]):[0-5]\d$
              required:
              - start
              - end
            thu:
              type: object
              properties:
                start:
                  type: string
                  pattern: ^([01]\d|2[0-3]):[0-5]\d$
                end:
                  type: string
                  pattern: ^([01]\d|2[0-3]):[0-5]\d$
              required:
              - start
              - end
            fri:
              type: object
              properties:
                start:
                  type: string
                  pattern: ^([01]\d|2[0-3]):[0-5]\d$
                end:
                  type: string
                  pattern: ^([01]\d|2[0-3]):[0-5]\d$
              required:
              - start
              - end
            sat:
              type: object
              properties:
                start:
                  type: string
                  pattern: ^([01]\d|2[0-3]):[0-5]\d$
                end:
                  type: string
                  pattern: ^([01]\d|2[0-3]):[0-5]\d$
              required:
              - start
              - end
            sun:
              type: object
              properties:
                start:
                  type: string
                  pattern: ^([01]\d|2[0-3]):[0-5]\d$
                end:
                  type: string
                  pattern: ^([01]\d|2[0-3]):[0-5]\d$
              required:
              - start
              - end
        active:
          type: boolean
          default: true
      required:
      - calendar_id
      - title
    Error:
      type: object
      properties:
        error:
          type: object
          properties:
            type:
              type: string
              example: invalid_request
            message:
              type: string
              example: The field "name" is required.
            request_id:
              type: string
              example: req_01H9X4M2P5R8T6V0
            required_plan:
              type: string
              example: pro
              description: 'plan_required: the plan that unlocks the feature'
            feature:
              type: string
              description: 'plan_required: the gated feature'
            metric:
              type: string
              description: 'quota_exceeded and count caps: the metric at its limit (a PLAN_LIMITS key, accepted by POST /v1/billing/upgrade-requests)'
            limit:
              type: integer
              description: 'quota_exceeded and count caps: the plan''s limit for `metric`'
            upgrade_url:
              type: string
              description: Where a human upgrades the plan
            docs_url:
              type: string
            contact_url:
              type: string
              description: 'Contract-managed plans: where to contact sales'
            retry_after:
              type: integer
              description: Seconds until the request may be retried
          required:
          - type
          - message
          - request_id
      required:
      - error
    BookingPage:
      type: object
      properties:
        id:
          type: string
          example: bkp_01H9X4M2P5R8T6V0
        org_id:
          type: string
          example: 5f8e...
        calendar_id:
          type: string
          example: cal_01H9X4M2P5R8T6V0
        agent_id:
          type:
          - string
          - 'null'
          example: agt_01H9X4M2P5R8T6V0
          description: Owner agent of the bound calendar; null for shared/org calendars.
        slug:
          type: string
          example: a1b2c3d4e5f6g7h8i9j0k1
          description: Unguessable public token in the hosted URL.
        title:
          type: string
          example: Intro call
        description:
          type:
          - string
          - 'null'
          example: A 30-minute intro chat.
        duration_minutes:
          type: integer
          example: 30
        buffer_minutes:
          type: integer
          example: 0
          description: Padding added before and after each existing event when computing slots.
        window_days:
          type: integer
          example: 14
          description: How far ahead bookings are allowed.
        min_notice_minutes:
          type: integer
          example: 0
          description: Minimum lead time before a bookable slot.
        timezone:
          type: string
          example: America/Los_Angeles
        availability_constraints:
          type:
          - object
          - 'null'
          additionalProperties:
            type: object
            properties:
              start:
                type: string
                example: 09:00
                description: HH:MM 24-hour
              end:
                type: string
                example: '17:00'
                description: HH:MM 24-hour
            required:
            - start
            - end
          example:
            mon:
              start: 09:00
              end: '17:00'
          description: Weekly working hours; null = any time inside the window (calendar events still block).
        active:
          type: boolean
          example: true
        bookings_count:
          type: integer
          example: 3
          description: Number of bookings made through this page.
        booking_url:
          type: string
          format: uri
          example: https://api.chronary.ai/book/a1b2c3d4e5f6g7h8i9j0k1
        created_at:
          type: string
          format: date-time
          example: '2026-07-14T10:00:00.000Z'
        updated_at:
          type: string
          format: date-time
          example: '2026-07-14T10:00:00.000Z'
      required:
      - id
      - org_id
      - calendar_id
      - agent_id
      - slug
      - title
      - description
      - duration_minutes
      - buffer_minutes
      - window_days
      - min_notice_minutes
      - timezone
      - availability_constraints
      - active
      - bookings_count
      - booking_url
      - created_at
      - updated_at
    UpdateBookingPage:
      type: object
      properties:
        title:
          type: string
          minLength: 1
          maxLength: 200
        description:
          type:
          - string
          - 'null'
          maxLength: 2000
        duration_minutes:
          type: integer
          minimum: 5
          maximum: 480
        buffer_minutes:
          type: integer
          minimum: 0
          maximum: 120
        window_days:
          type: integer
          minimum: 1
          maximum: 365
        min_notice_minutes:
          type: integer
          minimum: 0
          maximum: 40320
        timezone:
          type: string
          minLength: 1
          maxLength: 64
        availability_constraints:
          type:
          - object
          - 'null'
          properties:
            mon:
              type: object
              properties:
                start:
                  type: string
                  pattern: ^([01]\d|2[0-3]):[0-5]\d$
                end:
                  type: string
                  pattern: ^([01]\d|2[0-3]):[0-5]\d$
              required:
              - start
              - end
            tue:
              type: object
              properties:
                start:
                  type: string
                  pattern: ^([01]\d|2[0-3]):[0-5]\d$
                end:
                  type: string
                  pattern: ^([01]\d|2[0-3]):[0-5]\d$
              required:
              - start
              - end
            wed:
              type: object
              properties:
                start:
                  type: string
                  pattern: ^([01]\d|2[0-3]):[0-5]\d$
                end:
                  type: string
                  pattern: ^([01]\d|2[0-3]):[0-5]\d$
              required:
              - start
              - end
            thu:
              type: object
              properties:
                start:
                  type: string
                  pattern: ^([01]\d|2[0-3]):[0-5]\d$
                end:
                  type: string
                  pattern: ^([01]\d|2[0-3]):[0-5]\d$
              required:
              - start
              - end
            fri:
              type: object
              properties:
                start:
                  type: string
                  pattern: ^([01]\d|2[0-3]):[0-5]\d$
                end:
                  type: string
                  pattern: ^([01]\d|2[0-3]):[0-5]\d$
              required:
              - start
              - end
            sat:
              type: object
              properties:
                start:
                  type: string
                  pattern: ^([01]\d|2[0-3]):[0-5]\d$
                end:
                  type: string
                  pattern: ^([01]\d|2[0-3]):[0-5]\d$
              required:
              - start
              - end
            sun:
              type: object
              properties:
                start:
                  type: string
                  pattern: ^([01]\d|2[0-3]):[0-5]\d$
                end:
                  type: string
                  pattern: ^([01]\d|2[0-3]):[0-5]\d$
              required:
              - start
              - end
        active:
          type: boolean
    BookingSlotsResponse:
      type: object
      properties:
        booking_page:
          type: object
          properties:
            slug:
              type: string
              example: a1b2c3d4e5f6g7h8i9j0k1
            title:
              type: string
              example: Intro call
            description:
              type:
              - string
              - 'null'
              example: null
            duration_minutes:
              type: integer
              example: 30
            timezone:
              type: string
              example: America/Los_Angeles
          required:
          - slug
          - title
          - description
          - duration_minutes
          - timezone
        slots:
          type: array
          items:
            type: object
            properties:
              start:
                type: string
                format: date-time
                example: '2026-07-15T16:00:00.000Z'
              end:
                type: string
                format: date-time
                example: '2026-07-15T16:30:00.000Z'
            required:
            - start
            - end
      required:
      - booking_page
      - slots
    SubmitBooking:
      type: object
      properties:
        name:
          type: string
          minLength: 1
          maxLength: 200
        email:
          type: string
          maxLength: 320
          format: email
        notes:
          type: string
          maxLength: 2000
        start:
          type: string
          format: date-time
      required:
      - name
      - email
      - start
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: 'API key with `chr_sk_*` for org-level access or `chr_ak_*` for agent-scoped access. Pass in the Authorization header: `Authorization: Bearer chr_sk_...`'
    SessionAuth:
      type: apiKey
      in: cookie
      name: chronary_session
      description: Console session JWT (HS256), issued by sign-in and sent as the `chronary_session` cookie (a Bearer JWT is also accepted). This is NOT a chr_sk_*/chr_ak_* API key — API keys are rejected with 401 on these endpoints.
x-agent-self-signup:
  url: https://api.chronary.ai/v1/agent/sign-up
  verify_url: https://api.chronary.ai/v1/agent/verify
  restricted_key_returned: true
  human_in_the_loop: otp_email
  rate_limit: 5 requests per 60s per client IP
x-agent-bootstrap-script:
  npx: npx @chronary/agent-init@latest
  shell: https://chronary.ai/agent-init.sh
  description: One-liner that performs sign-up, prompts for OTP, verifies, and creates a smoke calendar. Accepts CHRONARY_EMAIL and CHRONARY_OTP env vars for non-interactive flows.
x-llms-txt: https://docs.chronary.ai/llms.txt
x-llms-full-txt: https://docs.chronary.ai/llms-full.txt
x-mcp-server-card: https://chronary.ai/.well-known/mcp/server-card.json
x-api-catalog: https://chronary.ai/.well-known/api-catalog