AuralisDocs
OperationsChannels and email

Connect or reconfigure a channel

Record this workspace's connection for a channel, creating it or replacing it wholesale.

/v1/channels/{channel}Editor
Operation id
upsert_channel_connection
Access
A viewer is refused.
PUT/v1/channels/{channel}

Record this workspace's connection for a channel, creating it or replacing it wholesale.

This is a replace, not a merge. config is written wholesale, so a save that omits a key deletes it. Send the whole configuration every time, and remember that a read gives you redacted values, so do not write back what you just read: *** would be stored literally.

A connection may be stored for a channel whose adapter does not exist yet. The connection records intent and configuration, and GET /v1/channels reports adapter_available: false until an adapter ships.

Config values are treated as credentials: everything except a short allowlist of operator descriptors is returned redacted on every read.

An OAuth token in config is refused with 400 channel_credential_misplaced rather than stored, because this field is replaced in full on every save and a cleared refresh token cannot be typed back in by anyone. The refusal names the route that stores it properly.

A stored connection does not mean traffic is flowing. It records what an operator configured.

Tenancy: the request is scoped to one workspace, and the credential presented is what selects it. A caller with no membership in that workspace is refused with 404, which is indistinguishable from a workspace that does not exist.

Authorisation: editor, admin or owner. A viewer receives 403 insufficient_role.

Access: Authorization: Bearer carrying either a realm access token or an API key. A key must hold the channels:write scope, and the workspace role of the person who owns it must meet the floor above.

Authorization

AuthorizationBearer <token>

A realm-issued access token, presented as Authorization: Bearer <token>. It acts as the person who signed in, and every operation resolves their workspace role live from the membership record.

In: header

Path Parameters

channel*Channel

Request Body

application/json

TypeScript Definitions

Use the request body type in TypeScript.

Response Body

application/json

application/json

application/json

application/json

application/json

application/json

application/json

curl -X PUT "https://example.com/v1/channels/string" \  -H "Content-Type: application/json" \  -d '{    "enabled": true,    "display_name": "Support SMS",    "config": {      "from_number": "+15550199",      "auth_token": "the provider\'s token"    }  }'
{  "channel": "sms",  "display_name": "Support SMS",  "adapter_available": true,  "ticket_source": "sms",  "handle_kind": "phone_number",  "outbound_supported": false,  "inbound_path": "/v1/ingest/sms",  "details": {},  "connected": true,  "enabled": true,  "config": {    "from_number": "+15550199",    "auth_token": "***"  },  "created_at": "2026-05-19T15:22:00+00:00",  "updated_at": "2026-08-14T08:10:00+00:00"}