версия 2022-07-05
Добро пожаловать в документацию по Plusofon API.
Plusofon API позволяет управлять аккаунтами и звонками внутри ОАТС посредством использования HTTP-запросов. Помимо стандартных функций ОАТС, Plusofon API предоставляет доступ к сервису двухфакторной аутентификации. Функциональные возможности API постоянно расширяются.
Plusofon API работает по протоколу JSON-RPC (?). Название метода, как правило, состоит из названия модуля и названия метода в этом модуле, и разделяется символом /
.
Структура запроса:
Параметр | Описание | Пример |
---|---|---|
jsonrpc |
Версия протокола | 2.0 |
method |
Название API метода | user/about-me |
id |
ID сообщения | f3gk6fsd56 |
params |
Параметры метода | {} |
На данный момент API использует версию 2.0 и поддерживает вызов процедур только с именованными параметрами
В ответ всегда возвращается JSON объект. Если запрос обработан успешно, параметр "result" будет содержать данные, которые вернул метод. Если произошла какая-либо ошибка, значение параметра "result" будет равняться NULL, а ответ будет содержать в себе параметр "error", в котором будет указан код ошибки и ее описание.
Параметр | Описание | Пример |
---|---|---|
jsonrpc |
Версия протокола | 2.0 |
id |
ID сообщения | f3gk6fsd56 |
result |
Данные, которые вернул метод, или NULL | {"email":"my@email.ru"} |
error |
NULL или код и описание ошибки | {"error": null} |
Получить ответ также можно в JSON-формате :
$json = file_get_contents('php://input');
$data = json_decode($json);
echo $data->content;# Для отладки
$filename = 'text.txt';
file_put_contents($filename, $data->content);
Для аутентификации пользователя в HTTP-запросе необходимо передавать заголовок Authorization
:
curl -H "Authorization: Bearer $TOKEN" https://new-api.plusofon.ru
OAuth — открытый протокол авторизации, который позволяет предоставить третьей стороне ограниченный доступ к защищённым ресурсам пользователя без необходимости передавать ей (третьей стороне) логин и пароль.
Разработчики должны зарегистрировать свое приложение, чтобы использовать OAuth. Зарегистрированному приложению присваивается идентификатор клиента(oauth_id) и секретный ключ(access_token). Секретный ключ клиента должен храниться в тайне и использоваться только между приложением и сервером авторизации Плюсофон.
API-токен можно получить одним из двух вариантов:
в личном кабинете Плюсофон, в разделе API
POST-запросом на адрес https://oauth.plusofon.ru/login/
Список передаваемых параметров для второго варианта:
Параметр | Описание | Пример |
---|---|---|
client_id |
фиксированное значение 10553 |
10553 |
type |
фиксированное значение login |
login |
email |
email-адрес аккаунта (логин) | user@mail.ru |
password |
пароль аккаунта | 12345 |
Запрос:
curl -d "client_id=10553&type=login&email=user@mail.ru&password=12345" https://oauth.plusofon.ru/login/
Ответ:
{
"result":
{
"email": "user@mail.ru",
"phone": "79993332210",
"access_token": "987654321-123-123456789",
"oauth_id": "123"
}
}
Метод: user/about-me
В этот метод не требуется передавать параметры. Возвращает массив, содержащий поля:
Параметр | Описание | Пример |
---|---|---|
id |
ID пользователя в системе | 1000 |
email |
my@email.ru |
|
phone |
Номер телефона | NULL |
customer_id |
ID клиента | 10000 |
status |
Статус пользователя | ACTIVE |
rate_limit |
Допустимое кол-во запросов в час | 1000 |
Запрос:
curl -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0", "method":"user/about-me", "id":"1", "params":{}}' \
-X POST https://new-api.plusofon.ru
Ответ:
{"jsonrpc":"2.0","id":"1","result":{"id":1000, ...}, "error":null}
Метод: user/about
Список передаваемых параметров:
Параметр | Описание | Пример |
---|---|---|
identifier |
E-mail или телефон пользователя | my@email.ru |
Возвращает массив, содержащий поля:
Параметр | Описание | Пример |
---|---|---|
id |
ID пользователя в системе | 1000 |
email |
E-mail пользователя | my@email.ru |
phone |
Номер телефона | NULL |
customer_id |
ID клиента | 10000 |
status |
Статус пользователя | ACTIVE |
rate_limit |
Допустимое кол-во запросов в час | 1000 |
Запрос:
curl -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0", "method":"user/about", "id":"1", "params":{"identifier":"my@mail.ru"}}' \
-X POST https://new-api.plusofon.ru
Ответ:
{"jsonrpc":"2.0","id":"1","result":{"id":1000, ...}, "error":null}
Метод: user/list
В этот метод не требуется передавать параметры. Возвращает массив пользователей, содержащий поля:
Параметр | Описание | Пример |
---|---|---|
id | ID пользователя в системе | 1000 |
my@email.ru |
||
phone | Номер телефона пользователя | NULL |
customer_id | ID клиента | 10000 |
status | Статус пользователя | ACTIVE |
rate_limit | Допустимое кол-во запросов в час | 1000 |
Запрос:
curl -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0", "method":"user/list", "id":"1", "params":{}}' \
-X POST https://new-api.plusofon.ru
Ответ:
{"jsonrpc":"2.0","id":"1","result":[{"id":1000, ...},{"id":1001, ...}],"error":null}
Значение | Описание |
---|---|
10 |
Может управлять любыми пользователями (ACCOUNT) внутри своего CUSTOMER |
50 |
Может управлять только своим пользователем |
Значение | Описание |
---|---|
ACTIVE |
Пользователь активен |
BLOCKED |
Пользователь заблокирован |
Значение | Описание |
---|---|
-1 |
Пользователь не найден |
-2 |
Пользователь не принадлежит данному клиенту |
Метод: user/balance
В этот метод не требуется передавать параметры. Возвращает поля:
Параметр | Описание | Пример |
---|---|---|
balance |
Текущий баланс | 99,5 |
Метода: user/xdrs
Список передаваемых параметров:
Параметр | Описание | Пример |
---|---|---|
i_service |
Тип сервиса (таблица ниже) | 2 |
from_date |
Дата начала | 2021-10-01 10:00:00 |
to_date |
Дата окончания | 2021-12-01 10:00:00 |
Возвращает массив с полями:
Параметр | Описание | Пример |
---|---|---|
i_service |
Тип сервиса (таблица ниже) | 2 |
charged_amount |
Сумма (при поступлениях – отрицательное значение) | -2000.000 |
bill_time |
Время операции | |
connect_time |
Время начала операции | |
disconnect_time |
Время завершения операции | |
description |
Описание |
Код (i_service) | Описание |
---|---|
1 |
Разовые списания (например, за покупку номеров) |
2 |
Поступления денег на счет |
4 |
Регулярные списания (абонентская плата) |
Метод: number/search
Список передаваемых параметров:
Параметр | Описание | Пример |
---|---|---|
number_type |
Тип номера: мобильный (mobile ) или городской (city ) |
mobile |
code |
Код города | 495 |
type |
Тип номера (простой, золотой и т. д.) | 0 |
mask |
Маска для поиска номера (символ % заменяет несколько цифр) |
123% |
limit |
Ограничение размера выборки | 10 |
offset |
Пропустить определённое кол-во строк | 0 |
owner_type |
Тип использования номера: бизнес (business ) или персональный (personal ) |
business |
В случае успеха возвращается массив номеров с параметрами:
Параметр | Описание | Пример |
---|---|---|
phone_number |
Номер телефона (без кода города) | 1330101 |
city_code |
Код города | 495 |
full_number |
Номер телефона (с кодом города) | 4951330101 |
number_type |
Тип номера (простой, золотой и т. д.) | 0 |
buy_price |
Цена покупки номера | 900 |
period_price |
Абонентская плата за номер | 150 |
Запрос:
curl -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0", "method":"number/search", "id":"1", "params":{"city_code":495, "limit":1}}' \
-X POST https://new-api.plusofon.ru
Ответ:
{"jsonrpc":"2.0", "id":"1", "result":[{"phone_number":1330101, ...}], "error":null}
Метод: number/buy
Список передаваемых параметров:
Параметр | Описание | Пример |
---|---|---|
number |
Номер телефона (с кодом города) | 4951330101 |
owner_type |
Тип использования номера: бизнес (business ) или персональный (personal ) |
personal |
Метод возвращает одно из следующих значений:
Значение | Описание |
---|---|
1 |
Номер успешно куплен |
-1 |
Номер не найден |
-2 |
Недостаточно средств для покупки номера |
Запрос:
curl -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0", "method":"number/buy", "id":"1", "params":{"number":"4951330101"}}' \
-X POST https://new-api.plusofon.ru
Ответ:
{"jsonrpc":"2.0", "id":"1", "result":1, "error":null}
Значение | Описание |
---|---|
0 |
Простой |
5 |
Бронзовый |
1 |
Серебряный |
2 |
Золотой |
3 |
Платиновый |
4 |
Эксклюзивный |
Метод: number/delete
Список передаваемых параметров:
Параметр | Описание | Пример |
---|---|---|
number |
Номер телефона | 74951330101 |
Метод возвращает одно из следующих значений (или ошибку, если входные параметры не прошли валидацию):
Значение | Описание |
---|---|
1 |
Номер удален |
-1 |
Во время удаления возникла ошибка |
Метод: number/reserve
Список передаваемых параметров:
Параметр | Описание | Пример |
---|---|---|
number |
Номер телефона | 74951330101 |
owner_type |
Тип использования номера: бизнес (business ) или персональный (personal ) |
personal |
Метод возвращает одно из следующих значений (или ошибку, если входные параметры не прошли валидацию):
Значение | Описание |
---|---|
1 |
Номер зарезервирован |
-1 |
Во время резервирования возникла ошибка |
Метод: number/get-reserved
В этот метод не требуется передавать параметры. Метод возвращает массив с полями (или -1
, если зарезервированных номеров нет):
Значение | Описание |
---|---|
number |
Номер телефона |
customer_id |
ИД клиента |
reserved_to |
Дата (timestamp), до которой зарезервирован номер |
-1 |
Нет зарезервированных номеров |
Метод: number/forward-to-device
Список передаваемых параметров:
Параметр | Описание | Пример |
---|---|---|
number |
Номер, на котором устанавливается переадресация | 74951332210 |
forward_number |
Номер, на который осуществляется переадресация, или SIP-аккаунт | 79991110000 |
Метод возвращает одно из следующих значений (или ошибку, если входные параметры не прошли валидацию):
Значение | Описание |
---|---|
1 |
Переадресация успешно назначена |
-1 |
Во время назначения возникла ошибка |
Метод: number/incoming
Список передаваемых параметров:
Параметр | Описание | Пример |
---|---|---|
number_type |
Тип номеров | all |
offset |
Смещение результатов относительно начала | 10 |
limit |
Ограничение результата выборки номеров |
Возможные значения number_type
:
Значение | Описание |
---|---|
all |
Номера всех типов |
mobile |
Мобильные номера (DEF) |
city |
Городские номера (ABC) |
federal |
Федеральные номера (8-800) |
personal |
Персональные номера |
Метод возвращает массив номеров (или ошибку, если входные параметры не прошли валидацию):
Значение | Описание |
---|---|
numbers |
Массив номеров |
-1 |
Нет номеров |
Массив numbers
состоит из следующих элементов:
Значение | Описание |
---|---|
number |
Номер телефона |
follow |
На кого настроена переадресация |
i_account |
ИД аккаунта телефонного номера |
Метод: number/get-city-codes
Список передаваемых параметров:
Параметр | Описание | Пример |
---|---|---|
types |
Массив типов | ['city', 'mobile', 'federal'] |
В случае успеха возвращается массив доступных кодов городов:
Параметр | Описание | Пример |
---|---|---|
code |
Код города | 347 |
region |
Название города | Уфа |
Метод: number/updateAlias
Список передаваемых параметров:
Параметр | Описание | Пример |
---|---|---|
number |
Номер | 9644951177 |
numberAlias |
Алиас | andrium |
В случае успеха возвращается TRUE
.
Метод: number/listAlias
Список передаваемых параметров:
Параметр | Описание | Пример |
---|---|---|
numbers |
Массив номеров | ['9644951177', '9611167864'] |
В случае успеха возвращается массив, где ключом является номер, а значением – его алиас.
Метод: account/list
Список передаваемых параметров:
Параметр | Описание | Пример |
---|---|---|
batch_name |
Название батча (серии) | @abc_numbers |
id |
Префикс батча (серии) | simple% |
В случае успеха возвращается массив с параметрами:
Параметр | Описание | Пример |
---|---|---|
id |
ИД SIP-аккаунта | 1234567 |
i_customer |
ИД клиента | 12345 |
batch_name |
Название батча (серии) | 1000@abc_numbers |
login |
Логин SIP-аккаунта | 1234567890 |
password |
Пароль SIP-аккаунта | qwerty |
Запрос:
curl -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0", "method":"account/list", "id":"1", "params":{"batch_name":"@abc_numbers", "prefix":"simple%"}}' \
-X POST https://new-api.plusofon.ru
Ответ:
{"jsonrpc":"2.0", "id":"1", "result":[{"id":"simple-74950000000", "i_account":"1", "i_customer":"yourCustomerId", "batch_name":"yourCustomerId@abc_numbers", "login":"simple-74950000000", "password":"sipPassword"}], "error":null}
Описание | Наименование батча | Доступные префиксы |
---|---|---|
Аккаунты городских номеров (ABC) | @abc_numbers |
exclusive , platina , gold , silver , bronze , simple |
Аккаунты мобильных номеров (DEF) | @def_numbers |
exclusive , platina , gold , silver , bronze , simple |
Аккаунты номеров МН | @int_numbers |
53 |
Аккаунты группы | @groups |
54 |
Аккаунты сценария | @scenario |
55 |
Аккаунты пользователя | yourLogin |
Метод: account/subscriptions
Список передаваемых параметров:
Параметр | Описание | Пример |
---|---|---|
i_account |
ИД аккаунта | 1234567 |
Метод возвращает массив подписок (или ошибку, если входные параметры не прошли валидацию):
Значение | Описание |
---|---|
fee |
Абонентская плата в месяц |
invoice_description |
Комментарий к подписке |
Метод: calls/search2
Список передаваемых параметров:
Параметр | Описание | Пример |
---|---|---|
date_from |
Дата начала выборки (в формате Y-m-d H:i:s) | 2021-01-01 10:00:00 |
date_to |
Дата конца выборки (в формате Y-m-d H:i:s) | 2021-01-01 10:30:00 |
call_id |
ИД звонка | NULL |
direction |
Направление звонка (1-входящий, 0-исходящий) | 1 |
callType |
Тип звонка (Success ,Failed ) |
Success |
numberA |
Номер с которого звонили | 9991111111 |
numberB |
Номер на который звонили | 4951111111 |
В случае успеха возвращается массив с параметрами:
Параметр | Описание | Пример |
---|---|---|
СLI |
Номер А (с которого звонили) | 79580000000 |
CLD |
Номер Б (на который звонили) | 74951332210 |
record |
URL записи звонка | https://record-url |
connect_time |
Дата и время начала звонка | 2021-01-01 10:05:00 |
disconnect_time |
Дата и время окончания звонка | 2021-01-01 10:10:00 |
call_id |
ИД звонка | 12345@ip |
i_account |
ИД аккаунта | 12345 |
charged_amount |
Стоимость звонка | 2.12000 |
Запрос:
curl -H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"jsonrpc":"2.0", "method":"calls/search", "id":"1", "params":{"date_from":"2021-01-01 10:00:00", "date_to":"2021-01-01 10:30:00"}}' \
-X POST https://new-api.plusofon.ru
Ответ:
{"jsonrpc":"2.0", "id":"1", "result":[{"CLD":"74951332210", "СLI":"79580000000", "record":false, "connect_time":"2021-01-01 10:05:00", "disconnect_time":"2021-01-01 10:10:00", "call_id":"12345@ip"}], "error":null}
Плюсофон предоставляет функциональность для интеграции звонков в Вашу систему посредством webhook. На данный момент доступна интеграция только входящих вызовов.
При поступлении входящего вызова на аккаунт с установленной нотификацией (аккаунт мониторинга, web-call) Plusofon API может отправить данные о звонке на указанный Вами URL-адрес. Данные, передаваемые в POST-запросе:
Параметр | Описание | Пример |
---|---|---|
a |
А-номер (с которого поступил звонок) | 79990000000 |
b |
Б-номер (на который поступил звонок) | 74951332210 |
ts |
Время начала звонка (в виде timestamp) | 1468483429 |
callId |
ИД звонка | 12345@127.0.0.1 |
batch |
E-mail аккаунта, находящегося на мониторинге | fio@mail.xyz |
Таким образом, если пользователи в интегрируемой системе имеют идентификаторы в виде адресов e-mail, Вам не придётся держать еще одну таблицу соответствий.
Если в своей работе Вы используете SuiteCRM (SugarCRM) – Вы можете реализовать EntryPoint (?) прямо внутри неё. Тогда код EntryPoint может быть таким:
<?php
if(!defined('sugarEntry') || !sugarEntry) die('Not A Valid Entry Point');
// Получение данных из POST
$a = filter_input(INPUT_POST, 'a');
$ts = filter_input(INPUT_POST, 'ts');
// Создание предварительного контакта
$lead = BeanFactory::newBean('Leads');
$lead->phone_work = $a;
$lead->save();
// Создание звонка
$call = BeanFactory::newBean('Calls');
$call->name = 'Входящий вызов с номера: ' . $a;
$call->date_start = date('Y-m-d H:i:s', $ts);
$call->parent_type = 'Leads';
$call->parent_id = $lead->id;
$call->save();
Метод: smartnumber/list
В этот метод не требуется передавать параметры. В случае успеха возвращается массив с параметрами:
Параметр | Описание | Пример |
---|---|---|
id |
ИД «умного номера» | 1234 |
user_id |
ИД пользователя | 12345 |
phoneA |
Телефонный номер пользователя | 79261111111 |
phoneB |
Телефон, на который нужно звонить | 76384445511 |
phoneX |
«Умный номер» | 79583332211 |
description |
Описание | Вася |
date_create |
Дата создания | 2021-06-09 14:33:40 |
Метод: smartnumber/add
Список передаваемых параметров:
Параметр | Описание | Пример |
---|---|---|
regionId |
ИД региона «умного номера» | 3 |
phoneA |
Телефонный номер пользователя | 79261111111 |
phoneB |
Телефон, на который нужно звонить | 76384445511 |
description |
Описание | Вася |
Метод возвращает одно из следующих значений (или ошибку, если входные параметры не прошли валидацию):
Значение | Описание |
---|---|
1 |
Номер создался |
-1 |
Не удалось создать номер |
Метод: smartnumber/delete
Список передаваемых параметров:
Параметр | Описание | Пример |
---|---|---|
id |
ИД «умного номера» | 1234 |
Метод возвращает одно из следующих значений (или ошибку, если входные параметры не прошли валидацию):
Значение | Описание |
---|---|
1 |
Номер удалился |
-1 |
Не удалось удалить номер |
Метод: smartnumber/regions
В этот метод не требуется передавать параметры. Метод возвращает одно из следующих значений (или ошибку, если входные параметры не прошли валидацию):
Значение | Описание |
---|---|
array |
Ключ – ИД региона, значение – название региона |
-1 |
Не удалось получить список регионов |
Метод: smartnumber/user-numbers
Метод возвращает список номеров, которые можно использовать при создании «умных номеров» в качестве А-номера (номера, с которого осуществляется звонок).
В этот метод не требуется передавать параметры.
Метод возвращает одно из следующих значений или ошибку, если входные параметры не прошли валидацию:
Значение | Описание |
---|---|
array |
Массив номеров пользователя |
-1 |
Не удалось получить список номеров пользователя |
Метод позволяет создать вебхук, который будет отправлять данные во внешнюю систему при наступлении некоторого события (например, после завершения звонка).
POST
webhooks/create
https://new-api.plusofon.ru
Варианты параметра type_call
:
Значение | Описание |
---|---|
all |
отслеживать все вызовы |
inbound |
отслеживать только входящие вызовы |
outbound |
отслеживать только исходящие вызовы |
Варианты параметра event
:
Значение | Описание |
---|---|
create |
создание звонка |
answer |
ответ |
destroy |
окончание звонка |
В объекте standart
можно переопределить названия параметров в соответствие с теми, которые ожидает Ваша внешняя система.
Например, в CRM-системе есть готовая реализация парсера вебхуков, но параметр «Идентификатор звонка» в ней называется «id_call», а не «call_id» как в настройках вебхуков. В таком случае заголовок легко можно поменять на необходимый.
{
"internal": "201",
"is_success": "1",
"finish": "1",
"call_id": "40488fae-4b5e8cda9bbe",
"direction": "inbound",
"timestamp": "1659097989",
"from": "74951332210",
"to": "74951332211",
"hook_event": "channel_destroy",
"account_id": "6fb9497c2b74cac21d57c3",
"authorizing_id": "98cb02b26316d5920d01",
"bridge_id": "75b5e31e340309785bb4@185.54.49.150:5060",
"duration": "42"
}
Описание полей:
Поле | Описание |
---|---|
internal |
только для события завершения звонка, внутренний (добавочный) номер SIP-аккаунта |
is_success |
только для события завершения звонка, признак успешного звонка: да (1 ) или нет (0 ) |
finish |
только для события завершения звонка, признак финального плеча: да (1 ) или нет (0 ) |
start |
только для входящего вызова, признак главного плеча (первого в цепочке): да (1 ) или нет (0 ) |
call_id |
уникальный идентификатор звонка |
direction |
направление звонка: входящий (inbound ) или исходящий (outbound ) |
timestamp |
временная метка в формате Unix Timestamp |
from |
А-номер (с которого звонили) |
to |
Б-номер (на который звонили) |
hook_event |
событие, на которые сработал вебхук |
account_id |
уникальный идентификатор договора |
authorizing_id |
уникальный идентификатор устройства, на который / с которого пришёл звонок |
bridge_id |
только для start = 0 , уникальный идентификатор (call_id ) предыдущего плеча вызова, помогает отслеживать переводы звонка |
duration |
только для события завершения звонка, продолжительность звонка |
В некоторых случаях временная метка может не соответствовать текущему времени и показывает 3992 год — мы работаем над исправлением этой ошибки.
В качестве временного решения можно отнимать от полученного числа
62167219202
.
Возможные значения поля hook_event
:
Значение | Описание |
---|---|
channel_create |
создание звонка |
channel_answer |
ответ на звонок (только для входящих) |
channel_destroy |
завершение звонка |