Mobile ID Auth Lite API
Mobile ID — это сервис аутентификации пользователя по номеру мобильного телефона через SIM-push-уведомление. Он помогает подтвердить, что номер принадлежит пользователю и доступен ему в момент входа, регистрации или подтверждения действия.
SIM-push — это запрос на подтверждение, который отображается на устройстве пользователя без перехода в SMS. Пользователь подтверждает действие на экране телефона, а сервис возвращает результат аутентификации. Если SIM-push невозможно доставить, сценарий может перейти на SMS-код: пользователь получает код в SMS, вводит его на вашей площадке, а вы передаёте код в API для проверки.
Mobile ID Auth Lite API — это упрощённый способ подключить аутентификацию через SIM-push и каскад на SMS через единый API МТС KYC платформы. Сервис запускает аутентификацию в Mobile ID, обрабатывает промежуточные состояния и возвращает понятный статус сессии.
Как выглядит сценарий
- Пользователь вводит номер телефона на вашей площадке.
- Вы создаёте сессию аутентификации через Mobile ID Auth Lite API.
- Пользователь получает SIM-push-уведомление и подтверждает действие на устройстве.
- Если SIM-push недоступен, сервис запрашивает SMS-код.
- Пользователь вводит SMS-код на вашей площадке, а вы передаёте его в API.
- Вы получаете итоговый статус сессии и используете
subIdпри успешной аутентификации.
Шаги интеграции
- Получите
client_idиclient_secret. - Получите OAuth-токен для вызова API.
- Создайте сессию аутентификации по номеру телефона.
- Получайте состояние сессии через polling или callback.
- Если требуется SMS-код, покажите пользователю форму ввода и передайте код в API.
- Завершайте сценарий только после статуса
success.
Перед началом
Для подключения нужны:
client_id;client_secret;- доступ к Mobile ID Auth Lite API;
- серверное хранилище для
client_secret; - callback URL, если результат нужно получать без постоянного опроса.
⚠️ Важно: client_secret должен храниться только на серверной стороне. Не передавайте его в браузер, мобильное приложение или публичные конфигурационные файлы.
Базовый адрес
Production base URL:
https://api.mts.ru/Id-Kyc-MobileIdAdapter-Prod/1.0
Все пути API добавляются к этому адресу.
Авторизация
API использует OAuth 2.0 с грантом client_credentials.
curl --location 'https://api.mts.ru/token'
--header 'Content-Type: application/x-www-form-urlencoded'
--header 'Authorization: Basic <base64(client_id:client_secret)>'
--data-urlencode 'grant_type=client_credentials'
В заголовке Authorization: Basic ... передаётся строка client_id:client_secret, закодированная в Base64.
Пример ответа токен-сервера:
{
"access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...",
"token_type": "Bearer",
"expires_in": 3600,
"scope": "..."
}
Во всех запросах к API передавайте полученный токен:
Authorization: Bearer <access_token>
Кэшируйте access_token с учётом expires_in и обновляйте его до или после истечения срока действия.
1. Создайте сессию аутентификации
Передайте номер пользователя и, при необходимости, свой идентификатор операции.
POST /api/v1/mobile-id-adapter/authentications
Content-Type: application/json
Authorization: Bearer <access_token>
{
"phoneNumber": "+79161234567",
"externalId": "login-session-123"
}
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
phoneNumber | string | Да | Номер РФ или Казахстана в формате +7XXXXXXXXXX |
externalId | string или null | Нет | Идентификатор операции в вашей системе |
Успешный ответ означает, что команда принята в обработку.
HTTP/1.1 202 Accepted
Content-Type: application/json
{
"authenticationId": "0195fa8e-61e5-7c40-b4af-f577674fd349",
"status": "pending",
"expiresAt": "2026-09-11T13:17:20Z",
"errorCode": null
}
Сохраните authenticationId. Он нужен для проверки состояния, передачи SMS-кода и сверки callback-ов.
ℹ️ Примечание: 202 Accepted не означает, что пользователь уже прошёл аутентификацию. Это только подтверждение, что сессия создана и обрабатывается.
2. Получайте состояние сессии
Запрашивайте состояние по authenticationId.
GET /api/v1/mobile-id-adapter/authentications/{authenticationId}
Authorization: Bearer <access_token>
Пример успешного результата:
{
"authenticationId": "0195fa8e-61e5-7c40-b4af-f577674fd349",
"externalId": "login-session-123",
"status": "success",
"createdAt": "2026-09-11T13:15:00Z",
"updatedAt": "2026-09-11T13:15:48Z",
"expiresAt": "2026-09-11T13:17:20Z",
"smsCodeExpiresAt": null,
"remainingAttempts": null,
"subId": "873d1a98-23ef-42be-a14c-f577674fd349",
"errorCode": null
}
| Поле | Тип | Описание |
|---|---|---|
authenticationId | UUID | Идентификатор сессии |
externalId | string или null | Идентификатор операции в вашей системе |
status | string | Текущее состояние аутентификации |
createdAt | datetime | Время создания сессии в UTC |
updatedAt | datetime | Время последнего изменения состояния в UTC |
expiresAt | datetime или null | Общий срок действия сессии |
smsCodeExpiresAt | datetime или null | Срок ввода текущего SMS-кода |
remainingAttempts | integer или null | Оставшиеся попытки ввода SMS-кода |
subId | string или null | Идентификатор подтверждённого субъекта. Заполняется только при success |
errorCode | string или null | Нормализованный бизнес-код ошибки |
Рекомендуемый интервал опроса — не чаще одного раза в две секунды. Остановите опрос после статуса success, failed или expired.
3. Передайте SMS-код, если он нужен
Вызывайте метод только при статусе smsCodeRequired и до наступления smsCodeExpiresAt.
POST /api/v1/mobile-id-adapter/authentications/{authenticationId}/sms-code
Content-Type: application/json
Authorization: Bearer <access_token>
{
"code": "0842"
}
| Поле | Тип | Обязательное | Описание |
|---|---|---|---|
code | string | Да | SMS-код из 3-10 цифр |
code передаётся строкой, чтобы сохранить ведущие нули.
Успешный ответ:
HTTP/1.1 202 Accepted
Content-Type: application/json
{
"authenticationId": "0195fa8e-61e5-7c40-b4af-f577674fd349"
}
После ответа продолжайте получать состояние сессии. Возможные результаты:
smsCodeSubmitted— код отправлен на проверку, ожидайте результат;smsCodeRequiredвместе сerrorCode: "sms_code_invalid"— код неверен, можно повторить ввод до истечения срока или исчерпания попыток;success,failedилиexpired— сценарий завершён.
Статусы аутентификации
| Статус | Значение | Что делать |
|---|---|---|
pending | Аутентификация выполняется | Ожидать результат |
smsCodeRequired | Требуется SMS-код | Показать форму ввода и передать код |
smsCodeSubmitted | Код отправлен на проверку | Ожидать результат |
success | Аутентификация успешна | Использовать subId и завершить сценарий |
failed | Аутентификация завершилась ошибкой | Обработать errorCode и завершить сценарий |
expired | Истёк общий срок сессии | При необходимости создать новую сессию |
success, failed и expired — конечные статусы. Они больше не изменяются.
Не считайте пользователя аутентифицированным при любом результате, кроме status: "success" с непустым subId.
Бизнес-коды ошибок
Бизнес-ошибка передаётся в поле errorCode состояния и не обязательно сопровождается ошибочным HTTP-кодом.
| errorCode | Значение | Рекомендация |
|---|---|---|
operator_unsupported | Оператор номера не поддерживается | Предложить другой способ входа |
authentication_already_in_progress | Для номера уже идёт аутентификация | Подождать и повторить позднее |
user_cancelled | Пользователь отменил запрос | Завершить сценарий без повтора |
authentication_failed | Пользователь не подтверждён | Предложить повторить аутентификацию |
sms_code_invalid | Введён неверный SMS-код | Разрешить повторный ввод, если попытки остались |
sms_attempts_exhausted | Попытки ввода исчерпаны | Создать новую сессию позднее |
sms_session_expired | Истёк срок SMS-кода или ожидания пользователя | Создать новую сессию |
mobile_id_request_rejected | Mobile ID отклонил запрос | Не повторять немедленно; зарегистрировать ошибку |
mobile_id_unavailable | Mobile ID временно недоступен | Повторить сценарий позднее |
mobile_id_response_invalid | Получен некорректный ответ Mobile ID | Зарегистрировать ошибку и обратиться в поддержку |
invalid_id_token | Результат Mobile ID не прошёл проверку | Не считать пользователя аутентифицированным |
tenant_configuration_error | Ошибка конфигурации подключения | Обратиться в поддержку |
unknown_error | Ошибка не распознана | Зарегистрировать ошибку и обратиться в поддержку |
HTTP-ошибки
Ошибки HTTP возвращаются в формате application/problem+json.
{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.1",
"title": "Invalid request",
"status": 400,
"detail": "Phone number must be in E.164 format, for example +79161234567"
}
| HTTP-код | Когда возвращается | Что делать |
|---|---|---|
400 Bad Request | Невалидный JSON, UUID, телефон или SMS-код | Исправить запрос; без изменений не повторять |
401 Unauthorized | Токен отсутствует, истёк или не прошёл проверку | Получить актуальный access_token и повторить запрос |
403 Forbidden | Токен не даёт доступа к API | Проверить подключение продукта и права доступа |
404 Not Found | Сессия не существует или недоступна вашему подключению | Проверить authenticationId |
409 Conflict | Операция недопустима в текущем состоянии | Получить актуальное состояние и продолжить по нему |
503 Service Unavailable | Недоступна критичная инфраструктура или неверно настроен сценарий | Повторить с задержкой; при устойчивой ошибке обратиться в поддержку |
Для сетевых ошибок и 503 используйте повторные попытки с увеличивающейся задержкой. Не создавайте новую аутентификацию автоматически после неоднозначного сетевого сбоя: сначала попытайтесь получить состояние по уже сохранённому authenticationId, если он был получен.
Callback
Если для вашего подключения заранее настроен callback, сервис отправляет изменения состояния методом POST на согласованный HTTPS-адрес.
POST <callbackUrl>
Content-Type: application/json; charset=utf-8
<согласованные заголовки авторизации>
Тело callback:
{
"eventId": "0195faa1-5a22-75b6-b4a7-06be89d82a0d",
"occurredAt": "2026-09-11T13:15:48Z",
"authentication": {
"id": "0195fa8e-61e5-7c40-b4af-f577674fd349",
"externalId": "login-session-123",
"status": "success",
"createdAt": "2026-09-11T13:15:00Z",
"updatedAt": "2026-09-11T13:15:48Z",
"expiresAt": "2026-09-11T13:17:20Z",
"smsCodeExpiresAt": null,
"remainingAttempts": null,
"subId": "873d1a98-23ef-42be-a14c-f577674fd349",
"errorCode": null
}
}
| Поле | Тип | Описание |
|---|---|---|
eventId | UUID | Уникальный идентификатор события. Не меняется при повторных попытках доставки |
occurredAt | datetime | Время изменения состояния в UTC |
authentication | object | Снимок состояния аутентификации на момент события |
authentication.id | UUID | Идентификатор сессии; соответствует authenticationId в ответах API |
authentication.externalId | string или null | Идентификатор операции в вашей системе |
authentication.status | string | Новое состояние аутентификации |
authentication.createdAt | datetime | Время создания сессии |
authentication.updatedAt | datetime | Время последнего изменения состояния |
authentication.expiresAt | datetime или null | Общий срок действия сессии |
authentication.smsCodeExpiresAt | datetime или null | Срок ввода текущего SMS-кода |
authentication.remainingAttempts | integer или null | Оставшиеся попытки ввода SMS-кода |
authentication.subId | string или null | Идентификатор подтверждённого субъекта при success |
authentication.errorCode | string или null | Нормализованный бизнес-код ошибки |
Обработчик callback должен:
- принимать повторную доставку одного
eventIdидемпотентно; - возвращать любой HTTP-код
2xxтолько после успешной обработки; - не рассчитывать на порядок доставки разных событий;
- игнорировать изменение после уже обработанного конечного статуса;
- проверять согласованный заголовок авторизации callback.
Любой ответ вне диапазона 2xx, сетевой сбой или таймаут считаются неуспешной доставкой. При повторной доставке используется тот же eventId.
При наличии callback метод GET /api/v1/mobile-id-adapter/authentications/{authenticationId} всё равно остаётся источником актуального состояния и может использоваться для сверки.
Когда обращаться в поддержку
- API возвращает
403 Forbiddenпри корректном токене; - устойчиво возвращается
503 Service Unavailable; - в состоянии сессии пришёл
errorCode: "tenant_configuration_error";