> For the complete documentation index, see [llms.txt](https://hub.equipme.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hub.equipme.io/development/api-reference-app/channel.md).

# Channel

A **channel** is how Solvio talks to the outside world — an email mailbox today, other transports later. A thread bound to a channel delivers its messages through it and receives replies back into the same conversation.

Two properties decide what a channel is:

|           | Values                                                                                        |
| --------- | --------------------------------------------------------------------------------------------- |
| `kind`    | the transport: `EMAIL`, `WEBHOOK`, `TEAMS`, `SMS`, `WHATSAPP`, `WEBCHAT`, `NOTICE`            |
| `purpose` | what it is used for: `THREAD` and `TICKET` carry conversations, `NOTIFICATION` only sends out |

`config` is a typed object per purpose — it holds static defaults such as the sender name a channel uses, never conditions. It is validated against the purpose when a channel is created or changed.

Only `EMAIL` channels with a conversational purpose can be created at the moment; every other kind is answered with `400`. The addresses a channel uses are described under *Channel Addresses*.

## List channels

> Returns the tenant's channels, ordered by \`id\` unless \`sort\` says otherwise.\
> \
> \*\*Filterable\*\* — \`id\`, \`tenantId\`, \`name\`, \`kind\`, \`purpose\`, \`active\`, \`createdAt\`, \`updatedAt\`.\
> \
> \*\*Sortable\*\* — \`id\`, \`name\`, \`active\`, \`createdAt\`, \`updatedAt\`.\
> \
> \*\*Searchable\*\* — nothing yet.\
> \
> The identities of a channel are not part of the default answer; request them with\
> \`fields=identities\`.<br>

```json
{"openapi":"3.1.0","info":{"title":"Solvio REST API","version":"1.0.0-beta"},"tags":[{"description":"A **channel** is how Solvio talks to the outside world — an email mailbox today, other transports\nlater. A thread bound to a channel delivers its messages through it and receives replies back into the\nsame conversation.\n\nTwo properties decide what a channel is:\n\n| | Values |\n| --- | --- |\n| `kind` | the transport: `EMAIL`, `WEBHOOK`, `TEAMS`, `SMS`, `WHATSAPP`, `WEBCHAT`, `NOTICE` |\n| `purpose` | what it is used for: `THREAD` and `TICKET` carry conversations, `NOTIFICATION` only sends out |\n\n`config` is a typed object per purpose — it holds static defaults such as the sender name a channel\nuses, never conditions. It is validated against the purpose when a channel is created or changed.\n\nOnly `EMAIL` channels with a conversational purpose can be created at the moment; every other kind is\nanswered with `400`. The addresses a channel uses are described under *Channel Addresses*.\n","name":"channel"}],"servers":[{"description":"The host serving this document","url":"/api"}],"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"BearerAuth":{"description":"Token issued by the central equipme authentication, sent as `Bearer <token>`.","scheme":"bearer","type":"http"},"ApiKeyAuth":{"description":"Static key for machine-to-machine access. Alternative to BearerAuth.","in":"header","name":"X-API-Key","type":"apiKey"}},"schemas":{"v1.ListChannelsResponse-domain_Channel":{"properties":{"count":{"type":"integer"},"data":{"items":{"$ref":"#/components/schemas/domain.Channel"},"type":"array","uniqueItems":false}},"type":"object"},"domain.Channel":{"properties":{"active":{"type":"boolean"},"createdAt":{"type":"string"},"id":{"type":"integer"},"kind":{"$ref":"#/components/schemas/domain.ChannelKind"},"name":{"type":"string"},"purpose":{"$ref":"#/components/schemas/domain.ChannelPurpose"},"tenant":{"$ref":"#/components/schemas/domain.Tenant"},"tenantId":{"type":"integer"},"updatedAt":{"type":"string"}},"type":"object"},"domain.ChannelKind":{"enum":["","EMAIL","WEBHOOK","TEAMS","SMS","WHATSAPP","WEBCHAT","NOTICE"],"type":"string"},"domain.ChannelPurpose":{"enum":["","THREAD","TICKET","NOTIFICATION"],"type":"string"},"domain.Tenant":{"properties":{"id":{"type":"integer"},"name":{"type":"string"}},"type":"object"},"middleware.ErrorResponse":{"properties":{"error":{"$ref":"#/components/schemas/middleware.ErrorBody"}},"type":"object"},"middleware.ErrorBody":{"properties":{"code":{"description":"Code is the stable, machine-readable reason. Clients match on this, not on the message.","type":"string"},"details":{"description":"Details carries structured context where an error has any — a conflict names what it\ncollided with. Absent otherwise."},"message":{"type":"string"}},"type":"object"}}},"paths":{"/v1/channels":{"get":{"description":"Returns the tenant's channels, ordered by `id` unless `sort` says otherwise.\n\n**Filterable** — `id`, `tenantId`, `name`, `kind`, `purpose`, `active`, `createdAt`, `updatedAt`.\n\n**Sortable** — `id`, `name`, `active`, `createdAt`, `updatedAt`.\n\n**Searchable** — nothing yet.\n\nThe identities of a channel are not part of the default answer; request them with\n`fields=identities`.\n","operationId":"listChannels","parameters":[{"description":"JSON filter expression","in":"query","name":"filter","schema":{"type":"string"}},{"description":"Free-text term — no effect here","in":"query","name":"search","schema":{"type":"string"}},{"description":"Comma-separated field:direction terms","in":"query","name":"sort","schema":{"type":"string"}},{"description":"Selection of fields and relations","in":"query","name":"fields","schema":{"type":"string"}},{"description":"Number of entries to skip","in":"query","name":"offset","schema":{"default":0,"type":"integer"}},{"description":"Page size, 1 to 100","in":"query","name":"limit","schema":{"default":100,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/v1.ListChannelsResponse-domain_Channel"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/middleware.ErrorResponse"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/middleware.ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/middleware.ErrorResponse"}}},"description":"Forbidden"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/middleware.ErrorResponse"}}},"description":"Internal Server Error"}},"summary":"List channels","tags":["channel"]}}}}
```

## Create a channel

> Creates a channel. \`name\`, \`kind\` and \`purpose\` are required, \`config\` is validated against the\
> purpose and rejected with \`400\` when it does not fit.\
> \
> Today only \`EMAIL\` with a conversational purpose (\`THREAD\` or \`TICKET\`) can be created — any other\
> kind is answered with \`400\`. Inbound email additionally requires the server to have its mail domain\
> configured.\
> \
> \`active\` decides whether the channel is used; an inactive channel keeps its configuration but neither\
> sends nor receives.<br>

```json
{"openapi":"3.1.0","info":{"title":"Solvio REST API","version":"1.0.0-beta"},"tags":[{"description":"A **channel** is how Solvio talks to the outside world — an email mailbox today, other transports\nlater. A thread bound to a channel delivers its messages through it and receives replies back into the\nsame conversation.\n\nTwo properties decide what a channel is:\n\n| | Values |\n| --- | --- |\n| `kind` | the transport: `EMAIL`, `WEBHOOK`, `TEAMS`, `SMS`, `WHATSAPP`, `WEBCHAT`, `NOTICE` |\n| `purpose` | what it is used for: `THREAD` and `TICKET` carry conversations, `NOTIFICATION` only sends out |\n\n`config` is a typed object per purpose — it holds static defaults such as the sender name a channel\nuses, never conditions. It is validated against the purpose when a channel is created or changed.\n\nOnly `EMAIL` channels with a conversational purpose can be created at the moment; every other kind is\nanswered with `400`. The addresses a channel uses are described under *Channel Addresses*.\n","name":"channel"}],"servers":[{"description":"The host serving this document","url":"/api"}],"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"BearerAuth":{"description":"Token issued by the central equipme authentication, sent as `Bearer <token>`.","scheme":"bearer","type":"http"},"ApiKeyAuth":{"description":"Static key for machine-to-machine access. Alternative to BearerAuth.","in":"header","name":"X-API-Key","type":"apiKey"}},"schemas":{"v1.AddChannelRequest":{"properties":{"active":{"type":"boolean"},"config":{"items":{"type":"integer"},"type":"array","uniqueItems":false},"kind":{"$ref":"#/components/schemas/domain.ChannelKind"},"name":{"type":"string"},"purpose":{"$ref":"#/components/schemas/domain.ChannelPurpose"}},"required":["kind","name","purpose"],"type":"object"},"domain.ChannelKind":{"enum":["","EMAIL","WEBHOOK","TEAMS","SMS","WHATSAPP","WEBCHAT","NOTICE"],"type":"string"},"domain.ChannelPurpose":{"enum":["","THREAD","TICKET","NOTIFICATION"],"type":"string"},"v1.AddChannelResponse":{"properties":{"data":{"$ref":"#/components/schemas/domain.Channel"}},"type":"object"},"domain.Channel":{"properties":{"active":{"type":"boolean"},"createdAt":{"type":"string"},"id":{"type":"integer"},"kind":{"$ref":"#/components/schemas/domain.ChannelKind"},"name":{"type":"string"},"purpose":{"$ref":"#/components/schemas/domain.ChannelPurpose"},"tenant":{"$ref":"#/components/schemas/domain.Tenant"},"tenantId":{"type":"integer"},"updatedAt":{"type":"string"}},"type":"object"},"domain.Tenant":{"properties":{"id":{"type":"integer"},"name":{"type":"string"}},"type":"object"},"middleware.ErrorResponse":{"properties":{"error":{"$ref":"#/components/schemas/middleware.ErrorBody"}},"type":"object"},"middleware.ErrorBody":{"properties":{"code":{"description":"Code is the stable, machine-readable reason. Clients match on this, not on the message.","type":"string"},"details":{"description":"Details carries structured context where an error has any — a conflict names what it\ncollided with. Absent otherwise."},"message":{"type":"string"}},"type":"object"}}},"paths":{"/v1/channels":{"post":{"description":"Creates a channel. `name`, `kind` and `purpose` are required, `config` is validated against the\npurpose and rejected with `400` when it does not fit.\n\nToday only `EMAIL` with a conversational purpose (`THREAD` or `TICKET`) can be created — any other\nkind is answered with `400`. Inbound email additionally requires the server to have its mail domain\nconfigured.\n\n`active` decides whether the channel is used; an inactive channel keeps its configuration but neither\nsends nor receives.\n","operationId":"addChannel","requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object"},{"$ref":"#/components/schemas/v1.AddChannelRequest","summary":"request","description":"Channel to create"}]}}},"description":"Channel to create","required":true},"responses":{"201":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/v1.AddChannelResponse"}}},"description":"Created"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/middleware.ErrorResponse"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/middleware.ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/middleware.ErrorResponse"}}},"description":"Forbidden"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/middleware.ErrorResponse"}}},"description":"Internal Server Error"}},"summary":"Create a channel","tags":["channel"]}}}}
```

## Get a channel

> Returns a single channel by its id. Its identities are not included unless \`fields=identities\` asks\
> for them.<br>

```json
{"openapi":"3.1.0","info":{"title":"Solvio REST API","version":"1.0.0-beta"},"tags":[{"description":"A **channel** is how Solvio talks to the outside world — an email mailbox today, other transports\nlater. A thread bound to a channel delivers its messages through it and receives replies back into the\nsame conversation.\n\nTwo properties decide what a channel is:\n\n| | Values |\n| --- | --- |\n| `kind` | the transport: `EMAIL`, `WEBHOOK`, `TEAMS`, `SMS`, `WHATSAPP`, `WEBCHAT`, `NOTICE` |\n| `purpose` | what it is used for: `THREAD` and `TICKET` carry conversations, `NOTIFICATION` only sends out |\n\n`config` is a typed object per purpose — it holds static defaults such as the sender name a channel\nuses, never conditions. It is validated against the purpose when a channel is created or changed.\n\nOnly `EMAIL` channels with a conversational purpose can be created at the moment; every other kind is\nanswered with `400`. The addresses a channel uses are described under *Channel Addresses*.\n","name":"channel"}],"servers":[{"description":"The host serving this document","url":"/api"}],"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"BearerAuth":{"description":"Token issued by the central equipme authentication, sent as `Bearer <token>`.","scheme":"bearer","type":"http"},"ApiKeyAuth":{"description":"Static key for machine-to-machine access. Alternative to BearerAuth.","in":"header","name":"X-API-Key","type":"apiKey"}},"schemas":{"v1.GetChannelResponse-domain_Channel":{"properties":{"data":{"$ref":"#/components/schemas/domain.Channel"}},"type":"object"},"domain.Channel":{"properties":{"active":{"type":"boolean"},"createdAt":{"type":"string"},"id":{"type":"integer"},"kind":{"$ref":"#/components/schemas/domain.ChannelKind"},"name":{"type":"string"},"purpose":{"$ref":"#/components/schemas/domain.ChannelPurpose"},"tenant":{"$ref":"#/components/schemas/domain.Tenant"},"tenantId":{"type":"integer"},"updatedAt":{"type":"string"}},"type":"object"},"domain.ChannelKind":{"enum":["","EMAIL","WEBHOOK","TEAMS","SMS","WHATSAPP","WEBCHAT","NOTICE"],"type":"string"},"domain.ChannelPurpose":{"enum":["","THREAD","TICKET","NOTIFICATION"],"type":"string"},"domain.Tenant":{"properties":{"id":{"type":"integer"},"name":{"type":"string"}},"type":"object"},"middleware.ErrorResponse":{"properties":{"error":{"$ref":"#/components/schemas/middleware.ErrorBody"}},"type":"object"},"middleware.ErrorBody":{"properties":{"code":{"description":"Code is the stable, machine-readable reason. Clients match on this, not on the message.","type":"string"},"details":{"description":"Details carries structured context where an error has any — a conflict names what it\ncollided with. Absent otherwise."},"message":{"type":"string"}},"type":"object"}}},"paths":{"/v1/channels/{channelId}":{"get":{"description":"Returns a single channel by its id. Its identities are not included unless `fields=identities` asks\nfor them.\n","operationId":"getChannel","parameters":[{"description":"Channel id","in":"path","name":"channelId","required":true,"schema":{"type":"integer"}},{"description":"Selection of fields and relations","in":"query","name":"fields","schema":{"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/v1.GetChannelResponse-domain_Channel"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/middleware.ErrorResponse"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/middleware.ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/middleware.ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/middleware.ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/middleware.ErrorResponse"}}},"description":"Internal Server Error"}},"summary":"Get a channel","tags":["channel"]}}}}
```

## Delete a channel

> Deletes a channel. Threads that were bound to it keep their messages; they simply have no transport\
> any more, so nothing further is delivered for them. Answers with \`204\` and no body.<br>

```json
{"openapi":"3.1.0","info":{"title":"Solvio REST API","version":"1.0.0-beta"},"tags":[{"description":"A **channel** is how Solvio talks to the outside world — an email mailbox today, other transports\nlater. A thread bound to a channel delivers its messages through it and receives replies back into the\nsame conversation.\n\nTwo properties decide what a channel is:\n\n| | Values |\n| --- | --- |\n| `kind` | the transport: `EMAIL`, `WEBHOOK`, `TEAMS`, `SMS`, `WHATSAPP`, `WEBCHAT`, `NOTICE` |\n| `purpose` | what it is used for: `THREAD` and `TICKET` carry conversations, `NOTIFICATION` only sends out |\n\n`config` is a typed object per purpose — it holds static defaults such as the sender name a channel\nuses, never conditions. It is validated against the purpose when a channel is created or changed.\n\nOnly `EMAIL` channels with a conversational purpose can be created at the moment; every other kind is\nanswered with `400`. The addresses a channel uses are described under *Channel Addresses*.\n","name":"channel"}],"servers":[{"description":"The host serving this document","url":"/api"}],"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"BearerAuth":{"description":"Token issued by the central equipme authentication, sent as `Bearer <token>`.","scheme":"bearer","type":"http"},"ApiKeyAuth":{"description":"Static key for machine-to-machine access. Alternative to BearerAuth.","in":"header","name":"X-API-Key","type":"apiKey"}},"schemas":{"middleware.ErrorResponse":{"properties":{"error":{"$ref":"#/components/schemas/middleware.ErrorBody"}},"type":"object"},"middleware.ErrorBody":{"properties":{"code":{"description":"Code is the stable, machine-readable reason. Clients match on this, not on the message.","type":"string"},"details":{"description":"Details carries structured context where an error has any — a conflict names what it\ncollided with. Absent otherwise."},"message":{"type":"string"}},"type":"object"}}},"paths":{"/v1/channels/{channelId}":{"delete":{"description":"Deletes a channel. Threads that were bound to it keep their messages; they simply have no transport\nany more, so nothing further is delivered for them. Answers with `204` and no body.\n","operationId":"deleteChannel","parameters":[{"description":"Channel id","in":"path","name":"channelId","required":true,"schema":{"type":"integer"}}],"responses":{"204":{"description":"No Content"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/middleware.ErrorResponse"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/middleware.ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/middleware.ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/middleware.ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/middleware.ErrorResponse"}}},"description":"Internal Server Error"}},"summary":"Delete a channel","tags":["channel"]}}}}
```

## Change a channel

> Changes a channel. The body follows JSON Merge Patch semantics: an absent field stays as it is, \`null\`\
> clears it, a value sets it.\
> \
> \`kind\` and \`purpose\` cannot be changed — they decide what the channel \*is\*, and its configuration and\
> identities depend on them. A replacement \`config\` is validated against the existing purpose.<br>

```json
{"openapi":"3.1.0","info":{"title":"Solvio REST API","version":"1.0.0-beta"},"tags":[{"description":"A **channel** is how Solvio talks to the outside world — an email mailbox today, other transports\nlater. A thread bound to a channel delivers its messages through it and receives replies back into the\nsame conversation.\n\nTwo properties decide what a channel is:\n\n| | Values |\n| --- | --- |\n| `kind` | the transport: `EMAIL`, `WEBHOOK`, `TEAMS`, `SMS`, `WHATSAPP`, `WEBCHAT`, `NOTICE` |\n| `purpose` | what it is used for: `THREAD` and `TICKET` carry conversations, `NOTIFICATION` only sends out |\n\n`config` is a typed object per purpose — it holds static defaults such as the sender name a channel\nuses, never conditions. It is validated against the purpose when a channel is created or changed.\n\nOnly `EMAIL` channels with a conversational purpose can be created at the moment; every other kind is\nanswered with `400`. The addresses a channel uses are described under *Channel Addresses*.\n","name":"channel"}],"servers":[{"description":"The host serving this document","url":"/api"}],"security":[{"BearerAuth":[]},{"ApiKeyAuth":[]}],"components":{"securitySchemes":{"BearerAuth":{"description":"Token issued by the central equipme authentication, sent as `Bearer <token>`.","scheme":"bearer","type":"http"},"ApiKeyAuth":{"description":"Static key for machine-to-machine access. Alternative to BearerAuth.","in":"header","name":"X-API-Key","type":"apiKey"}},"schemas":{"v1.PatchChannelRequest":{"properties":{"active":{"type":"boolean"},"config":{"type":"object"},"name":{"type":"string"}},"type":"object"},"v1.PatchChannelResponse":{"properties":{"data":{"$ref":"#/components/schemas/domain.Channel"}},"type":"object"},"domain.Channel":{"properties":{"active":{"type":"boolean"},"createdAt":{"type":"string"},"id":{"type":"integer"},"kind":{"$ref":"#/components/schemas/domain.ChannelKind"},"name":{"type":"string"},"purpose":{"$ref":"#/components/schemas/domain.ChannelPurpose"},"tenant":{"$ref":"#/components/schemas/domain.Tenant"},"tenantId":{"type":"integer"},"updatedAt":{"type":"string"}},"type":"object"},"domain.ChannelKind":{"enum":["","EMAIL","WEBHOOK","TEAMS","SMS","WHATSAPP","WEBCHAT","NOTICE"],"type":"string"},"domain.ChannelPurpose":{"enum":["","THREAD","TICKET","NOTIFICATION"],"type":"string"},"domain.Tenant":{"properties":{"id":{"type":"integer"},"name":{"type":"string"}},"type":"object"},"middleware.ErrorResponse":{"properties":{"error":{"$ref":"#/components/schemas/middleware.ErrorBody"}},"type":"object"},"middleware.ErrorBody":{"properties":{"code":{"description":"Code is the stable, machine-readable reason. Clients match on this, not on the message.","type":"string"},"details":{"description":"Details carries structured context where an error has any — a conflict names what it\ncollided with. Absent otherwise."},"message":{"type":"string"}},"type":"object"}}},"paths":{"/v1/channels/{channelId}":{"patch":{"description":"Changes a channel. The body follows JSON Merge Patch semantics: an absent field stays as it is, `null`\nclears it, a value sets it.\n\n`kind` and `purpose` cannot be changed — they decide what the channel *is*, and its configuration and\nidentities depend on them. A replacement `config` is validated against the existing purpose.\n","operationId":"patchChannel","parameters":[{"description":"Channel id","in":"path","name":"channelId","required":true,"schema":{"type":"integer"}}],"requestBody":{"content":{"application/json":{"schema":{"oneOf":[{"type":"object"},{"$ref":"#/components/schemas/v1.PatchChannelRequest","summary":"request","description":"Fields to change"}]}}},"description":"Fields to change","required":true},"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/v1.PatchChannelResponse"}}},"description":"OK"},"400":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/middleware.ErrorResponse"}}},"description":"Bad Request"},"401":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/middleware.ErrorResponse"}}},"description":"Unauthorized"},"403":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/middleware.ErrorResponse"}}},"description":"Forbidden"},"404":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/middleware.ErrorResponse"}}},"description":"Not Found"},"500":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/middleware.ErrorResponse"}}},"description":"Internal Server Error"}},"summary":"Change a channel","tags":["channel"]}}}}
```


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://hub.equipme.io/development/api-reference-app/channel.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
