Перейти к содержанию

Правила проверок

Итоговый вердикт системы в соответствии с проверками

Доступно на тарифах Биорг.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"
},