> 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-entries.md).

# ManualEntries

## Introduction

`ManualEntries` contain the Manual content organized by [ManualChapters](/api-reference/manual/manual-chapters.md). An entry can belong directly to a chapter or to another entry, and its visibility is constrained by every parent in that hierarchy.

Entries can be published immediately or scheduled, support translations and reactions, and expose [seen](/api-reference/manual/manual-entry-seen-users.md) and [read](/api-reference/manual/manual-entry-read-users.md) tracking.

The `text` field uses the shared [Rich Text](/introduction/rich-text.md) HTML format.

## Model Definition

**Alias**

`manualEntry`

**Relations**

| Key                 | Relation                                                                 | Type            | Relation Field(s)                                                            |
| ------------------- | ------------------------------------------------------------------------ | --------------- | ---------------------------------------------------------------------------- |
| `user`              | [User](/api-reference/users.md)                                          | Belongs to      | `user_id`                                                                    |
| `manualChapter`     | [ManualChapter](/api-reference/manual/manual-chapters.md)                | Belongs to      | `manual_chapter_id`                                                          |
| `parent`            | [ManualEntry](/api-reference/manual/manual-entries.md)                   | Belongs to      | `parent_id`                                                                  |
| `children`          | [ManualEntries](/api-reference/manual/manual-entries.md)                 | Has many        | `parent_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` |
| `seenUsers`         | [ManualEntrySeenUsers](/api-reference/manual/manual-entry-seen-users.md) | Has many        | `manual_entry_seen_users.manual_entry_id`                                    |
| `readUsers`         | [ManualEntryReadUsers](/api-reference/manual/manual-entry-read-users.md) | Has many        | `manual_entry_read_users.manual_entry_id`                                    |
| `reactions`         | [Reactions](/api-reference/reactions.md)                                 | Morph many      | `reactions.reactable_type`, `reactions.reactable_id`                         |
| `currentReaction`   | [Reaction](/api-reference/reactions.md)                                  | Morph one       | `reactions.reactable_type`, `reactions.reactable_id`, `reactions.user_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 entry `id`.

**Capabilities**

* [Targetables](/introduction/resource-capabilities/targetables.md) - Eligible users and departments are derived from the intersecting `view` grants of the entry, its parent entries, and its root chapter.
* [Entity Permissions](/introduction/resource-capabilities/entity-permissions.md) - Entries own direct `view` and `administrate` grants and inherit additional constraints from parent entries and their chapter.
* [URL Context](/introduction/resource-capabilities/url-context.md) - Entry URLs resolve to access-checked context information.
* [Translations](/introduction/resource-capabilities/translations.md) - The `title` and `text` fields are translatable.
* [Notifications](/introduction/resource-capabilities/notifications.md) - Publishing and relevant content or confirmation changes can notify eligible users.
* [Reactions](/introduction/resource-capabilities/reactions.md) - Entries accept reactions when `reactions_forbidden` is `false`.
* [Seen and Read Tracking](/introduction/resource-capabilities/seen-and-read-tracking.md) - Seen records track views, read records capture explicit confirmations, and `reading_confirmation` tells clients whether confirmation is required.

## List

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

**Definition**

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

**Behavior**

* The Restricted Scope applies the entry's direct Entity Permissions together with every parent entry and chapter constraint.
* Scheduled entries are visible to their owner and to users with applicable administration access; other users see them only after publication.

**Example Request**

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

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

{% endtab %}
{% endtabs %}

**Example Response**

```json
[
  {
    "id": 1,
    "user_id": 3,
    "manual_chapter_id": 1,
    "lang_id": "en-US",
    "parent_id": null,
    "icon_id": 21,
    "title": "Welcome to the company",
    "slug": "welcome-to-the-company",
    "text": "<p>This guide explains the first steps for new employees.</p>",
    "reading_confirmation": true,
    "reactions_forbidden": false,
    "planned_publish_at": null,
    "published_at": "2026-08-06 09:20:00",
    "sort_number": 1,
    "created_at": "2026-08-06 09:20:00",
    "updated_at": "2026-08-06 09:20:00",
    "deleted_at": null,
    "hash": "zn7m24owk63qolxryge8pj05"
  },
  {
    "id": 2,
    "user_id": 3,
    "manual_chapter_id": null,
    "lang_id": "en-US",
    "parent_id": 1,
    "icon_id": 22,
    "title": "First-week checklist",
    "slug": "first-week-checklist",
    "text": "<p>Complete your profile and review the security guidelines.</p>",
    "reading_confirmation": false,
    "reactions_forbidden": false,
    "planned_publish_at": "2026-08-08 09:00:00",
    "published_at": null,
    "sort_number": 1,
    "created_at": "2026-08-06 09:25:00",
    "updated_at": "2026-08-06 09:25:00",
    "deleted_at": null,
    "hash": "6o8m0kz5yw10x1pr9e4vxj27"
  }
]
```

## Show

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

**Definition**

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

**Route Parameters**

| Parameter     | Type                  | Description                    |
| ------------- | --------------------- | ------------------------------ |
| `manualEntry` | `integer` \| `string` | ManualEntry ID, hash, or slug. |

**Behavior**

* Access is checked recursively against the entry, its parent entries, and its chapter.
* A scheduled entry is visible before publication only to its owner or a user with applicable administration access.

**Example Request**

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

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

{% endtab %}
{% endtabs %}

**Example Response**

```json
{
  "id": 1,
  "user_id": 3,
  "manual_chapter_id": 1,
  "lang_id": "en-US",
  "parent_id": null,
  "icon_id": 21,
  "title": "Welcome to the company",
  "slug": "welcome-to-the-company",
  "text": "<p>This guide explains the first steps for new employees.</p>",
  "reading_confirmation": true,
  "reactions_forbidden": false,
  "planned_publish_at": null,
  "published_at": "2026-08-06 09:20:00",
  "sort_number": 1,
  "created_at": "2026-08-06 09:20:00",
  "updated_at": "2026-08-06 09:20:00",
  "deleted_at": null,
  "hash": "zn7m24owk63qolxryge8pj05"
}
```

## Admin: List

List `ManualEntries` available in the administration scope.

**Definition**

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

**Behavior**

* Administration permissions determine whether the result is unrestricted or limited to owned and permitted entries.
* Soft-deleted and scheduled entries are included when they satisfy the administration scope.

**Example Request**

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

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

{% endtab %}
{% endtabs %}

**Example Response**

```json
[
  {
    "id": 1,
    "user_id": 3,
    "manual_chapter_id": 1,
    "lang_id": "en-US",
    "parent_id": null,
    "icon_id": 21,
    "title": "Welcome to the company",
    "slug": "welcome-to-the-company",
    "text": "<p>This guide explains the first steps for new employees.</p>",
    "reading_confirmation": true,
    "reactions_forbidden": false,
    "planned_publish_at": null,
    "published_at": "2026-08-06 09:20:00",
    "sort_number": 1,
    "created_at": "2026-08-06 09:20:00",
    "updated_at": "2026-08-06 09:20:00",
    "deleted_at": null,
    "hash": "zn7m24owk63qolxryge8pj05"
  },
  {
    "id": 2,
    "user_id": 3,
    "manual_chapter_id": null,
    "lang_id": "en-US",
    "parent_id": 1,
    "icon_id": 22,
    "title": "First-week checklist",
    "slug": "first-week-checklist",
    "text": "<p>Complete your profile and review the security guidelines.</p>",
    "reading_confirmation": false,
    "reactions_forbidden": false,
    "planned_publish_at": "2026-08-08 09:00:00",
    "published_at": null,
    "sort_number": 1,
    "created_at": "2026-08-06 09:25:00",
    "updated_at": "2026-08-06 09:25:00",
    "deleted_at": null,
    "hash": "6o8m0kz5yw10x1pr9e4vxj27"
  }
]
```

## Admin: Show

Show a single `ManualEntry` in the administration scope.

**Definition**

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

**Route Parameters**

| Parameter     | Type                  | Description                    |
| ------------- | --------------------- | ------------------------------ |
| `manualEntry` | `integer` \| `string` | ManualEntry ID, hash, or slug. |

**Behavior**

* The user must have unrestricted entry administration access, own the entry, or receive an applicable `administrate` grant through its entry and chapter hierarchy.
* Scheduled entries remain available in this scope.

**Example Request**

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

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

{% endtab %}
{% endtabs %}

**Example Response**

```json
{
  "id": 2,
  "user_id": 3,
  "manual_chapter_id": null,
  "lang_id": "en-US",
  "parent_id": 1,
  "icon_id": 22,
  "title": "First-week checklist",
  "slug": "first-week-checklist",
  "text": "<p>Complete your profile and review the security guidelines.</p>",
  "reading_confirmation": false,
  "reactions_forbidden": false,
  "planned_publish_at": "2026-08-08 09:00:00",
  "published_at": null,
  "sort_number": 1,
  "created_at": "2026-08-06 09:25:00",
  "updated_at": "2026-08-06 09:25:00",
  "deleted_at": null,
  "hash": "6o8m0kz5yw10x1pr9e4vxj27"
}
```

## Admin: Create

Create a new `ManualEntry`.

**Definition**

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

**Request Keys**

| Key                    | Type                 | Default               | Description                                                                                                            |
| ---------------------- | -------------------- | --------------------- | ---------------------------------------------------------------------------------------------------------------------- |
| `parent_id`            | `integer` \| `null`  | `null`                | ID of the parent [ManualEntry](/api-reference/manual/manual-entries.md). Required when `manual_chapter_id` is omitted. |
| `manual_chapter_id`    | `integer` \| `null`  | `null`                | ID of the containing [ManualChapter](/api-reference/manual/manual-chapters.md). Required when `parent_id` is omitted.  |
| `lang_id`              | `string`             | system language       | Language key for the translatable content.                                                                             |
| `icon_id`              | `integer`            | configured entry icon | ID of the [Icon](/api-reference/icons.md) used by the entry.                                                           |
| `title`\*              | `string`             | -                     | Entry title, unique across the selected chapter hierarchy.                                                             |
| `slug`                 | `string`             | slugged `title`       | Entry slug, unique across the selected chapter hierarchy.                                                              |
| `text`\*               | `string`             | -                     | Entry content, which can contain HTML.                                                                                 |
| `reading_confirmation` | `boolean`            | `false`               | Whether users must explicitly confirm reading.                                                                         |
| `planned_publish_at`   | `datetime` \| `null` | `null`                | Future publication date. Relative dates are accepted.                                                                  |
| `sort_number`          | `integer`            | end of parent         | Position among entries with the same `manual_chapter_id` and `parent_id`.                                              |
| `entity_permissions`   | `array`              | -                     | Direct [EntityPermissions](/api-reference/entity-permissions.md) assigned to the entry.                                |

Keys with `*` are required.

**Behavior**

* The authenticated user becomes the owner; a client-provided `user_id` is ignored.
* At least one of `parent_id` and `manual_chapter_id` is required. When both are supplied, `parent_id` takes precedence and `manual_chapter_id` becomes `null`.
* The slug is normalized from `slug` or `title`, and missing, invalid, or out-of-range `sort_number` values are normalized within the selected parent.
* A future `planned_publish_at` stores `published_at` as `null`. A missing, current, or past value publishes immediately and stores `planned_publish_at` as `null`; clients cannot set `published_at` independently.
* Creating an immediately published entry can notify eligible users. The notification requests confirmation when `reading_confirmation` is `true`.

**Example Request**

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

```php
$client = new GuzzleHttp\Client(['base_uri' => 'https://{tenant}.intratool.de']);
$response = $client->request('POST', '/api/administration/manual/entries', [
    'headers' => ['Authorization' => "Bearer {accessToken}"],
    'json' => [
        'manual_chapter_id' => 1,
        'lang_id' => 'en-US',
        'icon_id' => 21,
        'title' => 'Emergency procedures',
        'text' => '<p>Follow these steps during an emergency.</p>',
        'reading_confirmation' => true,
        'planned_publish_at' => '2026-08-08 10:00:00'
    ]
]);
```

{% endtab %}
{% endtabs %}

**Example Response**

```json
{
  "status": "success",
  "data": {
    "id": 3,
    "user_id": 3,
    "manual_chapter_id": 1,
    "lang_id": "en-US",
    "parent_id": null,
    "icon_id": 21,
    "title": "Emergency procedures",
    "slug": "emergency-procedures",
    "text": "<p>Follow these steps during an emergency.</p>",
    "reading_confirmation": true,
    "reactions_forbidden": false,
    "planned_publish_at": "2026-08-08 10:00:00",
    "published_at": null,
    "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: Reset Relations

Reset selected tracking and reaction relations of an existing `ManualEntry`.

**Definition**

<mark style="color:yellow;">`POST`</mark> `/api/administration/manual/entries/{manualEntry}/reset`

**Route Parameters**

| Parameter     | Type                  | Description                    |
| ------------- | --------------------- | ------------------------------ |
| `manualEntry` | `integer` \| `string` | ManualEntry ID, hash, or slug. |

**Request Keys**

| Key         | Type      | Description                                                                                      |
| ----------- | --------- | ------------------------------------------------------------------------------------------------ |
| `seenUsers` | `boolean` | Delete all [ManualEntrySeenUsers](/api-reference/manual/manual-entry-seen-users.md) when `true`. |
| `readUsers` | `boolean` | Delete all [ManualEntryReadUsers](/api-reference/manual/manual-entry-read-users.md) when `true`. |
| `reactions` | `boolean` | Delete all [Reactions](/api-reference/reactions.md) when `true`.                                 |

**Behavior**

* Only the three resettable relation keys are retained from the request.
* At least one relation must be set to `true`; an empty request or all-`false` request returns an error.
* Resetting relations is idempotent with respect to already absent records.

**Example Request**

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

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

{% endtab %}
{% endtabs %}

**Example Response**

```json
{
  "status": "success",
  "data": {
    "id": 3,
    "user_id": 3,
    "manual_chapter_id": 1,
    "lang_id": "en-US",
    "parent_id": null,
    "icon_id": 21,
    "title": "Emergency procedures",
    "slug": "emergency-procedures",
    "text": "<p>Follow these steps during an emergency.</p>",
    "reading_confirmation": true,
    "reactions_forbidden": false,
    "planned_publish_at": "2026-08-08 10:00:00",
    "published_at": null,
    "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 `ManualEntry`.

**Definition**

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

**Route Parameters**

| Parameter     | Type                  | Description                    |
| ------------- | --------------------- | ------------------------------ |
| `manualEntry` | `integer` \| `string` | ManualEntry ID, hash, or slug. |

**Request Keys**

| Key                    | Type                 | Description                                                                                     |
| ---------------------- | -------------------- | ----------------------------------------------------------------------------------------------- |
| `parent_id`            | `integer` \| `null`  | New parent [ManualEntry](/api-reference/manual/manual-entries.md) ID.                           |
| `manual_chapter_id`    | `integer` \| `null`  | New [ManualChapter](/api-reference/manual/manual-chapters.md) ID.                               |
| `lang_id`              | `string`             | New language key for the translatable content.                                                  |
| `icon_id`              | `integer`            | New [Icon](/api-reference/icons.md) ID.                                                         |
| `title`                | `string`             | New title, unique across the resulting chapter hierarchy.                                       |
| `slug`                 | `string`             | New slug, unique across the resulting chapter hierarchy.                                        |
| `text`                 | `string`             | New content, which can contain HTML.                                                            |
| `reading_confirmation` | `boolean`            | Whether users must explicitly confirm reading.                                                  |
| `planned_publish_at`   | `datetime` \| `null` | New future publication date, or `null` to publish immediately. Relative dates are accepted.     |
| `sort_number`          | `integer`            | New position among entries with the resulting parent.                                           |
| `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, chapter, title, slug, or text transfers ownership to the authenticated user.
* When neither parent key is supplied, the current hierarchy is retained. When both are supplied, `parent_id` takes precedence; supplying one sets the other to `null`.
* Changing the parent or sort position normalizes both affected sibling orders. The slug is normalized from an explicitly supplied `slug` or the updated `title`.
* A changed future `planned_publish_at` schedules the entry and clears `published_at`. Setting it to `null`, the current time, or a past time publishes immediately. An already published entry cannot be assigned an earlier `published_at` value.
* Changing `title` or `text` removes stored translations for the previous content. Publishing or changing content or reading-confirmation state 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/entries/3', [
    'headers' => ['Authorization' => "Bearer {accessToken}"],
    'json' => [
        'manual_chapter_id' => 1,
        'title' => 'Emergency and evacuation procedures',
        'planned_publish_at' => null
    ]
]);
```

{% endtab %}
{% endtabs %}

**Example Response**

```json
{
  "status": "success",
  "data": {
    "id": 3,
    "user_id": 3,
    "manual_chapter_id": 1,
    "lang_id": "en-US",
    "parent_id": null,
    "icon_id": 21,
    "title": "Emergency and evacuation procedures",
    "slug": "emergency-and-evacuation-procedures",
    "text": "<p>Follow these steps during an emergency.</p>",
    "reading_confirmation": true,
    "reactions_forbidden": false,
    "planned_publish_at": null,
    "published_at": "2026-08-06 10:15:00",
    "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 `ManualEntry`.

**Definition**

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

**Route Parameters**

| Parameter     | Type                  | Description                    |
| ------------- | --------------------- | ------------------------------ |
| `manualEntry` | `integer` \| `string` | ManualEntry ID, hash, or slug. |

**Behavior**

* The entry is soft-deleted, its position is removed from the sibling order, and its notifications are deleted.
* Descendant 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/entries/3', [
    'headers' => ['Authorization' => "Bearer {accessToken}"]
]);
```

{% endtab %}
{% endtabs %}

**Example Response**

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