> For the complete documentation index, see [llms.txt](https://docs.api.intratool.de/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.api.intratool.de/api-reference/infoboard/infoboard-channels.md).

# InfoboardChannels

## Introduction

`InfoboardChannels` organize [InfoboardPosts](/api-reference/infoboard/infoboard-posts.md) and own the Entity Permissions that control channel access and administration.

The `apply_allowed_departments` setting additionally constrains which departments can be targeted by posts moved to or created in a channel.

The `notifications_enabled` setting controls whether posts, comments, and reactions in the channel can dispatch notifications. It does not affect resource visibility or seen and read tracking.

## Model Definition

**Alias**

`infoboardChannel`

**Move Posts Assignment Modes**

* `any_of` - Assigns every moved post to the supplied departments.
* `null` - Removes explicit targeting when the target channel permits untargeted posts.

**Relations**

| Key                 | Relation                                                      | Type       | Relation Field(s)                                                            |
| ------------------- | ------------------------------------------------------------- | ---------- | ---------------------------------------------------------------------------- |
| `user`              | [User](/api-reference/users.md)                               | Belongs to | `user_id`                                                                    |
| `folder`            | [Folder](/api-reference/folders.md)                           | Belongs to | `folder_id`                                                                  |
| `icon`              | [Icon](/api-reference/icons.md)                               | Belongs to | `icon_id`                                                                    |
| `entityPermissions` | [EntityPermissions](/api-reference/entity-permissions.md)     | Morph many | `entity_permissions.restrictable_type`, `entity_permissions.restrictable_id` |
| `infoboardPosts`    | [InfoboardPosts](/api-reference/infoboard/infoboard-posts.md) | Has many   | `infoboard_posts.infoboard_channel_id`                                       |

**Capabilities**

* [Entity Permissions](/introduction/resource-capabilities/entity-permissions.md) - Channels own direct grants; their Restricted Scope controls viewing, post creation, commenting, and administration without changing post Targetables.
* [URL Context](/introduction/resource-capabilities/url-context.md) - Channel URLs resolve to access-checked context information.
* [Translations](/introduction/resource-capabilities/translations.md) - The `title` field is translatable.

## List

List `InfoboardChannels` visible to the current authenticated [User](/api-reference/users.md).

**Definition**

<mark style="color:green;">`GET`</mark> `/api/infoboard/channels`

**Behavior**

* The channel Restricted Scope uses direct Entity Permissions with the `view` key and includes ownership and configured extended department access.

**Example Request**

{% tabs %}
{% tab title="PHP" %}

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://{tenant}.intratool.de']);
$response = $client->request('GET', '/api/infoboard/channels', [
    'headers' => ['Authorization' => "Bearer {accessToken}"]
]);
```

{% endtab %}
{% endtabs %}

**Example Response**

```json
[
  {
    "id": 1,
    "user_id": 3,
    "lang_id": "en-US",
    "folder_id": null,
    "icon_id": 1,
    "title": "Company updates",
    "color": "#2457C5",
    "apply_allowed_departments": false,
    "notifications_enabled": true,
    "sort_number": 1,
    "created_at": "2026-08-06 09:00:00",
    "updated_at": "2026-08-06 09:00:00",
    "deleted_at": null
  },
  {
    "id": 2,
    "user_id": 3,
    "lang_id": "en-US",
    "folder_id": null,
    "icon_id": 2,
    "title": "Operations",
    "color": null,
    "apply_allowed_departments": true,
    "notifications_enabled": false,
    "sort_number": 2,
    "created_at": "2026-08-06 09:15:00",
    "updated_at": "2026-08-06 09:15:00",
    "deleted_at": null
  }
]
```

## Show

Show one visible `InfoboardChannel`.

**Definition**

<mark style="color:green;">`GET`</mark> `/api/infoboard/channels/{infoboardChannel}`

**Route Parameters**

| Parameter          | Type      | Description          |
| ------------------ | --------- | -------------------- |
| `infoboardChannel` | `integer` | InfoboardChannel ID. |

**Behavior**

* The same direct Entity Permissions and ownership rules as the list endpoint apply.

**Example Request**

{% tabs %}
{% tab title="PHP" %}

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://{tenant}.intratool.de']);
$response = $client->request('GET', '/api/infoboard/channels/1', [
    'headers' => ['Authorization' => "Bearer {accessToken}"]
]);
```

{% endtab %}
{% endtabs %}

**Example Response**

```json
{
  "id": 1,
  "user_id": 3,
  "lang_id": "en-US",
  "folder_id": null,
  "icon_id": 1,
  "title": "Company updates",
  "color": "#2457C5",
  "apply_allowed_departments": false,
  "notifications_enabled": true,
  "sort_number": 1,
  "created_at": "2026-08-06 09:00:00",
  "updated_at": "2026-08-06 09:00:00",
  "deleted_at": null
}
```

## Admin: List

List `InfoboardChannels` available for administration.

**Definition**

<mark style="color:green;">`GET`</mark> `/api/administration/infoboard/channels`

**Behavior**

* Without unrestricted channel edit or delete permission, the result contains channels owned by the authenticated user or granted through direct Entity Permissions for administration.
* Soft-deleted channels can be included through the shared query controls.

**Example Request**

{% tabs %}
{% tab title="PHP" %}

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://{tenant}.intratool.de']);
$response = $client->request('GET', '/api/administration/infoboard/channels', [
    'headers' => ['Authorization' => "Bearer {accessToken}"]
]);
```

{% endtab %}
{% endtabs %}

**Example Response**

```json
[
  {
    "id": 1,
    "user_id": 3,
    "lang_id": "en-US",
    "folder_id": null,
    "icon_id": 1,
    "title": "Company updates",
    "color": "#2457C5",
    "apply_allowed_departments": false,
    "notifications_enabled": true,
    "sort_number": 1,
    "created_at": "2026-08-06 09:00:00",
    "updated_at": "2026-08-06 09:00:00",
    "deleted_at": null
  },
  {
    "id": 2,
    "user_id": 4,
    "lang_id": "en-US",
    "folder_id": null,
    "icon_id": 2,
    "title": "Operations",
    "color": null,
    "apply_allowed_departments": true,
    "notifications_enabled": false,
    "sort_number": 2,
    "created_at": "2026-08-06 09:15:00",
    "updated_at": "2026-08-06 09:15:00",
    "deleted_at": null
  }
]
```

## Admin: Show

Show one `InfoboardChannel` in administration scope.

**Definition**

<mark style="color:green;">`GET`</mark> `/api/administration/infoboard/channels/{infoboardChannel}`

**Route Parameters**

| Parameter          | Type      | Description          |
| ------------------ | --------- | -------------------- |
| `infoboardChannel` | `integer` | InfoboardChannel ID. |

**Behavior**

* Access requires ownership, a direct administration grant, or unrestricted channel edit or delete permission.

**Example Request**

{% tabs %}
{% tab title="PHP" %}

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://{tenant}.intratool.de']);
$response = $client->request('GET', '/api/administration/infoboard/channels/1', [
    'headers' => ['Authorization' => "Bearer {accessToken}"]
]);
```

{% endtab %}
{% endtabs %}

**Example Response**

```json
{
  "id": 1,
  "user_id": 3,
  "lang_id": "en-US",
  "folder_id": null,
  "icon_id": 1,
  "title": "Company updates",
  "color": "#2457C5",
  "apply_allowed_departments": false,
  "notifications_enabled": true,
  "sort_number": 1,
  "created_at": "2026-08-06 09:00:00",
  "updated_at": "2026-08-06 09:00:00",
  "deleted_at": null
}
```

## Admin: Create

Create a new `InfoboardChannel`.

**Definition**

<mark style="color:yellow;">`POST`</mark> `/api/administration/infoboard/channels`

**Request Keys**

| Key                         | Type                | Default         | Description                                                                       |
| --------------------------- | ------------------- | --------------- | --------------------------------------------------------------------------------- |
| `lang_id`                   | `string`            | system language | Language key for the translatable title.                                          |
| `folder_id`                 | `integer` \| `null` | `null`          | ID of the [Folder](/api-reference/folders.md) containing the channel.             |
| `icon_id`\*                 | `integer`           | -               | ID of the [Icon](/api-reference/icons.md) used by the channel.                    |
| `title`\*                   | `string`            | -               | Channel title.                                                                    |
| `color`                     | `string` \| `null`  | `null`          | Channel color as a client-defined string.                                         |
| `apply_allowed_departments` | `boolean`           | `false`         | Whether post department targets are limited to departments the author may assign. |
| `notifications_enabled`     | `boolean`           | `true`          | Whether posts, comments, and reactions in the channel may dispatch notifications. |
| `sort_number`               | `integer`           | end of folder   | Position among channels with the same `folder_id`.                                |

Keys with `*` are required.

**Behavior**

* The authenticated user becomes the owner; a client-provided `user_id` is ignored.
* New channels enable notification dispatch by default. Setting `notifications_enabled` to `false` suppresses channel post, comment, and reaction notifications.
* Missing, invalid, or out-of-range `sort_number` values are normalized within the selected folder.

**Example Request**

{% tabs %}
{% tab title="PHP" %}

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://{tenant}.intratool.de']);
$response = $client->request('POST', '/api/administration/infoboard/channels', [
    'headers' => ['Authorization' => "Bearer {accessToken}"],
    'json' => [
        'icon_id' => 3,
        'title' => 'People and culture',
        'color' => '#7B3FB5'
    ]
]);
```

{% endtab %}
{% endtabs %}

**Example Response**

```json
{
  "status": "success",
  "data": {
    "id": 3,
    "user_id": 3,
    "lang_id": "en-US",
    "folder_id": null,
    "icon_id": 3,
    "title": "People and culture",
    "color": "#7B3FB5",
    "apply_allowed_departments": false,
    "notifications_enabled": true,
    "sort_number": 3,
    "created_at": "2026-08-06 10:00:00",
    "updated_at": "2026-08-06 10:00:00",
    "deleted_at": null
  }
}
```

## Admin: Update

Update an existing `InfoboardChannel`.

**Definition**

<mark style="color:blue;">`PUT`</mark> `/api/administration/infoboard/channels/{infoboardChannel}`

**Route Parameters**

| Parameter          | Type      | Description          |
| ------------------ | --------- | -------------------- |
| `infoboardChannel` | `integer` | InfoboardChannel ID. |

**Request Keys**

| Key                         | Type                | Description                                                                       |
| --------------------------- | ------------------- | --------------------------------------------------------------------------------- |
| `lang_id`                   | `string`            | Language key for the translatable title.                                          |
| `folder_id`                 | `integer` \| `null` | ID of the [Folder](/api-reference/folders.md) containing the channel.             |
| `icon_id`                   | `integer`           | ID of the [Icon](/api-reference/icons.md) used by the channel.                    |
| `title`                     | `string`            | Channel title.                                                                    |
| `color`                     | `string` \| `null`  | Channel color as a client-defined string.                                         |
| `apply_allowed_departments` | `boolean`           | Whether post department targets are limited to departments the author may assign. |
| `notifications_enabled`     | `boolean`           | Whether posts, comments, and reactions in the channel may dispatch notifications. |
| `sort_number`               | `integer`           | Position among channels with the same `folder_id`.                                |

**Behavior**

* A client-provided `user_id` is ignored.
* Disabling `notifications_enabled` suppresses future channel post, comment, and reaction notifications; it does not change existing notification records.
* Changing `folder_id` or `sort_number` normalizes the affected folder order.
* Changing `title` removes stored translations for the previous title.

**Example Request**

{% tabs %}
{% tab title="PHP" %}

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://{tenant}.intratool.de']);
$response = $client->request('PUT', '/api/administration/infoboard/channels/3', [
    'headers' => ['Authorization' => "Bearer {accessToken}"],
    'json' => [
        'title' => 'People, culture and benefits',
        'color' => '#653394',
        'notifications_enabled' => false
    ]
]);
```

{% endtab %}
{% endtabs %}

**Example Response**

```json
{
  "status": "success",
  "data": {
    "id": 3,
    "user_id": 3,
    "lang_id": "en-US",
    "folder_id": null,
    "icon_id": 3,
    "title": "People, culture and benefits",
    "color": "#653394",
    "apply_allowed_departments": false,
    "notifications_enabled": false,
    "sort_number": 3,
    "created_at": "2026-08-06 10:00:00",
    "updated_at": "2026-08-06 10:15:00",
    "deleted_at": null
  }
}
```

## Admin: Move Posts

Move every `InfoboardPost` from one channel to another channel or out of channel scope.

**Definition**

<mark style="color:blue;">`PUT`</mark> `/api/administration/infoboard/channels/{infoboardChannel}/move-posts`

**Route Parameters**

| Parameter          | Type      | Description                 |
| ------------------ | --------- | --------------------------- |
| `infoboardChannel` | `integer` | Source InfoboardChannel ID. |

**Request Keys**

| Key                    | Type                | Description                                                                               |
| ---------------------- | ------------------- | ----------------------------------------------------------------------------------------- |
| `infoboard_channel_id` | `integer` \| `null` | Target InfoboardChannel ID; omit or send `null` to remove the channel assignment.         |
| `assign_mode`          | `string` \| `null`  | Selects one of the supported [Move Posts Assignment Modes](#move-posts-assignment-modes). |
| `department_ids`       | `array` \| `null`   | Department IDs assigned to every moved post.                                              |

**Behavior**

* The target channel must differ from the source channel, and the authenticated user must be allowed to administer both when a target is supplied.
* The authenticated user becomes the owner of every successfully moved post. Client-provided `user_id` and `user_ids` values are ignored.
* Providing departments defaults `assign_mode` to `any_of`. Without departments it defaults to `null`.
* For no target channel or a target with `apply_allowed_departments` enabled, disallowed department IDs are removed. A target with that setting enabled requires a valid `any_of` assignment with at least one remaining department.
* Changing the channel resets each post's seen users, read users, comments, reactions, and targeted survey votes before the supplied departments are synchronized.
* The response data is the number of posts successfully moved; update events and their notification side effects run for each moved post.

**Example Request**

{% tabs %}
{% tab title="PHP" %}

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://{tenant}.intratool.de']);
$response = $client->request('PUT', '/api/administration/infoboard/channels/1/move-posts', [
    'headers' => ['Authorization' => "Bearer {accessToken}"],
    'json' => [
        'infoboard_channel_id' => 2,
        'department_ids' => [1, 2]
    ]
]);
```

{% endtab %}
{% endtabs %}

**Example Response**

```json
{
  "status": "success",
  "data": 2
}
```

## Admin: Delete

Delete an existing `InfoboardChannel`.

**Definition**

<mark style="color:red;">`DELETE`</mark> `/api/administration/infoboard/channels/{infoboardChannel}`

**Route Parameters**

| Parameter          | Type      | Description          |
| ------------------ | --------- | -------------------- |
| `infoboardChannel` | `integer` | InfoboardChannel ID. |

**Behavior**

* The channel is soft-deleted and removed from its sort range.
* All posts in the channel are deleted through their normal deletion lifecycle.
* Every department setting that used this channel as `default_channel_id` is changed to `null`.

**Example Request**

{% tabs %}
{% tab title="PHP" %}

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://{tenant}.intratool.de']);
$response = $client->request('DELETE', '/api/administration/infoboard/channels/3', [
    'headers' => ['Authorization' => "Bearer {accessToken}"]
]);
```

{% endtab %}
{% endtabs %}

**Example Response**

```json
{
  "status": "success",
  "data": null
}
```
