- Connection-level
allowed_operations— which operation groups the whole connection permits (e.g. Slackpost: false). - Per-agent attachments — which agents may use the connection, and optionally a narrower per-agent operation override.
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.
Authorization model
There are three layers, evaluated together at tool-synthesis and tool-execution time:- Connection-level
allowed_operations— the ceiling for the whole connection, set via PATCH. - Per-agent override (
agent_attachments[].allowed_operations) — an optional narrower subset for one agent, set via attach/detach.nullmeans “inherit the connection’s ceiling” — an override can only turn operations off, never grant one the connection ceiling denies. granted_scopes— what the OAuth grant actually covers. Each operation requires specific scopes (e.g. Slackpostrequireschat: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).
Disconnect
DELETE /v1/provider-connections/{id} returns 204 No Content and
removes the connection and every agent attachment.
Connect with an API key
Only forauth_kind: "api_key" providers — currently Cal.com.
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
400 when the sheet is
inaccessible to the connected account.
Configure
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.
Related
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.