> 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/manual/manual-chapters.md).

# ManualChapters

## Introduction

`ManualChapters` organize [ManualEntries](/api-reference/manual/manual-entries.md) in a nested structure and define the Entity Permissions inherited by their descendants.

## Model Definition

**Alias**

`manualChapter`

**Relations**

| Key                 | Relation                                                   | Type            | Relation Field(s)                                                            |
| ------------------- | ---------------------------------------------------------- | --------------- | ---------------------------------------------------------------------------- |
| `user`              | [User](/api-reference/users.md)                            | Belongs to      | `user_id`                                                                    |
| `parent`            | [ManualChapter](/api-reference/manual/manual-chapters.md)  | Belongs to      | `parent_id`                                                                  |
| `children`          | [ManualChapters](/api-reference/manual/manual-chapters.md) | Has many        | `parent_id`                                                                  |
| `manualEntries`     | [ManualEntries](/api-reference/manual/manual-entries.md)   | Has many        | `manual_chapter_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` |
| `tags`              | [Tags](/api-reference/tags/tags.md)                        | Belongs to many | `tag_taggable.taggable_type`, `tag_taggable.taggable_id`                     |

**Computed Properties**

* `hash` - Hashed representation of the chapter `id`.

**Capabilities**

* [Entity Permissions](/introduction/resource-capabilities/entity-permissions.md) - Chapters own direct `view` and `administrate` grants; descendant chapters and entries are additionally constrained by their ancestors.
* [URL Context](/introduction/resource-capabilities/url-context.md) - Chapter URLs resolve to access-checked context information.
* [Translations](/introduction/resource-capabilities/translations.md) - The `title` field is translatable.
* [Notifications](/introduction/resource-capabilities/notifications.md) - Creating or updating an active chapter can notify eligible users selected through its inherited access chain.

## List

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

**Definition**

<mark style="color:green;">`GET`</mark> `/api/manual/chapters`

**Behavior**

* The Restricted Scope combines direct `view` grants with the access constraints of every parent chapter.

**Example Request**

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

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

{% endtab %}
{% endtabs %}

**Example Response**

```json
[
  {
    "id": 1,
    "user_id": 3,
    "parent_id": null,
    "lang_id": "en-US",
    "icon_id": 20,
    "title": "Employee handbook",
    "slug": "employee-handbook",
    "enumeration": false,
    "active": true,
    "sort_number": 1,
    "created_at": "2026-08-06 09:00:00",
    "updated_at": "2026-08-06 09:00:00",
    "deleted_at": null,
    "hash": "zn7m24owk63qolxryge8pj05"
  },
  {
    "id": 2,
    "user_id": 4,
    "parent_id": 1,
    "lang_id": "en-US",
    "icon_id": 21,
    "title": "Policies",
    "slug": "policies",
    "enumeration": true,
    "active": false,
    "sort_number": 1,
    "created_at": "2026-08-06 09:10:00",
    "updated_at": "2026-08-06 09:15:00",
    "deleted_at": null,
    "hash": "6o8m0kz5yw10x1pr9e4vxj27"
  }
]
```

## Show

Show a single `ManualChapter` by ID, hash, or slug.

**Definition**

<mark style="color:green;">`GET`</mark> `/api/manual/chapters/{manualChapter}`

**Route Parameters**

| Parameter       | Type                  | Description                      |
| --------------- | --------------------- | -------------------------------- |
| `manualChapter` | `integer` \| `string` | ManualChapter ID, hash, or slug. |

**Behavior**

* Access is checked recursively against the chapter and every parent chapter.

**Example Request**

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

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

{% endtab %}
{% endtabs %}

**Example Response**

```json
{
  "id": 1,
  "user_id": 3,
  "parent_id": null,
  "lang_id": "en-US",
  "icon_id": 20,
  "title": "Employee handbook",
  "slug": "employee-handbook",
  "enumeration": false,
  "active": true,
  "sort_number": 1,
  "created_at": "2026-08-06 09:00:00",
  "updated_at": "2026-08-06 09:00:00",
  "deleted_at": null,
  "hash": "zn7m24owk63qolxryge8pj05"
}
```

## Admin: List

List `ManualChapters` available in the administration scope.

**Definition**

