---
title: "Типы узлов"
description: "Каждый тип узла, который можно добавить с холста кампании, с его категорией, выходами, обязательной настройкой и тем, что он делает, когда до него доходит выполнение."
canonical: https://docs.afp.monster/ru/reference/node-types
updated: 2026-08-19
pageType: reference
---

Тринадцать типов узлов можно добавить в кампанию из палитры холста: два триггера, четыре узла логики, один узел сообщения, четыре действия с комментарием и два действия с контактом. Каждый тип несёт свои ключи настройки и фиксированное число выходов, и эти две вещи решают, что делает выполнение на этом узле и куда идёт дальше. Типы узлов, которые существуют в рантайме, но не имеют плитки в палитре, перечислены в [схеме графа кампании](/ru/reference/campaign-graph-schema).

## Сводка

| Тип узла | Категория | Выходы | Обязательная настройка | Что делает |
|---|---|---|---|---|
| `trigger_comment` | триггер | 1 | `post_id`, когда `post_scope` — `specific` | Запускает кампанию, когда кто-то комментирует страницу |
| `trigger_dm` | триггер | 1 | нет | Запускает кампанию, когда кто-то отправляет странице личное сообщение |
| `condition` | логика | 2 (Match / No Match) | `match_type`, плюс `text` или `keyword_list_id` для типов сопоставления, которые их читают | Сопоставляет текст сообщения и выбирает ветку, или паркует выполнение до прихода ответа |
| `send_dm` | сообщение | 1, плюс один на каждую кнопку `postback` | `message_type` и ключи, которые читает этот тип | Отправляет личное сообщение: текст, изображение, карточка, или текст с кнопками |
| `reply_comment` | комментарии | 1 | `text` | Публично отвечает под комментарием, который запустил выполнение |
| `send_comment` | комментарии | 1 | `text`, `post_id` | Публикует новый комментарий на указанном посте |
| `hide_comment` | комментарии | 1 | нет | Скрывает комментарий, который запустил выполнение |
| `delete_comment` | комментарии | 1 | нет | Удаляет комментарий, который запустил выполнение |
| `delay` | логика | 1 | нет | Удерживает выполнение и продолжает его позже |
| `random_split` | логика | по одному на ветвь | `paths` | Отправляет каждое выполнение по одной ветви, выбранной случайно |
| `add_tag` | контакт | 1 | `tag_ids` | Добавляет теги контакту |
| `remove_tag` | контакт | 1 | `tag_ids` | Удаляет теги у контакта |
| `stop` | логика | 0 | нет | Завершает выполнение |

## `trigger_comment`

- **Категория:** триггер
- **Выходы:** 1, и подключается только к `condition`
- **Обязательная настройка:** `post_id`, когда `post_scope` — `specific`

| Ключ | Тип | Что задаёт |
|---|---|---|
| `post_scope` | строка | `all` или `specific`. Отсутствующий ключ считается как `all`. |
| `post_id` | строка | Пост, который слушает область `specific`. Панель настроек предлагает посты подключённой страницы. |
| `unique_per_user` | логическое значение | Включает ограничение "один раз на человека", описанное ниже. |

Запускает выполнение, когда на подключённую страницу приходит комментарий. При `post_scope`, установленном на `specific`, кампанию запускают только комментарии на посте, указанном `post_id`; все остальные комментарии на странице игнорируются.

`unique_per_user` ограничивает кампанию одним выполнением на человека. 

```json
{
  "post_scope": "specific",
  "post_id": "104857392017465_998234511",
  "unique_per_user": true
}
```

## `trigger_dm`

- **Категория:** триггер
- **Выходы:** 1, и подключается только к `condition`
- **Обязательная настройка:** нет

| Ключ | Тип | Что задаёт |
|---|---|---|
| `unique_per_user` | логическое значение | Включает ограничение "один раз на человека", описанное ниже. |

Запускает выполнение, когда кто-то отправляет подключённой странице личное сообщение. Ключа `post_scope` нет, потому что личное сообщение не привязано к посту. Действия с комментарием недоступны в кампании, чей триггер — `trigger_dm`.

