drag_indicator
support_agent
Support & AI Guide
API Documentation
External REST & AI MCP APIs

Bright Canoe API Documentation

Everything you need to integrate Bright Canoe into external applications, custom booking frontends, AI agent environments, and CRM workflows.

Total Endpoints 26
Base URL https://brightcanoe.com
Specification OpenAPI 3.1
AI Protocols MCP JSON-RPC & SSE
lock

Authentication Protocols

Bright Canoe uses explicit security layers tailored to where the request originates.

API Key (Server-to-Server)

Used for External Booking v1 and External Roster v1 APIs. Never expose in client-side code.

X-API-Key: sk_live_...
Browser-Safe & CORS

Used for Headless Booking, Public Roster Enrollment, and Direct Booking.

Origin: https://your-site.com
AI Model Context Protocol

Standard JSON-RPC 2.0 & SSE transport for AI agents and developer IDEs.

Authorization: Bearer sk_live_...

External Booking API (v1)

Server-to-server booking, availability querying, and consolidated calendar access for custom integrations and third-party systems.

Auth: API Key (X-API-Key)
GET /api/v1/booking/event-types
List Active Event Types

Retrieve all active appointment and service types configured for the account.

Parameter In Type Required Description
X-API-Key header string YES Your Bright Canoe API key (sk_live_...)
Example Request:
curl -X GET "https://brightcanoe.com/api/v1/booking/event-types" \
  -H "X-API-Key: sk_live_your_key_here"
check_circle Sample Response (HTTP 200 List of active event types) expand_more
{
  "eventTypes": [
    {
      "id": "evt_38291f0",
      "title": "60-Minute Strategy Session",
      "slug": "strategy-session",
      "description": "Deep dive coaching and business architecture review.",
      "duration": 60,
      "price": 150,
      "currency": "usd",
      "active": true,
      "isGroupEvent": false,
      "maxAttendees": null,
      "waitlistEnabled": false,
      "questions": [],
      "meetingOptions": {
        "locationType": "google_meet"
      },
      "serviceMode": "online",
      "providerIds": [
        "usr_abc123"
      ]
    }
  ]
}
GET /api/v1/booking/availability
Query Slot Availability

Find ranked available booking slots for a specific event type within a date range.

Parameter In Type Required Description
X-API-Key header string YES Your Bright Canoe API key (sk_live_...)
eventTypeId query string YES ID of the event type to check
startDate query string YES Start date in YYYY-MM-DD format
endDate query string YES End date in YYYY-MM-DD format
Example Request:
curl -X GET "https://brightcanoe.com/api/v1/booking/availability?eventTypeId=evt_38291f0&startDate=2026-10-01&endDate=2026-10-07" \
  -H "X-API-Key: sk_live_your_key_here"
check_circle Sample Response (HTTP 200 Ranked available slots) expand_more
{
  "slots": [
    {
      "start": "2026-10-01T14:00:00.000Z",
      "end": "2026-10-01T15:00:00.000Z",
      "score": 95,
      "providerId": "usr_abc123"
    },
    {
      "start": "2026-10-01T16:00:00.000Z",
      "end": "2026-10-01T17:00:00.000Z",
      "score": 90,
      "providerId": "usr_abc123"
    }
  ]
}
GET /api/v1/booking/calendar
Get Consolidated Calendar Events

Read consolidated calendar events across connected Google Calendar, Zoom, and Bright Canoe schedules.

Parameter In Type Required Description
X-API-Key header string YES Your Bright Canoe API key (sk_live_...)
startDate query string optional Filter start ISO 8601 string
endDate query string optional Filter end ISO 8601 string
Example Request:
curl -X GET "https://brightcanoe.com/api/v1/booking/calendar?startDate=2026-10-01T00:00:00Z" \
  -H "X-API-Key: sk_live_your_key_here"
check_circle Sample Response (HTTP 200 Calendar events list) expand_more
{
  "events": [
    {
      "id": "cal_849204",
      "title": "Product Review with Client",
      "start": "2026-10-02T18:00:00.000Z",
      "end": "2026-10-02T19:00:00.000Z",
      "isAllDay": false,
      "source": "google_calendar",
      "status": "confirmed",
      "location": "https://meet.google.com/xyz-abcd-efg",
      "meetingType": "google_meet",
      "description": "Quarterly roadmap check-in",
      "attendees": [
        "client@example.com",
        "host@example.com"
      ]
    }
  ]
}
GET /api/v1/booking/bookings
List Existing Bookings

