1. Веб SDK
RSID docs
Russian
  • English
  • Russian
  • Uzbek
  • Обзор интеграции
  • Веб SDK
    • Руководство по интеграции
    • Авторизация (sign-in)
      POST
    • Обновление токена (refresh)
      POST
    • Создание сессии
      POST
    • Получение данных пользователя
      GET
  • Мобильный SDK
    • Руководство по интеграции
    • Авторизация (sign-in)
      POST
    • Обновление токена (refresh)
      POST
    • Создание сессии
      POST
    • Получение данных пользователя
      GET
  • Backend с данными
    • Руководство по интеграции
    • Авторизация (sign-in)
      POST
    • Обновление токена (refresh)
      POST
    • Вариант 1 — сравнение фото с фото из паспорта
      POST
    • Вариант 2 — сравнение двух фото с данными гражданина
      POST
    • Вариант 3 — сравнение двух фото без данных гражданина
      POST
    • Получение результата
      GET
  • Backend без данных
    • Руководство по интеграции
    • Авторизация (sign-in)
      POST
    • Обновление токена (refresh)
      POST
    • Вариант 1 — сравнение фото с фото из паспорта
      POST
    • Вариант 2 — сравнение двух фото с данными гражданина
      POST
    • Вариант 3 — сравнение двух фото без данных гражданина
      POST
  • Авторизация и QR-подписание
    • Вход через RS-ID (OAuth2)
    • Подписание по QR-коду
    • Получение данных пользователя по коду
      POST
    • Авторизация (sign-in)
      POST
    • Обновление токена (refresh)
      POST
    • Создание QR-токена
      POST
    • Статус QR-токена по qr_id
      GET
    • Статус QR-токена по external_id
      GET
  • Schemas
    • ErrorResponse
    • AuthCodeRequest
    • ClientCredentials
    • Token
    • UserInfo
    • TokenResponseEnvelope
    • DocumentInfo
    • Signer
    • StringResponseEnvelope
    • ContactInfo
    • CallbackEvent
    • UserProfile
    • QrTokenCreateRequest
    • PhotoItem
    • Address
    • UserProfileResponseEnvelope
    • AdditionalParams
    • WebSessionCreateRequest
    • QrToken
    • UserProfileResponse
    • CompareFaceRequest
    • UserResponseEnvelope
    • CompareImagesWithInfoRequest
    • QrTokenResponseEnvelope
    • CompareImagesRequest
    • SignCallback
    • ComparisonResult
    • MobileSessionCreateRequest
    • ComparisonResultEnvelope
  1. Веб SDK

Руководство по интеграции

Интеграция с Web SDK#

1. Что такое RS-ID Web SDK#

RS-ID Web SDK позволяет вашему веб-продукту подтвердить, что перед ним реальный, живой человек и что он действительно тот, за кого себя выдаёт, — по лицу и по данным государственного реестра Республики Узбекистан.
Вам не нужно разрабатывать работу с камерой, проверку «живости» (liveness) или сравнение лиц. Ваш бэкенд создаёт сессию, пользователь открывает страницу RS-ID (размещена на стороне RS-ID), делает селфи, а RS-ID:
1.
проверяет, что на селфи живой человек, а не фото, экран или маска (анти-спуфинг);
2.
получает официальное фото из паспорта и данные гражданина из государственного реестра;
3.
сравнивает селфи с фото из паспорта;
4.
возвращает пользователя на ваш сайт и передаёт вашему бэкенду подтверждённый профиль гражданина.

Сценарии использования#

СценарийПример
Удалённая идентификация клиента (KYC)Банк, микрофинансовая или страховая компания открывает счёт онлайн, без визита в офис.
Подтверждение личности перед важным действиемПодтверждение владельца аккаунта перед крупным переводом, сбросом пароля или сменой номера телефона.
Онлайн-подписание договоровПроверка того, что договор займа или аренды подписывает именно этот гражданин.
Проверка возраста / личностиМаркетплейсы, телеком, игровые сервисы или службы доставки, которым нужно подтвердить возраст или реальную личность.
Автозаполнение регистрацииПользователь только делает селфи, а ваша форма заполняется подтверждёнными ФИО, документом и датой рождения.

2. Терминология#

