Правила проверок
Итоговый вердикт системы в соответствии с проверками
Доступно на тарифах Биорг.KYC и Биорг.Универсальный
Блок check_result — итоговый вердикт системы по результатам всех проверок документа. Он имеет следующую структуру:
"check_result": {
"status": "Approved",
"details": {
"logic": { "status": "Approved" },
"metadata": { "status": "Approved" },
"fraud": { "status": "Approved" },
"external_integrations": { "status": "Approved" }
}
}
status (главный статус) - итоговый результат всей проверки.
- Формируется на основе статусов из раздела
details. Если все подразделы (за исключениемmetadata) имеют статусApproved, то и общий статус будетApproved. Если хотя бы один из них имеет статусFailed, общий статус тоже станетFailed.
details (детализация по типам проверок)
Содержит разбивку по четырём ключевым направлениям проверки. Каждое направление независимо оценивает свою область.
logic- проверяет логическую целостность данных внутри документа.metadata- оценивает технические параметры документа и процесса его подачи.fraud- признаки подделки с документа.external_integrations- сверяет данные с внешними базами данных.
Таблица статусов верификации
| Статус (англ.) | Статус (рус.) | Приоритет | Описание |
|---|---|---|---|
Approved |
Одобрено | Базовый (низший) | Проверка выполнена успешно, нарушений не обнаружено |
Failed |
Не пройдено | Высокий (высший) | Проверка выявила критическую проблему, документ не может быть одобрен |
Not executed |
Не выполнено | Средний | Проверка не запускалась или не смогла завершиться по техническим причинам |
Attention |
Требуется внимание | Средний | Проверка выявила потенциальную проблему, требующую ручной проверки |
Проверка паспорта РФ
В результате обработки входящего паспорта будет доступно поле verifications.verifications_passport,
в котором находятся следующие данные:
| Название | Описание | Тип данных |
|---|---|---|
| status | статус проверки | integer |
| status_text | текстовое описание статуса | string |
| checks | Подробное описание произведенных проверок | dict |
| bad_fields | список полей полей имеющих несоответствия | list |
Поле status может отражать следующие варианты кодов проверки:
Статусы по всем проверкам;
0 — проверки пройдены (или все проверки были пропущены '')
1 — хотябы одна не пройдена
Поле checks может отражать следующие данные проверок:
-
fields_to_check_valid - проверка наличия обязательных полей
0 — проверки пройдены 1 — проверки не пройдены '' - проверки не было, из-за отсутствия набора значений в ключах проверки -
fio_series_number_mrz - проверка согласованности МЧЗ с полями документа
0 — проверки пройдены 1 — проверки не пройдены '' - проверки не было, из-за отсутствия набора значений в ключах проверки -
series_okato - проверка согласованности серии паспорта с кодом подразделения
0 — проверки пройдены 1 — проверки не пройдены '' - проверки не было, из-за отсутствия набора значений в ключах проверки -
region_valid - проверка согласованности места выдачи с кодом подразделения
0 — проверки пройдены 1 — проверки не пройдены '' - проверки не было, из-за отсутствия набора значений в ключах проверки -
issued_after_14 - проверка выдачи паспорта до 14 лет
0 — проверки пройдены 1 — проверки не пройдены '' - проверки не было, из-за отсутствия набора значений в ключах проверки -
issued_after_1997 - проверка выдачи паспорта до 1997 года
0 — проверки пройдены 1 — проверки не пройдены '' - проверки не было, из-за отсутствия набора значений в ключах проверки -
expiration_date - проверка действительности паспорта по дате истечения
0 — проверки пройдены 1 — проверки не пройдены '' - проверки не было, из-за отсутствия набора значений в ключах проверки
Проверка Водительского удостоверения
В результате обработки входящего водительского удостоверения будет доступно поле verifications.verifications_dlic,
в котором находятся следующие данные:
Поле status может отражать следующие варианты кодов проверки:
Статусы по всем проверкам;
0 — проверки пройдены (или все проверки были пропущены '')
1 — хотябы одна не пройдена
Поле checks может отражать следующие данные проверок:
-
date_issue - Проверка Дата рождения < дата выдачи ВУ < дата окончания срока действия;
0 — проверки пройдены 1 — проверки не пройдены '' - проверки не было, из-за отсутствия набора значений в ключах проверкиУсловия проверки
значение 1, если BirthDate > CategoryAStartDate > CategoryAEndDate или BirthDate > CategoryA1StartDate > CategoryA1EndDate или BirthDate > CategoryBStartDate > CategoryBEndDate или BirthDate > CategoryB1StartDate > CategoryB1EndDate или BirthDate > CategoryCStartDate > CategoryCEndDate или BirthDate > CategoryC1StartDate > CategoryC1EndDate или BirthDate > CategoryDStartDate > CategoryDEndDate или BirthDate > CategoryD1StartDate > CategoryD1EndDate или BirthDate > CategoryBEStartDate > CategoryBEEndDate или BirthDate > CategoryCEStartDate > CategoryCEEndDate или BirthDate > CategoryC1EStartDate > CategoryC1EEndDate или BirthDate > CategoryDEStartDate > CategoryDEEndDate или BirthDate > CategoryD1EStartDate > CategoryD1EEndDate или BirthDate > CategoryMStartDate > CategoryMEndDate или BirthDate > CategoryTmStartDate > CategoryTmEndDate или BirthDate > CategoryTbStartDate > CategoryTbEndDate -
certain_open_categories - Проверка Дата выдачи
Дата рождения не менее 16 лет, 21 года для определенных открытых категорий M, BE
Дата рождения > 16-летнего возраста для транспортных средств (далее также - ТС) категории "A", если водительское удостоверение выдано до 05.11.2013 включительно
Дата рождения > 16-летнего возраста для транспортных средств категории "M" и подкатегории "A1"
Дата рождения > 18-летнего возраста для ТС категорий "A", "B", "C" и подкатегорий "B1", "C1"
Дата рождения > 21-летнего возраста для ТС категорий "D", "Tm", "Tb" и подкатегории "D1";
0 - проверка пройдена 1 - проверки не пройдены '' - проверки не было, из-за отсутствия набора значений в ключах проверкиУсловия проверки
значение 1, если (CategoryAStartDate - BirthDate) < 18 лет — при условии, что CategoryAStartDate ≥ 05.11.2013 или (CategoryAStartDate - BirthDate) < 16 лет — при условии, что CategoryAStartDate < 05.11.2013 или (CategoryC1StartDate - BirthDate) < 16 лет или (CategoryBEStartDate - BirthDate) < 21 года или (CategoryCEStartDate - BirthDate) < 16 лет или (CategoryDEStartDate - BirthDate) < 16 лет или (CategoryBStartDate - BirthDate) < 18 лет или (CategoryCStartDate - BirthDate) < 18 лет или (CategoryB1StartDate - BirthDate) < 18 лет или (CategoryC1EStartDate - BirthDate) < 18 лет или (CategoryMStartDate - BirthDate) < 16 лет или (CategoryA1StartDate - BirthDate) < 16 лет или (CategoryDStartDate - BirthDate) < 21 года или (CategoryD1StartDate - BirthDate) < 21 года или (CategoryD1EStartDate - BirthDate) < 21 года или (CategoryTmStartDate - BirthDate) < 21 года или (CategoryTbStartDate - BirthDate) < 21 года -
driving_experience - стаж вождения более 12 месяцев;
0 - проверка пройдена 1 - проверки не пройдены '' - проверки не было, из-за отсутствия набора значений в ключах проверкиУсловия проверки
значение 1, если (today - CategoryD1EStartDate) > 12 месяцев -
category_and_date_issue - проверка наличия у категории дат выдачи и окончания
Если в поле Категории распознаны определенные значения, например B и B1, то в соответствующих полях Даты выдачи и Даты окончания по соответствующим категориям должны присутствовать значения дат;
0 - проверка пройдена 1 - проверки не пройдены '' - проверки не было, из-за отсутствия набора значений в ключах проверкиУсловия проверки
значение 1, если Categories содержит значение A и (CategoryAStartDate отсутствует или CategoryAEndDate отсутствует) или (CategoryAStartDate присутствует, а CategoryAEndDate отсутствует) или Categories содержит значение B и (CategoryBStartDate отсутствует или CategoryBEndDate отсутствует) или (CategoryBStartDate присутствует, а CategoryBEndDate отсутствует) или Categories содержит значение B1 и (CategoryB1StartDate отсутствует или CategoryBEndDate отсутствует) или (CategoryB1StartDate присутствует, а CategoryBEndDate отсутствует) или Categories содержит значение C и (CategoryCStartDate отсутствует или CategoryCEndDate отсутствует) или (CategoryCStartDate присутствует, а CategoryCEndDate отсутствует) или Categories содержит значение C1 и (CategoryC1StartDate отсутствует или CategoryC1EndDate отсутствует) или (CategoryC1StartDate присутствует, а CategoryC1EndDate отсутствует) или Categories содержит значение D и (CategoryDStartDate отсутствует или CategoryDEndDate отсутствует) или (CategoryDStartDate присутствует, а CategoryDEndDate отсутствует) или Categories содержит значение D1 и (CategoryD1StartDate отсутствует или CategoryD1EndDate отсутствует) или (CategoryD1StartDate присутствует, а CategoryD1EndDate отсутствует) или Categories содержит значение BE и (CategoryBEStartDate отсутствует или CategoryBEEndDate отсутствует) или (CategoryBEStartDate присутствует, а CategoryBEEndDate отсутствует) или Categories содержит значение CE и (CategoryCEStartDate отсутствует или CategoryCEEndDate отсутствует) или (CategoryCEStartDate присутствует, а CategoryCEEndDate отсутствует) или Categories содержит значение C1E и (CategoryC1EStartDate отсутствует или CategoryC1EEndDate отсутствует) или (CategoryC1EStartDate присутствует, а CategoryC1EEndDate отсутствует) или Categories содержит значение D1E и (CategoryD1EStartDate отсутствует или CategoryD1EEndDate отсутствует) или (CategoryD1EStartDate присутствует, а CategoryD1EEndDate отсутствует) или Categories содержит значение DE и (CategoryDEStartDate отсутствует или CategoryDEndDate отсутствует) или (CategoryDEStartDate присутствует, а CategoryDEndDate отсутствует) или Categories содержит значение M и (CategoryMStartDate отсутствует или CategoryMEndDate отсутствует) или (CategoryMStartDate присутствует, а CategoryMEndDate отсутствует) или Categories содержит значение Tm и (CategoryTmStartDate отсутствует или CategoryTmEndDate отсутствует) или (CategoryTmStartDate присутствует, а CategoryTmEndDate отсутствует) или Categories содержит значение Tb и (CategoryTbStartDate отсутствует или CategoryTbEndDate отсутствует) или (CategoryTbStartDate присутствует, а CategoryTbEndDate отсутствует). -
correct_formats - проверка на корректность форматов Дата в документе указана корректно;
0 - проверка пройдена 1 - проверки не пройдены '' - проверки не было, из-за отсутствия набора значений в ключах проверкиУсловия проверки
значение 1, если BirthDate != формату ДД.ММ.ГГГ или CategoryAStartDate != формату ДД.ММ.ГГГ или CategoryA1StartDate != формату ДД.ММ.ГГГ или CategoryBStartDate != формату ДД.ММ.ГГГ или CategoryB1StartDate != формату ДД.ММ.ГГГ или CategoryCStartDate != формату ДД.ММ.ГГГ или CategoryC1StartDate != формату ДД.ММ.ГГГ или CategoryDStartDate != формату ДД.ММ.ГГГ или CategoryD1StartDate != формату ДД.ММ.ГГГ или CategoryBEStartDate != формату ДД.ММ.ГГГ или CategoryCEStartDate != формату ДД.ММ.ГГГ или CategoryC1EStartDate != формату ДД.ММ.ГГГ или CategoryDEStartDate != формату ДД.ММ.ГГГ или CategoryD1EStartDate != формату ДД.ММ.ГГГ или CategoryMStartDate != формату ДД.ММ.ГГГ или CategoryTmStartDate != формату ДД.ММ.ГГГ или CategoryTbStartDate != формату ДД.ММ.ГГГ -
matching_series_number - сверка по совпадению Серии и Номера на лицевой и оборотной стороне;
0 - проверка пройдена 1 - проверки не пройдены '' - проверки не было, из-за отсутствия набора значений в ключах проверкиУсловия проверки
значение 1, если SeriesFront != SeriesBack или NumberFront != NumberBack
Собственные логические проверки (язык правил)
Кроме встроенных проверок, вы можете задать свои правила для полей документа: возраст, формат номера, согласованность дат, допустимые значения и т.д. Правила описываются в JSON в стиле запросов MongoDB и выполняются после распознавания документа.
Как передать правила
Правила указываются в элементе process_info документа в ключе checks — списке правил:
{
"key": "PASSPORT1",
"type": "PASSPORT",
"checks": [
{
"key": "adult",
"title": "Клиенту исполнилось 18 лет",
"query": {"BirthDate": {"$age": {"$gte": 18}}},
"critical": true
},
{
"key": "issue_not_in_future",
"title": "Дата выдачи не позже сегодняшней",
"query": {"IssueDate": {"$lte": "$$TODAY"}}
}
]
}
| Ключ | Описание | Обязательный |
|---|---|---|
key |
идентификатор правила, возвращается в результате | да |
title |
описание правила, возвращается в результате | да |
query |
условие, которому должны соответствовать поля документа | да |
critical |
true — невыполнение правила делает проверку документа непройденной (status: 1). По умолчанию false: правило попадает в результат, но на общий статус не влияет |
нет |
Ограничения: не больше 20 правил на документ; key — латиница, цифры, _ и -, до 64 символов, без повторов; title — до 256 символов; query — до 4096 символов в JSON и не глубже 10 уровней вложенности. Правило с ошибкой (неизвестный оператор, неверные аргументы) не принимается: документ отклоняется с ответом 400 и текстом ошибки.
Имена полей в query — те же, что в результате распознавания документа (BirthDate, IssueDate, Series, Number, LastName и т.д.). Пустое или нераспознанное поле считается отсутствующим (null).
Результат
Результаты правил добавляются в блок логических проверок документа:
{
"status": 1,
"status_text": "not_ok",
"checks": {
...встроенные проверки...,
"custom_checks": [
{"key": "adult", "title": "Клиенту исполнилось 18 лет", "status": 1, "is_critical": true},
{"key": "issue_not_in_future", "title": "Дата выдачи не позже сегодняшней", "status": 0, "is_critical": false}
]
},
"bad_fields": ["BirthDate"]
}
- custom_checks[].status —
0правило выполнено,1не выполнено; - bad_fields — дополняется полями из невыполненных правил;
- status — становится
1, если не выполнено хотя бы одно правило сcritical: true(или не пройдена встроенная проверка).
Условия на поля
Простейшее правило — поле и значение: {"Gender": "M"}. Несколько полей в одном объекте объединяются через «И»: все условия должны выполниться.
Для остальных проверок у поля указывается объект с операторами (все операторы должны выполниться):
{"BirthDate": {"$gte": "01.01.1950", "$lt": "01.01.2010"}}
| Оператор | Значение | Пример |
|---|---|---|
$eq, $ne |
равно, не равно | {"Gender": {"$ne": "F"}} |
$gt, $gte, $lt, $lte |
больше, больше или равно, меньше, меньше или равно | {"IssueDate": {"$lte": "$$TODAY"}} |
$in, $nin |
входит (не входит) в список | {"Gender": {"$in": ["M", "F"]}} |
$exists |
поле есть (true) или его нет (false) |
{"MiddleName": {"$exists": true}} |
$empty |
поле пустое: нет значения, пустая строка или пустой список | {"Number": {"$empty": false}} |
$size |
длина списка | {"Categories": {"$size": 2}} |
$not |
отрицание вложенного условия | {"Gender": {"$not": {"$in": ["M", "F"]}}} |
⚠️ Регулярные выражения (
$regex,$regexMatch) не поддерживаются: документ с такими правилами не принимается
Логика
{"$and": [условие, условие, ...]} все условия выполнены
{"$or": [условие, условие, ...]} хотя бы одно выполнено
{"$nor": [условие, условие, ...]} ни одно не выполнено
{"$not": условие} условие не выполнено
Пример — серия и номер заполнены, а гражданство РФ или не указано:
{
"Series": {"$empty": false},
"Number": {"$empty": false},
"$or": [
{"Citizenship": "РФ"},
{"Citizenship": {"$exists": false}}
]
}
Преобразование значения поля
Значение поля можно сначала преобразовать, а затем проверить результат. Для этого оператор преобразования указывается на месте оператора условия:
{"BirthDate": {"$age": {"$gte": 18}}} полных лет с даты рождения >= 18
{"Number": {"$digits": {"$strLen": 6}}} в номере ровно 6 цифр
{"Gender": {"$toUpper": {"$in": ["M", "F"]}}} пол M или F в любом регистре
{"BirthDate": {"$year": {"$gte": 1950}}} год рождения не раньше 1950
Подходит любой оператор выражения с одним аргументом (см. ниже).
Сравнение полей между собой и выражения
В значении условия можно ссылаться на другие поля и вычислять значения:
"$Поле"— значение поля ("$BirthDate"), вложенное поле — через точку ("$address.region");"$$TODAY"— сегодняшняя дата;{"$literal": "$100"}— строка, начинающаяся с$, как обычный текст.
{"IssueDate": {"$gt": {"$dateAdd": {"startDate": "$BirthDate", "unit": "year", "amount": 14}}}}
Паспорт выдан позже, чем клиенту исполнилось 14 лет.
Для произвольного логического выражения используется $expr — правило выполнено, если выражение истинно:
{"$expr": {"$gte": [{"$dateDiff": {"startDate": "$BirthDate", "endDate": "$IssueDate", "unit": "year"}}, 14]}}
Операторы выражений записываются как {"$оператор": [аргумент, ...]} или {"$оператор": аргумент}, операторы дат — с именованными аргументами.
| Группа | Операторы |
|---|---|
| логика | $and, $or, $not, $cond (если — то — иначе), $ifNull (первое непустое значение) |
| сравнения | $eq, $ne, $gt, $gte, $lt, $lte, $in |
| арифметика | $add, $subtract, $multiply, $divide, $mod, $abs, $round, $min, $max |
| строки | $concat, $toLower, $toUpper, $trim, $strLen (длина), $digits (только цифры из строки) |
| приведение типов | $toInt, $toDouble, $toString, $toDate |
| даты | $dateFromString, $dateAdd, $dateSubtract, $dateDiff, $age, $year, $month, $dayOfMonth |
| прочее | $empty, $size, $isNumber |
Операторы дат:
| Оператор | Аргументы | Результат |
|---|---|---|
$dateAdd, $dateSubtract |
startDate, unit, amount |
дата плюс (минус) amount единиц |
$dateDiff |
startDate, endDate, unit |
количество полных единиц между датами |
$age |
дата (и необязательно дата, на которую считать) | полных лет до сегодняшнего дня |
$dateFromString |
dateString, format (необязательно, например "%d.%m.%Y") |
дата из строки |
$year, $month, $dayOfMonth |
дата | год, месяц, день |
unit — year, quarter, month, week, day.
Пример $cond — для мужчин и женщин разный возрастной порог:
{"$expr": {"$gte": [
{"$age": "$BirthDate"},
{"$cond": {"if": {"$eq": ["$Gender", "M"]}, "then": 18, "else": 16}}
]}}
Особенности сравнения
- нет значения и
nullне различаются; - сравнения «больше/меньше» с отсутствующим значением всегда ложны: правило
{"BirthDate": {"$lt": "01.01.2010"}}не выполнится, если дата рождения не распознана. Чтобы пропускать пустые поля, добавьте$orс{"Поле": {"$exists": false}}; - строка с числом сравнивается с числом как число:
"77"равно77; - строка с датой сравнивается с датой как дата. Поддерживаемые форматы:
ДД.ММ.ГГГГ,ГГГГ-ММ-ДД,ДД/ММ/ГГГГ,ГГГГ.ММ.ДД,ДД-ММ-ГГГГ; $dateDiffи$ageсчитают полные единицы: от10.05.2000до09.05.2018— 17 лет;- при прибавлении лет и месяцев, если такого числа в месяце нет, берется последний день:
29.02.2024+ 1 год =28.02.2025.
Примеры правил
Возраст от 18 до 65 лет:
{"BirthDate": {"$age": {"$gte": 18, "$lte": 65}}}
Серия — 4 цифры, номер — 6 цифр:
{"Series": {"$digits": {"$strLen": 4}}, "Number": {"$digits": {"$strLen": 6}}}
ИНН — 10 или 12 цифр:
{"INN": {"$digits": {"$strLen": {"$in": [10, 12]}}}, "$expr": {"$eq": [{"$digits": "$INN"}, "$INN"]}}
Документ не просрочен (если дата окончания указана):
{"$or": [{"ExpiryDate": {"$gte": "$$TODAY"}}, {"ExpiryDate": {"$exists": false}}]}
Паспорт РФ заменен после 20 и 45 лет (упрощенно, без учета срока на замену):
{"$or": [
{"BirthDate": {"$age": {"$lt": 20}}},
{"$and": [
{"BirthDate": {"$age": {"$lt": 45}}},
{"IssueDate": {"$gte": {"$dateAdd": {"startDate": "$BirthDate", "unit": "year", "amount": 20}}}}
]},
{"IssueDate": {"$gte": {"$dateAdd": {"startDate": "$BirthDate", "unit": "year", "amount": 45}}}}
]}
Проверки метаданных
Доступно на тарифе Биорг.KYC
В результате обработки входящего документа будет доступно поле verifications.metadata_check,
в котором находятся следующие данные:
{
'status': 0, // тип integer -- проверка на наличие словаря metadata
'checks': {
'metadata': {
'source_check': 0, // тип integer -- проверка наличия следов производителя устройства
'create_date': '1730796861', // тип timestamp -- дата создания файла
'make': '1', // тип string -- производитель устройства
'model': 'T1' // тип string -- модель устройства
}
}
}
Условия проверки
-
status - Фиксирует наличие метаданных
0 — словарь metadata присутствует и не пустой 1 — словарь metadata отсутствует или пустой -
source_check - Проверка наличия следов производителя устройства, на котором было получение изображение
0 - если make и model присутствуют и непусты 1 - в противном случае -
сreate_date - Фиксирует дату создания файла, значение из словаря metadata ключа CreateDate или DateTimeOriginal
-
make - Фиксирует производителя устройства, значение из словаря metadata ключа Make или DeviceManufacturer,
если ключи отсутствуют или пустые - передает пустое значение '' -
model - Фиксирует модель устройства, значение из словаря metadata ключа Model или DeviceModel
если ключи отсутствуют или пустые - передает пустое значение '' -
not_standart_sizes - Проверяет несоответствие изображения типовым размерам
0 - изображение соответствует типовым размерам 1 - изображение не соответствует типовым размерам
⚠️ Важно: Может свидетельствовать о сгенерированном изображении
-
incorrect_dpi - Проверяет несоответствие DPI изображения
0 - DPI корректен 1 - DPI некорректен
⚠️ Важно: Может свидетельствовать о сгенерированном изображении
-
color_profile - Наличие информации о цветовом профиле
0 - информация отсутствует 1 - информация присутствует
⚠️ Важно: Может свидетельствовать о сгенерированном изображении
Проверка доумента на фрод
Доступно на тарифе Биорг.KYC
В результате обработки входящего документа будет доступно поле verifications.fraud_check,
в котором находятся следующие данные:
"fraud_check": {
"fraud": 0, // тип integer -- 0 - документ не поддельный 1 - документ поддельный
"probability": 1,
"error_code": 0,
"comment": "Good"
},