Интеграции
Типовая интеграция IqDialer и CRM.¶
Весь функционал IqDialer на 100% покрыт API. Управление работой производится с помощью API запросов.
После инсталяции настраивается система IqDialer (либо вносятся правки по требованию):
- создается пользователь с необходимыми правами и ApiToken https://demo.iqtek.ru/dialer/api/v1/docs#/users/__call___acl_users_api_key_login_post;
- создаются кампании, бакеты, планировщики обзвона.
Загрузка контактов из CRM в IqDialer¶
CRM настраивается на стороне клиента.
CRM с помощью API запрашивает список кампаний https://demo.iqtek.ru/dialer/api/v1/docs#/campaigns/__call___campaigns_search_post и бакетов https://demo.iqtek.ru/dialer/api/v1/docs#/buckets/__call___buckets_search_post.
По определенной бизнес-логике (обычно это воронка и статус) CRM заливает лида в систему в указанные через external_id бакеты. Если у лида указан external_id, он в системе может быть только один.
Лиды могут загружаться:
- По одному https://demo.iqtek.ru/dialer/api/v1/docs#/leads/__call___leads_post.
- Либо сразу пачкой в один бакет https://demo.iqtek.ru/dialer/api/v1/docs#/leads/__call___leads_bulk_post.
Зная external_id над лидами можно производить разные действия https://demo.iqtek.ru/dialer/api/v1/docs#/leads. Например, изменить данные, пересоздать лида для повторного обзвона или удалить.
Обзвон¶
Операторы включают софтфоны и выставляют соответствующий статус. Оператору поступит вызов только при получении с телефонии статуса, свидетельствующего о его готовности к работе.
В соответствии с бизнес-логикой клиента в IqDialer настраиваются стратегии обзвона для каждой из кампаний.
В зависимости от выбранной стратегии звонок может поступать:
- Сначала лиду. При успешном дозвоне звонок поступает оператору.
- Сначала оператору. При успешом дозвоне звонок поступает лиду.
Настройка нотификаторов¶
В процессе обзвона из IqDialer в сторону CRM настраиваются нотификаторы или провайдеры уведомлений (web_hook, websoket, rabbtmq). Примеры данных и событий приведены чуть ниже.
Через нотификаторы можно получать события о:
- Звонке. Дайлер отправляет webhook CRM о том, что произошел дозвон.
- Операторе. В Дайлере настраиваются коды пауз, с помощью которых можно устанавливать статусы операторов.
- Процессе обработки лида. CRM отправляет webhook дайлеру о результате звонка (нужно или нет перезванивать лиду). CRM открывает карточку оператору, происходит разговор, оператор выставляет статус в CRM. Также в CRM можно поставить задачу на определенное время, которая является тригером для отправки по API лида в Дайлер с указанием времени. Это пересоздает лид с новыми данными. В случае, если перезвон нужен, а время перезвона не определено, это настраивается переносом лида в другую воронку.
Нотификаторы¶
Типы нотификаторов¶
- iqtek_web_panel (centrifugo)
- rabbitmq
- http webhook
Последовательность отправки событий в процессе совершения вызова¶
В версии 3.7.0 были добавлены небольшие изменения в наименования событий.
Для стратегий с участием операторов:
Для стратегий без участия оператора:
Примеры событий¶
Звонки¶
- Начало вызова. Отправляется в момент начала вызова (отправки вызова к клиенту).
{
"event": 'call:start',
"timestamp": '2025-08-26 14:00:00',
"data": {
'campaign': {
'id': '7a673f3e-ae0c-43d6-b725-649b63d89cd0',
'external_id': null,
'name': 'informer_ts_stage-2',
'priority': 50,
'strategy': 'informer',
} if event.campaign else {},
'bucket': {
'id': '28edcaa6-3c8b-4b78-9ceb-aacb2eea5f73',
'external_id': 'test_with_operator',
'name': 'test_with_operator',
'priority': 0,
} if event.lead and event.lead.bucket else {},
'lead': {
'id': '42426873-25eb-44f3-88e3-6c7f9b54e132',
'external_id': null,
'name': 'TEST',
'priority': 100,
'timezone': 3,
'data': {},
'status': 'INITIALIZE',
'attempts': 1,
'attempts_current_campaign': 1,
'attempts_current_scheduler_rule': 1,
} if event.lead else {},
'lead_selected_data': {
'phone': {
'id': 'e2270f69-92e9-44de-ac86-d40117740a52',
'external_id': null,
'priority': 1,
'type': 'mobile',
'phone': '8923036250',
},
'route': {
'id': '13eb5398-a986-463a-9113-b06378538498',
'external_id': 'all_to_FreePbx',
'name': 'all_to_FreePbx',
},
'cid': null,
'agent': {
'id': '3ddc2ef5-98cb-4d9b-90b6-d2097daada61',
'external_id': null,
'name': '2002',
'ext': 505,
} if event.lead_selected_data.agent else {},
} if event.lead_selected_data else {},
'call': event.call.model_dump() if event.call else {}
}
}
- Перевод вызова на другого оператора.
{
"event": 'call:transfer',
"timestamp": '2025-08-26 14:00:00',
"data": {
'campaign': {
'id': 'e470a5f6-dbc8-4711-aab0-44bc2cd5e52f',
'external_id': null,
'name': 'informer_ts_stage-2',
'priority': 50,
'strategy': 'informer',
} if event.campaign else {},
'bucket': {
'id': 'f4535d8e-32bc-4d4e-9733-9c600773dcee',
'external_id': 'test_with_operator',
'name': 'test_with_operator',
'priority': 0,
} if event.lead and event.lead.bucket else {},
'lead': {
'id': '7adc5ad4-255b-43de-b0bf-a54ba306579e',
'external_id': null,
'name': 'TEST',
'priority': 100,
'timezone': 3,
'data': {},
'status': 'INITIALIZE',
'attempts': 1,
'attempts_current_campaign': 1,
'attempts_current_scheduler_rule': 1,
} if event.lead else {},
'lead_selected_data': {
'phone': {
'id': '488b1070-7d98-4b29-878d-b4719bdf59eb',
'external_id': null,
'priority': 1,
'type': 'mobile',
'phone': '8923036250',
},
'route': {
'id': '7ba6c7d7-d5d7-49f8-9cd7-5a969d7470d5',
'external_id': 'all_to_FreePbx',
'name': 'all_to_FreePbx',
},
'cid': null,
'agent': {
'id': '41cbfbe6-4b07-49cd-85c1-a69dd677cb6f',
'external_id': null,
'name': '2002',
'ext': 505,
} if event.lead_selected_data.agent else {},
} if event.lead_selected_data else {},
'agent_ext': event.agent_ext,
}
}
- Завершение вызовов. Отправляется в момент завершения вызова к клиенту.
{
"event": 'calls:end',
"timestamp": '2025-08-26 14:00:00',
"data": [{
'campaign': {
'id': '7a673f3e-ae0c-43d6-b725-649b63d89cd0',
'external_id': null,
'name': 'informer_ts_stage-2',
'priority': 50,
'strategy': 'informer',
},
'bucket': {
'id': '28edcaa6-3c8b-4b78-9ceb-aacb2eea5f73',
'external_id': 'test_with_operator',
'name': 'test_with_operator',
'priority': 0,
} if event.lead.bucket else {},
'lead': {
'id': '91b87f49-1bfd-4fe4-b13a-d1108f21f4b0',
'external_id': null,
'name': 'TEST',
'priority': 100,
'timezone': 6,
'data': {},
'status': 'INITIALIZE',
'attempts': 1,
'attempts_current_campaign': 1,
'attempts_current_scheduler_rule': 1,
},
'lead_selected_data': {
'phone': {
'id': 'd46e45aa-bcc1-4f51-b5ec-4815aa015712',
'external_id': null,
'priority': 1,
'type': 'mobile',
'phone': '89000000001',
},
'route': {
'id': '13eb5398-a986-463a-9113-b06378538498',
'external_id': 'all_to_FreePbx',
'name': 'all_to_FreePbx',
},
'cid': null,
'agent': {
'id': 'b1d7b56e-9163-4165-a3e4-1f53e196f44f',
'external_id': null,
'name': '2002',
'ext': 505,
} if event.lead_selected_data.agent else {}
},
'call': event.call.model_dump() if event.call else {}
} for event in event.calls]
}
Лиды¶
Завершение обработки лидов.
Событие отправляется в момент завершения обработки лида по завершении очередного вызова (клиент ответил на вызов или закончились попытки дозвона).
{
"event": "lead:processed",
"data": [
{
"campaign": {
"id": "7a673f3e-ae0c-43d6-b725-649b63d89cd0",
"external_id": null,
"name": "informer_ts_stage-2",
"priority": 50,
"strategy": "informer"
},
"lead": {
"id": "91b87f49-1bfd-4fe4-b13a-d1108f21f4b0",
"external_id": null,
"name": "TEST",
"priority": 100,
"timezone": 6,
"data": {},
"status": "COMPLITED",
"attempts": 10,
"attempts_current_campaign": 5,
"attempts_current_scheduler_rule": 2
},
"lead_selected_data": {
"phone": {
"id": "d46e45aa-bcc1-4f51-b5ec-4815aa015712",
"external_id": null,
"priority": 1,
"type": "mobyle",
"phone": "89000000001"
},
"route": {
"id": "13eb5398-a986-463a-9113-b06378538498",
"external_id": "all_to_FreePbx",
"name": "all_to_FreePbx"
},
"cid": null,
"agent": {}
},
"call": {
"id": 3867,
"agent_id": null,
"agent_ext": null,
"uniqueid": "1601973054.3422",
"date": "2020-10-06",
"calldate": 1601973054,
"duration": 30,
"billsec": 0,
"time_client_ringing": 30,
"time_agent_ringing": null,
"time_client_hold_queue": null,
"time_talk_call": null,
"disposition": "NOANSWER",
"causecode": 34,
"clid": "<74993809012>",
"timestamp": 1601973054.3584647,
"talk_stop_leads": true,
"talk_stop_flow": true,
"delay_talk_completed": 1601973204,
"tracking": null,
"error": null
}
}
]
}
Агенты¶
События данного раздела генерируются на основании событий от модуля app_queue, подробнее о событиях и условии их генерации можно ознакомится в документации.
- Событие AgentCalled
{ "event": 'agent:ringing', "timestamp": '2025-08-25 11:25:25', "data": { 'campaign': { 'id': 'db2cdddb-0a67-4b3b-9af9-6b7bf95d4bdc', 'external_id': null, 'name': 'stage-campaign_10000', 'priority': 1, 'strategy': 'progressive', } if event.campaign else {}, 'bucket': { 'id': 'eb498260-ca68-4afc-9459-e42216e19e49', 'external_id': null, 'name': 'stage_bucket_1000', 'priority': 1, } if event.lead and event.lead.bucket else {}, 'lead': { 'id': '442e7245-3527-499e-958b-1b0d0d8930ea', 'external_id': null, 'name': 'TEST', 'priority': 100, 'timezone': 3, 'data': {}, 'status': 'INITIALIZE', 'attempts': 1, 'attempts_current_campaign': 1, 'attempts_current_scheduler_rule': 1, } if event.lead else {}, 'lead_selected_data': { 'phone': { 'id': '801dcd49-e3f2-481b-85b2-b457c36b34bd', 'external_id': null, 'priority': 1, 'type': 'mobyle', 'phone': '89210000000', }, 'route': { 'id': '88b2a87c-ed94-4b3d-8259-07bbc2eaa5b5', 'external_id': null, 'name': 'all_to_FreePbx: Emulate', }, 'cid': '880000313', 'agent': { 'id': '8bd89c54-dfc9-41fc-a79b-23429f14771f', 'external_id': null, 'name': '2002', 'ext': 505, } if event.lead_selected_data.agent else {}, } if event.lead_selected_data else {}, 'agent_ext': 505, } } - Событие AgentConnect
{ "event": 'agent:connected', "timestamp": '2025-08-26 14:00:00', "data": { 'campaign': { 'id': 'db2cdddb-0a67-4b3b-9af9-6b7bf95d4bdc', 'external_id': null, 'name': 'stage-campaign_10000', 'priority': 50, 'strategy': 'progressive', } if event.campaign else {}, 'bucket': { 'id': '752aff79-e000-4757-a5f7-b1aba1747198', 'external_id': null, 'name': 'stage_bucket_1000', 'priority': 1, } if event.lead and event.lead.bucket else {}, 'lead': { 'id': '442e7245-3527-499e-958b-1b0d0d8930ea', 'external_id': null, 'name': 'TEST', 'priority': 100, 'timezone': 3, 'data': {}, } if event.lead else {}, 'lead_selected_data': { 'phone': { 'id': '801dcd49-e3f2-481b-85b2-b457c36b34bd', 'external_id': null, 'priority': 1, 'type': 'mobyle', 'phone': '89210000000', }, 'route': { 'id': 'd94e100c-0be8-4bed-a171-b0dc366eeb55', 'external_id': null, 'name': 'all_to_FreePbx: Emulate', }, 'cid': null, 'agent': { 'id': 'a788ec93-5dbe-473f-8ade-2a382352d179', 'external_id': null, 'name': '2002', 'ext': 505, } if event.lead_selected_data.agent else {}, } if event.lead_selected_data else {}, 'agent_ext': 505, } } -
{ "event": 'agent:completed', "timestamp": '2025-08-26 14:00:00', "data": { 'campaign': { 'id': 'db2cdddb-0a67-4b3b-9af9-6b7bf95d4bdc', 'external_id': null, 'name': 'stage-campaign_10000', 'priority': 1, 'strategy': 'progressive', } if event.campaign else {}, 'bucket': { 'id': '3b8cd085-f228-4447-9ac3-aa80a20e829b', 'external_id': null, 'name': 'stage_bucket_1000', 'priority': 1, } if event.lead and event.lead.bucket else {}, 'lead': { 'id': '442e7245-3527-499e-958b-1b0d0d8930ea', 'external_id': null, 'name': 'TEST', 'priority': 100, 'timezone': 3, 'data': {}, }, 'lead_selected_data': { 'phone': { 'id': '534b51a4-5198-4896-8e57-56a3fe999d55', 'external_id': null, 'priority': 1, 'type': 'mobyle', 'phone': '89210000000', }, 'route': { 'id': 'd1f6e697-03ac-4411-9571-430f69228008', 'external_id': null, 'name': 'all_to_FreePbx: Emulate', }, 'cid': null, 'agent': { 'id': 'fdb687ca-52ce-4586-ad8d-4398b55e38b2', 'external_id': null, 'name': '2002', 'ext': 505, } if event.lead_selected_data.agent else {} } if event.lead_selected_data else {}, 'agent_ext': event.agent_ext, } }
{
"event": 'agent:ring_no_answer',
"timestamp": '2025-08-25 11:25:25',
"data": {
'campaign': {
'id': 'e8a4cca2-16ba-4296-b245-889f2d9732ff',
'external_id': null,
'name': 'stage-campaign_10000',
'priority': 1,
'strategy': 'progressive',
} if event.campaign else {},
'bucket': {
'id': 'f013973c-15be-496e-aaa2-68356d7e6fa6',
'external_id': null,
'name': 'stage_bucket_1000',
'priority': 1,
} if event.lead and event.lead.bucket else {},
'lead': {
'id': 'dfe195af-489f-47b3-a640-a3bc99a0a6ea',
'external_id': null,
'name': 'TEST',
'priority': 100,
'timezone': 3,
'data': {},
} if event.lead else {},
'lead_selected_data': {
'phone': {
'id': 'd0272f57-7fbd-4f8d-a932-7e778397fb00',
'external_id': null,
'priority': 1,
'type': 'mobyle',
'phone': '89210000000',
},
'route': {
'id': '5385fd89-faac-4939-a535-a1d30bf7fad3',
'external_id': null,
'name': 'all_to_FreePbx: Emulate',
},
'cid': null,
'agent': {
'id': 'd6ad7c3c-7875-4b18-a1b7-e79e39a2051c',
'external_id': null,
'name': '2002',
'ext': 505,
} if event.lead_selected_data.agent else {},
} if event.lead_selected_data else {},
'agent_ext': event.agent_ext,
}
}
Из события AgentConnected есть возможность брать данные для обогащения шаблонной ссылки с данными о лиде в настройках кампании.
Данные, которыми обогащается ссылка, берутся из отправляемого события AgentConnected.
Сопоставление этих данных осуществляется путем указания в настройках пар <будущий_ключ_в_ссылке>: <путь_на_языке_jsonpath_до_поля_в_отправляемом_событии>.
Пример отправляемого события (добавлены $.call.channel, $.url и $.campaign.settings.url_parameters_mapping):
{
"event": "AgentConnect",
"url": "http://localhost:8910?phone=89230360000&channel=Local%2F89230360000%40dialer-call_lead-v4-0000012b%3B1&queue_param=4001",
"call": {
"call_id": "",
"caller_name": "Agentik",
"caller_num": "89230360000",
"channel": "Local/89230360000@dialer-call_lead-v4-0000012b;1",
"hold_time": "2",
"queue": "4001",
"ring_time": "0",
"uniqueid": "1737367051.3894"
},
"campaign": {
"external_id": null,
"id": "81547d63-08dc-4ef2-8823-25ee8ba4827d",
"name": "aaaaaaa",
"settings": {
"external_urls": null,
"openUrlNewTab": false,
"url": "http://localhost:8910",
"url_parameters_mapping": {
"any_name": "not.existing.path:p",
"channel": "call.channel:p",
"phone": "lead.phone.phone:p",
"queue_param": "call.queue:p"
}
},
"strategy": "progressive"
},
"lead": {
"data": {},
"external_id": null,
"id": "63d50469-19a4-414c-b445-8680af48e3f1",
"name": "Agentik",
"phone": {
"external_id": null,
"id": "b75c1e7d-413b-4979-a347-86bbd224eae2",
"phone": "89230360000",
"priority": 100,
"type": null
},
"priority": 100,
"timezone": 6
}
}
{
"event": "AgentRingNoAnswer",
"data": {
"call": {
"call_id": "",
"queue": "10000",
"caller_name": "None",
"caller_num": "<unknown>",
"hold_time": "",
"ring_time": "4000"
},
"campaign": {
"id": "db2cdddb-0a67-4b3b-9af9-6b7bf95d4bdc",
"external_id": null,
"name": "stage-campaign_10000",
"strategy": "progressive",
"settings": {
"url": "http://example.com/{PHONE}",
"external_urls": null,
"openUrlNewTab": null
}
},
"lead": {
"id": "21e24ee8-8b55-4536-9948-53b47f8d28b1",
"external_id": null,
"name": "TEST",
"priority": 100,
"timezone": 6,
"data": {},
"phone": {
"id": "b3c0c2af-5420-48e8-ade2-068f32d1c829",
"external_id": null,
"priority": 1,
"phone": "89210000000",
"type": "mobyle"
}
}
}
}
Управление операторами из CRM¶
Для управления операторами из CRM необходимо в панели супервайзера выполнить следующие действия:
- Создать очереди,за которыми система будет следить на телефонии.
- Создать нужное количество операторов, не привязывая их к пользователям, так как под ними не будут входить.
- Привязать операторов к очередям.
- Создать нужные PauseCode для их отображения у операторов в Real time статистике.
Затем по API из CRM:
- Залогинить оператора при входе в CRM систему для того, чтобы он вошел на телефонии во все очереди, настроенные в панели супервайзера.
POST /telephony_server_providers/agents/login { "external_id": "crm_operator_id | ext" }
- Разлогинить оператора при выходе из CRM системы.
POST /telephony_server_providers/agents/logout
- Поставить оператора на паузу на телефонии.
POST /telephony_server_providers/agents/paused { "external_id": "crm_operator_id | ext", "pause_code": "code", }
- Снять оператора с паузы на телефонии.
POST /telephony_server_providers/agents/unpaused { "external_id": "crm_operator_id | ext" }


