Bright Canoe API Documentation
Everything you need to integrate Bright Canoe into external applications, custom booking frontends, AI agent environments, and CRM workflows.
Authentication Protocols
Bright Canoe uses explicit security layers tailored to where the request originates.
Used for External Booking v1 and External Roster v1 APIs. Never expose in client-side code.
X-API-Key: sk_live_...
Used for Headless Booking, Public Roster Enrollment, and Direct Booking.
Origin: https://your-site.com
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.
/api/v1/booking/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_...) |
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"
]
}
]
}
/api/v1/booking/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 |
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"
}
]
}
/api/v1/booking/calendar
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 |
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"
]
}
]
}
/api/v1/booking/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 |
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"
}
]
}
/api/v1/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 |
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.
/api/v1/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 |
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"
}
]
}
/api/v1/rosters/{rosterId}
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 |
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": []
}
}
/api/v1/rosters/{rosterId}/members
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 |
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"
}
}
/api/v1/rosters/{rosterId}/members/{memberId}
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 |
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"
}
/api/v1/rosters/{rosterId}/availability
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 |
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.
/api/v1/public/businesses/{orgSlug}
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 |
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"
}
}
/api/v1/public/businesses/{orgSlug}/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 |
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"
}
]
}
/api/v1/public/businesses/{orgSlug}/bookings
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 |
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"
}
/api/v1/public/businesses/{orgSlug}/concierge
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 |
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.
/api/v1/public/rosters/{shareToken}
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 |
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
}
/api/v1/public/rosters/{shareToken}/enroll
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 |
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.
/api/booking/available-slots
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 |
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"
]
}
/api/booking/calendar-view
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 |
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"
]
}
/api/booking
Public endpoint to book an appointment with a host.
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
| Content-Type | header | string | YES | application/json |
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).
/api/mcp
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 |
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"
}
]
}
}
/api/mcp/sse
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 |
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.
/api/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 |
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
}
/meetstream/meeting/webhook
Inbound webhook receiving automated meeting bot transcripts, summaries, and recording links.
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
}
/api/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 |
// Configured inside Twilio Console Phone Numbers > Messaging Webhook URL
check_circle Sample Response (HTTP 200 TwiML response or XML) expand_more
<Response></Response>
/api/whatsapp/webhook
Receives inbound WhatsApp chat messages and delivery status receipts.
// Configured inside Meta WhatsApp Developer Portal
check_circle Sample Response (HTTP 200 Acknowledged) expand_more
{
"status": "EVENT_RECEIVED"
}
/api/telegram/webhook
Receives inbound Telegram messages and commands from connected bot users.
// Set via Telegram Bot API setWebhook call
check_circle Sample Response (HTTP 200 OK) expand_more
{
"ok": true
}
Live Swagger UI Sandbox
Test live requests against the Bright Canoe API. Enter your API key in the Authorize dialog.