Channel Kinds
The surfaces and predicates each connectable channel kind publishes — what a
route's surface and match can name.
Overview
Every connectable kind (whatsapp, discord) declares its own surfaces —
named conversational shapes, like a 1:1 DM or a shared server thread — and the
predicates its routes can match on: an engine-wide vocabulary every kind
shares (address_known), plus whatever the kind itself contributes
(guild_id on Discord).
GET /v1/channel-kinds reads this
registry directly, so a console can render a route's condition builder
without hardcoding either vocabulary.
See the OpenAPI spec for the full schema reference, or browse it rendered under API Reference → Channel Kinds.
Data Model
ChannelKind
| Field | Type | Description |
|---|---|---|
kind | string | whatsapp or discord. |
surfaces | array of object | { name, title, shared } — this kind's conversational shapes. |
predicates | array of object | { name, type } — the match keys a route on this kind can use. |
shared: true means several humans share one conversation there (a thread) —
worth knowing before you route it to an agent with account-scoped tools.
Key Concepts
Today's surfaces
| Kind | Surface | shared | Identifier |
|---|---|---|---|
whatsapp | dm | false | whatsapp:dm:<phone> |
discord | dm | false | discord:dm:<user_id> |
discord | guild_thread | true | discord:thread:<guild_id>:<channel_id> |
Today's predicates
| Predicate | Scope | Type | Matches |
|---|---|---|---|
address_known | every kind | boolean | Whether this project has seen the identifier before. |
guild_id | discord | string | Which server the message came from — how a guild is granted an agent at all. |
Examples
List every channel kind, its surfaces and its predicates:
- CLI
- SDK
- curl
naturali list-channel-kinds
const { data } = await naturali.channels.listChannelKinds();
curl https://api.naturali.ai/v1/channel-kinds \
-H "Authorization: Bearer $NATURALI_API_KEY"