Retrieve all confirmed and pending customer appointments.

Parameter In Type Required Description
X-API-Key header string YES Your Bright Canoe API key
startDate query string optional Optional start boundary ISO
endDate query string optional Optional end boundary ISO
Example Request:
curl -X GET "https://brightcanoe.com/api/v1/booking/bookings" \
  -H "X-API-Key: sk_live_your_key_here"
check_circle Sample Response (HTTP 200 Bookings list) expand_more
{
  "bookings": [
    {
      "id": "bkg_918231",
      "hostId": "usr_abc123",
      "eventTypeId": "evt_38291f0",
      "name": "Jane Doe",
      "email": "jane.doe@example.com",
      "phone": "+15551234567",
      "startTime": "2026-10-05T15:00:00.000Z",
      "endTime": "2026-10-05T16:00:00.000Z",
      "status": "confirmed",
      "createdAt": "2026-09-20T10:00:00.000Z"
    }
  ]
}
POST /api/v1/booking
Create Booking

Programmatically create a booking on behalf of a client. Must be proxied through your backend server.

Parameter In Type Required Description
X-API-Key header string YES Your Bright Canoe API key
Content-Type header string YES application/json
Example Request:
curl -X POST "https://brightcanoe.com/api/v1/booking" \
  -H "X-API-Key: sk_live_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "eventTypeId": "evt_38291f0",
    "startTime": "2026-10-05T15:00:00.000Z",
    "endTime": "2026-10-05T16:00:00.000Z",
    "name": "Jane Doe",
    "email": "jane.doe@example.com",
    "phone": "+15551234567"
  }'
check_circle Sample Response (HTTP 200 Booking created successfully) expand_more
{
  "success": true,
  "bookingId": "bkg_918231",
  "status": "confirmed",
  "meetingLink": "https://meet.google.com/xyz-abcd-efg"
}

External Roster API (v1)

Manage class and cohort rosters, check seat availability, enroll attendees, and handle waitlists programmatically.

Auth: API Key (X-API-Key)
GET /api/v1/rosters
List Rosters

Retrieve all class and cohort rosters created by the account owner.

Parameter In Type Required Description
X-API-Key header string YES Your Bright Canoe API key
Example Request:
curl -X GET "https://brightcanoe.com/api/v1/rosters" \
  -H "X-API-Key: sk_live_your_key_here"
check_circle Sample Response (HTTP 200 List of rosters) expand_more
{
  "rosters": [
    {
      "id": "rst_582910",
      "name": "Saturday Morning Yoga Cohort",
      "description": "Intermediate Vinyasa flow, max 15 participants.",
      "maxCapacity": 15,
      "activeCount": 12,
      "waitlistCount": 2,
      "shareToken": "a8e1b93f0c4765d18e9a2b",
      "eventTypeId": "evt_yoga_60"
    }
  ]
}
GET /api/v1/rosters/{rosterId}
Get Roster with Members

Retrieve detailed roster info along with active and waitlisted member lists.

Parameter In Type Required Description
X-API-Key header string YES Your Bright Canoe API key
rosterId path string YES Roster document ID
Example Request:
curl -X GET "https://brightcanoe.com/api/v1/rosters/rst_582910" \
  -H "X-API-Key: sk_live_your_key_here"
check_circle Sample Response (HTTP 200 Roster and members) expand_more
{
  "roster": {
    "id": "rst_582910",
    "name": "Saturday Morning Yoga Cohort",
    "maxCapacity": 15,
    "activeCount": 1,
    "waitlistCount": 0
  },
  "members": {
    "active": [
      {
        "id": "mem_1",
        "name": "Alice Smith",
        "email": "alice@example.com",
        "status": "active"
      }
    ],
    "waitlisted": []
  }
}
POST /api/v1/rosters/{rosterId}/members
Add Member to Roster

Add an attendee to the roster. If the roster is full, the member is automatically placed on the waitlist.

Parameter In Type Required Description
X-API-Key header string YES Your Bright Canoe API key
Content-Type header string YES application/json
rosterId path string YES Target roster ID
Example Request:
curl -X POST "https://brightcanoe.com/api/v1/rosters/rst_582910/members" \
  -H "X-API-Key: sk_live_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{"name": "Robert Johnson", "email": "robert@example.com"}'
check_circle Sample Response (HTTP 201 Member added) expand_more
{
  "success": true,
  "member": {
    "id": "mem_2",
    "name": "Robert Johnson",
    "email": "robert@example.com",
    "status": "active",
    "position": 2,
    "addedAt": "2026-09-20T22:00:00.000Z"
  }
}
DELETE /api/v1/rosters/{rosterId}/members/{memberId}
Remove Member from Roster