ТерминКто это
КлиентКомпания, которая интегрирует RS-ID (вы). Зарегистрирована в RS-ID и получила client_id / client_secret. Включает бэкенд клиента (вызывает API RS-ID) и фронтенд клиента (ваш сайт, который направляет пользователя на страницу RS-ID).
ПользовательКонечный человек, которого идентифицируют, — ваш клиент, гражданин Узбекистана.
СерверСервер RS-ID: API Web SDK и страница RS-ID (<rsid_base_url>), на которой пользователь делает селфи.
СессияОдна попытка идентификации, созданная бэкендом клиента. Определяется session_id (UUID). Имеет ограниченный срок жизни и ограниченное число попыток.
ПИНФЛПерсональный идентификационный номер физического лица — 14 цифр.
Номер документа (id_number)Серия и номер паспорта или ID-карты, например AA1234567.

3. Типы интеграции#

Страницу RS-ID можно показать пользователю двумя способами. Вызовы API одинаковые; отличается только способ открытия страницы.

3.1 Redirect flow (переход по ссылке)#

Фронтенд клиента перенаправляет браузер пользователя на страницу RS-ID. После успешной идентификации страница RS-ID возвращает пользователя на ваш redirect_url.
Самая простая интеграция, работает в браузерах на компьютере и на мобильных устройствах.
На время проверки пользователь уходит с вашего сайта.
или

3.2 iFrame flow (встраивание)#

Фронтенд клиента встраивает страницу RS-ID в <iframe> на своей странице, и пользователь не покидает ваш сайт.
Требования:
allow="camera" обязателен — без него браузер заблокирует камеру внутри iframe.
Ваша страница должна открываться по HTTPS.
После успешной идентификации iframe переходит на ваш redirect_url. Укажите в redirect_url небольшую страницу на своём домене, которая уведомит родительское окно, например:

4. Схема интеграции#

integration-flow-web-sdk.png

5. Окружения#

ОкружениеБазовый URL APIСтраница RS-ID
Stage (тестовое)https://sdk.stage.rsid.uz/web/apihttps://sdk.stage.rsid.uz/?session_id={session_id}
Productionhttps://sdk.rsid.uz/web/apihttps://sdk.rsid.uz/?session_id={session_id}
Для stage и production используются разные client_id / client_secret. Сессия, созданная на stage, открывается только на stage-странице, и наоборот.

6. Общие правила#

Формат ответа#

Все ответы API имеют одинаковую структуру:
{ "data": { }, "code": 0, "message": "Success" }
ПолеТипОписание
codeinteger0 — успех. Любое другое значение — ошибка (см. таблицы ошибок). Всегда проверяйте code, а не только HTTP-статус.
messagestringТекст на языке запроса (uz / ru / en). Не разбирайте его программно.
dataanyДанные ответа. Отсутствует при ошибке.

Заголовки#

ЗаголовокЗначениеГде используется
Content-Typeapplication/jsonВсе POST-запросы
AuthorizationBearer {access_token}Все запросы, кроме sign-in
Accept-Languageuz / ru / enНеобязательно — язык поля message
Безопасность. client_secret и access_token должны храниться только на бэкенде клиента. Никогда не передавайте их в браузер. Фронтенду клиента нужен только session_id.

7. Описание API#

7.1 Авторизация (Sign in)#

Обменивает учётные данные клиента на токен доступа.
Метод - POST
Endpoint - {base_url}/v1/auth/sign-in — без заголовка Authorization
Content-Type (заголовок) - application/json

Тело запроса
ПолеТипОбязательноДлина / форматОписание
client_idstringДаНе пустое; не может начинаться с цифрыИдентификатор клиента, выданный RS-ID.
client_secretstringДаНе пустоеСекрет клиента, выданный RS-ID.
{
  "client_id": "web-sdk-client",
  "client_secret": "s3cr3t-value"
}
Ответ
ПолеТипОписание
data.access_tokenstring (JWT)Токен для заголовка Authorization: Bearer.
data.token_typestringВсегда Bearer.
data.expires_inintegerСрок жизни токена в секундах.
data.scopestringВыданные права, через пробел.
data.refresh_tokenstring (JWT)Токен для получения нового access_token без повторной отправки учётных данных.
codeinteger0 при успехе.
messagestringТекст результата.
{
  "data": {
    "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
    "token_type": "Bearer",
    "expires_in": 3600,
    "scope": "read write",
    "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
  },
  "code": 0,
  "message": "Success"
}
Обновление токена — POST {base_url}/v1/auth/refresh?token={refresh_token} с обязательными параметрами. Используйте токен повторно до истечения срока, а не авторизуйтесь заново для каждой сессии.

7.2 Обновление токена (Refresh token)#

Выдаёт новый access_token по refresh_token без повторной авторизации. Вызывайте, когда access_token истёк (через expires_in секунд).
Метод - POST
Endpoint - {base_url}/v1/auth/refresh?token={refresh_token} — без заголовка Authorization.
Content-Type (заголовок) - application/json

