A consumer is an entry point where users interact with the AI. A Slack channel, an API key, a WhatsApp number, or a CLI integration. Each consumer is bound to exactly one workspace, preventing cross-workspace data pollution.
Consumer types
| Type | Description |
|---|
slack | Slack channel via Socket Mode. Users mention the bot to query. |
api | Direct HTTP API. Query via POST /api/workspaces/:id/query. |
whatsapp | WhatsApp number (via webhook). |
claude-code | CLI integration for developer workflows. |
Consumer types are provider-agnostic. Adding a new consumer type is a registry change on the server; no route modifications needed.
How consumers work
Slack
- Configure Slack bot credentials at the organisation level (Settings > Integrations)
- Bind a Slack channel to a workspace consumer
- Users mention the bot in the channel to start a query
- SupaProxy routes the message to the correct workspace based on channel binding
- The response is posted back to the Slack thread
A single Slack bot is shared across all workspaces. Individual workspaces bind channels to it. A channel can only belong to one workspace.
API
The API consumer is always available. Query any workspace directly:
POST /api/workspaces/:id/query
Content-Type: application/json
Cookie: supaproxy_session=YOUR_JWT
{"query": "Your question here"}
Channel binding
Each consumer can have multiple channels bound to it. For Slack, a channel is a Slack channel ID. The binding ensures:
- Messages from that channel route to the correct workspace
- One channel cannot be bound to multiple workspaces
- Channel metadata (name, type) is stored for observability
Consumer status
| Status | Meaning |
|---|
active | Consumer is running and accepting messages |
inactive | Consumer is configured but not running |