Проверка контрагента: 20 минут в браузере против 3 секунд по API
Пока бухгалтер вбивает ИНН в четыре разных сайта, сделка ждёт. Разбираем, что именно проверяется, какие признаки риска ловятся автоматически и во что обходится ручная сверка.
«ИНН есть, сейчас проверю» — и дальше двадцать минут, которых никто не считает. Сайт налоговой, капча, карточка организации. Отдельная вкладка с сайтом ЦБ, чтобы понять, что за банк стоит за БИК из платёжки. Поиск SWIFT-кода в выдаче, потому что платёж валютный, а в инвойсе код напечатан с опечаткой. И в конце — выписка в PDF, её просит юрист, чтобы положить в досье.
Двадцать минут — это когда всё нашлось с первого раза и никто не отвлёк.
Пока идут эти двадцать минут, сделка стоит. Менеджер уже пообещал клиенту счёт сегодня, юрист ждёт выписку, чтобы завизировать договор, а бухгалтерия не проводит платёж без сверенных реквизитов. Сорок новых контрагентов в месяц — это тринадцать рабочих часов, потраченных на копирование цифр из чужих окон в своё.
И самое неприятное: проверка одноразовая. Карточку смотрели в марте, счёт оплачивают в июле. За это время компания успела попасть в стадию ликвидации, сменить директора и переехать на адрес, по которому зарегистрировано ещё двести юрлиц. Никто не смотрит второй раз — потому что это ещё двадцать минут.
Где именно течёт
Проблема не в том, что данные закрыты. Они открыты, и любой человек может их найти. Проблема в том, что данные лежат в четырёх разных местах, каждое со своей формой поиска, своей капчей и своим форматом выдачи. Сборка происходит в голове бухгалтера и нигде не сохраняется.
Договор подписали с компанией в стадии ликвидации
- Что происходит
- Карточку смотрели весной, платёж проводят летом. Статус за это время сменился, но в CRM лежит копия трёхмесячной давности.
- Во что обходится
- Аванс уходит в конкурсную массу и возвращается годами. Вычет по НДС снимают, к нему добавляются пени — это уже не про репутацию, а про доначисление.
- Чем закрывается
- В карточке ЕГРЮЛ есть поля active и status. Один запрос по ИНН перед каждым платежом — и решение принимается на свежих данных, а не на скриншоте из марта.
Реквизиты пришли письмом, и их никто не сверил
- Что происходит
- «Мы сменили банк, вот новый счёт» — письмо от бухгалтерии контрагента. БИК новый, счёт новый, менеджер копирует их в платёжку.
- Во что обходится
- Классическая схема подмены реквизитов. Возврат ошибочного платежа идёт через банк неделями, а если счёт принадлежит третьему лицу — не идёт вообще.
- Чем закрывается
- БИК из платёжки прогоняется по справочнику ЦБ: сходится ли название банка с тем, что написано в письме, действует ли он, нет ли ограничений. Контрольный ключ расчётного счёта считается локально за десять строк кода.
Валютный платёж завис на комплаенсе
- Что происходит
- В инвойсе SWIFT-код, в договоре — получатель из другой юрисдикции. На позициях 5–6 кода стоит страна, которая со страной получателя не совпала.
- Во что обходится
- Платёж возвращают через несколько дней, комиссия за возврат остаётся у банка, курс за это время уезжает. Поставка сдвигается на неделю.
- Чем закрывается
- Справочник SWIFT/BIC отдаёт по коду карточку организации: страну, город, юридическое наименование и статус. Сравнение двух строк в коде закрывает вопрос до того, как платёж уйдёт.
Заметьте, во всех трёх случаях данные для проверки существовали и были доступны. Просто никто не пошёл смотреть — потому что каждый поход стоит минут, а поводов ходить много.
Сколько это стоит
Считаем честно и вслух проговариваем допущения. Специалист бэкофиса с окладом 80 000 ₽ обходится компании примерно в 104 000 ₽ в месяц с учётом страховых взносов. При 165 рабочих часах это около 630 ₽ в час, то есть примерно 10 ₽ за минуту. Возьмите свои цифры — арифметика не изменится.
| Шаг проверки | Руками | По API |
|---|---|---|
| Найти компанию по ИНН, пройти капчу, открыть карточку | 5 минут | 1 запрос к ЕГРЮЛ |
| Прочитать статус, адрес, капитал, руководителя, ОКВЭД | 3 минуты | поля того же ответа |
| Понять, что за банк стоит за БИК, и совпадает ли он с письмом | 3 минуты | 1 запрос к справочнику БИК |
| Проверить контрольный ключ расчётного счёта | обычно не делают вовсе | локальный расчёт, бесплатно |
| Найти и сверить SWIFT получателя | 5 минут | 1 запрос к справочнику SWIFT/BIC |
| Скачать официальную выписку в PDF и положить в досье | 4 минуты | 1 запрос, файл сразу в хранилище |
| Итого на одного контрагента | около 20 минут ≈ 200 ₽ | 3 запроса, секунды |
Три секунды в заголовке — не фигура речи, а сумма трёх ответов. Самый долгий из них —
карточка ЕГРЮЛ, и она сама сообщает, сколько потратила: в ответе есть поле
elapsedMs. Справочники БИК и SWIFT/BIC отвечают быстрее. Дольше всех работает
расширенный режим — ему нужно разобрать официальную выписку, и об этом честно написано
в документации.
Но экономия времени здесь не главный выигрыш. Главный — в том, что проверку, которая стоит секунды, начинают делать каждый раз: при первом платеже, при смене реквизитов, при ежемесячной переоценке базы поставщиков. Двадцатиминутную проверку делают один раз в жизни договора и потом надеются.
Что проверять и в каком порядке
Порядок важен: каждый следующий шаг дороже предыдущего, и дешёвые проверки должны отсекать мусор до того, как вы полезете в платные.
Шаг 0. Формат идентификатора. ИНН — 10 цифр у организаций и 12 у ИП, ОГРН — 13, ОГРНИП — 15. Всё, что не подходит под эти длины, сервис ЕГРЮЛ отбрасывает локально и отвечает 400 ещё до обращения к реестру. Опечатка в ИНН не стоит ничего.
Шаг 1. Карточка организации. Один запрос по ИНН или ОГРН — и в ответе приезжает всё, ради чего открывали браузер: наименование полное и сокращённое, КПП, статус, даты регистрации, юридический адрес, регион, руководитель с должностью и ИНН, основной и дополнительные ОКВЭД, уставный капитал, налоговые режимы, категория МСП. Из этих полей собирается светофор, и собирается он без юриста.
| Что в ответе | Что это значит | Решение |
|---|---|---|
found: false |
По этому идентификатору в реестре ничего нет | Стоп. Либо опечатка в ИНН, либо контрагента не существует |
active: false, status со словом «ликвидац» или «прекращен» |
Юрлицо прекратило деятельность или в процессе этого | Стоп. Платить и подписывать нечему |
massAddress: true |
По юридическому адресу зарегистрировано много других организаций | Жёлтый. Косвенный признак: сам по себе не приговор (бывают бизнес-центры), но в паре с другими — повод посмотреть внимательнее |
authorizedCapital: 10000 при свежей registrationDate |
Минимальный уставный капитал у только что созданной компании | Жёлтый. Нормально для стартапа, тревожно для поставщика с авансом в несколько миллионов |
Непустой publications |
О компании публиковались сообщения в «Вестнике государственной регистрации» | Жёлтый. В поле url лежит ссылка — открыть и прочитать, о чём публикация |
primaryOkved не бьётся с предметом договора |
Компания заявила другой основной вид деятельности | Жёлтый. Вопрос не запретительный, но его задают на налоговой проверке |
Непустой warnings |
Сервис не смог надёжно сопоставить часть данных | Прочитать текст предупреждения и не считать эти поля достоверными |
Шаг 2. Расширенный режим — только когда цена вопроса высока. Параметр
extended=true добирает из официальной выписки то, чего нет в обычной
карточке: для юрлиц — состав участников и их доли (номинал и проценты), для ИП —
адрес электронной почты и пол, если они в выписке раскрыты. Это отдельный, более дорогой
тариф со своими лимитами, и ответ формируется дольше — выписку нужно разобрать. Включайте
его там, где важно понять, кто на самом деле владеет контрагентом, а не на каждой мелкой
поставке.
Шаг 3. Банковские реквизиты. БИК из платёжного поручения идёт в справочник БИК
Банка России — тот самый ED807, который ЦБ обновляет ежедневно. В ответе: наименование
банка (сравните с тем, что написано в письме контрагента), корреспондентский счёт, город,
регистрационный номер, все SWIFT-коды банка и, что важнее всего, список ограничений.
Код URRS в restrictions означает отзыв лицензии,
LWRS — ликвидацию, MRTS — мораторий. Пустой список — ограничений нет.
Статус счёта ACAC в блоке accounts — счёт действующий.
Дальше — контрольный ключ расчётного счёта самого контрагента. Это чистая арифметика по алгоритму ЦБ: последние три цифры БИК приклеиваются к двадцатизначному счёту, каждая цифра умножается на свой вес из ряда 7-1-3, сумма должна делиться на десять. Никакого внешнего сервиса для этого не нужно — вам нужен только настоящий БИК, а его как раз и подтверждает справочник. Опечатка в счёте ловится до того, как платёж уйдёт в банк.
Шаг 4. Международный платёж. Здесь два вопроса, и оба закрываются справочником
SWIFT/BIC. Первый: правильно ли вообще записан код — на это отвечает локальный разбор по
ISO-9362, который раскладывает BIC на код организации, страну, локацию и филиал. Второй,
главный: country в карточке организации и страна получателя из договора
должны совпасть. Не совпали — платёж почти наверняка вернётся с комплаенса.
Там же стоит посмотреть на entityStatus. Значение INACTIVE
означает, что юрлицо прекратило существование — присоединилось, слилось, ликвидировалось.
BIC при этом из справочника никуда не делся, а в полях successorLei и
successorName может лежать правопреемник. Деньги, отправленные несуществующей
компании, вернутся не сразу и не сами.
Шаг 5. Выписка в досье. Официальная выписка из реестра выгружается отдельным запросом и приходит готовым PDF. Её кладут в дело — это тот документ, который юрист и налоговая ожидают увидеть в подтверждение того, что проверка была.
Код: три запроса вместо четырёх вкладок
Все примеры ниже работают прямо сейчас, без регистрации: в них стоит публичный демо-ключ. Он отдаёт моки — правдоподобные, но сгенерированные данные. Формат ответа настоящий, значения нет; ответ на один и тот же запрос всегда одинаковый, поэтому на моках удобно писать тесты. Настоящие данные приходят с личным ключом.
curl -H "Authorization: Bearer ak_sandbox_demo_mockdata_v1" \
"https://atlorium.com/api/egrul/7707083893"
# С составом участников и их долями (отдельный тариф, ответ дольше):
curl -H "Authorization: Bearer ak_sandbox_demo_mockdata_v1" \
"https://atlorium.com/api/egrul/7707083893?extended=true"
import requests
KEY = "ak_sandbox_demo_mockdata_v1" # демо-ключ: отдаёт моки
def check_counterparty(inn: str) -> list[str]:
"""Возвращает список стоп-факторов. Пустой список — можно работать."""
resp = requests.get(
f"https://atlorium.com/api/egrul/{inn}",
headers={"Authorization": f"Bearer {KEY}"},
timeout=15,
)
if resp.status_code == 404:
return ["В реестре нет организации с таким ИНН"]
if resp.status_code == 503:
# Источник недоступен. Деньги за такой запрос не списываются,
# решение по контрагенту откладываем, а не принимаем вслепую.
raise RuntimeError("Реестр недоступен, повторите позже")
resp.raise_for_status()
card = resp.json()
stop = []
if not card["active"]:
stop.append(f"Статус: {card['status']}")
if card.get("massAddress"):
stop.append("Массовый адрес регистрации")
if (card.get("authorizedCapital") or 0) <= 10_000:
stop.append("Минимальный уставный капитал")
if card.get("publications"):
stop.append("Есть публикации в «Вестнике госрегистрации»")
return stop
using System.Net.Http.Json;
var http = new HttpClient();
http.DefaultRequestHeaders.Add("Authorization", "Bearer ak_sandbox_demo_mockdata_v1");
// Карточка организации: found, active, status, address, managers, authorizedCapital…
var card = await http.GetFromJsonAsync<JsonElement>(
"https://atlorium.com/api/egrul/7707083893");
bool active = card.GetProperty("active").GetBoolean();
bool massAddress = card.GetProperty("massAddress").GetBoolean();
if (!active)
throw new InvalidOperationException("Контрагент не действует: " + card.GetProperty("status"));
{
"found": true,
"kind": "LegalEntity",
"inn": "7707083893",
"ogrn": "1027700132195",
"kpp": "770701001",
"fullName": "ПУБЛИЧНОЕ АКЦИОНЕРНОЕ ОБЩЕСТВО «СБЕРБАНК РОССИИ»",
"shortName": "ПАО СБЕРБАНК",
"status": "Действующая организация",
"active": true,
"registrationDate": "2002-08-16",
"dataDate": "2026-07-14",
"address": "117312, Г.МОСКВА, УЛ. ВАВИЛОВА, Д.19",
"regionName": "Г.МОСКВА",
"primaryOkved": { "code": "64.19", "name": "Денежное посредничество прочее" },
"additionalOkveds": [],
"authorizedCapital": 67760844000,
"capitalType": "УСТАВНЫЙ КАПИТАЛ",
"managers": [
{ "fullName": "ГРЕФ ГЕРМАН ОСКАРОВИЧ", "position": "ПРЕЗИДЕНТ, ПРЕДСЕДАТЕЛЬ ПРАВЛЕНИЯ" }
],
"founders": [],
"specialTaxRegimes": [],
"smeCategory": null,
"publications": [],
"massAddress": false,
"officialExcerptAvailable": true,
"warnings": [],
"elapsedMs": 312
}
Тот же вызов на шести языках (Python, TypeScript, Go, Java, C#, PHP) — в репозитории egrul-api-client. Примеры запускаются сразу: ключ в них уже стоит демонстрационный.
Поле officialExcerptAvailable говорит, что по этому субъекту доступна
официальная выписка. Забрать её — один запрос, ответ приходит файлом:
curl -H "Authorization: Bearer ak_sandbox_demo_mockdata_v1" \
-o excerpt.pdf \
"https://atlorium.com/api/egrul/7707083893/excerpt"
Тот же вызов на шести языках (Python, TypeScript, Go, Java, C#, PHP) — в репозитории egrul-api-client. Примеры запускаются сразу: ключ в них уже стоит демонстрационный.
Теперь реквизиты платежа. Справочник БИК подтверждает банк, локальная арифметика — сам счёт. Второе не требует ни одного запроса наружу.
curl -H "Authorization: Bearer ak_sandbox_demo_mockdata_v1" \
"https://atlorium.com/api/cbr/044525225"
import requests
KEY = "ak_sandbox_demo_mockdata_v1"
WEIGHTS = [7, 1, 3, 7, 1, 3, 7, 1, 3, 7, 1, 3, 7, 1, 3, 7, 1, 3, 7, 1, 3, 7, 1]
def account_key_valid(bik: str, account: str) -> bool:
"""Контрольный ключ расчётного счёта по алгоритму ЦБ. Локально, без запросов."""
if len(bik) != 9 or len(account) != 20:
return False
# Для расчётного счёта берутся последние три цифры БИК,
# для корсчёта (счёт начинается на 301) — «0» и 5-6 цифры БИК.
prefix = "0" + bik[4:6] if account.startswith("301") else bik[6:9]
digits = prefix + account
total = sum(w * int(d) % 10 for w, d in zip(WEIGHTS, digits))
return total % 10 == 0
def check_payment_details(bik: str, account: str) -> list[str]:
problems = []
if not account_key_valid(bik, account):
problems.append("Контрольный ключ счёта не сходится — опечатка в реквизитах")
bank = requests.get(
f"https://atlorium.com/api/cbr/{bik}",
headers={"Authorization": f"Bearer {KEY}"},
timeout=10,
).json()
# URRS — отзыв лицензии, LWRS — ликвидация, MRTS — мораторий.
for r in bank["restrictions"]:
problems.append(f"Ограничение банка: {r['code']} от {r['date']}")
print("Банк по справочнику ЦБ:", bank["name"])
print("Корсчёт:", bank["corrAccount"])
return problems
{
"bik": "044525225",
"name": "ПАО СБЕРБАНК",
"englishName": "SBERBANK",
"corrAccount": "30101810400000000225",
"countryCode": "RU",
"regionCode": "45",
"locality": "Москва",
"registrationNumber": "1481",
"uid": "4500000000225",
"dateIn": "2015-11-30",
"swift": "SABRRUMM",
"swiftCodes": ["SABRRUMM"],
"accounts": [
{
"account": "30101810400000000225",
"accountType": "CRSA",
"controlKey": "5",
"cbrBic": "044525000",
"status": "ACAC",
"restrictions": []
}
],
"restrictions": [],
"participantType": "00",
"status": "PSAC"
}
Тот же вызов на шести языках (Python, TypeScript, Go, Java, C#, PHP) — в репозитории cbr-bik-api-client. Примеры запускаются сразу: ключ в них уже стоит демонстрационный.
И последний шаг — валютный платёж. Здесь важна одна строчка сравнения: страна из BIC против страны получателя.
curl -H "Authorization: Bearer ak_sandbox_demo_mockdata_v1" \
"https://atlorium.com/api/swift/DEUTDEFF"
# Только разбор формата по ISO-9362, без обращения к справочнику:
curl -H "Authorization: Bearer ak_sandbox_demo_mockdata_v1" \
"https://atlorium.com/api/swift/validate/DEUTDEFFXXX"
import requests
KEY = "ak_sandbox_demo_mockdata_v1"
def check_swift(bic: str, expected_country: str) -> list[str]:
"""expected_country — страна получателя из договора, ISO-3166 alpha-2."""
org = requests.get(
f"https://atlorium.com/api/swift/{bic}",
headers={"Authorization": f"Bearer {KEY}"},
timeout=10,
).json()
problems = []
# Позиции 5-6 самого кода — страна. Она же лежит в карточке организации.
if org["country"] != expected_country:
problems.append(
f"Страна получателя {expected_country}, а BIC зарегистрирован в {org['country']}"
)
if org["entityStatus"] != "ACTIVE":
successor = org.get("successorName") or "не указан"
problems.append(f"Организация не действует, правопреемник: {successor}")
# LAPSED — запись давно не подтверждалась, данные могли устареть.
if org["registrationStatus"] != "ISSUED":
problems.append(f"Статус записи: {org['registrationStatus']}")
return problems
{
"bic": "DEUTDEFF",
"lei": "7LTWFZYICNSX8D621K86",
"name": "DEUTSCHE BANK AKTIENGESELLSCHAFT",
"otherNames": [],
"country": "DE",
"jurisdiction": "DE",
"entityCategory": "GENERAL",
"city": "Frankfurt am Main",
"postalCode": "60329",
"address": "Taunusanlage 12",
"registrationAuthorityId": "RA000242",
"registrationId": "HRB 30000",
"entityStatus": "ACTIVE",
"registrationStatus": "ISSUED",
"corroborationLevel": "FULLY_CORROBORATED",
"lastUpdate": "2026-06-02T00:00:00+00:00",
"nextRenewalDate": "2027-04-28T00:00:00+00:00",
"legalEvents": [],
"allBics": ["DEUTDEFF", "DEUTDEFFXXX"]
}
Тот же вызов на шести языках (Python, TypeScript, Go, Java, C#, PHP) — в репозитории swift-bic-api-client. Примеры запускаются сразу: ключ в них уже стоит демонстрационный.
Чего это не умеет
Дальше — про границы, и это самая важная часть статьи.
У наших данных нет юридической силы, и полноту госреестров мы не гарантируем. Мы отдаём то, что отдал официальный источник, в том виде, в каком он это отдал. Если в реестре сведения устарели или их там нет, у нас их тоже не будет. Официальная выписка PDF приходит из реестра как есть, и её юридический статус определяется не нами.
Карточка — это снимок, а не подписка на изменения. Сервис не присылает уведомление, когда контрагент сменил директора или ушёл в ликвидацию. Свежесть данных — ваше решение: хотите знать вовремя — перепроверяйте базу поставщиков по расписанию. Ровно за этим сюда и идут: перепроверка, которая стоит секунды, помещается в ночную задачу, а двадцатиминутная — нет.
Мы не считаем «индекс благонадёжности». В ответе нет балла риска, потому что честного балла не бывает: массовый адрес у компании в деловом центре и массовый адрес у конторы с уставным капиталом в десять тысяч — это разные вещи, и взвешивать их должны вы, зная свою сделку. Мы отдаём факты, правила остаются вашими.
Судов, банкротств и залогов в карточке нет. Арбитражные дела, исполнительные производства и реестр залогов живут в других источниках. Проверка по ЕГРЮЛ — необходимый минимум должной осмотрительности, но не весь её объём.
Расширенный режим отдаёт не всё и не всегда. Состав участников раскрывается в
реестре не для каждой организации: у банков и акционерных обществ его там может просто не
быть. Если данных нет, список founders придёт пустым, а в warnings
появится пояснение — вместо того чтобы придумать значение.
Контрольный ключ счёта проверяет арифметику, а не владельца. Если ключ сошёлся, это значит, что в номере счёта нет опечатки и он согласован с БИК. Кому принадлежит счёт и вправе ли контрагент им распоряжаться — из этой проверки не следует.
Частые вопросы
Частые вопросы
Как проверить контрагента по ИНН автоматически?
Один GET-запрос к /api/egrul с ИНН, ОГРН или ОГРНИП возвращает карточку организации: наименование, статус, юридический адрес, руководителя, ОКВЭД, уставный капитал, налоговые режимы и категорию МСП. Из полей active, status, massAddress и authorizedCapital собираются собственные правила отсечения — код принимает решение сам, без участия человека.
Чем это отличается от бесплатной проверки на сайте налоговой?
Данными — ничем: источник тот же государственный реестр. Разница в способе доступа: сайт рассчитан на человека с браузером и капчей, API — на систему. Проверку по API можно встроить в форму создания контрагента, в согласование платежа и в ночную перепроверку всей базы поставщиков, чего в браузере руками никто делать не станет.
Что показывает расширенный режим extended=true?
Он добирает из официальной выписки то, чего нет в обычной карточке: для юридических лиц — состав участников и размеры их долей, для ИП — адрес электронной почты и пол, если они в выписке раскрыты. Это отдельный тариф со своими лимитами, и ответ формируется дольше. Если состав участников в реестре не раскрыт, список придёт пустым.
Можно ли получить официальную выписку из ЕГРЮЛ в PDF через API?
Да, отдельным запросом к /api/egrul/{идентификатор}/excerpt — в ответ приходит PDF-файл. Поле officialExcerptAvailable в карточке заранее говорит, доступна ли выписка по этому субъекту. Если выписки нет, запрос отвечает 404 и не тарифицируется.
Как проверить банковские реквизиты контрагента перед платежом?
БИК проверяется по справочнику Банка России: /api/cbr/{бик} возвращает наименование банка, корреспондентский счёт и список ограничений — код URRS означает отзыв лицензии, LWRS — ликвидацию. Сверьте название банка с тем, что указал контрагент. Контрольный ключ расчётного счёта считается локально по алгоритму ЦБ, для этого нужен только подтверждённый БИК.
Заменяет ли автоматическая проверка должную осмотрительность?
Нет. Мы отдаём сведения из официальных источников в том виде, в каком их отдал источник, и не гарантируем ни их полноты, ни юридической силы. Арбитражных дел, банкротств и залогов в ответе нет. Автоматическая проверка закрывает необходимый минимум и делает его повторяемым, но окончательное решение по контрагенту остаётся за вами.
Сервисы из этой статьи
Карточка организации по ИНН/ОГРН: реквизиты, статус, руководитель, ОКВЭД, выписка PDF
Всё из обычного плюс данные из выписки: участники и доли (ЮЛ), e-mail и пол (ИП)
Реквизиты банков по БИК из справочника ЦБ РФ: корсчёт, регион, SWIFT
Организация по SWIFT/BIC и поиск по названию: LEI, страна, адрес, статус
Попробовать прямо сейчас — без регистрации
Демо-ключ ak_sandbox_demo_mockdata_v1 — публичный и общий для всех.
С ним API отвечает моками: данные правдоподобные, но сгенерированные,
и они не меняются от запроса к запросу — на них удобно писать тесты.
Настоящие данные приходят с личным ключом.
curl -H "Authorization: Bearer ak_sandbox_demo_mockdata_v1" \
https://atlorium.com/openapi/egrul_ru.json