Query-параметры
ПолеТипОбязательноДлина / форматОписание
tokenstringДаJWTrefresh_token из авторизации (7.1) или из предыдущего ответа обновления.
client_idstringДаНе пустоеИдентификатор клиента, выданный RS-ID.
Ответ
ПолеТипОписание
data.access_tokenstring (JWT)Новый токен для заголовка Authorization: Bearer.
data.token_typestringВсегда Bearer.
data.expires_inintegerСрок жизни токена в секундах.
data.scopestringВыданные права, через пробел.
codeinteger0 при успехе.
messagestringТекст результата.
{
  "data": {
    "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
    "token_type": "Bearer",
    "expires_in": 3600,
    "scope": "read write"
  },
  "code": 0,
  "message": "Success"
}
Если refresh-токен истёк или недействителен, авторизуйтесь заново (7.1).

7.3 Создание сессии#

Создаёт сессию идентификации для одного пользователя. Каждая сессия привязана к ip_address пользователя. Это гарантирует, что сессия работает только на текущем устройстве пользователя и только один раз.
Метод - POST
Endpoint - {base_url}/v1/sessions
Authorization (заголовок) - Bearer {access_token}
Content-Type (заголовок) - application/json

Тело запроса
ПолеТипОбязательноДлина / форматОписание
client_typestring (enum)ДаWEBКанал интеграции. Для Web SDK всегда WEB.
ip_addressstringДаIPv4 / IPv6Публичный IP-адрес пользователя (возьмите его из запроса пользователя к вашему бэкенду). Страница RS-ID работает только с этого IP — см. примечание ниже.
user_infoobjectНет—Данные гражданина. Передайте, чтобы создать сессию с user_info; не передавайте для сессии без user_info.
user_info.pinflstringУсловноРовно 14 цифрПИНФЛ. Передавайте либо pinfl, либо id_number, но не оба.
user_info.id_numberstringУсловно9 символов: 2 буквы + 7 цифр, например AA1234567Номер паспорта / ID-карты. Передавайте либо pinfl, либо id_number, но не оба.
user_info.birth_datestringДа, если передан user_infodd.MM.yyyyДата рождения. Пользователю должно быть не меньше 16 лет.
external_idstringНет—Ваш собственный идентификатор (заказа, заявки или клиента) для связи сессии с вашими данными. Рекомендуется случайный uuid.
retry_countintegerНет> 0Максимальное число попыток. Если не передано, равно 0 или больше системного максимума — используется системный максимум.
thresholdnumberНет0.0 – 1.0Минимальный порог сходства лиц для прохождения. Если не передан, используется значение по умолчанию.
localestring (enum)НетUZ, RU, ENПо умолчанию UZ.
additional_paramsobjectНетТолько ключи нижеНастройки страницы RS-ID. Любой другой ключ отклоняется.
additional_params.redirect_urlstringРекомендуетсяURLКуда перенаправить пользователя после успешной идентификации (см. 7.6).
additional_params.langstringНетuz, ru, enЯзык страницы RS-ID.
additional_params.themestringНетнапример light, darkТема страницы RS-ID.
additional_params.primary_colorstringНетЦвет в HEX, например #1A73E8Акцентный цвет страницы RS-ID.
Порог (threshold). threshold — минимальная оценка сходства лиц (от 0.0 до 1.0), которую селфи должно получить при сравнении с фото из паспорта, чтобы идентификация прошла. Если параметр не передан, используется значение по умолчанию 0.5. Если вы передаёте его сами, рекомендуем значение выше 0.5. Для высокоточной (строгой) идентификации передавайте значение выше 0.7. Чем выше значение, тем строже проверка и ниже риск, что пройдёт другой человек, но настоящим пользователям может понадобиться больше попыток.
Привязка к IP. Сессия привязана к ip_address. Когда пользователь открывает страницу RS-ID, RS-ID сравнивает его IP с этим значением. Если они не совпадают, страница показывает ошибку (-1028). Передавайте реальный публичный IP пользователя, а не IP вашего сервера.
Примеры запросов — выберите вариант:
Сессия с user_info

Вариант 1 — Сессия с user_info#

