Сonnector api#
Base URL: https://connector-direct.i-dgtl.ru
Аутентификация#
Все запросы (кроме /auth/token) должны содержать заголовок Authorization с Bearer-токеном:
Authorization: Bearer <token>
Получить токен#
POST /auth/token
Request:
{
"login": "partner@example.com",
"password": "your_password"
}
Поле |
Тип |
Обязательное |
Описание |
|---|---|---|---|
login |
string |
да |
Логин партнера в системе Direct |
password |
string |
да |
Пароль партнера |
Response: 200 OK
{
"token": "dGhpcyBpcyBhbiBleGFtcGxlIHRva2VuIGZvciBkb2Nz..."
}
Полученный токен используйте в заголовке Authorization:
Authorization: Bearer dGhpcyBpcyBhbiBleGFtcGxlIHRva2VuIGZvciBkb2Nz...
Важно:
При смене пароля в Direct нужно получить новый токен
Company API#
Управление компаниями (клиентами).
Создать компанию#
POST /company
Request:
{
"company": {
"name": "ООО Рога и Копыта",
"counteragentType": "LEGAL",
"counteragentInn": "7707083893",
"counteragentAddress": "г. Москва, ул. Примерная, д. 1",
"counteragentKpp": "770701001"
},
"budget": 10000.00
}
Поле |
Тип |
Обязательное |
Описание |
|---|---|---|---|
company.name |
string |
да |
Название компании |
company.counteragentType |
enum |
да |
Тип контрагента: |
company.counteragentInn |
string |
да |
ИНН |
company.counteragentAddress |
string |
нет |
Юридический адрес |
company.counteragentKpp |
string |
нет |
КПП (для юрлиц) |
budget |
double |
нет |
Месячный лимит расходов |
Про лимит расходов:
budget— максимальная сумма, которую компания может потратить за месяцЕсли не передан — лимит безлимитный
Лимит обнуляется 1-го числа каждого месяца в период с 00:00 до 03:00
При отправке сообщений резервируется приблизительная стоимость (может быть выше финальной)
Финальная стоимость определяется после доставки и может быть ниже зарезервированной
Response: 201 Created
{
"companyId": 123
}
Получить список компаний#
GET /company?page=1&per_page=10
Query Parameters:
Параметр |
Тип |
По умолчанию |
Описание |
|---|---|---|---|
page |
int |
1 |
Номер страницы |
per_page |
int |
10 |
Количество на странице |
Response: 200 OK
{
"page": 1,
"perPage": 10,
"total": 42,
"items": [
{
"companyId": 123,
"name": "ООО Рога и Копыта",
"counteragentName": "ООО Рога и Копыта",
"counteragentInn": "7707083893",
"status": "ACTIVE",
"budget": {
"value": 10000.00,
"currency": "RUB"
}
}
]
}
Обновить компанию#
PUT /company/{id}
Request:
{
"budget": 50000.00,
"status": "ACTIVE",
"name": "Новое название",
"actualAddress": "г. Москва, ул. Фактическая, д. 10"
}
Поле |
Тип |
Описание |
|---|---|---|
budget |
double |
Месячный лимит расходов |
status |
enum |
Статус: |
name |
string |
Название компании |
actualAddress |
string |
Фактический адрес |
Все поля опциональны. Передавайте только те, которые нужно изменить.
Response: 200 OK
{
"companyId": 123,
"updatedAt": "2024-01-15T10:30:00+03:00"
}
Загрузить документ#
POST /company/{id}/documents
Content-Type: multipart/form-data
Form Data:
file— файл документа (PDF, JPG, PNG, до 10 МБ)
Response: 201 Created
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"companyId": 123,
"filename": "contract.pdf",
"createdAt": "2024-01-15T10:30:00+03:00"
}
Получить список документов#
GET /company/{id}/documents
Response: 200 OK
[
{
"id": "550e8400-e29b-41d4-a716-446655440000",
"companyId": 123,
"filename": "contract.pdf",
"createdAt": "2024-01-15T10:30:00+03:00"
}
]
Sender API#
Управление отправителями (имена отправителя/подписи для SMS).
Создать отправителя#
POST /senders
Request:
{
"companyId": 123,
"senderName": "MyCompany",
"channelType": "SMS",
"commonType": "PROMO",
"brand": "MTS",
"dateFrom": "2024-01-01T00:00:00Z",
"countryId": 1,
"description": "Для рекламных рассылок",
"documentIds": [
"550e8400-e29b-41d4-a716-446655440000"
]
}
Поле |
Тип |
Обязательное |
Описание |
|---|---|---|---|
companyId |
int |
да |
ID компании |
senderName |
string |
да |
Имя отправителя (до 11 символов для SMS) |
channelType |
string |
да |
Канал: |
commonType |
string |
да |
Тип: |
brand |
string |
да |
Оператор: |
dateFrom |
datetime |
да |
Дата начала действия |
countryId |
int |
нет |
ID страны (1 = Россия) |
description |
string |
нет |
Описание/комментарий |
documentIds |
string[] |
нет |
ID документов, ранее загруженных через |
Response: 201 Created
{
"id": 789,
"senderName": "MyCompany",
"channelType": "SMS",
"counteragentName": "ООО Рога и Копыта",
"counteragentInn": "7707083893",
"dateFrom": "2024-01-01T00:00:00Z",
"dateTo": null,
"commonType": "PROMO",
"brand": "MTS",
"status": "DRAFT",
"suspended": false,
"fee": null,
"managerComment": null,
"rejectedAt": null,
"createdAt": "2024-01-15T10:30:00Z"
}
Статусы отправителя:
DRAFT— черновикPRE_REVIEW— на предварительном рассмотренииINTERNAL_REVIEW— на внутреннем рассмотренииEXTERNAL_REVIEW— на рассмотрении у оператораAWAITING— ожидает активацииAPPROVED— одобрен, можно использоватьREJECTED— отклоненDENIED— запрещенCLOSED— закрыт
Получить список отправителей#
GET /senders?companyId=123
Query Parameters:
Параметр |
Тип |
Описание |
|---|---|---|
companyId |
int |
ID компании (обязательный) |
brand |
string[] |
Фильтр по операторам |
commonType |
string[] |
Фильтр по типу |
status |
string[] |
Фильтр по статусу |
channelType |
string[] |
Фильтр по каналу |
countryCode |
string[] |
Фильтр по коду страны |
Пример с фильтрами:
GET /senders?companyId=123&brand=MTS&brand=BEELINE&status=APPROVED
Response: 200 OK
[
{
"id": 789,
"senderName": "MyCompany",
"channelType": "SMS",
"counteragentName": "ООО Рога и Копыта",
"counteragentInn": "7707083893",
"dateFrom": "2024-01-01T00:00:00Z",
"dateTo": null,
"commonType": "PROMO",
"brand": "MTS",
"status": "APPROVED",
"suspended": false,
"fee": 0.50,
"managerComment": null,
"rejectedAt": null,
"createdAt": "2024-01-15T10:30:00Z"
}
]
Удаление отправителя возможно через:
PUT /senders/{id}с указаниемdateTo— дата окончания действия (правила и ограничения уточняйте у бизнеса)POST /senders/{id}/suspend— немедленная блокировка использования в рассылках
Получить отправителя по ID#
GET /senders/{id}?companyId=123
Response: 200 OK (структура как в списке)
Обновить отправителя#
PUT /senders/{id}
Request:
{
"senderName": "NewName",
"commonType": "COMMON",
"dateFrom": "2024-02-01T00:00:00Z",
"dateTo": "2025-01-01T00:00:00Z",
"documentIds": []
}
Поле |
Тип |
Описание |
|---|---|---|
senderName |
string |
Новое имя отправителя |
commonType |
enum |
Тип: |
dateFrom |
datetime |
Дата начала действия |
dateTo |
datetime |
Дата окончания действия (для закрытия имени) |
documentIds |
string[] |
ID документов |
Все поля опциональны.
Response: 200 OK (структура как в списке)
Приостановить отправителя#
Работает независимо от реального статуса в системе оператора и позволяет остановить трафик по данному sender name. Для полного прекращения обслуживания также необходимо закрыть имя через PUT /senders/{id} с указанием dateTo.
POST /senders/{id}/suspend
Request (опционально):
{
"reason": "Жалоба на спам"
}
Response: 200 OK (структура как в списке, с suspended: true и suspendReason)
Возобновить отправителя#
POST /senders/{id}/unsuspend
Response: 200 OK (структура как в списке, с suspended: false)
Dispatch API#
Создание и управление рассылками.
Создать рассылку#
POST /dispatches
Request:
{
"companyId": 123,
"name": "Новогодняя акция",
"senderIds": [789, 790, 791],
"channelType": "SMS",
"text": "Привет, {name}! Скидка 20% до конца месяца. Промокод: {code}",
"messages": [
{
"destination": "79001234567",
"substitutions": {
"name": "Иван",
"code": "NY2024"
}
},
{
"destination": "79007654321",
"customText": "Полностью кастомный текст для этого получателя"
}
],
"schedule": {
"startAt": "2024-01-15T10:00:00Z",
"hours": [10, 11, 12, 13, 14, 15, 16, 17, 18],
"days": [1, 2, 3, 4, 5]
},
"callbackUrl": "https://your-api.com/callbacks/dispatch",
"callbackEvents": ["delivered", "sent"]
}
Поле |
Тип |
Обязательное |
Описание |
|---|---|---|---|
companyId |
int |
да |
ID компании |
name |
string |
да |
Название рассылки |
senderIds |
int[] |
да |
ID отправителей (по одному на каждого оператора) |
channelType |
string |
да |
Канал: |
text |
string |
да |
Текст сообщения с плейсхолдерами |
messages |
array |
да |
Список получателей |
messages[].destination |
string |
да |
Номер телефона (79001234567) |
messages[].substitutions |
object |
нет |
Подстановки для плейсхолдеров |
messages[].customText |
string |
нет |
Полностью кастомный текст (игнорирует |
schedule |
object |
нет |
Расписание отправки |
schedule.startAt |
datetime |
да |
Время начала рассылки |
schedule.hours |
int[] |
да |
Разрешенные часы (0-23) |
schedule.days |
int[] |
да |
Разрешенные дни недели (1=Пн, 7=Вс) |
callbackUrl |
string |
нет |
URL для webhook-уведомлений о статусах |
callbackEvents |
string[] |
нет |
События: |
Response: 200 OK
{
"id": 1001,
"status": "CREATED",
"priceEstimate": {
"total": 150.00,
"currency": "RUB",
"parts": 2
},
"total": 2,
"success": 2,
"failed": 0,
"messages": [
{
"destination": "79001234567",
"messageUuid": "550e8400-e29b-41d4-a716-446655440001",
"parts": 1,
"senderId": 789
},
{
"destination": "79007654321",
"messageUuid": "550e8400-e29b-41d4-a716-446655440002",
"parts": 1,
"senderId": 790
}
]
}
Routing: Система автоматически определяет оператора каждого номера и назначает соответствующего отправителя из senderIds.
Добавить сообщения в рассылку#
Добавление сообщений в уже созданную рассылку (только в статусе CREATED).
POST /dispatches/{id}/messages
Request:
{
"messages": [
{
"destination": "79009876543",
"substitutions": {
"name": "Петр",
"code": "NY2024"
}
}
]
}
Response: 200 OK (структура как при создании)
Запустить рассылку#
POST /dispatches/{id}/start
Response: 200 OK
{
"id": 1001,
"status": "STARTED"
}
Остановить рассылку#
POST /dispatches/{id}/stop
Response: 200 OK
{
"id": 1001,
"status": "STOPPED"
}
Получить список рассылок#
GET /dispatches?companyId=123&status=STARTED&page=1&perPage=10
Query Parameters:
Параметр |
Тип |
По умолчанию |
Описание |
|---|---|---|---|
companyId |
int |
— |
ID компании (обязательный) |
status |
string |
— |
Фильтр по статусу: |
page |
int |
1 |
Номер страницы |
perPage |
int |
10 |
Количество на странице |
Response: 200 OK
{
"page": 1,
"perPage": 10,
"total": 5,
"items": [
{
"id": 1001,
"name": "Новогодняя акция",
"status": "STARTED",
"channelType": "SMS",
"parts": {
"total": 100,
"delivered": 45,
"failed": 5,
"pending": 50
},
"messages": {
"total": 50,
"delivered": 20,
"failed": 2,
"pending": 28
},
"priceEstimate": 7500.00,
"createdAt": "2024-01-15T10:30:00Z",
"startedAt": "2024-01-15T10:35:00Z"
}
]
}
Получить рассылку по ID#
GET /dispatches/{id}
Response: 200 OK (структура как в списке)
Message API#
Получение статусов сообщений.
Получить сообщения рассылки#
GET /messages?dispatchId=1001&status=DELIVERED&page=1&perPage=100
Query Parameters:
Параметр |
Тип |
По умолчанию |
Описание |
|---|---|---|---|
dispatchId |
int |
— |
ID рассылки (обязательный) |
status |
string |
— |
Фильтр по статусу: |
page |
int |
1 |
Номер страницы |
perPage |
int |
100 |
Количество на странице |
Response: 200 OK
{
"page": 1,
"perPage": 100,
"total": 50,
"items": [
{
"messageUuid": "550e8400-e29b-41d4-a716-446655440001",
"destination": "79001234567",
"text": "Привет, Иван! Скидка 20% до конца месяца. Промокод: NY2024",
"parts": 1,
"status": "DELIVERED",
"price": 2.50,
"senderId": 789,
"brandId": 1,
"createdAt": "2024-01-15T10:30:00Z",
"sentAt": "2024-01-15T10:35:00Z",
"deliveredAt": "2024-01-15T10:35:05Z"
}
]
}
Статусы сообщений:
CREATED— созданоSENT— отправлено операторуDELIVERED— доставленоFAILED— ошибка доставки
Recipient API#
Управление черным списком.
Добавить/удалить из черного списка#
PUT /recipients
Request (добавить в blacklist):
{
"companyId": 123,
"msisdn": "79001234567",
"blacklist": true,
"comment": "Отписался от рассылки"
}
Request (удалить из blacklist):
{
"companyId": 123,
"msisdn": "79001234567",
"blacklist": false
}
Поле |
Тип |
Обязательное |
Описание |
|---|---|---|---|
companyId |
int |
да |
ID компании |
msisdn |
string |
да |
Номер телефона |
blacklist |
bool |
да |
|
comment |
string |
нет |
Причина блокировки |
Response: 200 OK
{
"msisdn": "79001234567",
"companyId": 123,
"blacklist": true
}
Callbacks (Webhooks)#
При указании callbackUrl в рассылке, система отправляет POST-запросы на этот URL при изменении статусов сообщений.
Пример callback для события ``delivered``:
{
"event": "delivered",
"messageUuid": "550e8400-e29b-41d4-a716-446655440001",
"destination": "79001234567",
"status": "DELIVERED",
"deliveredAt": "2024-01-15T10:35:05Z"
}
Пример callback для события ``sent``:
{
"event": "sent",
"messageUuid": "550e8400-e29b-41d4-a716-446655440001",
"destination": "79001234567",
"status": "SENT",
"sentAt": "2024-01-15T10:35:00Z"
}
Price API#
Тарифы и стоимость сендернеймов. Операция от имени партнёра (admin operation).
Получить тарифы трафика#
GET /price/tariffs
Query Parameters (все опциональные):
Параметр |
Тип |
Описание |
|---|---|---|
senderType |
enum |
Тип имени: |
brand |
string |
Оператор: |
trafficType |
enum |
Тип трафика: |
pricingModel |
enum |
Модель ценообразования: |
Response: 200 OK
{
"tariffs": [
{
"senderType": "COMMON",
"pricingModel": "FIXED",
"currency": "RUB",
"prices": [
{"from": 1, "price": 3.95, "priceMauBatch": 0}
]
},
{
"senderType": "START",
"brand": "MTS",
"pricingModel": "SCALED",
"currency": "RUB",
"prices": [
{"from": 1, "price": 3.50, "priceMauBatch": 0},
{"from": 10001, "price": 3.20, "priceMauBatch": 0},
{"from": 100001, "price": 2.85, "priceMauBatch": 0}
]
},
{
"senderType": "PRO",
"trafficType": "PROMO",
"brand": "BEELINE",
"pricingModel": "MAU",
"currency": "RUB",
"prices": [
{"from": 1, "price": 3.00, "priceMauBatch": 0},
{"from": 1001, "price": 0, "priceMauBatch": 9.00},
{"from": 5001, "price": 0, "priceMauBatch": 15.00},
{"from": 10001, "price": 0, "priceMauBatch": 20.00},
{"from": 50001, "price": 0, "priceMauBatch": 25.00}
]
}
]
}
Типы имён (``senderType``):
COMMON— общее имя, доступно без регистрации, фиксированная ценаSTART— требует регистрации, фиксированная цена или MAU (Beeline)PRO— платное имя, цена зависит от объёма сообщений или MAU
Модели ценообразования (``pricingModel``):
FIXED— фиксированная цена, не зависит от объёма.pricesсодержит один элементSCALED— цена зависит от объёма сообщений.prices[].from— порог кол-ва сообщенийMAU— цена зависит от кол-ва уникальных получателей.prices[].from— порог уникальных получателей
Структура ``prices[]``:
Поле |
Тип |
Описание |
|---|---|---|
from |
int |
Порог |
price |
double |
Цена за сообщение |
priceMauBatch |
double |
Цена за MAU-пакет |
Получить стоимость имён отправителей#
GET /price/senders
Response: 200 OK
{
"senderFees": [
{"brand": "MTS", "value": 5000.00, "currency": "RUB"},
{"brand": "BEELINE", "value": 7500.00, "currency": "RUB"},
{"brand": "MEGAFON", "value": 6000.00, "currency": "RUB"},
{"brand": "TELE2", "value": 4500.00, "currency": "RUB"}
]
}
Поле |
Тип |
Описание |
|---|---|---|
brand |
string |
Оператор |
value |
double |
Абонентская плата за имя отправителя |
currency |
string |
Валюта |
Ошибки#
Все ошибки возвращаются в формате:
{
"error": {
"code": 4000,
"msg": "Описание ошибки"
}
}
Коды ошибок:
Код |
HTTP Status |
Описание |
|---|---|---|
4000 |
400 |
Bad Request — некорректные данные |
4040 |
404 |
Not Found — ресурс не найден |