`unique_per_user` — та же настройка, что и на `trigger_comment`, и ограничивает кампанию одним выполнением на человека. 

```json
{
  "unique_per_user": false
}
```

## `condition`

- **Категория:** логика
- **Выходы:** 2 — выход 0 это Match, выход 1 это No Match
- **Обязательная настройка:** `match_type`, плюс `text` или `keyword_list_id` для типов сопоставления, которые их читают

| Ключ | Тип | Что задаёт |
|---|---|---|
| `match_type` | строка | `any`, `contains`, `exact` или `keyword_list`. Решает сравнение и то, какие ключи ниже читаются. |
| `text` | строка | Текст, с которым сравнивают `contains` и `exact`. |
| `keyword_list_id` | число | Сохранённый список ключевых слов, с которым сравнивает `keyword_list`. |
| `reverse_keywords` | логическое значение | Инвертирует результат сравнения `keyword_list`. |
| `wait_for_reply` | логическое значение | Паркует выполнение на этом узле вместо оценки сообщения, которое до него дошло. |
| `filter_images` | логическое значение | Медиафильтр на входящем сообщении. |
| `filter_gifs` | логическое значение | Медиафильтр на входящем сообщении. |
| `filter_links` | логическое значение | Медиафильтр на входящем сообщении. |

Оценивает сообщение и отправляет выполнение через выход Match или No Match. [Правила сопоставления ключевых слов](/ru/reference/keyword-matching) описывает, с чем сравнивает каждый тип сопоставления и какой выход он производит.

`wait_for_reply` паркует выполнение на этом узле вместо немедленной оценки, и оно остаётся там, пока человек не ответит. [Состояния выполнения](/ru/reference/execution-states) описывает, сколько выживает припаркованное выполнение и что его будит.

Медиафильтры — это отдельные настройки на том же узле, не участвующие в сравнении ключевых слов. [Сопоставление комментариев со списками ключевых слов](/ru/guides/keyword-lists) описывает построение списка, на который указывает `keyword_list_id`.

```json
{
  "match_type": "keyword_list",
  "keyword_list_id": 41,
  "reverse_keywords": false,
  "wait_for_reply": true
}
```

## `send_dm`

- **Категория:** сообщение
- **Выходы:** 1, плюс один дополнительный выход на каждую кнопку `postback`
- **Обязательная настройка:** `message_type` и ключи, которые читает этот тип

| Ключ | Тип | Что задаёт |
|---|---|---|
| `message_type` | строка | `text`, `image`, `card` или `text_with_buttons`. Решает, какие ключи ниже читаются. |
| `text` | строка | Текст сообщения. |
| `image_url` | строка | Изображение для сообщения `image`, и картинка на `card`. |
| `title` | строка | Заголовок на `card`. |
| `subtitle` | строка | Вторая строка на `card`. |
| `buttons` | массив | Кнопки на карточке или в сообщении с кнопками. Каждая запись несёт `id`, `type` — `web_url` или `postback`, `title`, и `url` для кнопки `web_url`. |
| `buttons_text` | строка | Одна подпись кнопки на строку, для сообщения `text_with_buttons`. Каждая строка становится кнопкой `postback`, чья полезная нагрузка — эта подпись. |

Отправляет одно личное сообщение человеку, для которого выполняется выполнение. `message_type` выбирает, какие ключи читаются: `text` для обычного сообщения, `image_url` для изображения, `title`, `subtitle` и `image_url` для карточки, и `buttons_text` для текста с кнопками.

Переменные с именем отправителя в `text`, `title` и `subtitle` подставляются перед отправкой сообщения.

Кнопка `postback` добавляет узлу собственный выход, так что выполнение может продолжиться по разной ветке в зависимости от того, какую кнопку нажал человек.

Узел без какой-либо настройки ничего не отправляет, и выполнение переходит к следующему узлу.

```json
{
  "message_type": "text_with_buttons",
  "text": "Thanks for commenting. Which size do you want?",
  "buttons_text": "Small\nMedium\nLarge"
}
```

## `reply_comment`