Remove an attendee from a roster. If there is a waitlist, the next candidate is automatically promoted.

Parameter In Type Required Description
X-API-Key header string YES Your Bright Canoe API key
rosterId path string YES Roster ID
memberId path string YES Member ID to remove
Example Request:
curl -X DELETE "https://brightcanoe.com/api/v1/rosters/rst_582910/members/mem_2" \
  -H "X-API-Key: sk_live_your_key_here"
check_circle Sample Response (HTTP 200 Member removed successfully) expand_more
{
  "success": true,
  "message": "Member removed successfully"
}
GET /api/v1/rosters/{rosterId}/availability
Check Roster Capacity

Check if a roster has open spots or how many waitlist entries exist.

Parameter In Type Required Description
X-API-Key header string YES Your Bright Canoe API key
rosterId path string YES Roster ID
Example Request:
curl -X GET "https://brightcanoe.com/api/v1/rosters/rst_582910/availability" \
  -H "X-API-Key: sk_live_your_key_here"
check_circle Sample Response (HTTP 200 Capacity and waitlist details) expand_more
{
  "isFull": false,
  "spotsRemaining": 3,
  "waitlistLength": 0,
  "canEnroll": true
}

Headless Booking API (v1)

Browser-safe business catalog, multi-provider team availability, headless appointment booking, and AI concierge for separately hosted customer websites.

Auth: Public (CORS Enabled)
GET /api/v1/public/businesses/{orgSlug}
Fetch Business Catalog & Team

Public, browser-safe business catalog containing public profile, services, team providers, branding, and concierge settings.

Parameter In Type Required Description
orgSlug path string YES Organization or provider handle/slug
Example Request:
curl -X GET "https://brightcanoe.com/api/v1/public/businesses/riverside-wellness"
check_circle Sample Response (HTTP 200 Business catalog) expand_more
{
  "business": {
    "name": "Riverside Wellness Clinic",
    "slug": "riverside-wellness",
    "timezone": "America/New_York",
    "description": "Holistic physiotherapy and recovery studio.",
    "logoUrl": "https://brightcanoe.com/img/logo.png"
  },
  "services": [
    {
      "id": "srv_physio_60",
      "title": "Physiotherapy Assessment",
      "duration": 60,
      "price": 130,
      "currency": "usd"
    }
  ],
  "providers": [
    {
      "id": "prv_doc_1",
      "name": "Dr. Sarah Adams",
      "specialties": [
        "Sports Injury",
        "Post-Op Rehab"
      ]
    }
  ],
  "concierge": {
    "enabled": true,
    "endpoint": "/api/v1/public/businesses/riverside-wellness/concierge"
  }
}
GET /api/v1/public/businesses/{orgSlug}/availability
Query Live Multi-Provider Availability

Query live available booking slots across team members and service locations without exposing calendar identifiers.

Parameter In Type Required Description
orgSlug path string YES Organization handle
serviceId query string YES Service ID to book
providerId query string optional Specific provider ID or "any"
from query string YES Start ISO timestamp
to query string YES End ISO timestamp
Example Request:
curl -X GET "https://brightcanoe.com/api/v1/public/businesses/riverside-wellness/availability?serviceId=srv_physio_60&from=2026-10-01T00:00:00Z&to=2026-10-07T23:59:59Z"
check_circle Sample Response (HTTP 200 Available appointment slots) expand_more
{
  "slots": [
    {
      "start": "2026-10-02T13:00:00.000Z",
      "end": "2026-10-02T14:00:00.000Z",
      "providerId": "prv_doc_1",
      "locationId": "loc_main"
    }
  ]
}
POST /api/v1/public/businesses/{orgSlug}/bookings
Submit Headless Booking

Submit an appointment booking from a custom customer frontend. Conflict checked and rate limited.

Parameter In Type Required Description
Content-Type header string YES application/json
orgSlug path string YES Organization handle
Example Request:
curl -X POST "https://brightcanoe.com/api/v1/public/businesses/riverside-wellness/bookings" \
  -H "Content-Type: application/json" \
  -d '{
    "serviceId": "srv_physio_60",
    "providerId": "prv_doc_1",
    "start": "2026-10-02T13:00:00.000Z",
    "end": "2026-10-02T14:00:00.000Z",
    "guestName": "Alex Parker",
    "guestEmail": "alex@example.com"
  }'
