Управление своими звонками (calls_by_participation)

Обзор

Управляет существующими активными звонками (диалогами B2B) посредством команд API (без использования инициатив со стороны SIP-устройств).

Управлению доступны любые звонки: инициированные как через API, так и с SIP-устройств и сервисов SIP-UA. В отличие от API /rest/v1/uc/calls текущий endpoint предоставляет доступ только к тем диалогам, где одним из участников является учетная запись SIP-пользователя, принадлежащая пользователю, который выполняюет API-запрос.

Обслуживание запросов производится ролью mware.

Для работы требуется наличие роли callstore.

Запросы

HTTP verb Endpoint Описание

GET

/rest/v1/uc/calls_by_participation

Получение списка звонков (GET)

POST

/rest/v1/uc/calls_by_participation

Инициация нового звонка (POST)

INVITE

/rest/v1/uc/calls_by_participation

Инициация нового звонка (INVITE)

INVITEBYIVR

/rest/v1/uc/calls_by_participation

[invitebyivr]

LOOKUP

/rest/v1/uc/calls_by_participation

Поиск идентификатора звонка (LOOKUP)

GET

/rest/v1/uc/calls_by_participation/<id>

[get]

REFER

/rest/v1/uc/calls_by_participation/<id>

[refer]

REFERREPLACES

/rest/v1/uc/calls_by_participation/<id>

[referreplaces]

SWITCHCONF

/rest/v1/uc/calls_by_participation/<id>

[switchconf]

REFERCONF

/rest/v1/uc/calls_by_participation/<id>

[referconf]

NOTIFY

/rest/v1/uc/calls_by_participation/<id>

[notify]

SEND_DTMF

/rest/v1/uc/calls_by_participation/<id>

[send_dtmf]

SETUP_ASR

/rest/v1/uc/calls_by_participation/<id>

[setup_asr]

SETUP_RECORD

/rest/v1/uc/calls_by_participation/<id>

[setup_record]

SETUP_BINDINGS

/rest/v1/uc/calls_by_participation/<id>

[setup_bindings]

STOP_HOLD_MELODY

/rest/v1/uc/calls_by_participation/<id>

[stop_hold_melody]

DELETE

/rest/v1/uc/calls_by_participation/<id>

[delete]


Получение списка звонков (GET)

Возвращает список активных диалогов в пределах текущего домена.

У любого диалога есть две стороны: вызывающая (A) и вызываемая (B). Абонентов, представляющих сторону B, может быть один или несколько в зависимости от состояния диалога.

Диалог относится к домену, если хотя бы один из его абонентов (плеч диалога) принадлежит домену (является учетной записью провайдера, SIP-пользователя, конференцией или сценарием IVR).

Результат выполнения запроса проходит дополнительную фильтрацию. Возвращаются только те диалоги, одним из участников которых является авторизованный пользователь (через любую из принадлежащих ему учетных записей sipuser).

Запрос

Table 1. Параметры запроса
Имя Тип Описание

filter

object

Фильтр по значениям полей.

mask

str

Список полей для вывода. Доступные поля для выдачи: acallid, callids, dialogid, esgdlg, esgcallid, inviteid, status, legs, localuri, remoteuri, site, startts, uris, opts.

offset

int

Смещение в списке ресурсов, подлежащих выдаче.

limit

int

Максимальное количество ресурсов в списке.

order

array<object|str>

Порядок сортировки ресурсов в списке.

flat

bool

Преобразование в плоский вид составных полей.

countonly

bool

Возврат лишь количества элементов.

Пример запроса
GET /rest/v1/uc/calls_by_participation?offset=0&limit=1 HTTP/1.1

Ответ

Возвращает список объектов, каждый из которых представляет собой отдельный диалог. Состав возвращаемых полей ограничен: acallid, callids, dialogid, esgdlg, esgcallid, inviteid, status, legs, localuri, remoteuri, site, startts, uris, opts. При указании других полей в параметре mask они будут проигнорированы.

Table 2. Поля диалога:
Поле Описание

acallid

Call-Id инициирующей стороны диалога. Содержится в соответствующем заголовке инициирующего SIP-запроса INVITE.

callids

Список всех Call-Id активных участников диалога. Каждая сторона диалога имеет свой Call-Id, каждый вызываемый форк имеет уникальный Call-Id.

dialogid