<mark style="color:green;">`GET`</mark> `/api/administration/manual/chapters`

**Behavior**

* Administration permissions determine whether the result is unrestricted or limited to owned and permitted chapters.
* Soft-deleted chapters are included.

**Example Request**

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

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

{% endtab %}
{% endtabs %}

**Example Response**

```json
[
  {
    "id": 1,
    "user_id": 3,
    "parent_id": null,
    "lang_id": "en-US",
    "icon_id": 20,
    "title": "Employee handbook",
    "slug": "employee-handbook",
    "enumeration": false,
    "active": true,
    "sort_number": 1,
    "created_at": "2026-08-06 09:00:00",
    "updated_at": "2026-08-06 09:00:00",
    "deleted_at": null,
    "hash": "zn7m24owk63qolxryge8pj05"
  },
  {
    "id": 2,
    "user_id": 4,
    "parent_id": 1,
    "lang_id": "en-US",
    "icon_id": 21,
    "title": "Policies",
    "slug": "policies",
    "enumeration": true,
    "active": false,
    "sort_number": 1,
    "created_at": "2026-08-06 09:10:00",
    "updated_at": "2026-08-06 09:15:00",
    "deleted_at": null,
    "hash": "6o8m0kz5yw10x1pr9e4vxj27"
  }
]
```

## Admin: Show

Show a single `ManualChapter` in the administration scope.

**Definition**

<mark style="color:green;">`GET`</mark> `/api/administration/manual/chapters/{manualChapter}`

**Route Parameters**

| Parameter       | Type                  | Description                      |
| --------------- | --------------------- | -------------------------------- |
| `manualChapter` | `integer` \| `string` | ManualChapter ID, hash, or slug. |

**Behavior**

* The user must have unrestricted chapter administration access, own the chapter, or receive an applicable `administrate` grant through its hierarchy.

**Example Request**

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

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

{% endtab %}
{% endtabs %}

**Example Response**

```json
{
  "id": 1,
  "user_id": 3,
  "parent_id": null,
  "lang_id": "en-US",
  "icon_id": 20,
  "title": "Employee handbook",
  "slug": "employee-handbook",
  "enumeration": false,
  "active": true,
  "sort_number": 1,
  "created_at": "2026-08-06 09:00:00",
  "updated_at": "2026-08-06 09:00:00",
  "deleted_at": null,
  "hash": "zn7m24owk63qolxryge8pj05"
}
```

## Admin: Create

Create a new `ManualChapter`.

**Definition**

<mark style="color:yellow;">`POST`</mark> `/api/administration/manual/chapters`

**Request Keys**

| Key                  | Type                | Default                 | Description                                                                               |
| -------------------- | ------------------- | ----------------------- | ----------------------------------------------------------------------------------------- |
| `parent_id`          | `integer` \| `null` | `null`                  | ID of the parent [ManualChapter](/api-reference/manual/manual-chapters.md).               |
| `lang_id`            | `string`            | system language         | Language key for the translatable title.                                                  |
| `icon_id`            | `integer`           | configured chapter icon | ID of the [Icon](/api-reference/icons.md) used by the chapter.                            |
| `title`\*            | `string`            | -                       | Chapter title, unique among siblings with the same `parent_id`.                           |
| `slug`               | `string`            | slugged `title`         | Chapter slug, unique among siblings with the same `parent_id`.                            |
| `enumeration`        | `boolean`           | `false`                 | Whether clients should enumerate the chapter.                                             |
| `active`             | `boolean`           | `true`                  | Whether the chapter is active.                                                            |
| `sort_number`        | `integer`           | end of parent           | Position among chapters with the same `parent_id`.                                        |
| `entity_permissions` | `array`             | -                       | Direct [EntityPermissions](/api-reference/entity-permissions.md) assigned to the chapter. |

Keys with `*` are required.

**Behavior**

* The authenticated user becomes the owner; a client-provided `user_id` is ignored.
* The slug is normalized from `slug` or `title`, and missing, invalid, or out-of-range `sort_number` values are normalized within the selected parent.
* Creating an active chapter can notify eligible users selected by its direct and inherited `view` grants.

