osint-ru-companies
ASecurityOSINT по российским юридическим лицам на бесплатных официальных источниках ФНС. Строит граф связей между организациями (учредители, управляющие компании, общие директора, общие адреса), достаёт руководство и владельцев с их ИНН, поднимает бухгалтерскую отчётность за 5 лет (выручка, прибыль, активы, капитал) и накапливает всё в локальной базе, чтобы пересечения между разными проверками находились автоматически. Использовать, когда просят проверить контрагента, найти аффилированность, собрать д...
- 2 stars
- 0 votes
- 0 copies
- 2 views
- Added October 26, 2026
Works with
Security analysis
100/100Pro scans all 17 files and shows the line behind each finding
npx -y skills add visualklik/osint-ru-companies --agent claude-codeAre you the author of osint-ru-companies?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/visualklik-osint-ru-companies)---
name: osint-ru-companies
description: >
OSINT по российским юридическим лицам на бесплатных официальных источниках
ФНС. Строит граф связей между организациями (учредители, управляющие
компании, общие директора, общие адреса), достаёт руководство и владельцев с
их ИНН, поднимает бухгалтерскую отчётность за 5 лет (выручка, прибыль,
активы, капитал) и накапливает всё в локальной базе, чтобы пересечения между
разными проверками находились автоматически. Использовать, когда просят
проверить контрагента, найти аффилированность, собрать досье на компанию,
выявить бенефициаров, оценить финансовое состояние или нарисовать структуру
холдинга. Триггеры — «проверь контрагента», «кто владеет», «связи компании»,
«ИНН», «ЕГРЮЛ», «выписка», «бенефициары», «аффилированность», «выручка
компании», «должная осмотрительность», «due diligence по российской
компании».
---
# Корпоративная разведка по РФ
Работает на бесплатных официальных источниках — ФНС, Генпрокуратура, Роструд, ГИС ЖКХ, ЕИС.
Ключи API не нужны.
| Что нужно | Откуда | Скрипт |
|---|---|---|
| Руководитель, учредители с ИНН и долями, адрес, ОКВЭД, лицензии, филиалы, статус | `egrul.nalog.ru` — выписка из ЕГРЮЛ в PDF | `scripts/egrul.py` |
| Выручка, прибыль, активы, капитал, долги — формы 1–4 за 5 лет | `bo.nalog.gov.ru` — ГИР БО | `scripts/girbo.py` |
| Численность работников, налоговая задолженность, доходы/расходы, спецрежимы | массовые выгрузки открытых данных ФНС | `scripts/opendata.py` |
| Арбитражные дела, роли, оппоненты | `kad.arbitr.ru` | `scripts/kad.py` |
| Проверки, предостережения, профилактические визиты | ЕРКНМ, `proverki.gov.ru` | `scripts/erknm.py` |
| Фактический адрес работы, должности, штат | реестр деклараций СОУТ, Роструд | `scripts/rostrud.py` |
| Лицензии УК, дома в управлении с датами, передачи домов, телефоны | ГИС ЖКХ, `dom.gosuslugi.ru` | `scripts/gis_zhkh.py` |
| Дисквалифицированные лица | реестр ФНС, открытые данные | `scripts/opendata.py disq` |
| Дисквалифицированные руководители УК | ГИС ЖКХ | `scripts/gis_zhkh.py disq` |
| Госконтракты как поставщик, общие заказчики, реестр недобросовестных поставщиков | ЕИС, `zakupki.gov.ru` | `scripts/eis.py` |
| Компании человека (обратный поиск) | `rusprofile.ru`, `list-org.com` | `scripts/people.py` |
| Граф владения и контроля, накопление, пересечения | локальный SQLite | `scripts/crawl.py`, `scripts/report.py` |
## Требования
`python3` (только stdlib) и `pdftotext` из `poppler-utils`:
```bash
sudo apt install poppler-utils
```
Для картинки графа дополнительно `graphviz` (необязательно — есть вывод в mermaid).
## Рабочий цикл
Всё запускается из `scripts/`. База по умолчанию — `data/corp.db`, путь
переопределяется через `--db` или переменную `RU_CORP_DB`.
**1. Найти ИНН, если известно только название.** Возвращает и текущего
руководителя — часто этого хватает без выписки.
```bash
python3 scripts/egrul.py "название компании" --search-only
```
**2. Загрузить компанию и её владельцев в базу.** `--depth` — сколько хопов
владения пройти вверх по цепочке. `--case` помечает всё загруженное именем
расследования.
```bash
python3 scripts/crawl.py add 7721546864 --depth 2 --case имя_дела
```
Обход идёт вверх по корпоративной цепочке: юрлица-учредители и управляющие
организации ставятся в очередь автоматически. Очередь переживает перезапуск —
если упёрлись в `--limit`, продолжайте:
```bash
python3 scripts/crawl.py expand --limit 30 --case имя_дела
```
**3. Досье на одну компанию.**
```bash
python3 scripts/report.py dossier 7721546864
```
**4. Пересечения по всей накопленной базе** — общие физлица, общие адреса,
цепочки владения:
```bash
python3 scripts/crawl.py links --case имя_дела
```
**5. Граф.** `--format mermaid` удобно вставлять прямо в ответ; `dot`
рендерится в SVG через graphviz.
```bash
python3 scripts/report.py graph --case имя_дела --format mermaid
```
**6. Все компании человека** (в пределах накопленной базы):
```bash
python3 scripts/report.py person "Фамилия"
```
Финансы отдельно, без базы:
```bash
python3 scripts/girbo.py 7721546864
```
## Численность и налоговые данные
Массовые выгрузки ФНС качаются один раз целиком на всю страну, потом лежат в
базе и работают офлайн без лимитов. Численность — 94 МБ, около минуты на
индексацию, примерно 2 млн организаций.
```bash
python3 scripts/opendata.py load sshr2019
```
Наборы: `sshr2019` численность работников, `debtam` задолженность по налогам,
пеням и штрафам, `revexp` доходы и расходы по данным отчётности, `snr`
применяемые спецрежимы. Все сразу — `--all` (около 330 МБ).
```bash
python3 scripts/opendata.py show 2309085638
python3 scripts/opendata.py status
```
Данные попадают в досье автоматически, вместе с выручкой на сотрудника.
Покрытие неполное и это не ошибка: в наборе примерно 2 млн юрлиц из более чем
3 млн действующих. Организации под санкциями и связанные с ними из публикации
исключены — Сбербанк, Газпром, Роснефть в наборе отсутствуют, Магнит и МТС
присутствуют. Дата одна, последняя опубликованная (данные за 2025 год);
исторических файлов ФНС на странице набора не держит.
Численность относится к конкретному юрлицу, а не к группе. У холдинговой
компании это несколько десятков человек при том, что в группе их десятки
тысяч — операционный персонал сидит в дочерних юрлицах.
## Обратный поиск: человек → компании
```bash
python3 scripts/people.py person "ФАМИЛИЯ ИМЯ ОТЧЕСТВО" --inn 111111111111
python3 scripts/people.py shared
```
В реестрах ФНС обратного индекса нет и не будет, поэтому берём его у
агрегаторов. `--inn` обязателен: оба источника ключуют людей по личному ИНН, а
без него однофамильцев набираются десятки.
**rusprofile — основной.** Страница человека адресуется напрямую по шаблону
`/person/<фамилия-транслитом>-<инициалы>-<ИНН>`, например
`medvedev-sm-111111111111`. Никакого поиска, а значит и нечему упираться в
лимит. Отдаёт список компаний с ИНН, выручкой, адресом и — что особенно
ценно — **историю выходов из состава с датами**: «22.10.2021 лицо больше не
является учредителем такой-то».
**list-org — запасной.** Богаче по деталям (доли, телефоны), но ограничивает
частоту примерно после десяти запросов, а затем блокирует адрес совсем: сначала
отдаёт обычную страницу без блока «Найдено», потом перестаёт отвечать вообще.
Скрипт распознаёт оба состояния и говорит про лимит явно, а не выдаёт пустоту за
«связей нет». Вызывать точечно, через `--source list-org`.
`shared` показывает компании, общие для нескольких проверенных лиц, и отдельно —
найденные компании, которых ещё нет в базе; их стоит догрузить через
`crawl.py add`.
**Данные агрегаторов отстают от реестра** на месяцы и годы. Это лид, а не
истина: каждую компанию сверяйте с ЕГРЮЛ. Расхождение само по себе ценно —
оно показывает, что человек вышел из состава, и когда.
## Фактический адрес и штат (Роструд, реестр СОУТ)
Самый недооценённый источник в наборе. Декларации специальной оценки условий
труда публикуют **фактический адрес осуществления деятельности** и **перечень
должностей** с численностью по каждому рабочему месту.
```bash
python3 scripts/rostrud.py load --case имя_дела
python3 scripts/rostrud.py show 7721546864
python3 scripts/rostrud.py addresses
python3 scripts/rostrud.py profile
```
Зачем это нужно:
- **Юридический адрес из ЕГРЮЛ и место реальной работы совпадают далеко не
всегда.** Компания может числиться по одному адресу и годами работать по
другому, вместе с формально не связанными организациями. `addresses`
показывает и общие фактические адреса, и расхождения с ЕГРЮЛ.
- **Перечень должностей говорит, чем компания занимается на самом деле.**
Управляющая компания с двадцатью рабочими по обслуживанию зданий содержит
свою службу эксплуатации; компания с одним юристом и расчётным отделом отдала
работы подрядчику. `profile` считает это по каждой компании и делит на
«свой персонал» и «только офис».
ФИО в реестре не публикуются, только должности — это данные об организации, а
не о людях.
Сопоставление адресов идёт по ключу «улица + дом»: индекс, регион, город и
номер помещения отбрасываются, потому что один и тот же дом в реестрах пишут
десятком способов, вплоть до опечаток в индексе. Соседние дома при этом не
склеиваются.
Ссылка на источник: Реестр деклараций СОУТ, Роструд,
declaration.rostrud.gov.ru.
## ГИС ЖКХ: лицензии, дома, передачи, телефоны
```bash
python3 scripts/gis_zhkh.py load --case имя_дела --region <код региона> --history --deep
python3 scripts/gis_zhkh.py transfers --case имя_дела
python3 scripts/gis_zhkh.py contacts --case имя_дела
python3 scripts/gis_zhkh.py show 7721546864
```
Публичный REST API ГИС ЖКХ отвечает без ключа и капчи. Даёт то, чего нет ни в
одном другом бесплатном источнике:
- **лицензию УК** с телефоном и e-mail лицензиата и числом домов;
- **дома в управлении с датами включения и исключения** — отсюда видно, когда
дом ушёл от одной компании и пришёл к другой;
- **по любому дому — все лицензии, которыми он когда-либо покрывался.**
`transfers` находит передачи домов: исключение у одной УК и включение у другой в
пределах 120 дней. Передача пачки домов между компаниями — прямая операционная
связь с датами в госреестре. `--history` ищет по каждому дому все прежние
лицензии, `--deep` догружает дома найденных так компаний, чтобы у передач были
даты.
`contacts` сравнивает телефоны и e-mail из карточек организаций и лицензий:
общий номер, общий адрес почты и **общий блок городских номеров** — компании,
подключавшиеся вместе, получают соседние номера. Сразу же печатается фон по
всем лицензиатам региона: насколько часто блок и «зеркальные» номера вида
XX-YY-YY встречаются у посторонних компаний. Блок без фона — не признак.
Сводный реестр лицензий региона приходит целиком за несколько запросов (в регионе обычно
несколько сотен лицензий), поэтому фон считается бесплатно.
Эндпоинты и форматы запросов — в [references/sources.md](references/sources.md).
Сервер отвечает на неизвестное поле списком допустимых — так и были найдены
формы запросов.
## Реестр дисквалифицированных лиц
```bash
python3 scripts/opendata.py disq --case имя_дела
```
Около 8,4 тыс. записей, CSV ФНС, обновляется еженедельно. Личного ИНН в реестре
нет, поэтому сверка идёт по ФИО и делится на две силы: **ФИО и ИНН организации
совпали** — находка; **совпало только ФИО** — лид, надо сверить дату рождения.
Результат попадает в досье.
Второй реестр — **дисквалифицированные руководители УК** из ГИС ЖКХ (ст. 195 ЖК
РФ, около 1,5 тыс. записей):
```bash
python3 scripts/gis_zhkh.py disq --case имя_дела # --load перекачивает реестр
```
В отличие от реестра ФНС здесь есть ИНН организации и хранятся исключённые
записи, поэтому видны и прошлые дисквалификации. Три силы совпадения: `org` —
дисквалифицирован кто-то из руководителей этой самой компании (по ИНН), `strong`
— ФИО и организация совпали с человеком из базы, `name` — совпало только ФИО.
## Госзакупки (ЕИС)
```bash
python3 scripts/eis.py load --case имя_дела --fz223 # контракты как поставщик + РНП
python3 scripts/eis.py show 7721546864
python3 scripts/crawl.py links --case имя_дела # раздел «Общие заказчики»
```
Контракты, где компания была **поставщиком**, по 44-ФЗ (и 223-ФЗ с `--fz223`):
заказчик, цена, даты, предмет. Плюс **реестр недобросовестных поставщиков**
(РНП) — отметка попадает в досье рядом с дисквалификациями.
`crawl.py links` показывает заказчиков, покупающих у нескольких компаний дела.
**Для УК это часто шум:** КУМИ и администрации платят всем управляющим
компаниям за муниципальные квартиры в их домах. Связью общий заказчик становится,
когда это не собственник жилья, а покупатель услуг — больница, школа, ведомство —
и компании сменяют друг друга на одних и тех же закупках.
Сайт подписан российским корневым сертификатом Минцифры. Модуль скачивает его с
`gu-st.ru`, **сверяет SHA-256 отпечаток с зашитым в коде** и использует только в
своём SSL-контексте. Системное хранилище сертификатов не меняется.
Фильтр поставщика в поиске — только `supplierTitle=<ИНН>`. Незнакомые параметры
сервер молча отбрасывает и отдаёт все 42 млн контрактов.
## Проверки (ЕРКНМ)
Единый реестр контрольных (надзорных) мероприятий Генпрокуратуры: проверки,
предостережения, профилактические визиты. Для управляющих компаний ЖКХ это
самый показательный публичный след — реестры ФНС говорят, кто владеет
компанией, а этот говорит, как она себя ведёт.
```bash
python3 scripts/erknm.py available
python3 scripts/erknm.py load --year 2026 --case имя_дела
python3 scripts/erknm.py show 7721546864
```
По умолчанию фильтр — все компании из базы; `--case` сужает до одного дела,
`--inn` задаёт список вручную. Найденное само попадает в досье.
Про объём: выгрузки помесячные и покрывают всю страну, один месяц — около
300 МБ, доступны с 2021 года. Полная история это порядка 20 ГБ, поэтому
грузите нужные годы, а не всё подряд. Архивы удаляются после разбора, если не
указан `--keep-zip`. Сервер рвёт соединение на больших файлах — загрузка
докачивается с места обрыва сама, до восьми попыток.
Флаг `--erp` переключает на старый Единый реестр проверок (294-ФЗ, 131-ФЗ,
184-ФЗ) — он нужен для мероприятий до вступления в силу 248-ФЗ.
Почему выгрузки, а не поиск: форма поиска на `proverki.gov.ru` защищена капчей,
её эндпоинт `/public/api/inspections/search` без токена капчи отвечает 400.
Открытые данные — это официальный машиночитаемый канал того же реестра,
опубликованный оператором именно для автоматической обработки, и капчи там нет.
Условия использования требуют сохранять ссылку на источник: ФГИС ЕРКНМ,
Генеральная прокуратура РФ, proverki.gov.ru.
## Арбитраж
```bash
python3 scripts/kad.py fetch 7721546864 --pages 4
python3 scripts/kad.py show 7721546864
```
Дела складываются в базу вместе со всеми сторонами. Дальше `crawl.py links`
показывает раздел «Общие арбитражные дела»: если две проверяемые компании
встречаются в одном процессе, между ними есть хозяйственная связь, которой нет
ни в одном реестре. Устойчивая пара истец-ответчик — сильный признак.
**kad.arbitr.ru банит адреса по частоте запросов**, и в первую очередь IP
дата-центров, VPN и общих выходных узлов. При блокировке сервис отдаёт HTTP 451
с HTML-страницей; скрипт распознаёт это и говорит прямо, а не выдаёт за
«дел нет». Запускать нужно с обычного домашнего или офисного подключения,
держать `--pause` не меньше 2 секунд и не гнать десятки компаний подряд.
**С 2026 года поиск закрыт антибот-защитой.** Главная страница открывается, а
`/Kad/SearchInstances` отвечает 451 и с домашнего адреса: API требует токен,
который вычисляет JavaScript сайта в браузере. Скрипт различает этот случай и
бан по адресу. Обходить защиту скил не будет — дела ищутся вручную на сайте.
Найденное вручную загружается в базу: на kad.arbitr.ru найти дела по ИНН,
выделить таблицу результатов, скопировать в файл и выполнить
```bash
python3 scripts/kad.py paste 7721546864 --file kad.txt
```
В скопированном тексте теряется граница между истцами и ответчиками, поэтому
все стороны пишутся как «участник». Компания, по чьему ИНН искали, привязывается
к каждому делу — даже когда в строке она под старым названием или скрыта среди
«ещё N участников». Остальные стороны получают ИНН, если их название совпало с
организацией из базы. После загрузки `crawl.py links` находит общие дела.
## Как вести расследование
1. Начать с ИНН цели. Если его нет — найти поиском по названию, сверить регион
и руководителя, чтобы не взять однофамильца-двойника.
2. Загрузить с `--depth 2`. Больше двух хопов почти всегда даёт шум, а нагрузка
на источник растёт быстро.
3. Прочитать досье. Смотреть на: несоответствие масштаба выручки уставному
капиталу, отрицательный капитал, смену директора незадолго до сделки,
статус реорганизации или ликвидации, массовость адреса.
4. Прогнать `links`. Общий директор или общий адрес между формально
независимыми компаниями — самый частый и самый твёрдый признак связи.
5. Догрузить арбитраж по ключевым компаниям и снова прогнать `links`.
Совместные дела вскрывают хозяйственные связи, которых нет в реестрах.
6. Расширить охват: догрузить всех юрлиц-совладельцев, которые видны в графе
как «(не загружено)», и повторить `links`. С каждой новой компанией база
находит больше пересечений.
## Что этот скил не умеет
- **В самих реестрах ФНС обратного поиска «человек → компании» нет.** Поиск по
ФИО на `egrul.nalog.ru` находит только ИП, поиск по личному ИНН не даёт
ничего. Обходной путь — `people.py`, см. ниже: он берёт индекс у агрегаторов,
но их данные надо перепроверять по ЕГРЮЛ.
- **Состав акционеров АО и ПАО в ЕГРЮЛ не раскрывается** — там пусто по закону,
не из-за ошибки парсера. Смотреть раскрытие эмитента и реестродержателя.
- **Банки и страховщики не сдают отчётность в ГИР БО** — они отчитываются в ЦБ.
Пустой ответ по такой компании корректен.
- **Численность работников — только по юрлицу и только за последний
опубликованный год**, без разбивки по подразделениям. Это агрегат из
налоговой отчётности, само по себе оно не даёт ни одной фамилии.
- **Поимённого состава сотрудников подключённые источники не содержат.**
ЕГРЮЛ даёт должностных лиц, ГИР БО — цифры, выгрузки ФНС — агрегаты,
kad.arbitr — стороны дел. Фамилии рядовых сотрудников берутся из закупок,
материалов судебных дел и публикаций самой компании — эти источники нужно
подключать отдельно, см. «Правовая рамка».
- ФССП и Федресурс не подключены. `references/sources.md` описывает,
что там есть и чем это достаётся.
## Ограничения источников
Оба эндпоинта не требуют авторизации, но лимитируют частоту. `crawl.py` держит
паузу 2 с между компаниями, `egrul.py` — 1.5 с между шагами (меняется через
`EGRUL_PAUSE`). Если `egrul.nalog.ru` начал требовать капчу, скрипт скажет об
этом явно — надо снизить темп, а не долбить повторно. Всё уже загруженное
лежит в базе и повторных запросов не требует.
## Правовая рамка
ЕГРЮЛ, ГИР БО, картотека арбитражных дел и реестр закупок — официально
открытые данные, работа с ними ограничений не имеет. Руководители, учредители
и бенефициары публикуются в ЕГРЮЛ по закону, поэтому в досье они попадают
законно.
ФИО сотрудников собирать можно из источников, где человек назван в
профессиональном качестве и публикация исходит от самой организации или от
государственного органа. Это обычная деловая разведка, отдельного разрешения
она не требует:
- контактные лица в закупочной документации на zakupki.gov.ru
- представители сторон и подписанты в материалах арбитражных дел
- разделы «команда» и «руководство» на сайте компании, пресс-релизы
- отраслевые конференции, публикации, реестры профессиональных объединений
- лицензионные и разрешительные реестры, где указан ответственный специалист
Что за рамками скила: домашние адреса, личные телефоны, семья, частные
аккаунты и любое сведение данных о конкретном человеке в профиль, не связанный
с его рабочей ролью. Это уже не корпоративная разведка, и такие задачи скил не
обслуживает.
Files in this skill
- CONTRIBUTING.md
- SKILL.md
- references/schema.md
- references/sources.md
- scripts/crawl.py
- scripts/db.py
- scripts/egrul.py
- scripts/eis.py
- scripts/erknm.py
- scripts/girbo.py
- scripts/gis_zhkh.py
- scripts/kad.py
- scripts/opendata.py
- scripts/people.py
- scripts/report.py
- scripts/rostrud.py
- tests/smoke.py
Attribution
Comments
Loading comments…
Newsletter
Get the weekly list of safe new skills, and the ones we pulled.