Download OpenAPI specification:Download
API для взаимодействия с платформой Fromni. В основном предназначено для запуска:
По своей сути Кампания - это обычный чат-бот. С той лишь разницей, что вы пишете Пользователю, а он вам отвечает. Поэтому для запуска любой Кампании важен Сценарий (какие сообщения отправлять, какие ответы могут прийти и т.д.), Каналы (через какие каналы передаются сообщения), Условия запуска (что должно случиться, чтобы кампания запустилась). Для удобства работы с платформой все Сценарии, Каналы и Условия запуска реализуются через WEB-интерфейс. По API же передаются События, которые должны запустить Кампанию, либо прямые команды на запуск Кампании.
Каждый метод является POST-запросом, который в случае успеха возвращает код 200, а в случае ошибки API - код 500.
Точка подключения: https://api.fromni.com/user
Формат данных: JSON
Кодировка: UTF-8
Authorization: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Content-Type: application/json
Кампании - исходящие коммуникации по определенному сценарию. Сценарий должен быть предварительно создан в конструкторе сценариев в WEB-интерфейсе. Там, в частности, "рисуется" логика работы Кампании и подключаются каналы, через которые отправляются сообщения.
Отправляет статистику завершенной кампании. Кампания считается завершенной, если все получатели прошли сценарий кампании (если он был) запущен или если истек liveTime кампании.
Поле data совпадает с ответом метода /campaign/stat
type required | string |
required | object (CampaignResponse) |
{- "type": "campaign_completed",
- "data": {
- "id": "2c78e241008fedf822288be5",
- "name": "My campaign",
- "type": "STANDARD",
- "liveTime": 48,
- "channels": [
- {
- "name": "notify+vk",
- "connections": [
- 1,
- 2
], - "ttl": 60
}
], - "scenarioId": "5eb882228fdef800142e87c2",
- "templateId": 1,
- "docs": [
- {
- "data": {
- "Имя клиента": "Иван Петрова",
- "Номер телефона": "+79990000000",
- "Номер накладной": 123456,
- "age": 22
}, - "channel": "notify",
- "status": "delivered",
- "channelIndex": 0,
- "answersMap": {
- "Answer 1": "10",
- "Последний ответ": "Да"
}, - "answersList": [
- "10",
- "Да"
]
}
], - "match": [
- "Номер телефона",
- "Имя клиента",
- "Номер накладной"
], - "headers": [
- "Имя клиента, phone, Номер накладной, Answer 1, Последний ответ"
], - "customId": "123e4567-e89b-12d3-a456-426655440000",
- "presetId": "65350f2b09c0fc0012d91715",
- "createdAt": "2020-10-20T00:00:00.436Z"
}
}
Отправляется при запуске автоматической кампании по сделкам / контактам. Статусы и каналы отправки в этом вебхуке не финальные, поэтому для получения результатов автоматической кампании стоит дождаться вебхук о завершении кампании.
type required | string |
required | object |
{- "type": "auto_campaign_started",
- "data": {
- "campaign": {
- "id": "2c78e241008fedf822288be5",
- "name": "My campaign",
- "type": "STANDARD",
- "liveTime": 48,
- "channels": [
- {
- "name": "notify+vk",
- "connections": [
- 1,
- 2
], - "ttl": 60
}
], - "scenarioId": "5eb882228fdef800142e87c2",
- "templateId": 1,
- "docs": [
- {
- "data": {
- "Имя клиента": "Иван Петрова",
- "Номер телефона": "+79990000000",
- "Номер накладной": 123456,
- "age": 22
}, - "channel": "notify",
- "status": "delivered",
- "channelIndex": 0,
- "answersMap": {
- "Answer 1": "10",
- "Последний ответ": "Да"
}, - "answersList": [
- "10",
- "Да"
]
}
], - "match": [
- "Номер телефона",
- "Имя клиента",
- "Номер накладной"
], - "headers": [
- "Имя клиента, phone, Номер накладной, Answer 1, Последний ответ"
], - "customId": "123e4567-e89b-12d3-a456-426655440000",
- "presetId": "65350f2b09c0fc0012d91715",
- "createdAt": "2020-10-20T00:00:00.436Z"
}, - "dealId": "5eb882228fdef800142e87c2",
- "error": "string"
}
}
С помощью данного метода можно запускать кампании множеством способов.
По типу определения отправляемых сообщений:
По типу определения получателей:
По времени отправки:
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
name required | string Название кампании |
customId | string Ваш идентификатор кампании, который вернется вместе с колбэком о завершении кампании |
liveTime | number [ 1 .. 48 ] Default: 24 Время (в часах), в течение которого получатель может отвечать на кампанию |
scenarioId | string, ID сценария кампании, который будет запущен после получения пользователем первого сообщения |
required | Array of objects (CampaignChannels) Список каналов, по которым будет отправлятсья сообщение до первой доставки. Порядок каналов в массиве задает порядок отправки. |
templateId required | number ID шаблона первого сообщения. Этот параметр не обязателен, если указанный сценарий связан с шаблоном в конструкторе сценариев или в параметре channels указан текст для каждого канала. Если передать отрицательное значение, то интерпретируется как ID группы шаблонов. |
data required | Array of objects (CampaignRecipientData) Массив объектов с данными по каждому получателю. Объект может содержать произвольное количество полей, но должен иметь одинаковую структуру для каждого получателя |
match | Array of strings (CampaignMatch) Массив соответствий данных кампании (или события) и полей шаблона. Заголовок, соответствующий полю, в котором указан номер телефона получателя обязательно должен быть первым. |
{- "name": "My campaign",
- "customId": "123e4567-e89b-12d3-a456-426655440000",
- "liveTime": 24,
- "scenarioId": "5eb882228fdef800142e87c2",
- "channels": [
- {
- "name": "notify+vk",
- "connections": [
- 1,
- 2
], - "ttl": 60
}
], - "templateId": 1,
- "data": [
- {
- "Имя клиента": "Иван Петров",
- "Номер телефона": "+79990000000",
- "Номер накладной": 123456,
- "age": 22
}
], - "match": [
- "Номер телефона",
- "Имя клиента",
- "Номер накладной"
]
}
{- "result": "success",
- "id": "2c78e241008fedf822288be5"
}
Возвращает список Кампаний, которые были запущены за указанный период. Метод может быть полезен для оценки количества кампаний, отправленных в определенный период и получения подробной статистики по конкретной Кампании.
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
object | |
offset | number Default: 0 Отступ от начала списка |
limit | number Default: 10 Максимальное количество записей в ответе. Не указывайте этот параметр, если необходимо вернуть все записи. |
order | Array of strings[ items ] Параметры сортировки. Каждый элемент - массив, в котором 1-ый элемент - название поля, по которому идет сортировка, а 2-ой элмент - порядок сортировки (ASC или DESC) |
object |
{- "filter": {
- "startDate": "2021-01-21T00:00:00:000Z",
- "endDate": "2021-02-21T00:00:00:000Z",
- "type": "STANDARD"
}, - "offset": 0,
- "limit": 10,
- "order": [
- [
- "createdAt",
- "DESC"
]
], - "options": {
- "docsTopN": 1
}
}
{- "result": "success",
- "data": [
- {
- "id": "2c78e241008fedf822288be5",
- "name": "My campaign",
- "type": "STANDARD",
- "liveTime": 48,
- "channels": [
- {
- "name": "notify+vk",
- "connections": [
- 1,
- 2
], - "ttl": 60
}
], - "scenarioId": "5eb882228fdef800142e87c2",
- "templateId": 1,
- "docs": [
- {
- "data": {
- "Имя клиента": "Иван Петрова",
- "Номер телефона": "+79990000000",
- "Номер накладной": 123456,
- "age": 22
}, - "channel": "notify",
- "status": "delivered",
- "channelIndex": 0,
- "answersMap": {
- "Answer 1": "10",
- "Последний ответ": "Да"
}, - "answersList": [
- "10",
- "Да"
]
}
], - "match": [
- "Номер телефона",
- "Имя клиента",
- "Номер накладной"
], - "headers": [
- "Имя клиента, phone, Номер накладной, Answer 1, Последний ответ"
], - "customId": "123e4567-e89b-12d3-a456-426655440000",
- "presetId": "65350f2b09c0fc0012d91715",
- "createdAt": "2020-10-20T00:00:00.436Z",
- "recipientsCount": 10
}
]
}
В отличие от возврата статистики на Callback-сервер, данный метод позволяет вам самостоятельно получить текущую статистику по кампании даже если она не завершена. Возвращает все параметры запущенной кампании, а также модифицированный список получателей в поле docs.
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
id required | string ID кампании |
{- "id": "2c78e241008fedf822288be5"
}
{- "result": "success",
- "id": "2c78e241008fedf822288be5",
- "name": "My campaign",
- "type": "STANDARD",
- "liveTime": 48,
- "channels": [
- {
- "name": "notify+vk",
- "connections": [
- 1,
- 2
], - "ttl": 60
}
], - "scenarioId": "5eb882228fdef800142e87c2",
- "templateId": 1,
- "docs": [
- {
- "data": {
- "Имя клиента": "Иван Петрова",
- "Номер телефона": "+79990000000",
- "Номер накладной": 123456,
- "age": 22
}, - "channel": "notify",
- "status": "delivered",
- "channelIndex": 0,
- "answersMap": {
- "Answer 1": "10",
- "Последний ответ": "Да"
}, - "answersList": [
- "10",
- "Да"
]
}
], - "match": [
- "Номер телефона",
- "Имя клиента",
- "Номер накладной"
], - "headers": [
- "Имя клиента, phone, Номер накладной, Answer 1, Последний ответ"
], - "customId": "123e4567-e89b-12d3-a456-426655440000",
- "presetId": "65350f2b09c0fc0012d91715",
- "createdAt": "2020-10-20T00:00:00.436Z"
}
С помощью этого метода можно создать:
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
name required | string Название кампании |
liveTime | number [ 1 .. 48 ] Default: 24 Время (в часах), в течение которого получатель может отвечать на кампанию |
templateId | number ID шаблона первого сообщения. Этот параметр не обязателен, если указанный сценарий связан с шаблоном в конструкторе сценариев или в параметре channels указан текст для каждого канала. Если передать отрицательное значение, то интерпретируется как ID группы шаблонов. |
scenarioId | string, ID сценария кампании, который будет запущен после получения пользователем первого сообщения |
required | Array of Каналы кампании (objects) or Array of Каналы кампании с произвольными текстами (objects) |
required | object Параметры автоматической кампании |
{- "name": "My campaign",
- "liveTime": 24,
- "templateId": 1,
- "scenarioId": "5eb882228fdef800142e87c2",
- "channels": [
- {
- "name": "notify+vk",
- "connections": [
- 1,
- 2
], - "ttl": 60
}
], - "autoCampaign": {
- "contactsFilter": {
- "union": "or",
- "conditions": [
- {
- "union": "and",
- "conditions": [
- {
- "field": "d00137359aa5f3cd834e8aad",
- "op": "gt",
- "value": 10
}, - {
- "field": "d00137359aa5f3cd834e8aad",
- "op": "lt",
- "value": 20
}
]
}, - {
- "union": null,
- "conditions": [
- {
- "field": "channels",
- "op": "has",
- "value": "vk"
}
]
}
]
}, - "dealsFilter": {
- "union": "or",
- "conditions": [
- {
- "union": "and",
- "conditions": [
- {
- "field": "d00137359aa5f3cd834e8aad",
- "op": "gt",
- "value": 10
}, - {
- "field": "d00137359aa5f3cd834e8aad",
- "op": "lt",
- "value": 20
}
]
}, - {
- "union": null,
- "conditions": [
- {
- "field": "name",
- "op": "contains",
- "value": "123"
}
]
}
]
}, - "sendTime": {
- "period": "after",
- "interval": {
- "value": 1,
- "units": "minutes"
}, - "field": {
- "name": "<id атрибута Город>",
- "type": "deal",
- "trigger": "update",
- "value": "Москва"
}
}
}
}
{- "result": "success",
- "id": "655b4c21d122e90012a72834",
- "name": "My campaign",
- "liveTime": 24,
- "templateId": 1,
- "scenarioId": "5eb882228fdef800142e87c2",
- "channels": [
- {
- "name": "notify+vk",
- "connections": [
- 1,
- 2
], - "ttl": 60
}
], - "autoCampaign": {
- "contactsFilter": {
- "union": "or",
- "conditions": [
- {
- "union": "and",
- "conditions": [
- {
- "field": "d00137359aa5f3cd834e8aad",
- "op": "gt",
- "value": 10
}, - {
- "field": "d00137359aa5f3cd834e8aad",
- "op": "lt",
- "value": 20
}
]
}, - {
- "union": null,
- "conditions": [
- {
- "field": "channels",
- "op": "has",
- "value": "vk"
}
]
}
]
}, - "dealsFilter": {
- "union": "or",
- "conditions": [
- {
- "union": "and",
- "conditions": [
- {
- "field": "d00137359aa5f3cd834e8aad",
- "op": "gt",
- "value": 10
}, - {
- "field": "d00137359aa5f3cd834e8aad",
- "op": "lt",
- "value": 20
}
]
}, - {
- "union": null,
- "conditions": [
- {
- "field": "name",
- "op": "contains",
- "value": "123"
}
]
}
]
}, - "sendTime": {
- "period": "after",
- "interval": {
- "value": 1,
- "units": "minutes"
}, - "field": {
- "name": "<id атрибута Город>",
- "type": "deal",
- "trigger": "update",
- "value": "Москва"
}
}
}, - "active": true,
- "lang": "ru",
- "createdAt": "2021-04-09T09:55:09.782Z",
- "updatedAt": "2021-04-09T09:55:09.782Z"
}
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
{- "result": "success",
- "data": [
- {
- "id": "655b4c21d122e90012a72834",
- "name": "My campaign",
- "liveTime": 24,
- "templateId": 1,
- "scenarioId": "5eb882228fdef800142e87c2",
- "channels": [
- {
- "name": "notify+vk",
- "connections": [
- 1,
- 2
], - "ttl": 60
}
], - "autoCampaign": {
- "contactsFilter": {
- "union": "or",
- "conditions": [
- {
- "union": "and",
- "conditions": [
- {
- "field": "d00137359aa5f3cd834e8aad",
- "op": "gt",
- "value": 10
}, - {
- "field": "d00137359aa5f3cd834e8aad",
- "op": "lt",
- "value": 20
}
]
}, - {
- "union": null,
- "conditions": [
- {
- "field": "channels",
- "op": "has",
- "value": "vk"
}
]
}
]
}, - "dealsFilter": {
- "union": "or",
- "conditions": [
- {
- "union": "and",
- "conditions": [
- {
- "field": "d00137359aa5f3cd834e8aad",
- "op": "gt",
- "value": 10
}, - {
- "field": "d00137359aa5f3cd834e8aad",
- "op": "lt",
- "value": 20
}
]
}, - {
- "union": null,
- "conditions": [
- {
- "field": "name",
- "op": "contains",
- "value": "123"
}
]
}
]
}, - "sendTime": {
- "period": "after",
- "interval": {
- "value": 1,
- "units": "minutes"
}, - "field": {
- "name": "<id атрибута Город>",
- "type": "deal",
- "trigger": "update",
- "value": "Москва"
}
}
}, - "active": true,
- "lang": "ru",
- "createdAt": "2021-04-09T09:55:09.782Z",
- "updatedAt": "2021-04-09T09:55:09.782Z"
}
]
}
Достаточно передать параметры, которые необходимо обновить. Например, для активации / деактивации достаточно передать ID автоматической кампании и параметр active.
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
id required | string ID автоматической кампании |
name required | string Название кампании |
liveTime | number [ 1 .. 48 ] Default: 24 Время (в часах), в течение которого получатель может отвечать на кампанию |
templateId | number ID шаблона первого сообщения. Этот параметр не обязателен, если указанный сценарий связан с шаблоном в конструкторе сценариев или в параметре channels указан текст для каждого канала. Если передать отрицательное значение, то интерпретируется как ID группы шаблонов. |
scenarioId | string, ID сценария кампании, который будет запущен после получения пользователем первого сообщения |
required | Array of Каналы кампании (objects) or Array of Каналы кампании с произвольными текстами (objects) |
required | object Параметры автоматической кампании |
active | boolean Активна ли автоматическая кампания |
{- "id": "655b4c21d122e90012a72834",
- "name": "My campaign",
- "liveTime": 24,
- "templateId": 1,
- "scenarioId": "5eb882228fdef800142e87c2",
- "channels": [
- {
- "name": "notify+vk",
- "connections": [
- 1,
- 2
], - "ttl": 60
}
], - "autoCampaign": {
- "contactsFilter": {
- "union": "or",
- "conditions": [
- {
- "union": "and",
- "conditions": [
- {
- "field": "d00137359aa5f3cd834e8aad",
- "op": "gt",
- "value": 10
}, - {
- "field": "d00137359aa5f3cd834e8aad",
- "op": "lt",
- "value": 20
}
]
}, - {
- "union": null,
- "conditions": [
- {
- "field": "channels",
- "op": "has",
- "value": "vk"
}
]
}
]
}, - "dealsFilter": {
- "union": "or",
- "conditions": [
- {
- "union": "and",
- "conditions": [
- {
- "field": "d00137359aa5f3cd834e8aad",
- "op": "gt",
- "value": 10
}, - {
- "field": "d00137359aa5f3cd834e8aad",
- "op": "lt",
- "value": 20
}
]
}, - {
- "union": null,
- "conditions": [
- {
- "field": "name",
- "op": "contains",
- "value": "123"
}
]
}
]
}, - "sendTime": {
- "period": "after",
- "interval": {
- "value": 1,
- "units": "minutes"
}, - "field": {
- "name": "<id атрибута Город>",
- "type": "deal",
- "trigger": "update",
- "value": "Москва"
}
}
}, - "active": true
}
{- "result": "success",
- "id": "655b4c21d122e90012a72834",
- "name": "My campaign",
- "liveTime": 24,
- "templateId": 1,
- "scenarioId": "5eb882228fdef800142e87c2",
- "channels": [
- {
- "name": "notify+vk",
- "connections": [
- 1,
- 2
], - "ttl": 60
}
], - "autoCampaign": {
- "contactsFilter": {
- "union": "or",
- "conditions": [
- {
- "union": "and",
- "conditions": [
- {
- "field": "d00137359aa5f3cd834e8aad",
- "op": "gt",
- "value": 10
}, - {
- "field": "d00137359aa5f3cd834e8aad",
- "op": "lt",
- "value": 20
}
]
}, - {
- "union": null,
- "conditions": [
- {
- "field": "channels",
- "op": "has",
- "value": "vk"
}
]
}
]
}, - "dealsFilter": {
- "union": "or",
- "conditions": [
- {
- "union": "and",
- "conditions": [
- {
- "field": "d00137359aa5f3cd834e8aad",
- "op": "gt",
- "value": 10
}, - {
- "field": "d00137359aa5f3cd834e8aad",
- "op": "lt",
- "value": 20
}
]
}, - {
- "union": null,
- "conditions": [
- {
- "field": "name",
- "op": "contains",
- "value": "123"
}
]
}
]
}, - "sendTime": {
- "period": "after",
- "interval": {
- "value": 1,
- "units": "minutes"
}, - "field": {
- "name": "<id атрибута Город>",
- "type": "deal",
- "trigger": "update",
- "value": "Москва"
}
}
}, - "active": true,
- "lang": "ru",
- "createdAt": "2021-04-09T09:55:09.782Z",
- "updatedAt": "2021-04-09T09:55:09.782Z"
}
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
id required | string ID автоматической кампании |
{- "id": "2c78e241008fedf822288be5"
}
{- "result": "success"
}
Нотификации - возможность отправить пользователям односторонние сообщение с импользованием большинства имеющихся каналов. В рамках данного решения вы отправляете конкретное сообщение. Задача платформы - доставить это сообщение. При этом если для сообщения в вашем аккаунте будет найден шаблон, то сообщение автоматически уйдет теми каналами, для которых найденный шаблон был зарегистрирован/одобрен. Так может быть организована доставка сообщений, к примеру, через WhatsApp Business API. Если же шаблоны не будут обнаружены, сообщение автоматически переотправляется через SMS (необходимо, чтобы данный канал был подключен в аккаунте).
Если параметр channels не указан, то нотификация будет отправлена в соответствии с заданными настройками в аккаунте.
Отправка возможна по номеру телефона или по ID контакта. В любом случае сперва будет предпринята попытка найти цифровой профиль пользователя во Fromni. Затем по имеющимся идентификаторам в различных мессенджерах будет произведена попытка доставки нотификации в указанные каналы (до 1-ой успешной отправки).
Некоторые каналы позволяют прикреплять вложения (например, в Instagram и Viber - бизнес-сообщения доступно только 1 изображение; Notify и SMS не могут содержать вложений).
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
phone | string Номер получателя. Если не указан contactId, то поле обязательно. |
contactId | string ID контакта в CRM. Если не указан phone, то поле обязательно. |
required | object (CampaignMessage) Сообщение, отправляемое через канал(-ы) |
required | Array of objects (CampaignChannels) Список каналов, по которым будет отправлятсья сообщение до первой доставки. Порядок каналов в массиве задает порядок отправки. |
{- "phone": 79000000000,
- "contactId": "5f3cd834e8aadd00137359aa",
- "message": {
- "text": "Текст сообщения",
- "attachments": [
],
}, - "channels": [
- {
- "name": "notify+vk",
- "connections": [
- 1,
- 2
], - "ttl": 60
}
]
}
{- "result": "success",
- "id": "6062fdc861914f0013e793a2"
}
{- "type": "notification_message_updated",
- "data": {
- "id": "6062fdc861914f0013e793a2",
- "status": "error",
- "channel": "whatsapp-business",
- "statusDetails": {
- "desc": "Unable to send to any channel because contact doesn't have destination params for specified channels"
}
}
}
События позволяют запускать Кампании автоматически. События могут быть созданы с помощью API-запроса или через WEB-интерфейс.
Каждое создаваемое событие имеет вычисляемый параметр tag. Все события, которые вы самостоятельно создадите, имеют tag "custom".
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
{- "result": "success",
- "data": [
- {
- "id": 1,
- "name": "added_to_cart",
- "displayName": "Добавлено в корзину",
- "tag": "custom",
- "vars": [
- {
- "name": "Номер телефона",
- "path": "phone",
- "type": "string"
}, - {
- "name": "Стоимость",
- "path": "price",
- "type": "number"
}
]
}
]
}
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
name required | string Имя события для передачи по API. Учтите, что имя НЕ должно содержать заглавные буквы и точки |
displayName | string Видимое в личном кабинете название события |
Array of objects Параметры события |
{- "name": "added_to_cart",
- "displayName": "Добавлено в корзину",
- "vars": [
- {
- "name": "Номер телефона",
- "path": "phone",
- "type": "string"
}, - {
- "name": "Стоимость",
- "path": "price",
- "type": "number"
}
]
}
{- "result": "success",
- "id": 1,
- "name": "added_to_cart",
- "displayName": "Добавлено в корзину",
- "tag": "custom",
- "vars": [
- {
- "name": "Номер телефона",
- "path": "phone",
- "type": "string"
}, - {
- "name": "Стоимость",
- "path": "price",
- "type": "number"
}
]
}
При передаче события в систему будет предпринята попытка найти связанную с ним Кампанию. Если таковая имеется, то она будет запущена, а в ответ будет возвращено ее id. Важно, чтобы номер телефона получателя также передавался в данных События, а путь до него был определен в переменных Кампании.
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
name required | string Имя события. Учтите, что имя НЕ должно содержать заглавные буквы |
data | object Любой объект, содержащий данные события |
{- "name": "added_to_cart",
- "data": {
- "client": {
- "phone": 79990000000
}, - "category": "Cars",
- "productId": 12345
}
}
{- "result": "success",
- "id": "2c78e241008fedf822288be5"
}
Шаблоны текстов необходимы для того, чтобы компания могла писать первой в каналах, где не разрешены произвольные текста.
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
offset | number Default: 0 Отступ от начала списка |
limit | number Default: 10 Максимальное количество записей в ответе. Не указывайте этот параметр, если необходимо вернуть все записи. |
order | Array of strings[ items ] Параметры сортировки. Каждый элемент - массив, в котором 1-ый элемент - название поля, по которому идет сортировка, а 2-ой элмент - порядок сортировки (ASC или DESC) |
{- "offset": 0,
- "limit": 10,
- "order": [
- [
- "createdAt",
- "DESC"
]
]
}
{- "result": "success",
- "data": [
- {
- "id": 1,
- "displayName": "Тестовый шаблон",
- "text": "Тестовый шаблон от компании #COMPAY_NAME#.",
- "regexpText": "^Тестовый шаблон от компании (.+).$",
- "name": "before_visit_10_min",
- "channels": [
- {
- "id": 1,
- "channel": "whatsapp",
- "status": "approved",
- "updated_at": "2022-03-09T00:00:00.000Z",
- "components": null,
- "keyboard": {
- "inline": true
}, - "attachments": [
], - "sender": null
}
], - "templateGroupId": 1,
- "groupName": "Группа шаблонов для примера",
- "group": [
- {
- "id": 1,
- "displayName": "Тестовый шаблон",
- "text": "Тестовый шаблон от компании #COMPAY_NAME#.",
- "regexpText": "^Тестовый шаблон от компании (.+).$",
- "name": "added_to_cart",
- "channels": [
- {
- "id": 1,
- "channel": "whatsapp",
- "status": "approved",
- "updated_at": "2022-03-09T00:00:00.000Z",
- "components": null,
- "keyboard": {
- "buttons": [
- {
- "type": null,
- "text": null,
- "link": null
}
], - "inline": true
}, - "attachments": [
], - "sender": null
}
]
}
]
}
]
}
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
displayName | string Название шаблона |
text required | string Текст сообщения |
name | String Название шаблона в API |
Array of objects Массив каналов, через которые планируется отправлять данный шаблон |
{- "displayName": "Тестовый шаблон",
- "text": "Привет! Это образец сообщения",
- "name": "before_visit_10_min",
- "channels": [
- {
- "channel": "whatsapp",
- "keyboard": {
- "inline": true
}, - "attachments": [
]
}
]
}
{- "result": "success",
- "id": 1,
- "displayName": "Тестовый шаблон",
- "text": "Тестовый шаблон от компании #COMPAY_NAME#.",
- "regexpText": "^Тестовый шаблон от компании (.+).$",
- "name": "before_visit_10_min",
- "channels": [
- {
- "id": 1,
- "channel": "whatsapp",
- "status": "approved",
- "updated_at": "2022-03-09T00:00:00.000Z",
- "components": null,
- "keyboard": {
- "inline": true
}, - "attachments": [
], - "sender": null
}
]
}
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
id required | number ID шаблона |
text required | string Текст шаблона |
{- "id": 1,
- "text": "Новый текст шаблона"
}
{- "result": "success"
}
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
templateId required | number ID шаблона |
required | object |
{- "templateId": 1,
- "channel": {
- "channel": "telegram"
}
}
{- "result": "success",
- "templateId": 1,
- "channel": "telegram",
- "status": "moderate",
- "updated_at": "2022-07-07T19:52:15.023Z"
}
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
templateId required | number ID шаблона |
channel required | string Идентификатор канала |
{- "templateId": 1,
- "channel": "telegram"
}
{- "result": "success"
}
Один шаблон может состоять только в одной группе. В группу нельзя объединить шаблоны, имеющие хотя бы один схожий канал.
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
name required | string Название группы |
templates required | Array of numbers ID шаблонов, входяших в группу |
{- "name": "Тестовая группа шаблонов",
- "templates": [
- 1,
- 2
]
}
{- "result": "success",
- "id": 1,
- "name": "Тестовая группа шаблонов",
- "created_at": "2022-03-09T00:00:00.000Z",
- "updated_at": "2022-03-09T00:00:00.000Z"
}
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
id required | number ID группы |
name required | string Название группы |
{- "id": 1,
- "name": "Новое название группы шаблонов"
}
{- "result": "success",
- "id": 1,
- "name": "Новое название группы шаблонов",
- "created_at": "2022-03-09T00:00:00.000Z",
- "updated_at": "2022-03-09T00:00:00.000Z"
}
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
templateId required | number ID шаблона |
templateGroupId required | number ID группы шаблонов |
{- "templateId": 1,
- "templateGroupId": 1
}
{- "result": "success"
}
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
templateId required | number ID шаблона |
{- "templateId": 1
}
{- "result": "success"
}
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
templateId required | number ID шаблона |
{- "templateId": 1
}
{- "result": "success"
}
Медиа-хранилище позволяет загружать файлы для получения прямой ссылки на них, которую можно указать для вложения при отправке сообщения. Также в хранилище сохраняются вложения из входящих сообщений пользователей.
Размер файла на данный момент ограничен 10Мб.
Чтобы загрузить файл в хранилище, сначала необходимо получить параметры сервера для загрузки. Ответ содержит поле url - адрес, на который необходимо отправить POST-запрос с телом в формате FromData, ссылка действительна 1 час. Для каждого нового загружаемого элемента необходимо получать новые параметры.
Также ответ содержит объект fields, каждый ключ которого необходимо передать в исходном виде вместе с запросом как пару ключ-значение в FormData. Сам файл передается по ключу file и обязательно должен быть указан самым последним. В ответе возвращается поле mediaUrl, содержащее прямую ссылку на будущий загруженный файл, используйте ее для вставки в сообщение.
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
contentType | string Тип файла, желательно указать во избежание ошибок |
filename required | string Имя файла обязательно с расширением |
{- "contentType": "application/pdf",
- "filename": "contract.pdf"
}
{- "result": "success",
- "fields": {
- "Key": "prefix/image.png",
- "ACL": "public-read",
- "bucket": "fromni-storage",
- "X-Amz-Algorithm": "AWS4-HMAC-SHA256",
- "X-Amz-Credential": "Credential",
- "X-Amz-Date": "20210719T075156Z",
- "Policy": "policyStringExample",
- "X-Amz-Signature": "signatureStringExample"
},
}
Контакты - все пользователи, с которыми когда-либо велось взаимодействие. Для каждого из них во Fromni создается цифровой профиль, который включает в себя их идентификаторы в различных мессенджерах, публичные данные из мессенджеров, а также значения переменных.
Переменные контактов могут иметь следующие типы (поле type):
Тип | Описание |
---|---|
STRING | Строка |
NUMBER | Число |
DATE | Строка. Содержит дату в формате ISO |
Строка. Содержит email | |
SELECT | Выбор. К переменной добавляется поле options - массив из возможных значений в виде строк |
Даже если был создан один контакт, то он все равно будет прислан в массиве.
type required | string |
required | Array of objects (Контакт) |
{- "type": "contact_created",
- "data": [
- {
- "id": "5f3cd6d49ed4e10013083db0",
- "phone": 79990000000,
- "blacklisted": true,
- "externalId": "12345",
- "source": "booking_service",
- "profiles": [
- {
- "_id": "5f3cd834e8aadd00137359aa",
- "profileId": "13579",
- "socialId": "my_telegram_bot",
- "channel": "telegram",
- "info": {
- "first_name": "Example",
- "username": "example_user",
- "language_code": "en"
}, - "createdAt": "2023-11-17T07:43:48.417Z",
- "updatedAt": "2023-11-17T07:43:48.417Z"
}
], - "createdAt": "2021-04-09T09:55:09.782Z",
- "updatedAt": "2021-04-09T09:55:09.782Z"
}
]
}
Объект data содержит все поля контакта, а не только обновленные.
type required | string |
required | object (Contact) |
{- "type": "contact_updated",
- "data": {
- "id": "5f3cd6d49ed4e10013083db0",
- "phone": 79990000000,
- "blacklisted": true,
- "externalId": "12345",
- "source": "booking_service",
- "profiles": [
- {
- "_id": "5f3cd834e8aadd00137359aa",
- "profileId": "13579",
- "socialId": "my_telegram_bot",
- "channel": "telegram",
- "info": {
- "first_name": "Example",
- "username": "example_user",
- "language_code": "en"
}, - "createdAt": "2023-11-17T07:43:48.417Z",
- "updatedAt": "2023-11-17T07:43:48.417Z"
}
], - "createdAt": "2021-04-09T09:55:09.782Z",
- "updatedAt": "2021-04-09T09:55:09.782Z"
}
}
Контакты объединены, т.к. идентификаторы в одном из каналов совпали. Поле preservedContact содержит контакт, сохраненный после слияния, поле deletedContact - удаленный контакт.
type required | string |
required | object |
{- "type": "contact_merged",
- "data": {
- "preservedContact": {
- "id": "5f3cd6d49ed4e10013083db0",
- "phone": 79990000000,
- "blacklisted": true,
- "externalId": "12345",
- "source": "booking_service",
- "profiles": [
- {
- "_id": "5f3cd834e8aadd00137359aa",
- "profileId": "13579",
- "socialId": "my_telegram_bot",
- "channel": "telegram",
- "info": {
- "first_name": "Example",
- "username": "example_user",
- "language_code": "en"
}, - "createdAt": "2023-11-17T07:43:48.417Z",
- "updatedAt": "2023-11-17T07:43:48.417Z"
}
], - "createdAt": "2021-04-09T09:55:09.782Z",
- "updatedAt": "2021-04-09T09:55:09.782Z"
}, - "deletedContact": {
- "id": "5f3cd6d49ed4e10013083db0",
- "phone": 79990000000,
- "blacklisted": true,
- "externalId": "12345",
- "source": "booking_service",
- "profiles": [
- {
- "_id": "5f3cd834e8aadd00137359aa",
- "profileId": "13579",
- "socialId": "my_telegram_bot",
- "channel": "telegram",
- "info": {
- "first_name": "Example",
- "username": "example_user",
- "language_code": "en"
}, - "createdAt": "2023-11-17T07:43:48.417Z",
- "updatedAt": "2023-11-17T07:43:48.417Z"
}
], - "createdAt": "2021-04-09T09:55:09.782Z",
- "updatedAt": "2021-04-09T09:55:09.782Z"
}
}
}
Для информации о том, как формировать фильтр контактов, см. Правила формирования фильтров контактов и сделок.
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
object (ContactsFilter) | |
offset | number Default: 0 Отступ от начала списка |
limit | number Default: 10 Максимальное количество записей в ответе. Не указывайте этот параметр, если необходимо вернуть все записи. |
order | Array of strings[ items ] Параметры сортировки. Каждый элемент - массив, в котором 1-ый элемент - название поля, по которому идет сортировка, а 2-ой элмент - порядок сортировки (ASC или DESC) |
{- "filter": {
- "union": "or",
- "conditions": [
- {
- "union": "and",
- "conditions": [
- {
- "field": "d00137359aa5f3cd834e8aad",
- "op": "gt",
- "value": 10
}, - {
- "field": "d00137359aa5f3cd834e8aad",
- "op": "lt",
- "value": 20
}
]
}, - {
- "union": null,
- "conditions": [
- {
- "field": "channels",
- "op": "has",
- "value": "vk"
}
]
}
]
}, - "offset": 0,
- "limit": 10,
- "order": [
- [
- "createdAt",
- "DESC"
]
]
}
{- "result": "success",
- "data": [
- {
- "id": "5f3cd6d49ed4e10013083db0",
- "phone": 79990000000,
- "blacklisted": true,
- "externalId": "12345",
- "source": "booking_service",
- "profiles": [
- {
- "_id": "5f3cd834e8aadd00137359aa",
- "profileId": "13579",
- "socialId": "my_telegram_bot",
- "channel": "telegram",
- "info": {
- "first_name": "Example",
- "username": "example_user",
- "language_code": "en"
}, - "createdAt": "2023-11-17T07:43:48.417Z",
- "updatedAt": "2023-11-17T07:43:48.417Z"
}
], - "createdAt": "2021-04-09T09:55:09.782Z",
- "updatedAt": "2021-04-09T09:55:09.782Z",
- "variables": [
- {
- "id": "60b7f9b6163fec0007ecdaf0",
- "name": "Город",
- "type": "STRING",
- "apiName": "gorod",
- "createdAt": "2022-05-10T00:00:00.000Z",
- "updatedAt": "2022-05-10T00:00:00.000Z",
- "value": "Москва"
}
]
}
], - "total": 100
}
Возвращает список контактов (телефон, профили, переменные и пр.).
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
id required | string ID контакта |
{- "id": "608044bd4eeb3c0013c2e21e"
}
{- "result": "success",
- "id": "5f3cd6d49ed4e10013083db0",
- "phone": 79990000000,
- "blacklisted": true,
- "externalId": "12345",
- "source": "booking_service",
- "profiles": [
- {
- "_id": "5f3cd834e8aadd00137359aa",
- "profileId": "13579",
- "socialId": "my_telegram_bot",
- "channel": "telegram",
- "info": {
- "first_name": "Example",
- "username": "example_user",
- "language_code": "en"
}, - "createdAt": "2023-11-17T07:43:48.417Z",
- "updatedAt": "2023-11-17T07:43:48.417Z"
}
], - "createdAt": "2021-04-09T09:55:09.782Z",
- "updatedAt": "2021-04-09T09:55:09.782Z",
- "variables": [
- {
- "id": "60b7f9b6163fec0007ecdaf0",
- "name": "Город",
- "type": "STRING",
- "apiName": "gorod",
- "createdAt": "2022-05-10T00:00:00.000Z",
- "updatedAt": "2022-05-10T00:00:00.000Z",
- "value": "Москва"
}
]
}
Создает контакты в CRM с указанным номером телефона и переменными.
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
phone required | string Номер телефона контакта (номер начинается с '+') |
blacklisted | bool Default: false Внесен ли контакт в черный список (если внесен, то контакт не будет получать ручные и автоматические рассылки, но ему все также можно написать через мессенджер) |
externalId | string ID контакта из внешнего источника |
source | string Название источника контакта |
Array of objects Список переменных |
[- {
- "phone": 79990000000,
- "blacklisted": true,
- "externalId": "12345",
- "source": "booking_service",
- "variables": [
- {
- "name": "60b7f9b6163fec0007ecdaf0",
- "value": "Москва"
}
]
}
]
{- "result": "success",
- "data": [
- {
- "id": "5f3cd6d49ed4e10013083db0",
- "phone": 79990000000,
- "blacklisted": true,
- "externalId": "12345",
- "source": "booking_service",
- "profiles": [
- {
- "_id": "5f3cd834e8aadd00137359aa",
- "profileId": "13579",
- "socialId": "my_telegram_bot",
- "channel": "telegram",
- "info": {
- "first_name": "Example",
- "username": "example_user",
- "language_code": "en"
}, - "createdAt": "2023-11-17T07:43:48.417Z",
- "updatedAt": "2023-11-17T07:43:48.417Z"
}
], - "createdAt": "2021-04-09T09:55:09.782Z",
- "updatedAt": "2021-04-09T09:55:09.782Z",
- "variables": [
- {
- "id": "60b7f9b6163fec0007ecdaf0",
- "name": "Город",
- "type": "STRING",
- "apiName": "gorod",
- "createdAt": "2022-05-10T00:00:00.000Z",
- "updatedAt": "2022-05-10T00:00:00.000Z",
- "value": "Москва"
}
]
}
]
}
Необходимо передавать только те параметры, которые нужно обновить. Если у контакта уже есть профиль с такими же profileId и channel, то обновится info, иначе создастся новый профиль.
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
contactId required | string ID контакта |
phone | string Номер телефона контакта (номер начинается с '+') |
blacklisted | bool Default: false Внесен ли контакт в черный список (если внесен, то контакт не будет получать ручные и автоматические рассылки, но ему все также можно написать через мессенджер) |
externalId | string ID контакта из внешнего источника |
source | string Название источника контакта |
object (ContactProfile) Профиль контакта в соц. сети / мессенджере |
{- "contactId": "6062fdc861914f0013e793a2",
- "phone": 79990000000,
- "blacklisted": true,
- "externalId": "12345",
- "source": "booking_service",
- "profile": {
- "profileId": "13579",
- "socialId": "my_telegram_bot",
- "channel": "telegram",
- "info": {
- "first_name": "Example",
- "username": "example_user",
- "language_code": "en"
}
}
}
{- "result": "success"
}
По умолчанию Вам доступны следующие переменные: Имя (строка), Фамилия (строка), День рождения (дата), Город (строка), Страна (строка), Пол (строка), Email (строка), Тег 1 (строка), Тег 2 (выбор). Значения этих переменных профиля заполняются данными из соц. сетей (например, ВКонтакте и Facebook), однако вы можете изменять эти значения.
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
null
{- "result": "success",
- "data": [
- {
- "id": "60b7f9b6163fec0007ecdaf0",
- "name": "Город",
- "type": "STRING",
- "apiName": "gorod",
- "createdAt": "2022-05-10T00:00:00.000Z",
- "updatedAt": "2022-05-10T00:00:00.000Z"
}
]
}
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
name required | string Имя переменной |
type | string Default: "STRING" Enum: "STRING" "NUMBER" "DATE" "SELECT" |
apiName | string Название переменной (только a-z, 0-9 и _), которое нельзя изменить через интерфейс и которое используется для вставки значения переменной в текст шаблона (например, #contact.city#). Значение по умолчанию будет сгенерировано на основе name с использованием транслитерации |
options | Array of strings or numbers or null Список опций для переменной с типом SELECT и MULTISELECT |
{- "name": "Город",
- "type": "STRING",
- "apiName": "gorod",
- "options": null
}
{- "result": "success",
- "id": "60b7f9b6163fec0007ecdaf0"
}
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
id required | string ID переменной |
name required | string Имя переменной |
type required | string Default: "STRING" Enum: "STRING" "NUMBER" "DATE" "SELECT" |
apiName required | string Название переменной (только a-z, 0-9 и _), которое нельзя изменить через интерфейс и которое используется для вставки значения переменной в текст шаблона (например, #contact.city#). Значение по умолчанию будет сгенерировано на основе name с использованием транслитерации |
{- "id": "60b7f9b6163fec0007ecdaf0",
- "name": "Город",
- "type": "STRING",
- "apiName": "gorod"
}
{- "result": "success"
}
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
id required | string ID переменной |
{- "id": "60b7f9b6163fec0007ecdaf0"
}
{- "result": "success"
}
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
contactId required | string ID контакта |
required | Array of objects Список переменных |
{- "contactId": "608044bd4eeb3c0013c2e21e",
- "variables": [
- {
- "variableId": "60b7f9b6163fec0007ecdaf0",
- "value": "Москва"
}
]
}
{- "result": "success"
}
Метод позволяет проверить правильность мобильных номеров в соответствии с региональными правилами и получить их в отформатированном виде.
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
phones required | Array of strings Массив номеров телефонов |
{- "phones": [
- "79000000000",
- "+375000000"
]
}
{- "result": "success",
- "data": [
- "+79000000000",
- null
]
}
Сделки - раздел в CRM, в котором хранится история сделок с вашими клиентами. По созданным сделкам Вы можете отправлять автоматические кампании для уведомления клиентов или своих сотрудников.
Метод поддерживает как одиночное, так и пакетное добавление сделок. При пакетном добавлении созданные сделки возвращаются в массиве data. Если при добавлении сделок в пакетном режиме произошла ошибка при создании какой-либо сделки, то в ответном массиве элемент с соответсвующим индексом будет содержать поле error с описанием ошибки.
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
name required | string Название сделки |
required | Array of objects (AttributeSimple) Массив атрибутов сделки, у которых поле entity равно 'deal' |
Array of objects Список товаров/услуг, относящихся к сделке | |
contactId required | string ID контакта в системе Fromni, связанного со сделкой |
externalId | string ID сделки из внешнего источника |
source | string Название источника сделки |
{- "name": "Название сделки",
- "attributes": [
- {
- "id": "627c39f0e18d850013026ec5",
- "value": "Москва"
}
], - "products": [
- {
- "attributes": [
- {
- "id": "627c39f0e18d850013026ec5",
- "value": "Москва"
}
]
}
], - "contactId": "6011cd57f1a1932d984f2bcc",
- "externalId": "12345",
- "source": "booking_service"
}
{- "result": "success",
- "id": "627c483de18d850013027b7b",
- "name": "Название сделки",
- "attributes": [
- {
- "id": "627c39f0e18d850013026ec5",
- "name": "Город",
- "type": "STRING",
- "options": null,
- "required": true,
- "entity": "deal",
- "apiField": "order.city",
- "active": true,
- "apiName": "gorod",
- "isDefault": false,
- "updatedAt": "2022-05-10T00:00:00.000Z",
- "value": "Москва",
- "utcOffset": 0
}
], - "products": [
- {
- "id": "627c483de18d850013027b85",
- "dealId": "627c483de18d850013027b7b",
- "attributes": [
- {
- "id": "627c39f0e18d850013026ec5",
- "name": "Город",
- "type": "STRING",
- "options": null,
- "required": true,
- "entity": "deal",
- "apiField": "order.city",
- "active": true,
- "apiName": "gorod",
- "isDefault": false,
- "updatedAt": "2022-05-10T00:00:00.000Z",
- "value": "Москва",
- "utcOffset": 0
}
]
}
], - "contactId": "6011cd57f1a1932d984f2bcc",
- "externalId": "12345",
- "source": "booking_service",
- "createdAt": "2022-05-10T00:00:00.000Z",
- "updatedAt": "2022-05-10T00:00:00.000Z"
}
Для информации о том, как формировать фильтр сделок, см. Правила формирования фильтров контактов и сделок.
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
object (DealsFilter) | |
offset | number Default: 0 Отступ от начала списка |
limit | number Default: 10 Максимальное количество записей в ответе. Не указывайте этот параметр, если необходимо вернуть все записи. |
order | Array of strings[ items ] Параметры сортировки. Каждый элемент - массив, в котором 1-ый элемент - название поля, по которому идет сортировка, а 2-ой элмент - порядок сортировки (ASC или DESC) |
{- "filter": {
- "union": "or",
- "conditions": [
- {
- "union": "and",
- "conditions": [
- {
- "field": "d00137359aa5f3cd834e8aad",
- "op": "gt",
- "value": 10
}, - {
- "field": "d00137359aa5f3cd834e8aad",
- "op": "lt",
- "value": 20
}
]
}, - {
- "union": null,
- "conditions": [
- {
- "field": "name",
- "op": "contains",
- "value": "123"
}
]
}
]
}, - "offset": 0,
- "limit": 10,
- "order": [
- [
- "createdAt",
- "DESC"
]
]
}
{- "result": "success",
- "data": [
- {
- "id": "627c483de18d850013027b7b",
- "name": "Название сделки",
- "attributes": [
- {
- "id": "627c39f0e18d850013026ec5",
- "name": "Город",
- "type": "STRING",
- "options": null,
- "required": true,
- "entity": "deal",
- "apiField": "order.city",
- "active": true,
- "apiName": "gorod",
- "isDefault": false,
- "updatedAt": "2022-05-10T00:00:00.000Z",
- "value": "Москва",
- "utcOffset": 0
}
], - "products": [
- {
- "id": "627c483de18d850013027b85",
- "dealId": "627c483de18d850013027b7b",
- "attributes": [
- {
- "id": "627c39f0e18d850013026ec5",
- "name": "Город",
- "type": "STRING",
- "options": null,
- "required": true,
- "entity": "deal",
- "apiField": "order.city",
- "active": true,
- "apiName": "gorod",
- "isDefault": false,
- "updatedAt": "2022-05-10T00:00:00.000Z",
- "value": "Москва",
- "utcOffset": 0
}
]
}
], - "contactId": "6011cd57f1a1932d984f2bcc",
- "externalId": "12345",
- "source": "booking_service",
- "createdAt": "2022-05-10T00:00:00.000Z",
- "updatedAt": "2022-05-10T00:00:00.000Z"
}
], - "total": 1
}
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
id required | string ID сделки |
{- "id": "627c483de18d850013027b7b"
}
{- "result": "success",
- "id": "627c483de18d850013027b7b",
- "name": "Название сделки",
- "attributes": [
- {
- "id": "627c39f0e18d850013026ec5",
- "name": "Город",
- "type": "STRING",
- "options": null,
- "required": true,
- "entity": "deal",
- "apiField": "order.city",
- "active": true,
- "apiName": "gorod",
- "isDefault": false,
- "updatedAt": "2022-05-10T00:00:00.000Z",
- "value": "Москва",
- "utcOffset": 0
}
], - "products": [
- {
- "id": "627c483de18d850013027b85",
- "dealId": "627c483de18d850013027b7b",
- "attributes": [
- {
- "id": "627c39f0e18d850013026ec5",
- "name": "Город",
- "type": "STRING",
- "options": null,
- "required": true,
- "entity": "deal",
- "apiField": "order.city",
- "active": true,
- "apiName": "gorod",
- "isDefault": false,
- "updatedAt": "2022-05-10T00:00:00.000Z",
- "value": "Москва",
- "utcOffset": 0
}
]
}
], - "contactId": "6011cd57f1a1932d984f2bcc",
- "externalId": "12345",
- "source": "booking_service",
- "createdAt": "2022-05-10T00:00:00.000Z",
- "updatedAt": "2022-05-10T00:00:00.000Z"
}
Метод поддерживает как одиночное, так и пакетное удаление сделок. При пакетном удалении результат возвращается в массиве data. Если при удалении сделки в пакетном режиме произошла ошибка, то в ответном массиве элемент с соответсвующим индексом будет содержать поле error с описанием ошибки.
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
id required | string ID сделки |
{- "id": "627c483de18d850013027b7b"
}
{- "result": "success",
- "data": true
}
Учтите, что важно передать все атрибуты ранее созданной сделки, в противном случае значение атрибута будет отвязано от сделки (удалено). Вы можете указать новые атрибуты, в таком случае они добавятся к списку существующих атрибутов сделки.
Также обратите внимание, что для обновления атрибутов товаров/услуг сделки необходимо передать ID товара/сделки (поле id), полученные в ответе при создании сделки
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
name required | string Название сделки |
required | Array of objects (AttributeSimple) Массив атрибутов сделки, у которых поле entity равно 'deal' |
Array of objects Список товаров/услуг, относящихся к сделке | |
contactId required | string ID контакта в системе Fromni, связанного со сделкой |
externalId | string ID сделки из внешнего источника |
source | string Название источника сделки |
{- "name": "Название сделки",
- "attributes": [
- {
- "id": "627c39f0e18d850013026ec5",
- "value": "Москва"
}
], - "products": [
- {
- "attributes": [
- {
- "id": "627c39f0e18d850013026ec5",
- "value": "Москва"
}
], - "id": "627c483de18d850013027b85",
- "dealId": "627c483de18d850013027b7b"
}
], - "contactId": "6011cd57f1a1932d984f2bcc",
- "externalId": "12345",
- "source": "booking_service"
}
{- "result": "success",
- "id": "627c483de18d850013027b7b",
- "name": "Название сделки",
- "attributes": [
- {
- "id": "627c39f0e18d850013026ec5",
- "name": "Город",
- "type": "STRING",
- "options": null,
- "required": true,
- "entity": "deal",
- "apiField": "order.city",
- "active": true,
- "apiName": "gorod",
- "isDefault": false,
- "updatedAt": "2022-05-10T00:00:00.000Z",
- "value": "Москва",
- "utcOffset": 0
}
], - "products": [
- {
- "id": "627c483de18d850013027b85",
- "dealId": "627c483de18d850013027b7b",
- "attributes": [
- {
- "id": "627c39f0e18d850013026ec5",
- "name": "Город",
- "type": "STRING",
- "options": null,
- "required": true,
- "entity": "deal",
- "apiField": "order.city",
- "active": true,
- "apiName": "gorod",
- "isDefault": false,
- "updatedAt": "2022-05-10T00:00:00.000Z",
- "value": "Москва",
- "utcOffset": 0
}
]
}
], - "contactId": "6011cd57f1a1932d984f2bcc",
- "externalId": "12345",
- "source": "booking_service",
- "createdAt": "2022-05-10T00:00:00.000Z",
- "updatedAt": "2022-05-10T00:00:00.000Z"
}
Атрибуты сделок могут иметь различный тип. Также атрибут относится к одной из сущностей: Сделка (deal) или Товар/услуга (product).
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
name required | string Название атрибута |
type required | string Default: "STRING" Enum: "STRING" "NUMBER" "DATE" "DATETIME" "BOOLEAN" "SELECT" "MULTISELECT" Тип атрибута |
options | Array of strings or numbers or null Список опций для атрибутов с типом SELECT и MULTISELECT |
required | bool Default: false Является ли атрибут обязательным при создании сделки |
entity | string Default: "deal" Enum: "deal" "product" Обозначение, к какой сущности относится атрибут. deal - общий атрибут сделок, product - атрибут товаров/услуг сделок |
apiField | string Путь до значения атрибута в исходном JSON-объекте сделки |
active | bool Default: true Является ли атрибут активным. Если false, то атрибут не будет показан при создании сделки, но при этом значение атрибута будет отображаться для уже созданных сделок |
apiName | string Название атрибута (только a-z, 0-9 и _), которое нельзя изменить через интерфейс и которое используется для вставки значения атрибута в текст шаблона (например, #deal.city#). Значение по умолчанию будет сгенерировано на основе name с использованием транслитерации |
{- "name": "Город",
- "type": "STRING",
- "options": null,
- "required": true,
- "entity": "deal",
- "apiField": "order.city",
- "active": true,
- "apiName": "gorod"
}
{- "result": "success",
- "id": "627c39f0e18d850013026ec5",
- "name": "Город",
- "type": "STRING",
- "options": null,
- "required": true,
- "entity": "deal",
- "apiField": "order.city",
- "active": true,
- "apiName": "gorod",
- "isDefault": false,
- "updatedAt": "2022-05-10T00:00:00.000Z"
}
По умолчанию Вам доступны следующие атрибуты: Статус (сущность - Сделка, тип - Выбор), Сумма (Сделка, Число), Наименование (Товар/услуга, Строка), Стоимость (Товар/услуга, Число).
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
{ }
{- "result": "success",
- "data": [
- {
- "id": "627c39f0e18d850013026ec5",
- "name": "Город",
- "type": "STRING",
- "options": null,
- "required": true,
- "entity": "deal",
- "apiField": "order.city",
- "active": true,
- "apiName": "gorod",
- "isDefault": false,
- "updatedAt": "2022-05-10T00:00:00.000Z"
}
]
}
Для обновления достаточно передать только ID атрибута и обновляемые поля
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
id required | string ID атрибута |
name required | string Название атрибута |
type required | string Default: "STRING" Enum: "STRING" "NUMBER" "DATE" "DATETIME" "BOOLEAN" "SELECT" "MULTISELECT" Тип атрибута |
options | Array of strings or numbers or null Список опций для атрибутов с типом SELECT и MULTISELECT |
required | bool Default: false Является ли атрибут обязательным при создании сделки |
entity | string Default: "deal" Enum: "deal" "product" Обозначение, к какой сущности относится атрибут. deal - общий атрибут сделок, product - атрибут товаров/услуг сделок |
apiField | string Путь до значения атрибута в исходном JSON-объекте сделки |
active | bool Default: true Является ли атрибут активным. Если false, то атрибут не будет показан при создании сделки, но при этом значение атрибута будет отображаться для уже созданных сделок |
apiName | string Название атрибута (только a-z, 0-9 и _), которое нельзя изменить через интерфейс и которое используется для вставки значения атрибута в текст шаблона (например, #deal.city#). Значение по умолчанию будет сгенерировано на основе name с использованием транслитерации |
isDefault | bool Является ли атрибут атрибутом по умолчанию. Если true, то атрибут создан системой, если false - создан пользователем |
updatedAt | string Дата последнего обновления значения атрибута |
{- "id": "627c39f0e18d850013026ec5",
- "name": "Город",
- "type": "STRING",
- "options": null,
- "required": true,
- "entity": "deal",
- "apiField": "order.city",
- "active": true,
- "apiName": "gorod",
- "isDefault": false,
- "updatedAt": "2022-05-10T00:00:00.000Z"
}
{- "result": "success",
- "id": "627c39f0e18d850013026ec5",
- "name": "Город",
- "type": "STRING",
- "options": null,
- "required": true,
- "entity": "deal",
- "apiField": "order.city",
- "active": true,
- "apiName": "gorod",
- "isDefault": false,
- "updatedAt": "2022-05-10T00:00:00.000Z"
}
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
id required | string ID атрибута |
{- "id": "627c39f0e18d850013026ec5"
}
{- "result": "success"
}
Учтите, что с помощью этого метода можно только обновить значение атрибута, а не добавить новый или удалить старый.
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
dealId | string ID сделки |
attributeId | string ID атрибута |
productId | string or null ID товара/услуги или null, если атрибут принадлежит сущности 'deal' |
value | string or number or null Новое значение атрибута |
{- "dealId": "627c483de18d850013027b7b",
- "attributeId": "627c39f0e18d850013026ec5",
- "productId": "627c483de18d850013027b85",
- "value": "Санкт-Петербург"
}
{- "result": "success"
}
Каналы и их обозначения во Fromni:
Канал | Обозначение |
---|---|
ВКонтакте | vk |
Telegram | telegram |
Viber - чат-боты | viber-bots |
fb | |
Whatsapp Business | whatsapp-business |
Whatsapp WEB | |
Viber - бизнес-сообщения | viber |
SMS | sms |
Notify | notify |
Веб-чат | webchat |
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
null
{- "result": "success",
- "data": {
- "telegram": [
- {
- "id": 1,
- "name": "Мое подключение к Telegram",
- "isActive": true,
- "clientTag": "my_telegram_bot"
}
], - "whatsapp": [
- {
- "id": 2,
- "name": "Connection to WA",
- "isActive": false,
- "clientTag": "79876543210"
}
]
}
}
Callback-сервер также можно изменить в личном кабинке в разделе Настройки API.
Если попытка отправки уведомления потерпела неудачу (код ответа < 200 или >= 400 или ответ не был получен в отведенный таймаут), то будет произведено еще несколько попыток отправки. Количество попыток = 7. Интервал между попытками увеличивается следующим образом: 10 сек, 30 сек, 1.5 мин, 4.5 мин, 13.5 мин, 40.5 мин и 1 час.
Каждый запрос на callback-сервер имеет одинаковую структуру:
Поле | Описание |
---|---|
type | тип события |
data | данные события |
secret | строка, заданная при настройке адреса callback-сервера, для проверки подлинности запроса |
attempt | номер попытки (номер увеличивается на 1 после каждой неуспешной попытки) |
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
callbackUrl required | string Адрес колбэк-сервера |
secret | string Произвольная строка, которая передается с каждым запросом на колбэк-сервер в отдельном поле secret. Позволяет удостовериться, что уведомление пришло от нашего сервера. |
{- "secret": "some_secret_string"
}
{- "result": "success"
}
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
null
{- "result": "success",
- "secret": "some_secret_string"
}
В разделе описаны способы прямой связи с живыми операторами. Механизм запускается в момент, когда от Пользователя поступает такой тип входящего сообщения, который по Сценарию должен быть обработан специалистом на стороне Заказчика и через информационную систему Заказчика. Информация о входящем сообщении придет на Сallback-сервер (тип запроса - Инициирован новый диалог с оператором в Мессенджере). Далее вы сможете запросить историю сообщений диалога, используя метод Сообщения диалога.
Объект data содержит основную информацию о диалоге.
Поле contact содержит известные идентификаторы контакта в различных мессенджерах (phone, vkId, instagramId и т.п.). Поле connection содержит информацию о подключении, в рамках которого был начат диалог, в том числе идентификатор канала (vk, whatsapp-business, fb, viber и т.д.)
name | string |
required | object (Conversation) |
{- "name": "conversation_operator_requested",
- "data": {
- "id": "5f3cd834e8aadd00137359aa",
- "operatorMode": {
- "isActive": true,
- "expiresAt": "2020-08-19T09:44:02.942Z"
}, - "connection": {
- "id": 1,
- "channel": "whatsapp",
- "integrationId": 1,
- "provider": "Fromni",
- "createdAt": "2019-08-19T09:44:02.942Z"
}, - "contact": {
- "id": "5f3cd6d49ed4e10013083db0",
- "phone": 79990000000,
- "blacklisted": true,
- "externalId": "12345",
- "source": "booking_service",
- "profiles": [
- {
- "_id": "5f3cd834e8aadd00137359aa",
- "profileId": "13579",
- "socialId": "my_telegram_bot",
- "channel": "telegram",
- "info": {
- "first_name": "Example",
- "username": "example_user",
- "language_code": "en"
}, - "createdAt": "2023-11-17T07:43:48.417Z",
- "updatedAt": "2023-11-17T07:43:48.417Z"
}
], - "createdAt": "2021-04-09T09:55:09.782Z",
- "updatedAt": "2021-04-09T09:55:09.782Z"
}, - "scenario": {
- "id": "5f3515b16300bd0013c948c5"
}, - "startedAt": "2020-08-19T07:43:48.417Z",
- "startTrigger": "campaign",
- "endedAt": "2020-08-19T07:43:48.417Z",
- "endReason": "completed"
}
}
name | string |
required | object |
{- "name": "conversation_message_created",
- "data": {
- "conversationId": "5f3cd834e8aadd00137359aa",
- "message": {
- "text": "Текст сообщения",
- "attachments": [
]
}
}
}
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
offset | number Default: 0 Отступ от начала списка |
limit | number Default: 10 Максимальное количество записей в ответе. Не указывайте этот параметр, если необходимо вернуть все записи. |
{- "offset": 0,
- "limit": 10
}
{- "result": "success",
- "data": [
- {
- "id": "5f3cd834e8aadd00137359aa",
- "operatorMode": {
- "isActive": true,
- "expiresAt": "2020-08-19T09:44:02.942Z"
}, - "connection": {
- "id": 1,
- "channel": "whatsapp",
- "integrationId": 1,
- "provider": "Fromni",
- "createdAt": "2019-08-19T09:44:02.942Z"
}, - "contact": {
- "id": "5f3cd6d49ed4e10013083db0",
- "phone": 79990000000,
- "blacklisted": true,
- "externalId": "12345",
- "source": "booking_service",
- "profiles": [
- {
- "_id": "5f3cd834e8aadd00137359aa",
- "profileId": "13579",
- "socialId": "my_telegram_bot",
- "channel": "telegram",
- "info": {
- "first_name": "Example",
- "username": "example_user",
- "language_code": "en"
}, - "createdAt": "2023-11-17T07:43:48.417Z",
- "updatedAt": "2023-11-17T07:43:48.417Z"
}
], - "createdAt": "2021-04-09T09:55:09.782Z",
- "updatedAt": "2021-04-09T09:55:09.782Z"
}, - "scenario": {
- "id": "5f3515b16300bd0013c948c5"
}, - "startedAt": "2020-08-19T07:43:48.417Z",
- "startTrigger": "campaign",
- "endedAt": "2020-08-19T07:43:48.417Z",
- "endReason": "completed"
}
]
}
Метод может быть полезен, чтобы подгрузить историю общения Пользователя с Ботом после подключения оператора к диалогу.
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
conversationId | string ID диалога |
{- "conversationId": "5f3cd834e8aadd00137359aa"
}
{- "result": "success",
- "data": [
- {
- "id": 1,
- "connectionId": 1,
- "date": "2021-04-09T08:19:26.982Z",
- "out": true,
- "status": "read",
- "text": "Текст сообщения"
}
]
}
Оператор может отправить сообщение в диалог, только если operatorMode диалога не истек.
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
conversationId | string ID диалога |
object |
{- "conversationId": "5f3cd834e8aadd00137359aa",
- "message": {
- "text": "Текст сообщения",
- "attachments": [
]
}
}
{- "result": "success",
- "messageId": 2,
- "status": "sent",
- "conversationId": "5f3cd834e8aadd00137359aa"
}
{- "name": "conversation_message_updated",
- "data": {
- "conversationId": "5f3cd834e8aadd00137359aa",
- "messageId": 2,
- "status": "read"
}
}
Позволяет получить имеющиеся у владельца номера телефона каналы, в которые можно написать первым.
Content-Type required | string Example: application/json |
Authorization required | string Example: Token xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx |
phone required | string Номер телефона (номер начинается с '+') |
{- "phone": "+79990000000"
}
{- "result": "success",
- "data": [
- "whatsapp"
]
}
Фильтры состоят из групп условий. Количество групп и условий внутри них неограничено. Группы условий и условия внутри них можно объединять с помощью параметра union:
Оператор | Описание |
---|---|
and | Соответствует всем условиям |
or | Соответствует любому условию |
В условиях можно использовать следующие операторы (op) сравнения:
Оператор | Описание | Тип переменной/атрибута |
---|---|---|
eq | Равно | Все |
neq | Не равно | Все |
contains | Содержит | Строка |
ncontains | Не содержит | Строка |
lt | Меньше | Число |
gt | Больше | Число |
lte | Меньше или равно | Число |
gte | Больше или равно | Число |
before | После | Дата |
after | Перед | Дата |
has | Содержит | Массив |
nhas | Не содержит | Массив |
between | Интервал | Массив |
period | Период времени относительно времени применения фильтра | Дата |
Для всех операторов кроме between и period в поле value должно быть указано одно единственное значение для сравнения.
Для between в value должен быть указан массив, где первый элемент - дата начала интервала, второй элемент - конец.
{
"field": "...",
"op": "between",
"value": ["2023-10-01T00:00:00.000Z", "2023-10-15T23:59:59.999Z"]
}
Для period поле value приобретает более сложную структуру. value должен быть объектом, который содержит 2 поля: from и to, каждое из которых задает смещение относительно времени применения фильтра. Поля from и to - массивы, 1-ым элементов которого является количество единиц времени (допускаются отрицательные значения), а 2-ым - сами единицы времени ("day", "week", "month"). Для даты, полученной из from, будет взято начало дня, для даты из to - конец дня. Примеры:
// 5 дней назад
{
"field": "...",
"op": "period",
"value": {
"from": [-5, "day"],
"to": [-5, "day"]
}
}
// в течение месяца (следующие 30/31 дней)
{
"field": "...",
"op": "period",
"value": {
"from": [0, "month"],
"to": [1, "month"]
}
}
// дата в будущем
{
"field": "...",
"op": "period",
"value": {
"from": [0, "day"],
"to": null
}
}
Статус | Описание |
---|---|
sent | Сообщение отправлено, ожидается финальный статус |
unknown | Статус неизвестен |
rejected | Сообщение отклонено Оператором |
undelivered | Сообщение не было доставлено |
expired | Время доставки истекло |
delivered | Сообщение доставлено |
read | Сообщение прочитано |
unsupported | Не поддерживается (только Notify) |
error | Отправка завершилась ошибкой |
blocked_by_user | Пользователь запретил отправку сообщений (только VK) |
window_timeout | Закрыто 24-часовое окно для общения с пользователем (только WABA) |