Бэкенд клиента уже знает данные пользователя. Страница RS-ID сразу откроет камеру.
{
  "client_type": "WEB",
  "ip_address": "84.54.70.12",
  "external_id": "ORDER-123",
  "retry_count": 3,
  "threshold": 0.7,
  "locale": "UZ",
  "user_info": {
    "pinfl": "12345678901234",
    "birth_date": "01.01.1990"
  },
  "additional_params": {
    "redirect_url": "https://shop.example.uz/kyc/done?order=ORDER-123",
    "lang": "uz"
  }
}
С номером документа вместо ПИНФЛ:
"user_info": { "id_number": "AA1234567", "birth_date": "01.01.1990" }
Сессия без user_info
Ответ
ПолеТипДлина / форматОписание
datastringUUID, 36 символовsession_id. Используйте его, чтобы открыть страницу RS-ID и получить результат.
codeinteger0 при успехе.
messagestringТекст результата.
{
  "data": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
  "code": 0,
  "message": "Success"
}
Ошибки
КодПричина
-1000Некорректный запрос — например, в user_info переданы оба поля pinfl / id_number или ни одного.
-1002Учётные данные не принадлежат клиенту Web SDK.
-1024Неверный формат id_number.
-1025Неверный формат pinfl.
-1026Не передан birth_date.
-1034Неизвестный ключ в additional_params.
-1052threshold вне диапазона 0–1.
-1090Пользователю меньше 16 лет.
400Ошибка валидации поля, например ip address cannot be blank.

7.4 Открытие страницы RS-ID#

По session_id фронтенд клиента открывает страницу RS-ID — переходом (3.1) или в iFrame (3.2):
ОкружениеURL
Stagehttps://sdk.stage.rsid.uz/?session_id={session_id}
Productionhttps://sdk.rsid.uz/?session_id={session_id}
У сессии ограничены срок жизни и число попыток. Открывайте страницу сразу после создания сессии; если сессия истекла, создайте новую.

7.5 Действия пользователя на странице RS-ID#

У страницы RS-ID два режима. Какой из них увидит пользователь, зависит от того, как была создана сессия в 7.3:
Режим страницыКогда показываетсяЧто делает пользователь
with_infoСессия создана без user_info (Вариант 2)Вводит свои данные, затем делает селфи
without_infoСессия создана с user_info (Вариант 1)Только делает селфи

with_info — ввод данных, затем камера#

Сначала странице нужны данные пользователя.
1.
Пользователь вводит серию и номер паспорта или ПИНФЛ и дату рождения (дд.мм.гггг), затем нажимает Далее.
rsid-page-with-info_1.png
2.
Страница запрашивает доступ к камере. Пользователь нажимает Разрешить в окне браузера или Разрешить доступ на странице.
rsid-page-camera-permission_1.png
3.
Открывается камера (тот же экран, что в режиме without_info ниже). Пользователь размещает лицо в круге, и делается селфи.
4.
RS-ID проверяет «живость» и сравнивает лицо с фото из паспорта указанного человека.
5.
При успехе пользователь перенаправляется на redirect_url (7.6).

without_info — только камера#

Данные пользователя уже известны, поэтому страница сразу переходит к камере.
1.
Страница запрашивает доступ к камере — тот же экран, что на шаге 2 режима with_info выше. Пользователь разрешает доступ.
2.
Открывается камера. Пользователь размещает лицо в круге. Пока лицо не найдено, круг красный и на странице написано «Лицо не обнаружено»; как только лицо в нужном положении, делается селфи.
rsid-page-without-info_1.png
3.
RS-ID проверяет «живость» и сравнивает лицо с фото из паспорта.
4.
При успехе пользователь перенаправляется на redirect_url (7.6).

Неудачные попытки#

Если пользователь запретил доступ к камере, страница не может продолжить — пользователю нужно разрешить камеру в настройках браузера и перезагрузить страницу.
Если селфи отклонено (обнаружена подделка, лицо не совпало, гражданин не найден), страница показывает причину и позволяет повторить попытку, пока остаются попытки (retry_count). Когда попытки закончились или сессия истекла, страница показывает ошибку, и клиенту нужно создать новую сессию.

7.6 Перенаправление после успешной идентификации#

После успешной идентификации страница RS-ID перенаправляет пользователя на additional_params.redirect_url из запроса создания сессии.
В redirect flow браузер пользователя возвращается на ваш сайт.
В iFrame flow iframe переходит на redirect_url; используйте это, чтобы уведомить родительскую страницу (см. 3.2).
Добавьте в redirect_url свой идентификатор (например ?order=ORDER-123), чтобы понимать, какая сессия завершилась. Затем бэкенд клиента получает результат (7.7).
Не считайте сам факт перенаправления подтверждением идентификации — этот URL может открыть кто угодно. Всегда проверяйте результат с бэкенда через 7.7.

