CalendarForm
Developers

API, webhooks and MCP

Connect CalendarForm to your own systems, to Zapier, Make or n8n, or to AI assistants. Everything goes through the same checks as the booking page, and counts toward the same free allowance.

Authentication

Create a key in Dashboard › Developers. Send it on every request. Keys are shown once and stored only as a hash; revoke a key any time.

curl https://calendarform.bobwork.ai/api/v1/services \
  -H "Authorization: Bearer cfk_..."

Endpoints

PathWhat it does
GET/api/v1/meYour business and this month's usage
GET/api/v1/servicesBookable services and classes
GET/api/v1/availability?service=&date=&days=Free start times (business time zone date, up to 14 days)
GET/api/v1/bookings?from=&to=Bookings between two ISO times (max 500)
POST/api/v1/bookingsCreate a booking: service, starts_at, name, email, phone?, staff_id?, answers?
POST/api/v1/bookings/{id}/cancelCancel a future booking; the customer is emailed
GET/api/v1/formsForms with their fields
GET/api/v1/forms/{id}/submissions?since=Form entries (max 500 per call)
POST/api/v1/forms/{id}/submissionsSend a form entry: { answers: { fieldId: value } }
curl -X POST https://calendarform.bobwork.ai/api/v1/bookings \
  -H "Authorization: Bearer cfk_..." -H "Content-Type: application/json" \
  -d '{"service":"hatha-flow","starts_at":"2026-11-04T01:30:00.000Z",
       "name":"Aisha Lee","email":"aisha@example.com","answers":{"q1":"Beginner"}}'

Errors are JSON: { "error": { "code": "slot_taken", "message": "…" } }. Codes: unauthorized 401, not_found 404, invalid 400, slot_taken 409, out_of_credits 402, rate_limited 429. Each key allows 600 requests and 120 bookings or entries per hour.

Webhooks

Add an https URL in Dashboard › Developers and pick events: booking.created, booking.cancelled, submission.created. We POST JSON and sign it with your webhook secret:

CalendarForm-Signature: t=1793412000,v1=<hex HMAC-SHA256(secret, "t.body")>

// Node: verify
const [t, v1] = sig.match(/t=(\d+),v1=([0-9a-f]+)/).slice(1);
const ok = crypto.createHmac('sha256', secret).update(`${t}.${rawBody}`).digest('hex') === v1;

Answer with any 2xx within 10 seconds. A webhook that fails 20 times in a row is switched off; switch it back on in the dashboard.

MCP server for AI assistants

CalendarForm speaks the Model Context Protocol at https://calendarform.bobwork.ai/mcp (Streamable HTTP, JSON). Tools: list_services, get_availability and book for any business by its booking-page slug; with your API key also list_bookings and cancel_booking for your own business.

{
  "mcpServers": {
    "calendarform": {
      "url": "https://calendarform.bobwork.ai/mcp",
      "headers": {
        "Authorization": "Bearer cfk_... (optional)"
      }
    }
  }
}

Ask your assistant: "Book me a trial class at demo-yoga next Tuesday morning." It checks the timetable, asks you to confirm, and books. You get the same confirmation email as from the booking page.

FAQ

Questions

Does CalendarForm have an API?

Yes. A JSON REST API at /api/v1 lets you read services and free times, create and cancel bookings, and read or send form entries. Create a key in Developers in your dashboard.

Does CalendarForm have webhooks?

Yes. Booking created, booking cancelled and form submitted events are POSTed as signed JSON to your URL, including Zapier, Make and n8n catch-hook URLs.

Is there an MCP server for AI assistants?

Yes. Point any MCP client at /mcp. Without a key, assistants can see a business's services and book like a customer. With the business's API key they can also list and cancel its bookings.

Does the API cost extra?

No. Bookings and form entries made through the API or MCP count toward the same free monthly allowance and $5 packs as any other.