Skip to main content
A provider connection links a third-party account to your org and exposes a curated set of agent tools (e.g. “create a calendar event”, “post to Slack”). You control capability at two levels:
  • Connection-level allowed_operations — which operation groups the whole connection permits (e.g. Slack post: false).
  • Per-agent attachments — which agents may use the connection, and optionally a narrower per-agent operation override.
OAuth-based providers are connected from the dashboard (the browser OAuth consent flow can’t be driven by an API key). Once connected, everything on this page is manageable via the API. Cal.com uses an API key instead and can be connected directly.
Authorization here is operation-level, not record-level — see Authorization model below before assuming an agent’s access can be scoped to specific channels, contacts, or calendars.

Providers and their tools

Each tool maps to one operation group — disabling the group removes every tool it gates from all attached agents.

Endpoints

{connection_id} is the connection’s UUID. All writes require the admin role. (The browser-only OAuth start/callback routes are not part of the public API.)

Connection object

Tokens and API keys are never returned by any endpoint.

List connections

Response
providers is the full catalog with per-provider availability (configured is false when the ThunderPhone deployment lacks that provider’s OAuth app). agents is a convenience list for building attachment UIs.

Update allowed operations

allowed_operations must be an object whose keys are that provider’s operation groups (unknown keys are rejected with 400). Returns the updated connection object.
Enabling an operation the OAuth grant doesn’t cover (e.g. turning on Slack post when chat:write wasn’t granted) makes the tool fail at call time — reconnect from the dashboard to grant the extra scopes.

Authorization model

There are three layers, evaluated together at tool-synthesis and tool-execution time:
  1. Connection-level allowed_operations — the ceiling for the whole connection, set via PATCH.
  2. Per-agent override (agent_attachments[].allowed_operations) — an optional narrower subset for one agent, set via attach/detach. null means “inherit the connection’s ceiling” — an override can only turn operations off, never grant one the connection ceiling denies.
  3. granted_scopes — what the OAuth grant actually covers. Each operation requires specific scopes (e.g. Slack post requires chat:write); an operation enabled at both the connection and agent level still can’t run if the grant doesn’t cover it.
effective_operations on the connection object is operations (1) and (3) intersected — it does not factor in a per-agent override, since that’s per-attachment. The tool_names on each agent_attachments entry is the fully-intersected result: connection ceiling ∩ per-agent override (if any) ∩ granted scopes. That list is what the agent’s tool schema actually contains, and execute_provider_tool re-checks the same intersection at call time (defense in depth against a stale route or shared connection dispatching a call the agent’s current config would no longer allow).
Authorization is provider-level, not per-record. Toggling an operation on grants (or denies) it across every record the OAuth scope reaches — there is no per-channel, per-contact, per-object, or per-calendar scoping. Concretely:
  • An agent with Slack post: true can post to any channel the connected bot/user can reach — not a chosen subset of channels.
  • An agent with Slack view / search can read any channel the grant reaches, same caveat.
  • An agent with HubSpot or Salesforce write: true can create or update any record type/object the OAuth grant covers, not a restricted list of pipelines or object types.
  • Google Calendar operations always act on the connected account’s primary calendar — there’s no way to scope an agent to a secondary or shared calendar.
If you need to isolate what one agent can touch within a provider (e.g. “this agent may only post in #support”), connect a separate provider account scoped to just that resource (a dedicated Slack app/bot invited to one channel, a HubSpot user with restricted CRM permissions, a secondary Google account whose primary calendar is the one you want exposed) and attach that connection instead. Per-resource ACLs on a single connection (e.g. an allow-list of Slack channel IDs) are not implemented — this has come up before as a half-built field with no way to populate it, and is tracked as a roadmap item rather than something to configure today.

Disconnect

DELETE /v1/provider-connections/{id} returns 204 No Content and removes the connection and every agent attachment.

Connect with an API key

Only for auth_kind: "api_key" providers — currently Cal.com.
The key is validated against the provider before saving; invalid keys return 400 with an api_key field error. Returns 201 Created with the connection object.

Attach / detach agents

Attaching gives the agent the connection’s tools on its next deploy of call config (tool lists are computed per call).
PUT is an upsert — repeat it to change the override. Returns the connection object with updated agent_attachments. DELETE on the same path detaches the agent (204).

Configure the target Google Sheet

sheets_append_row writes to one configured spreadsheet + sheet per connection. Two-step setup (Sheets connections only — other providers return 404 on these routes):

Inspect a spreadsheet

Response
Accepts a full URL or a bare spreadsheet id. 400 when the sheet is inaccessible to the connected account.

Configure

Reads row 1 of the chosen sheet as the column headers (at least one non-empty header required — 400 otherwise) and stores spreadsheet_id, sheet_name, and the header map in provider_metadata. Returns the updated connection object. The agent tool then appends one row per call, mapping its arguments onto those headers.

Agents

Attached tools appear alongside the agent’s other tools.

MCP Servers

Bring arbitrary tools via the Model Context Protocol.

Integrations

Wrap any HTTP API as an agent tool.

Calls

Tool invocations show up in call history.