Skip to content
Back to skills

osint-ru-companies

ASecurity

OSINT по российским юридическим лицам на бесплатных официальных источниках ФНС. Строит граф связей между организациями (учредители, управляющие компании, общие директора, общие адреса), достаёт руководство и владельцев с их ИНН, поднимает бухгалтерскую отчётность за 5 лет (выручка, прибыль, активы, капитал) и накапливает всё в локальной базе, чтобы пересечения между разными проверками находились автоматически. Использовать, когда просят проверить контрагента, найти аффилированность, собрать д...

  • 2 stars
  • 0 votes
  • 0 copies
  • 2 views
  • Added October 26, 2026
developmentjavascriptpythongojavabashsqlapi

Works with

  • api

Security analysis

A100/100

Pro scans all 17 files and shows the line behind each finding

Scanned October 26, 2026

npx -y skills add visualklik/osint-ru-companies --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of osint-ru-companies?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for osint-ru-companies
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/visualklik-osint-ru-companies/badge)](https://www.skillsdirectory.com/skills/visualklik-osint-ru-companies)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
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.md5.1 KB
  • SKILL.md30.7 KB
  • references/schema.md11 KB
  • references/sources.md28.8 KB
  • scripts/crawl.py12.3 KB
  • scripts/db.py15.5 KB
  • scripts/egrul.py15.8 KB
  • scripts/eis.py11.5 KB
  • scripts/erknm.py11.4 KB
  • scripts/girbo.py7.1 KB
  • scripts/gis_zhkh.py25.1 KB
  • scripts/kad.py13.7 KB
  • scripts/opendata.py14.6 KB
  • scripts/people.py12.4 KB
  • scripts/report.py19.4 KB
  • scripts/rostrud.py10.6 KB
  • tests/smoke.py21.2 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.