Developers

Add Calendral to your product without rebuilding scheduling.

Use Calendral as the scheduling engine behind your own website or app. Fetch real availability, create bookings server-to-server, and subscribe to lifecycle webhooks from one API-first surface.

Secret-key auth

Server-to-server bearer auth with reveal-once API keys managed in the dashboard.

Booking API

Read event types, fetch slots, create bookings, and approve or decline pending requests.

Webhooks

Subscribe to booking lifecycle events with signed deliveries and retry support.

Hosted engine

Keep admin setup in Calendral while your product owns the frontend experience.

Auth and Endpoints

One API for the scheduling path your app actually needs.

`GET /api/v1/profile` returns the Calendral identity behind your integration.

`GET /api/v1/event-types` and `GET /api/v1/event-types/:id` expose bookable event configuration.

`GET /api/v1/event-types/:id/availability` returns server-authoritative slots with notice windows, overrides, capacity, buffers, and busy-calendar checks applied.

`POST /api/v1/bookings` creates bookings with required idempotency protection.

`POST /api/v1/bookings/:id/cancel|reschedule|approve|decline` lets your product manage the full lifecycle.

Rate limits

Design your integration around backend-to-backend calls, cache read responses where appropriate, and always send an `Idempotency-Key` for booking writes.

Booking flow example
const response = await fetch("https://your-domain.com/api/v1/event-types/:id/availability?start=2026-04-10&end=2026-04-10&timezone=Europe/Madrid", {
  headers: {
    Authorization: "Bearer clr_live_...",
  },
});

const availability = await response.json();

await fetch("https://your-domain.com/api/v1/bookings", {
  method: "POST",
  headers: {
    Authorization: "Bearer clr_live_...",
    "Content-Type": "application/json",
    "Idempotency-Key": crypto.randomUUID(),
  },
  body: JSON.stringify({
    event_type_id: "evt_123",
    booker_name: "Ada Lovelace",
    booker_email: "ada@example.com",
    start_at: availability.days[0].slots[0].start_at,
    end_at: availability.days[0].slots[0].end_at,
  }),
});

Architecture

Your frontend calls your backend.

Your backend calls Calendral using a secret API key.

Calendral resolves availability, writes the booking, syncs calendars, then emits signed webhooks back to your backend.

Webhooks

Keep your app state in sync with signed booking events.

Subscribe to `booking.pending`, `booking.confirmed`, `booking.cancelled`, `booking.rescheduled`, `booking.completed`, and `booking.no_show`. Deliveries are signed with HMAC SHA-256 in the `Calendral-Signature` header.

Signature verification sketch
import crypto from "node:crypto";

const signature = req.headers["calendral-signature"];
const expected = crypto
  .createHmac("sha256", process.env.CALENDRAL_WEBHOOK_SECRET!)
  .update(`${timestamp}.${rawBody}`)
  .digest("hex");

Build with Calendral

Use our scheduling engine, keep your own product surface.

Ship booking flows faster by outsourcing availability resolution, calendar sync, and lifecycle events to Calendral.