# Get all configured communication channels

`GET /api/configuration/consent/communication-channels`

- **Success:** `200 OK`
- **Products:** Operator (`FOH`), Consumer (`CONSUMER`) (any one of these products, not all)
- **Features:** Online Bookings (`ONLINEBOOK`), Online Joining (`ONLINEJOIN`), Front of House Generic Access (`FOHGENERIC`) (any one of these features, not all)

HTML version: [Get all configured communication channels](https://support.gladstonesoftware.cloud/reference/configuration/get-all-configured-communication-channels)

## Overview

Lists the communication channels a member can give or withhold consent for — email, post, SMS and so on. Call it once at start-up to build a consent preferences screen, and use the `channelId` values it returns wherever the consent endpoints ask for a channel.

**Trim `channelId` before you compare it.** Ids are fixed at 16 characters and come back blank-padded — `"EMAIL           "`, not `"EMAIL"`. Gladstone itself trims before matching; equality checks against an untrimmed literal will silently fail.

A new tenant starts with `EMAIL`, `MAIL` (post), `SMS`, `SOCIALMEDIA` and `TELEPHONE`. After that the list belongs to the operator, who can add channels of their own, so do not treat the starter five as a closed set and do not hard-code around them. The starter ids are the closest thing to stable values this endpoint offers, and even they can be renamed or removed.

One channel is deliberately hidden. A marker channel, `CHANNEL_COMPREF` ("Default channel"), represents campaign-level rather than channel-level consent, and is excluded from this list. You will never see it here, and you should not send it.

When no channels are configured you get `200` with an empty array `[]`.

## Endpoint

`GET {base_url}/api/configuration/consent/communication-channels`

`{base_url}` is the environment URL issued to your integration. See [Authenticating with Gladstone APIs](../../guides/authenticating-with-gladstone-apis.md).

## Sample request

```bash title="cURL"
curl -X GET '{base_url}/api/configuration/consent/communication-channels' \
  -H 'Authorization: Bearer {accessToken}' \
  -H 'X-Use-SSO: true'
```

## Response fields

| Field | Type | Description |
|-------|------|-------------|
| `[].channelId` | string | The channel identifier, and the value you pass to the consent endpoints. It is unique within your tenant. **Fixed at 16 characters and blank-padded on the right** — `"SMS             "` rather than `"SMS"` — so trim it before storing, comparing or displaying it. Uppercase by convention in the starter data, but nothing enforces case, so compare case-insensitively as well. Operator-editable: a channel can be added or removed per tenant, so resolve it from this call rather than hard-coding. |
| `[].channelName` | string | The channel's display label, for example `Email` or `Social Media`. Maximum 50 characters. It can be `null` while `channelId` is populated — fall back to the trimmed `channelId` when rendering. Free text the operator can edit; never key logic on it. A second-language variant of this label can be configured but is **not** returned by this endpoint, so a bilingual interface cannot be built from this response alone. |
| `[].protected` | boolean | `true` when the channel is flagged as a system channel, which the starter `EMAIL`, `MAIL`, `SMS` and `TELEPHONE` channels are and the starter `SOCIALMEDIA` channel is not. Treat it as a signal that the channel underpins platform behaviour and should not be offered for deletion or renaming in an administration UI. It says nothing about whether a member may consent to the channel, and nothing about whether the channel is currently in use — a `protected` channel and an operator-created one are equally valid targets for a consent record. Always present; never `null`. |

## Sample response

```json title="200 OK"
[
  {
    "channelId": "string",
    "channelName": "string",
    "protected": true
  }
]
```

## Errors

| Status | Meaning | When |
|--------|---------|------|
| `500` | Internal server error | Any unexpected server-side failure while reading the channels. The response is a bare status code with **no body**, so there is no detail to act on. Retry with backoff and fall back to a cached copy of this reference data. |
