- Calendar integrations — connect an external scheduling provider (Acuity Scheduling, Cal.com, Calendly, Google Calendar, Outlook) once, assign it to an assistant, and the assistant automatically gets booking tools for every call.
- The built-in booking engine — define your own event types with weekly availability and get a public, embeddable booking page at
/book/{workspace}/{slug}, ICS invitation emails, and anativeintegration your assistants can book against. No external account required.
Providers at a glance
Calendly link mode: Calendly’s Scheduling API requires a paid Calendly plan. If your plan cannot book directly, set the integration’s
booking_mode to link — the assistant then agrees on a rough time with the caller and sends a single-use scheduling link by SMS or email (link_channel) instead of hard-booking. Integrations that hit the paid-plan restriction at call time are flagged with status link_mode.Connecting an integration
Go to Booking → Integrations and pick a provider card:- Cal.com — paste your API key (Cal.com → Settings → Developer → API Keys) and the numeric event type ID (visible in the event type URL). Optional timezone override — make sure it matches the Cal.com event type.
- Calendly — click Connect with Calendly, approve access, then choose an active event type by name and duration. The account connection can be reused by multiple integrations; each integration selects exactly one event type. Choose the booking mode (
apiorlink), link channel, and Book/Cancel permissions. Full Calendly resource URIs and rotating refresh tokens stay internal. - Acuity Scheduling — click Connect with Acuity, approve the
api-v1access request, then choose an appointment type. Optionally select one specific Acuity calendar/person; choose Any available calendar to let Acuity route each booking to an available calendar offering that appointment type. Enable or disable Book, Cancel and Reschedule per integration; Reschedule is forced off for series because Acuity’s client API rejects moving a series. OAuth tokens stay server-side and are never returned by the API. - Google / Outlook — click Connect and complete the OAuth consent. The connection is stored per workspace and reused by every integration and event type that references it.
- Native — pick one of your booking event types (see below).
••• (send ••• on update to keep a stored legacy secret).
Deleting the final integration that uses an Acuity account revokes its OAuth token through Acuity’s disconnect endpoint and removes the local connection. An unused account can also be removed with Disconnect account in the Acuity editor; shared accounts cannot be disconnected until their remaining integrations are removed.
For a self-managed Calendly developer app, register
https://www.ouraicalling.de/api/oauth/calendly/callback as the production
Redirect URI. Enable users:read, event_types:read, locations:read,
scheduled_events:write, and scheduling_links:write. Webhook scopes and the
webhook signing key are not required for this connection.For the Acuity OAuth client, register
{OAUTH_REDIRECT_BASE_URL}/api/mcp-connectors/callback as an exact redirect
URI. The callback recognizes Acuity’s namespaced, single-use state before the
generic MCP connector handler and returns the browser to the original
workspace domain. Configure the client with ACUITY_OAUTH_CLIENT_ID and
ACUITY_OAUTH_CLIENT_SECRET; set ACUITY_OAUTH_REDIRECT_URI only when you
need to pin one exact registered URI. Never expose the client secret in browser
code. Starting this interactive OAuth flow requires a user-bound owner/admin
credential; service-account credentials are intentionally rejected.Assigning to an assistant
Open the assistant’s settings and tick the integrations it should use (orPUT /api/v1/assistants/{id}/integrations). For every assigned integration the assistant gets these tools on every call:
If more than one integration is assigned, tool names get the integration name as a suffix (for example
check_availability_sales). Slots are always spoken in the assistant timezone — set it in the assistant’s settings.
The built-in booking engine
Create event types under Booking in the dashboard (or via API/MCP):- Name, slug, duration — the slug is unique within the workspace and becomes the public page URL
/book/{workspace}/{slug}(workspace= the tenantbooking_handle). - Weekly availability — time windows per weekday in the event type’s timezone, e.g. Mon–Fri 09:00–17:00.
- Buffers & rules — buffer before/after each booking, minimum notice, booking horizon (
max_days_ahead), and slot increment. - Calendar sync (optional) — link a connected Google/Outlook calendar: its busy times are subtracted from the offered slots, and confirmed bookings are pushed as calendar events (attendees get the provider’s invite).
Public booking page & embed
Each active event type has a tenant-branded public page athttps://<your-domain>/book/{workspace}/{slug} — no login required. Embed it anywhere:
Booking from calls
Create an integration with providernative pointing at the event type and assign it to an assistant — mid-call bookings then land in the same calendar with source: "call" and a link to the call record.
Plan gating
The whole feature is gated by thecalendar_integrations plan flag (platform admin → Plans). Without it, creating integrations or event types returns 403; existing public booking pages stop accepting new bookings.
API & MCP
Everything above is available in the public REST API and as MCP tools athttps://<your-domain>/mcp:
GET /api/v1/bookings and list_bookings support event type, source and date filters. Use view=upcoming|unconfirmed|recurring|past|cancelled for the same booking views as the dashboard, or use an exact status filter; view and status are mutually exclusive.
Cancelling a booking sends a
METHOD:CANCEL ICS update, so the appointment disappears from the invitee’s calendar automatically.