Идентификатор активного диалога, применяемый при формировании endpoint. Уникален в рантайме, однако не является глобально уникальным и может повторяться через некоторое время в рамках одной и той же системы.

esgdlgid

Идентификатор диалога роли esg. Имеет непустое значение только в том случае, если диалог создан на основании внешнего входящего звонка с учетной записи провайдера.

Может использоваться в качестве идентификатора сессии обслуживания внешнего абонента, поскольку в ходе перевода звонка диалог esg не изменяется.

esgcallid

CallId внешнего абонента, скрытый за ролью esg. Имеет непустое значение только в том случае, если диалог создан на основании внешнего входящего звонка с учетной записи провайдера.

inviteid

Глобально уникальный идентификатор вызова, приводящего к диалогу. Формируется при поступлении в систему SIP-запроса INVITE и существует вплоть до завершения диалога. Присутствует во всех событиях CDR класса callevents.

status

Генеральное состояние диалога. Варианты значений:

  • "forking" – состояние вызова. От инициации до окончательного ответа 2xx от вызываемой стороны.

  • "dialog" – состояние диалога. После окончательного ответа 2xx от вызываемой стороны до окончания диалога.

На деле машина состояний диалога имеет гораздо больше состояний, но все они укладываются в генеральные состояния.

legs

Список плеч диалога. Каждый диалог всегда имеет ровно одного инициатора (вызывающая сторона A) и произвольное количество вызываемых плеч (сторона B) в связи с форкингом. В генеральном состоянии status=forking:

  • диалог может содержать более одного вызываемого плеча B;

  • вызываемые плечи могут добавляться и удаляться в зависимости от процесса маршрутизации вызова и его реализации для конкретного диалога.

В генеральном состоянии status=dialog плечо стороны B:

  • присутствует в единственном экземпляре;

  • представляет собой ответившего абонента;

  • не изменяется вплоть до завершения диалога.

Каждый элемент списка является объектом.

localuri

Строковое представление URI из заголовка To инициирующего SIP-запроса INVITE (local URI стороны A).

Формат: "<sip:USERNAME@DOMAIN>", где USERNAME и DOMAIN строго соответствуют значениям в заголовке.

remoteuri

Строковое представление URI из заголовка From инициирующего SIP-запроса INVITE (remote URI стороны A).

Формат: "<sip:USERNAME@DOMAIN>", где USERNAME и DOMAIN строго соответствуют значениям в заголовке.

site

Название сайта, серверы которого обслуживают диалог.

startts

Тайм-штамп времени поступления инициирующего SIP-запроса INVITE в систему. Является представлением момента времени и может быть преобразован к конкретной дате в любом часовом поясе.

Например, 1571743463336.

uris

Список всех URI, участвующих в звонке.

Каждый SIP-пользователь, являющийся абонентом диалога, имеет два URI, один из которых указан через login, другой через phonenumber.

opts

Объект с дополнительными параметрами диалога. Содержит:

  • referred-by – значение заголовка Referred-By из инициирующего SIP-запроса INVITE.

  • replaces – значение заголовка Replaces из инициирующего SIP-запроса INVITE.

Table 3. Поля плеча диалога в значении поля legs:
Поле Описание

callid

Call-Id плеча. Содержится в соответствующем заголовке SIP-запроса INVITE (полученного или отправленного).

expirets

Ограничение времени вызова абонента в миллисекундах. Имеет значение только для плеча стороны B.

localuri

Строковое представление local URI.

Для плеча стороны А – из заголовка To инициирующего SIP-запроса INVITE, для плеча стороны B – из заголовка From отправляемого SIP-запроса INVITE.

Формат: "<sip:USERNAME@DOMAIN>", где USERNAME и DOMAIN строго соответствуют значениям в заголовке.

remoteuri

Строковое представление remote URI.

Для плеча стороны А – из заголовка From инициирующего SIP-запроса INVITE, для плеча стороны B – из заголовка To отправляемого SIP-запроса INVITE.

Формат: "<sip:USERNAME@DOMAIN>", где USERNAME и DOMAIN строго соответствуют значениям в заголовке.

side

Код стороны диалога:

  • "a" – вызывающая сторона;

  • "b" – вызываемая сторона.

Пример ответа
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8