- **Категория:** комментарии
- **Выходы:** 1
- **Обязательная настройка:** `text`

| Ключ | Тип | Что задаёт |
|---|---|---|
| `text` | строка | Ответ, публикуемый под комментарием-триггером. |

Публикует публичный ответ под комментарием, который запустил выполнение. Переменные с именем отправителя в `text` подставляются перед публикацией ответа.

Узел недоступен в кампании, запускаемой `trigger_dm`, и холст отказывается размещать его после `delete_comment`.

```json
{
  "text": "Sent you the price list in a DM."
}
```

## `send_comment`

- **Категория:** комментарии
- **Выходы:** 1
- **Обязательная настройка:** `text`, `post_id`

| Ключ | Тип | Что задаёт |
|---|---|---|
| `text` | строка | Комментарий, публикуемый на указанном посте. |
| `post_id` | строка | Пост, на котором публикуется комментарий. |

Публикует новый комментарий верхнего уровня на посте, указанном `post_id`. Отката к посту, из которого пришло выполнение, нет: без `post_id` узел ничего не делает, и выполнение переходит к следующему узлу.

Узел недоступен в кампании, запускаемой `trigger_dm`.

```json
{
  "text": "Restocked today — sizes S to XL are back.",
  "post_id": "104857392017465_998234511"
}
```

## `hide_comment`

- **Категория:** комментарии
- **Выходы:** 1
- **Обязательная настройка:** нет

| Ключ | Тип | Что задаёт |
|---|---|---|
| `also_block_user` | логическое значение | Блокирует автора комментария на том же шаге. Только Facebook. |

Скрывает комментарий, который запустил выполнение.

`also_block_user` блокирует автора комментария на том же шаге и работает только на Facebook — опция отключена в кампании Instagram.

## `delete_comment`

- **Категория:** комментарии
- **Выходы:** 1
- **Обязательная настройка:** нет

| Ключ | Тип | Что задаёт |
|---|---|---|
| `also_block_user` | логическое значение | Блокирует автора комментария на том же шаге. Только Facebook. |

Удаляет комментарий, который запустил выполнение. `also_block_user` работает только на Facebook, так же как на `hide_comment`.

После этого узла холст отклоняет `reply_comment` и `hide_comment`, потому что комментария, на который эти узлы должны бы действовать, больше не существует.

## `delay`

- **Категория:** логика
- **Выходы:** 1
- **Обязательная настройка:** нет

| Ключ | Тип | Что задаёт |
|---|---|---|
| `delay_seconds` | число | Сколько ждёт выполнение, от 1 до 31536000 секунд. |
| `only_if_no_reply` | логическое значение | Отменяет остаток выполнения, если человек ответил, пока шло ожидание. |

Удерживает выполнение и планирует его продолжение позже. `delay_seconds` ограничивается диапазоном от 1 до 31536000 секунд (365 дней), и значение вне этого диапазона обрезается без ошибки. Узел без настроенного значения ждёт 60 секунд.

`only_if_no_reply` проверяется, когда ожидание истекает: если человек ответил в любой момент во время него, выполнение завершается на задержке вместо продолжения по ветке.

```json
{
  "delay_seconds": 3600,
  "only_if_no_reply": true
}
```

## `random_split`

- **Категория:** логика
- **Выходы:** по одной на каждую запись в `paths`
- **Обязательная настройка:** `paths`

| Ключ | Тип | Что задаёт |
|---|---|---|
| `paths` | массив | Одна запись `{ "percent": number }` на выход. Каждый процент от 0 до 100, а сумма не может превышать 100. |

Распределяет трафик между ветками: каждое выполнение следует по одной ветви, выбранной случайно. Задайте один процент на ветвь на холсте; каждый от 0 до 100, а сумма не может превышать 100.

Считайте проценты распределением, которое вы запрашиваете, а не гарантированным соотношением, и подтвердите фактическое распределение в истории выполнений, прежде чем полагаться на него в чём-то важном. 

Без настроенных процентов узел откатывается к двум равным ветвям.

