---
canonical: https://docs.ideco.ru/v22/ru/ngfw/api/access-rules-api/content-filter
---

# Контент-фильтр

::: page-constructor
blocks:
  - type: content-layout-block
    textContent:
      buttons:
        - text: Классический VCE
          theme: action
          width: 'auto'
        - text: Документация
          theme: outlined
          url: https://docs.ideco.ru/v22/ru/ngfw/settings/access-rules/content-filter/
          width: 'auto'
    resetPaddings: false
    textWidth: l
    size: m
    centered: false
:::

{% cut "Получение состояния Контент-фильтра" %}

```
GET /content-filter/state
```

**Ответ на успешный запрос:**

```json5
{
    "enabled": true | false
}
```

* `enabled` - опция раздела **Контент-фильтр**: 
  * `true` - включена;
  * `false` - выключена.

{% endcut %}

{% cut "Управление состоянием Контент-фильтра" %}

```
PATCH /content-filter/state
```

**Json-тело запроса:**

```json5
{
    "enabled": true | false
}
```

* `enabled` - опция раздела **Контент-фильтр**: 
  * `true` - включена;
  * `false` - выключена.

**Ответ на успешный запрос:** 200 ОК

{% endcut %}

## Управление базой данных

{% cut "Получение статуса обновления" %}{#online-update}

```
GET /content-filter/update_status
```

```json5
{
    "last_update": "float" | null,
    "status": "up_to_date" | "updating" | "failed_to_update" | "disabled",
    "msg": "i18n_string"
}
```

* `last_update` - время последнего обновления баз в формате timestamp. Может быть `null`, если база еще не скачана;
* `status` - текущий статус обновления баз:
  * `up_to_date` - базы успешно обновлены;
  * `updating` - скачиваются новые базы;
  * `failed_to_update` - последняя попытка обновления баз завершилась неудачно;
  * `disabled` - обновление баз выключено.
* `msg` - текстовое описание статуса обновления баз.

{% endcut %}

{% cut "Офлайн-обновление базы данных" %}{#offline-update}

`PUT /content-filter/update_archive_upload`

Тело запроса содержит архив с обновлением, содержащий три файла:
* `ideco-header.json` - json-файл, словарь, содержащий ключи:
  * `hwid` (string) - должно совпадать с hwid NGFW Novum, на который загружается обновление;
  * `pack-type` (string) - значение должно быть равно `content-filter` для архива с обновлением **Контент-фильтра**;
  * `cf-timestamp` (integer) - время обновления в формате timestamp;
  * `version` (dict[string, string | integer | boolean]) - значения атрибутов версии (SystemVersion), которые нужно проверить перед обновлением.
* `license.jwt` - файл лицензии в формате JWT для NGFW Novum;
* `sky-db-from-0.sst` - SST-файл для обновления базы **Контент-фильтра**.

Файлы должны идти в такой последовательности. Других файлов не должно быть в архиве.

**Ответ на успешный запрос:** 200 ОК

{% endcut %}

## Профиль антивируса по умолчанию

{% cut "Получение профиля по умолчанию" %}

```
GET /av_backend/profiles/default
```

**Ответ на успешный запрос:**

```json5
{
  "profile_id": "string" | null
}
```

* `profile_id` - идентификатор профиля антивируса, который используется по умолчанию. Может быть `null`, если профиль не установлен по умолчанию.

{% endcut %}

{% cut "Изменение профиля по умолчанию" %}

```
PATCH /av_backend/profiles/default
```

**Json-тело запроса:** 

```json5
{
  "profile_id": "string" | null
}
```

* `profile_id` - идентификатор профиля антивируса, который используется по умолчанию. Может быть `null`, если профиль не установлен по умолчанию.

**Ответ на успешный запрос:** 200 ОК

{% endcut %}

## Настройки Контент-фильтра

{% cut "Получение настроек" %}

```
GET /content-filter/settings
```

**Ответ на успешный запрос:**

```json5
{
    "enabled_extended_categorizer": true | false,
    "quic_reject_enabled": true | false
}
```

* `enabled_extended_categorizer` - расширенная категоризация (SkyDNS): 
  * `true` - включена;
  * `false` - выключена.
* `quic_reject_enabled` - запрет трафика по протоколу QUIC: 
  * `true` - включен;
  * `false` - выключен.

{% endcut %}

{% cut "Изменение настроек" %}

```
PATCH /content-filter/settings
```

**Json-тело запроса:**

```json5
{
    "enabled_extended_categorizer": true | false,
    "quic_reject_enabled": true | false
}
```

* `enabled_extended_categorizer` - расширенная категоризация (SkyDNS): 
  * `true` - включена;
  * `false` - выключена.
* `quic_reject_enabled` - запрет трафика по протоколу QUIC: 
  * `true` - включен;
  * `false` - выключен.

**Ответ на успешный запрос:** 200 OK

{% endcut %}

{% cut "Получение настройки безопасного поиска" %}

```
GET /proxy_backend/safe_search
```

**Ответ на успешный запрос:**

```json5
{
    "enabled": true | false
}
```

* `enabled` - состояние безопасного поиска: 
  * `true` - включено;
  * `false` - выключено.

{% endcut %}

{% cut "Изменение настройки безопасного поиска" %}

```
PATCH /proxy_backend/safe_search
```

**Json-тело запроса:**

```json5
{
    "enabled": true | false
}
```

* `enabled` - `true` для включения, `false` для выключения.

**Ответ на успешный запрос:** 200 OK

{% endcut %}

## Поиск категорий по URL

{% cut "Проверка ресурса" %}

```
GET /content-filter/categorize?url=<URL ресурса>
```

* `URL ресурса` - URL для проверки категории. Полный путь до страницы или только доменное имя.

**Ответ на успешный запрос:**

```json5
{
    "all": ["string"],
    "sky": ["string"],
    "patch": {
        "add": ["string"],
        "remove": ["string"]
    },
    "normalizedUrl": "string"
}
```

* `all` - все категории для URL;
* `sky` - категории из базы SkyDNS (до применения правил переопределения);
* `patch` - изменения, примененные правилами переопределения:
  * `add` - категории, добавленные правилами переопределения;
  * `remove` - категории, удаленные правилами переопределения.
* `normalizedUrl` - URL в нормализованном виде.

{% endcut %}

{% cut "Массовая проверка" %}

```
POST /content-filter/categorize
```

**Json-тело запроса:**

```json5
{
    "urls": ["string"]
}
```

* `urls` - список URL ресурсов.

**Ответ на успешный запрос:**

```json5
{
    "data": [
        {
            "sky": ["string"]
        }
    ]
}
```

* `data` - список категорий в том же порядке, что и URL в запросе:
  * `sky` - категории SkyDNS из основной базы (без учета правил переопределения). Пример: `["cf_extended.id.3", "cf_extended.id.7", ...]`.

{% endcut %}

## Категории Контент-фильтра

{% cut "Получение списка категорий (предустановленных и пользовательских)" %}

```
GET /content-filter/categories
```

**Ответ на успешный запрос:**

```json5
[
    {
        "id": "string",
        "type": "string",
        "name": "string",
        "comment": "string"
    },
    ...
]
```

* `id` - номер категории в формате `users.id.1` или `extended.id.1`;
* `type` - тип категории:
  * `users` - пользовательские категории;
  * `extended` - расширенные категории (SkyDNS);
  * `files` - категории для файлов;
  * `special` - специальные предопределенные категории (**Прямое обращение по IP**, **Все категоризированные запросы**, **Все некатегоризированные запросы**, **Все запросы**);
  * `other` - остальные категории.
* `name` - имя категории;
* `comment` - описание категории.

{% endcut %}

{% cut "Получение списка пользовательских категорий" %}

```
GET /content-filter/users_categories
```

**Ответ на успешный запрос:**

```json5
[
    {
        "id": "string",
        "name": "string",
        "comment": "string",
        "urls": ["string"]
    },
    ...
]
```

* `id` - идентификатор категории в формате `users.id.1`;
* `name` - название категории, не пустая строка;
* `comment` - комментарий;
* `urls` - список адресов. Полный путь до страницы или только доменное имя, любое количество любых символов.

{% endcut %}

{% cut "Создание пользовательской категории" %}

```
POST /content-filter/users_categories
```

**Json-тело запроса:**

```json5
{
    "name": "string",
    "comment": "string",
    "urls": ["string"]
}
```

* `name` - название категории, не пустая строка;
* `comment` - комментарий;
* `urls` - список адресов. Полный путь до страницы или только доменное имя, любое количество любых символов.

**Ответ на успешный запрос:** 

```json5
{
    "id": "string"
}
```

* `id` - идентификатор пользовательской категории.

{% endcut %}

{% cut "Редактирование пользовательских категорий" %}

```
PUT /content-filter/users_categories/<id категории>
```

**Json-тело запроса:**

```json5
{
    "name": "string",
    "comment": "string",
    "urls": ["string"]
}
```

* `name` - название категории, не пустая строка;
* `comment` - комментарий;
* `urls` - список адресов. Полный путь до страницы или только доменное имя, любое количество любых символов.

**Ответ на успешный запрос:** 200 ОК

{% endcut %}

{% cut "Удаление пользовательских категорий" %}

```
DELETE /content-filter/users_categories/<id категории>
```

**Ответ на успешный запрос:** 200 ОК

{% endcut %}

## Профиль антивируса по умолчанию

{% cut "Получение профиля антивируса по умолчанию" %}

```
GET /av_backend/profiles/default
```

**Ответ на успешный запрос:**

```json5
{
    "profile_id": "string" | null
}
```

* `profile_id` - идентификатор профиля антивируса по умолчанию.

{% endcut %}

{% cut "Изменение профиля по умолчанию" %}

```
PATCH /av_backend/profiles/default
```

**Json-тело запроса:**

```json5
{
    "profile_id": "string" | null
}
```

* `profile_id` - идентификатор профиля антивируса по умолчанию.

**Ответ на успешный запрос:** 200 ОК

{% endcut %}

## Правила Контент-фильтра

{% cut "Получение списка правил" %}

```
GET /content-filter/rules
```

**Ответ на успешный запрос:**

```json5
[
    {
        "id": "integer",
        "parent_id": "string",
        "name": "string",
        "comment": "string",
        "aliases": ["string"],
        "categories": ["string"],
        "http_methods": ["string"],
        "content_types": ["string"],
        "access": "allow" | "deny" | "bump" | "redirect",
        "redirect_url": "string" | null,
        "enabled": true | false,
        "timetable": ["string"]
    },
    ...
]
```

* `id` - идентификатор правила;
* `parent_id` - идентификатор группы в Ideco Center, в которую входит Ideco NGFW Novum, или константа `f3ffde22-a562-4f43-ac04-c40fcec6a88c` (соответствует Корневой группе);
* `name` - название правила, не пустая строка;
* `comment` - комментарий, может быть пустым (максимальная длина - 256 символов);
* `aliases` - список идентификаторов алиасов (поле Применяется для);
* `categories` - список идентификаторов категорий сайтов;
* `http_methods` - список методов HTTP. Доступен выбор из списка: GET, POST, PUT, DELETE, HEAD, OPTIONS, PATCH, TRACE, CONNECT;
* `content_types` -  список mime types;
* `access` - действие, которое необходимо выполнить в правиле:
  * `allow` - разрешить данный запрос;
  * `deny` - запретить запрос и показать страницу блокировки;
  * `bump` - расшифровать запрос;
  * `redirect` - перенаправить запрос на `redirect_url`.
* `redirect_url` - адрес, на который перенаправляются запросы. `String` при `access` = `redirect` и `null` при остальных вариантах `access`;
* `enabled` - правило включено (true) или выключено (false);
* `timetable` - время действия, список идентификаторов алиасов.

{% endcut %}

{% cut "Создание правила" %}

```
POST /content-filter/rules?anchor_item_id=<id правила>&insert_after={true|false}
```

* `anchor_item_id` - идентификатор правила, ниже или выше которого нужно создать новое. Если отсутствует, то новое правило будет добавлено в конец таблицы;
* `insert_after` - вставка до или после. Если значение `true` или отсутствует, то новое правило будет добавлено сразу после указанного в `anchor_item_id`. Если `false` - на месте указанного в `anchor_item_id`.

**Json-тело запроса:**

```json5
{
    "name": "string",
    "comment": "string",
    "parent_id": "string", 
    "aliases": ["string"],
    "categories": ["string"],
    "http_methods": ["string"],
    "content_types": ["string"],
    "access": "allow" | "deny" | "bump" | "redirect",
    "redirect_url": "string" | null,
    "enabled": true | false,
    "timetable": ["string"]
}
```

* `name` - название правила, не пустая строка;
* `comment` - комментарий, может быть пустым, максимальная длина - 255 символов;
* `parent_id` - идентификатор группы в Ideco Center, в которую входит Ideco NGFW Novum, или константа `f3ffde22-a562-4f43-ac04-c40fcec6a88c` (соответствует Корневой группе);
* `aliases` - список идентификаторов алиасов (поле Применяется для);
* `categories` - список идентификаторов категорий сайтов;
* `http_methods` - список методов HTTP. Доступен выбор из списка: GET, POST, PUT, DELETE, HEAD, OPTIONS, PATCH, TRACE, CONNECT;
* `content_types` -  список mime types;
* `access` - действие, которое необходимо выполнить в правиле:
  * `allow` - разрешить данный запрос;
  * `deny` - запретить запрос и показать страницу блокировки;
  * `bump` - расшифровать запрос;
  * `redirect` - перенаправить запрос на `redirect_url`.
* `redirect_url` - адрес, на который перенаправляются запросы. `String` при `access` = `redirect` и `null` при остальных вариантах `access`;
* `enabled` - правило включено (true) или выключено (false);
* `timetable` - время действия.

{% endcut %}

{% cut "Редактирование правила" %}

```
PATCH /content-filter/rules/<id правила>
```

**Json-тело запроса:**

```json5
{
    "name": "string",
    "comment": "string",
    "parent_id": "string", 
    "aliases": ["string"],
    "categories": ["string"],
    "http_methods": ["string"],
    "content_types": ["string"],
    "access": "allow" | "deny" | "bump" | "redirect",
    "redirect_url": "string" | null,
    "enabled": true | false,
    "timetable": ["string"]
}
```
* `name` - название правила, не пустая строка;
* `comment` - комментарий, может быть пустым (максимальная длина - 256 символов);
* `parent_id` - идентификатор группы в Ideco Center, в которую входит Ideco NGFW Novum, или константа `f3ffde22-a562-4f43-ac04-c40fcec6a88c` (соответствует Корневой группе);
* `aliases` - список идентификаторов алиасов (поле Применяется для);
* `categories` - список идентификаторов категорий сайтов;
* `http_methods` - список методов HTTP. Доступен выбор из списка: GET, POST, PUT, DELETE, HEAD, OPTIONS, PATCH, TRACE, CONNECT;
* `content_types` -  список mime types;
* `access` - действие, которое необходимо выполнить в правиле:
  * `allow` - разрешить данный запрос;
  * `deny` - запретить запрос и показать страницу блокировки;
  * `bump` - расшифровать запрос;
  * `redirect` - перенаправить запрос на `redirect_url`.
* `redirect_url` - адрес, на который перенаправляются запросы. `String` при `access` = `redirect` и `null` при остальных вариантах `access`;
* `enabled` - правило включено (true) или выключено (false);
* `timetable` - время действия.

**Ответ на успешный запрос:** 200 ОК

{% endcut %}

{% cut "Перемещение правила" %}

```
PATCH /content-filter/rules/move
```

**Json-тело запроса:**

```json5
{
    "params": {
      "id": "integer",
      "anchor_item_id": "integer",
      "insert_after": true | false
    }
}
```

* `id` - идентификатор правила;
* `anchor_item_id` - идентификатор правила, ниже или выше которого нужно вставить правило, которое перемещаем;
* `insert_after` - вставка до или после. Если `true`, то правило будет вставлено сразу после указанного в `anchor_item_id`, если `false` - на месте указанного в `anchor_item_id`.

**Ответ на успешный запрос:** 200 OK

{% endcut %}

{% cut "Удаление правила" %}

```
DELETE /content-filter/rules/<id правила>
```

**Ответ на успешный запрос:** 200 ОК

{% endcut %}

{% cut "Выгрузка правил в CSV" %}

```
GET /content-filter/rules/export
```

**Ответ на успешный запрос:** файл в формате `CSV`.

{% endcut %}

## Морфологический анализ

{% cut "Получение текущего состояние модуля" %}

```
GET /content-filter/morph_analysis/state
```

**Ответ на успешный запрос:**

```json5
{
    "enabled": true | false
}
```

* `enabled` - состояние модуля **Морфологического анализа**: 
  * `true` - включено;
  * `false` - выключено.

{% endcut %}

{% cut "Изменение состояния модуля" %}

```
PATCH /content-filter/morph_analysis/state
```

**Json-тело запроса:**

```json5
{
    "enabled": true | false
}
```

* `enabled` - состояние модуля **Морфологического анализа**: 
  * `true` - включено;
  * `false` - выключено.

**Ответ на успешный запрос:** 200 OK

{% endcut %}

{% cut "Получение списка словарей" %}

```
GET /content-filter/morph_analysis_dicts
```

**Ответ на успешный запрос:**

```json5
[
    {
        "id": "string",
        "title": "string",
        "comment": "string",
        "enabled": true | false,
        "read_only": true | false,
        "threshold": "integer",
        "words": [
            {
            "value":  "string",
            "weight": "integer"
            },
            ...
        ],
        "from_central_console": true | false
    },
    ...
]
```

* `id` - идентификатор словаря;
* `title` - название словаря. Максимальная длина - 42 символа;
* `comment` - комментарий, максимальная длина - 256 символов. Может быть пустым;
* `enabled` - статус словарей:
  * `true` - включен;
  * `false` - выключен. 

Предустановленные словари по умолчанию выключены, дополнительные - включены.

* `read_only` - тип словаря: 
  * `true` - предустановленный;
  * `false` - дополнительный.
* `threshold` - пороговый вес словаря, целое неотрицательное число. Не может быть пустым. Если пороговый вес равен `0`, страница блокируется при наличии любого слова из словаря весом больше `0`;
* `words` - массив словарей:
    * `value` - слово/словосочетание. Максимальная длина - 50 символов. Количество слов в словаре - не больше 1000;
    * `weight` - вес в словаре, целое неотрицательное число. Может быть равен `0`.
* `from_central_console` - источник создания словаря. Поле только для чтения. Возможные значения:
  * `true` - словарь создан в Ideco Center. В NGFW Novum доступен только для чтения. 
  * `false` - словарь создан в NGFW Novum. 

{% endcut %}

{% cut "Создание дополнительного словаря" %}

```
POST /content-filter/morph_analysis_dicts
```

**Json-тело запроса:**

```json5
{
    "title": "string",
    "comment": "string",
    "enabled": true | false,
    "read_only": true | false,
    "threshold": "integer",
    "words": [
        {
          "value":  "string",
          "weight": "integer", 
        },
        ...
    ]
}
```

* `title` - название словаря. Максимальная длина - 42 символа;
* `comment` - комментарий, максимальная длина - 256 символов. Может быть пустым;
* `enabled` - статус словарей:
  * `true` - включен;
  * `false` - выключен. 

Предустановленные словари по умолчанию выключены, дополнительные - включены.

* `read_only` - тип словаря: 
  * `true` - предустановленный;
  * `false` - дополнительный.
* `threshold` - пороговый вес словаря, целое неотрицательное число. Не может быть пустым. Если пороговый вес равен `0`, страница блокируется при наличии любого слова из словаря весом больше `0`;
* `words` - массив словарей:
    * `value` - слово/словосочетание. Максимальная длина - 50 символов. Количество слов в словаре - не больше 1000;
    * `weight` - вес в словаре, целое неотрицательное число. Может быть равен `0`.

**Ответ на успешный запрос:**

```json5
{
    "id": "string"
}
```

* `id` - идентификатор созданного словаря.

{% endcut %}

{% cut "Редактирование дополнительного словаря" %}

```
PATCH /content-filter/morph_analysis_dicts/<id словаря>
```

**Json-тело запроса:**

```json5
{
    "title": "string",
    "enabled": true | false, 
    "comment": "string",
    "threshold": "integer",
    "words": [
        {
          "value":  "string",
          "weight": "integer", 
        },
        ...
    ]
}
```

* `title` - название словаря. Максимальная длина - 42 символа;
* `comment` - комментарий, максимальная длина - 256 символов. Может быть пустым;
* `enabled` - статус словарей:
  * `true` - включен;
  * `false` - выключен. 

Предустановленные словари по умолчанию выключены, дополнительные - включены.

* `read_only` - тип словаря: 
  * `true` - предустановленный;
  * `false` - дополнительный.
* `threshold` - пороговый вес словаря, целое неотрицательное число. Не может быть пустым. Если пороговый вес равен `0`, страница блокируется при наличии любого слова из словаря весом больше `0`;
* `words` - массив словарей:
    * `value` - слово/словосочетание. Максимальная длина - 50 символов. Количество слов в словаре - не больше 1000;
    * `weight` - вес в словаре, целое неотрицательное число. Может быть равен `0`.

**Ответ на успешный запрос:** 200 OK

{% endcut %}

{% cut "Удаление дополнительного словаря" %}

```
DELETE /content-filter/morph_analysis_dicts/<id словаря>
```

**Ответ на успешный запрос:** 200 OK

{% endcut %}

{% cut "Скачивание словаря" %}

```
GET /content-filter/morph_analysis_dicts/download/<id словаря>
```

**Ответ на успешный запрос:** файл в формате CSV. В первой строке записан пороговый вес словаря;название словаря;комментарий. В последующих строках представлены слова и вес слов. Пример:

```
100;Словарь;Комментарий
слово;20
словосочетание;20
```

{% endcut %}