[
  {
    "acallid": "3113017065@192.168.0.149",
    "callids": [
      "rB2-002-484FD3-01-3113017065@192.168.0.149",
      "3113017065@192.168.0.149"
    ],
    "dialogid": "rDlg-002-484FD3",
    "esgdlg": "",
    "esgcallid": "",
    "inviteid": "357924f1-0623-b685-c105-b80000000002",
    "legs": [
      {
        "callid": "3113017065@192.168.0.149",
        "expirets": "undefined",
        "localuri": "<sip:sip3@test.rootdomain.ru>",
        "remoteuri": "<sip:sip2@test.rootdomain.ru>",
        "side": "a"
      },
      {
        "callid": "rB2-002-484FD3-01-3113017065@192.168.0.149",
        "expirets": 30000,
        "localuri": "<sip:12@test.rootdomain.ru>",
        "remoteuri": "<sip:sip3@test.rootdomain.ru>",
        "side": "b"
      }
    ],
    "localuri": "<sip:sip3@test.rootdomain.ru>",
    "opts": {
      "referred-by": "<sip:sip1@test.rootdomain.ru>"
    },
    "remoteuri": "<sip:sip2@test.rootdomain.ru>",
    "site": "SITE1",
    "startts": 1571747612067,
    "status": "forking",
    "uris": [
      "<sip:12@test.rootdomain.ru>",
      "<sip:sip3@test.rootdomain.ru>",
      "<sip:sip3@test.rootdomain.ru>",
      "<sip:sip2@test.rootdomain.ru>"
    ]
  }
]

Инициация нового звонка (POST)

Инициирует вызов абонента X (номер в поле from) в режиме интерком, после ответа производит его перевод (SIP-запрос REFER) на абонента Y (номер в поле to). Для инициации режима интерком-вызова в системе должен существовать featurecode соответствующего типа и быть доступен в маршрутизации как минимум для абонентов по направлению к самим себе, а также для абонента 100 (callmanager).

Операция проводится через запуск скрытого служебного сценария, осуществляющего подготовленный дозвон до инициатора (компонент сценария Исходящий звонок) с передачей управления специально подготовленному скрытому IVR-сценарию с компонентом Перевод на номер. В качестве номера для перевода подставляется указанный номер to.

Схема процесса: IVR→X, IVR REFER Y, X→Y.

Запрос выполняется асинхронно. Ответ на запрос возвращается в момент, определяемый параметром response_mode. Контекст процесса инициации вызова постепенно наполняется данными о звонке по мере его выполнения. Содержание данных в ответе соответствует моменту его возврата – чем более поздняя точка процесса выбрана, тем больше данных и точнее результат.

События CDR целевого звонка могут быть получены из интерфейса подписки на события системы.

Абонент, от имени которого заказан исходящий звонок, после снятия трубки слышит все сигналы КПВ организованного исходящего вызова.

Запрос проходит предварительную фильтрацию. Для допуска к выполнению необходимо, чтобы авторизованный пользователь был инициатором нового вызова. То есть указанное значение параметра "from" относилось к авторизованному пользователю (через любую из принадлежащих ему учетных записей sipuser).

Запрос

Table 4. Параметры запроса
Имя Тип Описание

mode

str

Режим указания стороны X инициатора создаваемого вызова.

Возможные варианты:

  • "number" – Звонок на номер (поле from содержит номер). Используется по умолчанию.

  • "sipuser" – Звонок на пользователя (поле from содержит логин).

from

str

В зависимости от режима (mode) - номер вызывающего абонента X, либо логин учетной записи SIP-пользователя.

to

str

Номер вызываемого абонента Y. Позволяет задавать символы “'” и “,”. Первый такой символ выделяет оставшуюся последовательность в качестве донабора DTMF после получения ответа, а каждый последующий такой символ обеспечивают паузу в 1 секунду в наборе DTMF.

callerid

str

Номер инициатора первого вызова. Отображается абоненту X. По умолчанию используется значение поля from (вызов от себя самого).

callername

str

Имя инициатора первого вызова. По умолчанию "callmanager".

calltimeout

int

Таймаут первого вызова в сеундах. Является ограничением стандартного время вызова. По умолчанию 30 сек.

binding

str

Метка, привязываемая к звонку. По умолчанию не назначается.

response_mode

int

Режим возврата ответа. Чем больше значение, тем позже отправляется ответ, и тем больше контекстной информации в ответе содержится.