7.7 Получение результата идентификации#

Бэкенд клиента получает подтверждённый профиль гражданина.
Метод - GET
Endpoint - {base_url}/v1/user/{session_id}
Authorization (заголовок) - Bearer {access_token}

Параметры пути
ПолеТипОбязательноДлина / форматОписание
session_idstringДаUUID, 36 символовИз 7.3.
Ответ
ПолеТипОписание
data.session_idstringИдентификатор сессии.
data.comparison_valuenumberОценка сходства лиц, 0–1.
data.notestringПримечание об ошибке, если есть.
data.profile.user_info.first_namestringИмя.
data.profile.user_info.last_namestringФамилия.
data.profile.user_info.middle_namestringОтчество.
data.profile.user_info.pinflstringПИНФЛ, 14 цифр.
data.profile.user_info.genderstringПол.
data.profile.user_info.birth_datestringyyyy-MM-dd.
data.profile.user_info.birth_placestringМесто рождения.
data.profile.user_info.birth_countrystringСтрана рождения.
data.profile.user_info.nationalitystringНациональность.
data.profile.user_info.citizenshipstringГражданство.
data.profile.document_info.documentstringСерия и номер документа.
data.profile.document_info.typestringТип документа.
data.profile.document_info.issued_bystringКем выдан.
data.profile.document_info.issued_atstringДата выдачи, yyyy-MM-dd.
data.profile.document_info.expiry_atstringСрок действия, yyyy-MM-dd.
data.profile.permanent_addressobjectcountry, country_id, region_id, district_id, address.
data.profile.temporary_addressobjectМожет быть null.
{
  "data": {
    "session_id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
    "comparison_value": 0.93,
    "profile": {
      "user_info": {
        "first_name": "ALISHER",
        "last_name": "KARIMOV",
        "middle_name": "BAXTIYOROVICH",
        "pinfl": "12345678901234",
        "gender": "MALE",
        "birth_date": "1990-01-01",
        "birth_place": "TOSHKENT",
        "birth_country": "UZBEKISTAN",
        "nationality": "UZBEK",
        "citizenship": "UZBEKISTAN"
      },
      "document_info": {
        "document": "AA1234567",
        "type": "PASSPORT",
        "issued_by": "IIV 26283",
        "issued_at": "2018-05-10",
        "expiry_at": "2028-05-09"
      },
      "contact_info": {},
      "permanent_address": {
        "country": "UZBEKISTAN",
        "country_id": 182,
        "region_id": 26,
        "district_id": 2603,
        "address": "..."
      },
      "temporary_address": null
    }
  },
  "code": 0,
  "message": "Success"
}
Ошибки
КодПричина
-1005Идентификация не прошла.
-1027Сессия истекла — запрашивайте результат сразу после перенаправления.
-1029Сессия не найдена.
-1002Сессия принадлежит другому клиенту.

8. Коды ошибок#

КодНазваниеЗначение
0SUCCESSУспех.
-5BAD_CREDENTIALSНеверные учётные данные или пользователь токена не найден.
-9SYSTEM_ERRORНепредвиденная ошибка сервера.
-1000BAD_REQUESTНекорректный запрос.
-1002CLIENT_NOT_PERMITTEDНедоступно для этого клиента.
-1005UNSUCCESS_JOBИдентификация не прошла.
-1008IDENTIFICATION_FAILEDЛицо не совпало.
-1024INVALID_ID_NUMBERНеверный номер документа.
-1025INVALID_PINFLНеверный ПИНФЛ.
-1026BIRTH_DATE_NOT_NULLТребуется дата рождения.
-1027SESSION_EXPIREDСессия истекла.
-1028IP_RESTRICTED_FOR_SESSIONIP пользователя не совпадает с ip_address сессии.
-1029JOB_SESSION_NOT_FOUNDСессия не найдена.
-1031RETRY_COUNT_EXPIREDПопытки закончились.
-1032SUCCESS_JOB_EXISTS_FOR_SESSIONСессия уже успешно пройдена.
-1033SPOOFED_FILE_DETECTEDПроверка «живости» не пройдена.
-1034ADDITIONAL_PARAMS_INVALIDНеизвестный ключ в additional_params.
-1052INVALID_THRESHOLD_LIMITthreshold вне диапазона 0–1.
-1090USER_AGE_OLDER_THAN_16Пользователю должно быть не меньше 16 лет.
-2001AI_ERRORОшибка сервиса распознавания лиц.
Modified at 2026-11-10 07:03:15
Previous
Обзор интеграции
Next
Авторизация (sign-in)
Built with