check_circle Sample Response (HTTP 200 Booking created) expand_more
{
  "status": "confirmed",
  "bookingId": "bkg_712891",
  "serviceTitle": "Physiotherapy Assessment",
  "start": "2026-10-02T13:00:00.000Z"
}
POST /api/v1/public/businesses/{orgSlug}/concierge
AI Concierge Chat & Navigation Assistant

Interactive AI concierge assistant answering visitor questions and recommending services/slots.

Parameter In Type Required Description
Content-Type header string YES application/json
orgSlug path string YES Organization handle
Example Request:
curl -X POST "https://brightcanoe.com/api/v1/public/businesses/riverside-wellness/concierge" \
  -H "Content-Type: application/json" \
  -d '{"visitorId": "vis_123", "message": "What services do you offer?"}'
check_circle Sample Response (HTTP 200 Concierge reply with proposed navigation actions) expand_more
{
  "reply": "Yes, Dr. Sarah Adams has an open appointment tomorrow at 2:00 PM.",
  "actions": [
    {
      "type": "select_slot",
      "serviceId": "srv_physio_60",
      "providerId": "prv_doc_1",
      "start": "2026-10-02T14:00:00.000Z",
      "end": "2026-10-02T15:00:00.000Z"
    }
  ]
}

Public Roster Enrollment (v1)

Shareable enrollment endpoints allowing participants to inspect class capacity and enroll without an account.

Auth: Public Share Token
GET /api/v1/public/rosters/{shareToken}
Get Public Roster Information

Retrieve class details, remaining capacity, and waitlist availability via public share token.

Parameter In Type Required Description
shareToken path string YES Unique roster share token
Example Request:
curl -X GET "https://brightcanoe.com/api/v1/public/rosters/a8e1b93f0c4765d18e9a2b"
check_circle Sample Response (HTTP 200 Public roster summary) expand_more
{
  "name": "Saturday Morning Yoga Cohort",
  "description": "Intermediate Vinyasa flow",
  "maxCapacity": 15,
  "activeCount": 12,
  "isFull": false,
  "spotsRemaining": 3,
  "waitlistCount": 0
}
POST /api/v1/public/rosters/{shareToken}/enroll
Public Self-Enrollment

Enroll a guest into a class roster or waitlist without requiring an account.

Parameter In Type Required Description
Content-Type header string YES application/json
shareToken path string YES Roster share token
Example Request:
curl -X POST "https://brightcanoe.com/api/v1/public/rosters/a8e1b93f0c4765d18e9a2b/enroll" \
  -H "Content-Type: application/json" \
  -d '{"name": "Michael Chang", "email": "michael@example.com"}'
check_circle Sample Response (HTTP 200 Enrollment successful) expand_more
{
  "status": "enrolled",
  "position": 13,
  "rosterName": "Saturday Morning Yoga Cohort"
}

Public Direct Booking API

Direct scheduling endpoints used by the hosted Bright Canoe booking widget and customer profile pages.

Auth: Public / Hosted Profile
GET /api/booking/available-slots
Get Available Slots for Host

Query open scheduling slots for a specific host username and event type.

Parameter In Type Required Description
username query string YES Host username
eventTypeId query string YES Event type identifier
date query string YES Date in YYYY-MM-DD
Example Request:
curl -X GET "https://brightcanoe.com/api/booking/available-slots?username=sarah&eventTypeId=evt_123&date=2026-10-01"
check_circle Sample Response (HTTP 200 Available slots for the date) expand_more
{
  "slots": [
    "09:00",
    "10:00",
    "11:30",
    "14:00",
    "15:30"
  ]
}
GET /api/booking/calendar-view
Public Month Calendar Availability

Retrieve days with availability for a host in a specified month.

Parameter In Type Required Description
username query string YES Host username
month query string YES Month in YYYY-MM
Example Request:
curl -X GET "https://brightcanoe.com/api/booking/calendar-view?username=sarah&month=2026-10"
check_circle Sample Response (HTTP 200 Month availability status) expand_more
{
  "availableDates": [
    "2026-10-01",
    "2026-10-02",
    "2026-10-05",
    "2026-10-06"
  ]
}
POST /api/booking
Submit Public Booking Request

Public endpoint to book an appointment with a host.