Возможные варианты:

  • 0 – отправлять ответ сразу после инициации вызова IVR→X. Отправляется почти моментально без ожидания ответов от абонентов X и Y. В ответе содержится только CallId инициирующего вызова IVR→X.

  • 1 – отправлять ответ после получения предварительного ответа от X (100-199, IVR→X).

  • 2 – отправлять ответ после получения окончательного ответа от X (200-699, IVR→X).

  • 3 – отправлять ответ после получения предварительного ответа от Y (101-199, X→Y). Ответ 100 исключается, поскольку его отправляет не абонент, а сервер. Начиная с этого режима в контексте звонка содержится информация о целевом диалоге.

  • 4 – отправлять ответ после получения окончательного ответа от Y (200-699, X→Y). Начиная с этого режима в ответе содержится достоверная информация об успешности соединения X→Y.

  • 5 - отправлять ответ после полного завершения операции и всех ее процессов (исключая сам диалог X→Y, который может продолжаться несколько часов).

По умолчанию 3.

use_intercom

bool

Выключатель режима intercom для вызова абонента. По умолчанию выключено.

Должны существовать фичакод с типом intercom и правило маршрутизации, разрешающее его применение.
Пример запроса
POST /rest/v1/uc/calls_by_participation HTTP/1.1
Content-Type: application/json; charset=utf-8

{
  "from": "14",
  "to": "16",

  "mode": "number",
  "callerid": "100",
  "callername": "callmanager",
  "calltimeout": 30,
  "use_intercom": true,
  "binding": "sample_binding",
  "response_mode": 5
}

Ответ

Table 5. Описание полей
Поле Описание

result

Итоговый результат по операции. Варианты значений.

ivrcallid

Call-Id инициирующего автоматического звонка IVR→X (отличается от CallId плеч целевого диалога). Присутствует в любом случае.

acallid

Call-Id звонка, поступившего в систему от абонента X к абоненту Y после обработки SIP-запроса REFER. Это Call-Id плеча A целевого диалога X→Y. При некоторых неудачных результатах операции может отсутствовать.

last_response

Response-Line последнего полученного ответа от абонента Y, по результатам которого сформирован ответ на запрос. При некоторых неудачных результатах операции может отсутствовать.

dialogid

Идентификатор целевого диалога X→Y. При некоторых неудачных результатах операции может отсутствовать. Также может отсутствовать если длительность диалога 0 секунд.

Table 6. Варианты значений поля result
Значение Описание

"ok"

Ответ сформирован на этапе, где не выявлено проблем для успешного создания диалога X→Y. Например, для

  • response_mode=0 – сценарий IVR успешно инициализирован для вызова IVR→X.

  • response_mode=1 – получен предварительный ответ от абонента X (IVR→X).

  • response_mode=2 – получен окончательный ответ 2xx от абонента X (IVR→X).

  • response_mode=3 – получен окончательный ответ 2xx от абонента X (IVR→X) и инициализирован вызов X→Y, получен предварительный ответ 18x или окончательный ответ 2xx от абонента Y.

  • response_mode=4 – получен окончательный ответ 2xx от абонента X (IVR→X) и инициализирован вызов X→Y, получен окончательный ответ 2xx от абонента Y.

  • response_mode=5 – диалог X→Y установлен, после некоторого небольшого таймаута инициализирующие процессы завершены.

"rejected"

Вызов IVR→X завершился неудачей (4xx-6xx), либо вызов X→Y завершился неудачей (4xx-6xx). Отправить неудачный ответ мог как сервер, так и абонентское устройство.

В случае, если неудачный ответ получен от абонента X, результат не содержит информации о диалоге X→Y, поля acallid, dialogid, last_response отсутствуют. В случае, если неудачный ответ получен от абонента Y, результат содержит поля acallid и last_response о диалоге X→Y и не содержит dialogid.

"redirected"

Вызов IVR→X завершился переадресацией SIP-UA (3xx), либо вызов X→Y завершился переадресацией SIP-UA (3xx).

Значение является гипотетическим, поскольку обработкой 3xx-переадресаций занимается сам сервер (роль b2b), автоматически инициируя альтернативные форки.

"timeout"

Вызов IVR→X после предварительного ответа завершился таймаутом.

Значение является гипотетическим, поскольку при отсутствии финального ответа сервер (роль b2b), завершает вызов автоматической эмуляцией ответа 408 Timeout.

"error"

Не получен ответ от абонента X, либо другая неожиданная ситуация.