Выбранная ветвь решает, какой выход берёт выполнение. Если у этого выхода нет связи, выполнение завершается на этом узле.

```json
{
  "paths": [{ "percent": 70 }, { "percent": 30 }]
}
```

## `add_tag`

- **Категория:** контакт
- **Выходы:** 1
- **Обязательная настройка:** `tag_ids`

| Ключ | Тип | Что задаёт |
|---|---|---|
| `tag_ids` | массив | Числовые идентификаторы тегов, которые нужно добавить. |

Добавляет указанные [теги](/ru/guides/tags) контакту, для которого выполняется выполнение, наряду с тегами, которые контакт уже несёт.

Когда за выполнением нет контакта, узел ничего не меняет, и выполнение переходит к следующему узлу.

```json
{
  "tag_ids": [12, 19]
}
```

## `remove_tag`

- **Категория:** контакт
- **Выходы:** 1
- **Обязательная настройка:** `tag_ids`

| Ключ | Тип | Что задаёт |
|---|---|---|
| `tag_ids` | массив | Числовые идентификаторы тегов, которые нужно удалить. |

Удаляет указанные теги у контакта, для которого выполняется выполнение, и оставляет остальные теги этого контакта на месте. [Поля контакта](/ru/reference/contact-fields) перечисляет остальную часть записи контакта.

Когда за выполнением нет контакта, узел ничего не меняет, и выполнение переходит к следующему узлу.

```json
{
  "tag_ids": [19]
}
```

## `stop`

- **Категория:** логика
- **Выходы:** 0
- **Обязательная настройка:** нет

Завершает выполнение, как только до него доходят, и записывает, что поток был остановлен. У узла нет выхода, так что после него ничего нельзя подключить.

## Типы узлов вне палитры

Ещё восемь типов узлов существуют в рантайме, не несут плитки в палитре и панели настроек, и никогда не появляются в кампании, построенной на холсте. [Схема графа кампании](/ru/reference/campaign-graph-schema) называет их и описывает, что делает выполнение на каждом из них. Считайте их типами только для рантайма, а не функциями.

## Примечания

- Выходы нумеруются с 0. `condition` использует 0 для Match и 1 для No Match, `random_split` использует одно число на ветвь в настроенном порядке, а каждый другой узел продолжает с 0.
- Выполнение следует по связи, выходящей из выхода, который выбрал узел. Когда у этого выхода нет связи, выполнение завершается на этом узле.
- Узел, чьё действие вызывает ошибку, записывает ошибку за выполнением и не продвигается, так что выполнение не идёт дальше этого узла.
- Выполнение, которое приходит на узел, уже посещённый, завершается ошибкой цикла с именем этого узла. Каждый узел запускается не более одного раза за выполнение.
- Тип узла, который рантайм не распознаёт, пропускается с предупреждением, и выполнение продолжается с выхода 0.
- Действие с комментарием, у которого нет комментария, на который можно подействовать, ничего не делает, и выполнение продолжается.
- Плитки палитры фильтруются по платформе кампании, так что палитра в кампании Instagram может предлагать меньше типов узлов, чем палитра в кампании Facebook.
- То, какие типы узлов могут идти за какими, применяется во время перетаскивания связи, а не при сохранении кампании. [Схема графа кампании](/ru/reference/campaign-graph-schema) перечисляет эти ограничения.
- В тестовом выполнении `add_tag` и `remove_tag` записывают, что они бы сделали, и оставляют контакт нетронутым, а `delay` завершает тестовое выполнение вместо планирования возобновления.

## Связанное

- [Схема графа кампании](/ru/reference/campaign-graph-schema) — как хранятся узлы, связи и настройка
- [Построение кампании](/ru/guides/build-a-campaign) — добавление и подключение этих узлов на холсте
- [Правила сопоставления ключевых слов](/ru/reference/keyword-matching) — с чем сравнивает каждый тип сопоставления `condition`
- [Состояния выполнения](/ru/reference/execution-states) — как выглядит выполнение, проходя через эти узлы
- [Поля контакта](/ru/reference/contact-fields) — запись контакта, в которую пишут узлы тегов