Parameter In Type Required Description
Content-Type header string YES application/json
Example Request:
curl -X POST "https://brightcanoe.com/api/booking" \
  -H "Content-Type: application/json" \
  -d '{"hostUsername":"sarah","eventTypeId":"evt_123","startTime":"2026-10-01T14:00:00Z","endTime":"2026-10-01T15:00:00Z","name":"Taylor Swift","email":"taylor@example.com"}'
check_circle Sample Response (HTTP 200 Booking confirmation) expand_more
{
  "success": true,
  "bookingId": "bkg_abc999",
  "status": "confirmed"
}

AI Model Context Protocol (MCP)

Live Model Context Protocol server exposing scheduling tools and calendar resources to AI agents (Claude Desktop, Cursor, ChatGPT, Antigravity).

Auth: API Key or Bearer Token
POST /api/mcp
MCP JSON-RPC 2.0 Endpoint

Standard JSON-RPC 2.0 protocol endpoint for AI assistants (ChatGPT, Claude Desktop, Cursor, Antigravity) to list and call calendar, booking, CRM, and concierge tools.

Parameter In Type Required Description
Authorization header string YES Bearer <sk_live_apiKey> or Bearer <firebaseIdToken>
Content-Type header string YES application/json
Example Request:
curl -X POST "https://brightcanoe.com/api/mcp" \
  -H "Authorization: Bearer sk_live_your_key_here" \
  -H "Content-Type: application/json" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
check_circle Sample Response (HTTP 200 JSON-RPC 2.0 response) expand_more
{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "content": [
      {
        "type": "text",
        "text": "Found 3 available slots:\n- 2026-10-01 at 14:00 UTC\n- 2026-10-01 at 16:00 UTC\n- 2026-10-02 at 10:00 UTC"
      }
    ]
  }
}
GET /api/mcp/sse
MCP Server-Sent Events (SSE) Stream

Persistent SSE transport stream for IDEs like Cursor and desktop AI agents.

Parameter In Type Required Description
Authorization header string YES Bearer <sk_live_...>
apiKey query string optional API key if headers cannot be configured
Example Request:
curl -N "https://brightcanoe.com/api/mcp/sse?apiKey=sk_live_your_key_here"
check_circle Sample Response (HTTP 200 Server-Sent Events event stream) expand_more
event: endpoint
data: {"type":"endpoint","endpoint":"/api/mcp","server":{"name":"bright-canoe-mcp","version":"1.0.0"}}

: ping

Inbound Webhooks

Inbound event hooks received from external partner services including Stripe, Meetstream AI Bot, Twilio SMS, WhatsApp, and Telegram.

Auth: HMAC Signature / Verification
POST /api/webhook
Stripe Payments Webhook

Receives signed Stripe webhook events for plan subscription updates, successful charges, and checkout completions.

Parameter In Type Required Description
stripe-signature header string YES Stripe cryptographic webhook signature
Example Request:
curl -X POST "https://brightcanoe.com/api/webhook" \
  -H "stripe-signature: t=...,v1=..." \
  -d '{"type":"checkout.session.completed"}'
check_circle Sample Response (HTTP 200 Webhook acknowledged) expand_more
{
  "received": true
}
POST /meetstream/meeting/webhook
Meetstream AI Bot Webhook

Inbound webhook receiving automated meeting bot transcripts, summaries, and recording links.

Example Request:
curl -X POST "https://brightcanoe.com/meetstream/meeting/webhook" -H "Content-Type: application/json" -d '{"meetingId":"mtg_123","status":"completed"}'
check_circle Sample Response (HTTP 200 Processed) expand_more
{
  "success": true
}
POST /api/sms/webhook
Twilio Inbound SMS Webhook

Receives customer text messages sent to your dedicated business phone number.

Parameter In Type Required Description
X-Twilio-Signature header string YES Twilio HMAC-SHA1 signature
Example Request:
// Configured inside Twilio Console Phone Numbers > Messaging Webhook URL
check_circle Sample Response (HTTP 200 TwiML response or XML) expand_more
<Response></Response>
POST /api/whatsapp/webhook
Meta WhatsApp Cloud API Webhook

Receives inbound WhatsApp chat messages and delivery status receipts.

Example Request:
// Configured inside Meta WhatsApp Developer Portal
check_circle Sample Response (HTTP 200 Acknowledged) expand_more
{
  "status": "EVENT_RECEIVED"
}
POST /api/telegram/webhook
Telegram Bot Updates Webhook

Receives inbound Telegram messages and commands from connected bot users.

Example Request:
// Set via Telegram Bot API setWebhook call
check_circle Sample Response (HTTP 200 OK) expand_more
{
  "ok": true
}