В ответе могут отсутствовать поля acallid, dialogid, last_response.

"undefined"

Абонент X удачно ответил на вызов IVR→X, состояние вызова X→Y неизвестно из-за отсутствия или неизвестного содержания SIP-запросов NOTIFY в диалоге, обслужившим REFER.

Пример ответа
HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8

{
  "result": "ok",
  "ivrcallid": "rIV-006-J8zgklJrGuVxZSlo1ZUWOjjJyl1",
  "acallid": "3099649154@192.168.0.149",
  "dialogid": "rDlg-002-6FpTv2",
  "last_response": "SIP/2.0 100 Trying"
}

Инициация нового звонка (INVITE)

Метод синонимичен POST.



Поиск идентификатора звонка (LOOKUP)

Производит поиск ресурса (активного диалога) по указанному ключу.

Возвращается список идентификаторов обнаруженных диалогов, подходящих по условиям поиска.

Применение поисковых полей производится по одному в порядке убывания приоритета в приведенной ниже таблице. Поисковые поля содержат в описании "Значение для поиска". Множественный возврат возможен, например, в случае поиска по логину SIP-пользователя, если он участвует в нескольких диалогах.

Результат выполнения запроса проходит дополнительную фильтрацию. Обнаруживаются только те диалоги, одним из участников которых является авторизованный пользователь (через любую из принадлежащих ему учетных записей sipuser).

Запрос

Table 7. Параметры запроса
Параметр Тип Описание

dialogid

str

Значение для поиска.

Идентификатор диалога, применяемый при формировании endpoint. Уникален в рантайме, однако не является глобально уникальным и может повторяться через некоторое время в рамках одной и той же системы.

Например, "rDlg-002-6FpTv2".

inviteid

str

Значение для поиска.

Глобально уникальный идентификатор вызова, приводящего к диалогу. Формируется при поступлении в систему SIP-запроса INVITE и существует вплоть до завершения диалога. Присутствует во всех событиях CDR класса callevents.

Например "660df330-0623-b465-6927-c00000000002".

callid

str

Значение для поиска.

Идентификатор звонка Call-Id. Произвольное строковое значение из соответствующего заголовка SIP-сообщений любой из сторон диалога.

Например, "3099649154@192.168.0.149".

uri

str

Значение для поиска.

SIP URI: "<sip:username@domain>". Значение формируется на основании заголовков From или To. Поиск осуществляется только по Remote-URI плеч диалога.

from

str

Значение для поиска.

Номер телефона или логин SIP-пользователя, используемые в качестве username.

Может использовать дополнительный параметр mode:

  • "number" – поиск по номеру телефона. То есть прямой поиск по значению в username, а также если по указанному номеру обнаружен sipuser, то поиск по его логину в username.

  • "sipuser" – поиск только по имени SIP-пользователя. Необходимо обязательное существование SIP-пользователя с указанным логином, в этом случае поиск по его логину в username.

По умолчанию mode=number.

Обнаруживаются диалоги, где одной из сторон выступает указанный абонент текущего домена. Поиск производится аналогично uri, при этом username формируется автоматически. Для учетной записи SIP-пользователя, как бы ни была она указана, поиск производится и для номера, и для логина.

sipuserid

str

Значение для поиска.

Идентификатор учетной записи SIP-пользователя.

sipuserlogin

str

Значение для поиска.

Логин учетной записи SIP-пользователя.

sipuserphonenumber

str

Значение для поиска.

Номер телефона учетной записи SIP-пользователя.

userid

str

Значение для поиска.

Идентификатор учетной записи пользователя системы. Если имеет место привязка учетных записей SIP-пользователей к пользователю системы, то обнаруживаются диалоги, где один из этих SIP-пользователей является одним из абонентов.

Пример запроса
LOOKUP /rest/v1/uc/calls_by_participation HTTP/1.1
Content-Type: application/json; charset=utf-8

{
  "callid": "rB2-002-XPhrjh-01-3587482024@192.168.0.146"
}

Ответ

Пример успешного ответа
HTTP/1.1 200 OK
content-type: application/json; charset=utf-8

[
  "rDlg-002-XPhrjh"
]
Пример неуспешного ответа
HTTP/1.1 404 Not Found
Content-Type: application/json; charset=utf-8

{
  "error_code": 1413,
  "error_message": "Dialog not found"
}