**Example Request**

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

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://{tenant}.intratool.de']);
$response = $client->request('POST', '/api/administration/manual/chapters', [
    'headers' => ['Authorization' => "Bearer {accessToken}"],
    'json' => [
        'lang_id' => 'en-US',
        'icon_id' => 20,
        'title' => 'Safety procedures',
        'enumeration' => true
    ]
]);
```

{% endtab %}
{% endtabs %}

**Example Response**

```json
{
  "status": "success",
  "data": {
    "id": 3,
    "user_id": 3,
    "parent_id": null,
    "lang_id": "en-US",
    "icon_id": 20,
    "title": "Safety procedures",
    "slug": "safety-procedures",
    "enumeration": true,
    "active": true,
    "sort_number": 2,
    "created_at": "2026-08-06 10:00:00",
    "updated_at": "2026-08-06 10:00:00",
    "deleted_at": null,
    "hash": "wrv2jd6x8g1nmlk4o970mqen"
  }
}
```

## Admin: Update

Update an existing `ManualChapter`.

**Definition**

<mark style="color:blue;">`PUT`</mark> `/api/administration/manual/chapters/{manualChapter}`

**Route Parameters**

| Parameter       | Type                  | Description                      |
| --------------- | --------------------- | -------------------------------- |
| `manualChapter` | `integer` \| `string` | ManualChapter ID, hash, or slug. |

**Request Keys**

| Key                  | Type                | Description                                                                                     |
| -------------------- | ------------------- | ----------------------------------------------------------------------------------------------- |
| `parent_id`          | `integer` \| `null` | New parent chapter ID.                                                                          |
| `lang_id`            | `string`            | New language key for the translatable title.                                                    |
| `icon_id`            | `integer`           | New [Icon](/api-reference/icons.md) ID.                                                         |
| `title`              | `string`            | New title, unique among siblings with the resulting `parent_id`.                                |
| `slug`               | `string`            | New slug, unique among siblings with the resulting `parent_id`.                                 |
| `enumeration`        | `boolean`           | Whether clients should enumerate the chapter.                                                   |
| `active`             | `boolean`           | Whether the chapter is active.                                                                  |
| `sort_number`        | `integer`           | New position among chapters with the resulting `parent_id`.                                     |
| `entity_permissions` | `array`             | Complete direct [EntityPermissions](/api-reference/entity-permissions.md) state to synchronize. |

**Behavior**

* A client-provided `user_id` is ignored. Changing the parent, title, or slug transfers ownership to the authenticated user.
* When `parent_id` is omitted, the current parent is retained for validation. Changing the parent or sort position normalizes both affected sibling orders.
* The slug is normalized from an explicitly supplied `slug` or the updated `title`.
* Changing `title` removes stored translations for the previous title. Activating a chapter or changing its title can trigger notifications.

**Example Request**

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

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://{tenant}.intratool.de']);
$response = $client->request('PUT', '/api/administration/manual/chapters/3', [
    'headers' => ['Authorization' => "Bearer {accessToken}"],
    'json' => [
        'title' => 'Safety and emergency procedures',
        'active' => false
    ]
]);
```

{% endtab %}
{% endtabs %}

**Example Response**

```json
{
  "status": "success",
  "data": {
    "id": 3,
    "user_id": 3,
    "parent_id": null,
    "lang_id": "en-US",
    "icon_id": 20,
    "title": "Safety and emergency procedures",
    "slug": "safety-and-emergency-procedures",
    "enumeration": true,
    "active": false,
    "sort_number": 2,
    "created_at": "2026-08-06 10:00:00",
    "updated_at": "2026-08-06 10:15:00",
    "deleted_at": null,
    "hash": "wrv2jd6x8g1nmlk4o970mqen"
  }
}
```

## Admin: Delete

Delete an existing `ManualChapter`.

**Definition**

<mark style="color:red;">`DELETE`</mark> `/api/administration/manual/chapters/{manualChapter}`

**Route Parameters**

| Parameter       | Type                  | Description                      |
| --------------- | --------------------- | -------------------------------- |
| `manualChapter` | `integer` \| `string` | ManualChapter ID, hash, or slug. |

**Behavior**

* The chapter is soft-deleted, its position is removed from the sibling order, and its notifications are deleted.
* Descendant chapters and contained entries are deleted recursively.

**Example Request**

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

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

{% endtab %}
{% endtabs %}

**Example Response**

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