Перейти к основному содержимому

Единый реестр субъектов МСП — публичный портал (rmsp.nalog.ru)

ПризнакЗначение
Уровень и охватФедеральный; интерактивное представление сведений о субъектах МСП — ЮЛ и ИП — и агрегированной статистики реестра
Тип доступаHTML-витрина; браузерные POST-обработчики JSON поиска и статистики; POST-выгрузки XLSX
Основные форматыHTML text/html;charset=utf-8; JSON application/json;charset=UTF-8; XLSX application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
ОператорФНС России
Режим доступаПубличный: тестовые HTTP-запросы без авторизации получили 200; сервер выдаёт cookie JSESSIONID

Коротко: rmsp.nalog.ru — официальная интерактивная витрина того же реестра, который ФНС публикует файловым набором 7707329152-rsmp. Витрина удобна для единичного или фильтрованного поиска, выбора исторической даты и статистики; файловый набор — для массовой загрузки XML. JSON-обработчики ниже реально работают на дату проверки, но портал не объявляет их стабильным публичным API.

Качество и верификация​

ИзмерениеЗначение для этой карточки
Дата проверки (last_verified)2026-07-19: браузерный поиск, UI-экспорт XLSX, JSON-ответы, раздел статистики и HTTP-заголовки
Полнота (data_completeness)Частичная для программной загрузки: микроданные доступны через поиск, но полный реестр как единый экспорт витрины не подтверждён; для него есть 7707329152-rsmp
Машиночитаемость (machine_readability)POST JSON с UTF-8 и XLSX, но без опубликованной спецификации; параметры и токены пагинации нужно получать из актуального ответа
Юридическая значимость (legal_significance)Официальная витрина ФНС России, но не самостоятельный нормативный источник статуса вне даты среза
Задержка обновления (update_lag)На 2026-07-19 главная страница и селектор показывали текущий срез 10.07.2026; SLA/время появления среза не указаны
Глубина архива (archive_depth)В форме наблюдался перечень выбираемых дат от 01.08.2016 до 10.07.2026; это состояние селектора, не гарантия неизменного архива
Лицензия (license_or_terms)Явные условия повторного использования на проверенной странице витрины не найдены; developers.html ссылается на открытые данные ФНС, но не задаёт лицензию для HTTP-обработчиков

Описание​

В карточке описан именно канал веб-витрины: обычный и расширенный поиск, JSON, XLSX и статистика. XML-поля и правила формирования файла не дублируются: они документированы в 7707329152-rsmp.

В объём не входят учётные роли портала и другой реестр — получатели поддержки на rmsp-pp.nalog.ru. Принадлежность к МСП и факт получения поддержки — разные данные.

Оператор​

Федеральная налоговая служба — оператор и публикатор витрины: https://rmsp.nalog.ru/

URL и точки доступа​

Тип доступаURLМетод и форматЧто подтверждено 2026-07-19
Главнаяhttps://rmsp.nalog.ru/GET, HTMLТекущий срез на странице — 10.07.2026; счётчик субъектов — 6 612 445
Обычный поискhttps://rmsp.nalog.ru/search.htmlHTML + POSTВвод: ИНН, ОГРН, ОГРНИП, наименование/ФИО ИП
Расширенный поискhttps://rmsp.nalog.ru/search.html?mode=extendedHTML + POSTФорма с фильтрами и обязательным dtCategory
Поискhttps://rmsp.nalog.ru/search-proc.jsonPOST, JSON UTF-8Рабочий обработчик результатов поиска; не описан как версионированный API
Экспорт результата поискаhttps://rmsp.nalog.ru/report.xlsxPOST, XLSXUI меняет action формы на этот URL; фактический тест описан в разделе XLSX
Статистикаhttps://rmsp.nalog.ru/statistics.htmlHTMLСелектор даты, таблицы и графики
Агрегаты статистикиhttps://rmsp.nalog.ru/statistics-proc.jsonPOST, JSON UTF-8Рабочий запрос с statDate=10.07.2026 возвращает РФ, федеральные округа и регионы
Выгрузка статистикиhttps://rmsp.nalog.ru/statistics.xlsx?statDate=10.07.2026GET, XLSXОтвет содержит имя rsmp_statistics_19.07.2026.xlsx
Материалы разработчикамhttps://rmsp.nalog.ru/developers.htmlGET, HTMLОписаны СМЭВ и ссылки на спецификации файловых открытых данных; лимиты HTTP API не опубликованы
Альтернативный URL из заданияhttps://rmsp.nalog.ru/razrabotchikam.htmlGET, HTML200, но в проверенном теле находилась страница поиска, а не отдельная страница для разработчиков

HTTP-заголовки ответов​

Значения сняты curl 2026-07-19. Content-Length у динамических и XLSX-ответов может зависеть от тела; «нет» означает отсутствие заголовка в конкретном ответе, а не обещание сервера.

URL и проверочный запросСтатус и Content-TypeContent-Length / передачаLast-Modified, сжатие, cookie
GET /200; text/html;charset=utf-8Content-Length нет; Transfer-Encoding: chunkedLast-Modified и Content-Encoding нет; Set-Cookie: JSESSIONID=…; Path=/; HttpOnly
POST /search-proc.json, mode=quick, query=4707048043200; application/json;charset=UTF-8Content-Length: 1361Last-Modified и Content-Encoding нет; тот же JSESSIONID
POST /report.xlsx с теми же полями200; application/vnd.openxmlformats-officedocument.spreadsheetml.sheetContent-Length нет; Transfer-Encoding: chunked; content-disposition: attachment; filename=rsmp_19.07.2026.xlsxLast-Modified и Content-Encoding нет; JSESSIONID; пустые Pragma, Cache-Control, Expires
POST /statistics-proc.json, statDate=10.07.2026200; application/json;charset=UTF-8Content-Length нет; Transfer-Encoding: chunkedLast-Modified и Content-Encoding нет; JSESSIONID
GET /statistics.xlsx?statDate=10.07.2026200; XLSX MIMEContent-Length нет; Transfer-Encoding: chunked; content-disposition: attachment; filename=rsmp_statistics_19.07.2026.xlsxLast-Modified и Content-Encoding нет; JSESSIONID; пустые Pragma, Cache-Control, Expires
GET /developers.html и GET /razrabotchikam.html200; text/html;charset=utf-8Content-Length нет; Transfer-Encoding: chunkedLast-Modified и Content-Encoding нет; JSESSIONID

Cookie выставляется даже на главной и JSON-ответах. При этом проверочный POST /search-proc.json и POST /statistics-proc.json от curl без заранее переданной cookie и без специального User-Agent получили корректный 200 и JSON. Это не доказывает отсутствие будущих ограничений.

Структура данных и объекты​

A. Параметры поиска​

Обычная форма передаёт mode=quick, query, page, sortField, sort. Расширенная форма имеет mode=extended и следующие имена полей. Значения, коды и обязательность сняты с HTML/клиентского JS формы; прямой сетевой запрос со всеми фильтрами сразу не выполнялся, поэтому поведение редких комбинаций помечено отдельно.

Параметр (HTTP)Где передаётсяТипОбяз.СемантикаСоответствие полю XML 7707329152-rsmp
modebody application/x-www-form-urlencodedстрокадаquick или extended; определяет вариант формыНет поля: технический параметр витрины
querybodyстрокадля обычного поиска даИНН, ОГРН, ОГРНИП, наименование ЮЛ или ФИО ИППоиск по ИННЮЛ/ИННФЛ, ОГРН/ОГРНИП, наименованию/ФИО; не отдельное XML-поле
npTypebody, повторяемый checkboxenum UL / IPнетТип субъекта: юридическое лицо или ИПДокумент/@ВидСубМСП: 1 / 2; глава КФХ — отдельный XML-код 3
vidIpbodyenum 2 / 1нетВ UI при выборе ИП: «является главой КФХ», да / нетДокумент/@ВидСубМСП; прямое соответствие кодов ТРЕБУЕТ ПРОВЕРКИ
categorybody, повторяемый checkboxenum 1 / 2 / 3нетМикро / малое / среднее предприятиеДокумент/@КатСубМСП
dtCategorybodyдата ДД.ММ.ГГГГда в расширенной формеДата среза, по которой определяется категория МСП; в селекторе доступны исторические датыДокумент/@ДатаСост
isNewbodyenum 1 / 0нетВновь созданный субъект: да / нетДокумент/@ПризНовМСП (в XML «да»=1, «нет»=2; коды витрины отличаются)
isSocialbodyenum 1 / 0нетСоциальное предприятие: да / нетДокумент/@СведСоцПред (аналогично кодировка UI отличается)
dtRegistrybodyдатанетДата включения в реестрДокумент/@ДатаВклМСП
regionbodyстрока кода субъекта РФнетРегионДокумент/СведМН/@КодРегион
district, city, localitybodyстроковые кодынетПоследовательно доступные район, город, населённый пунктАдресные части СведМН; точное соответствие кодов ТРЕБУЕТ ПРОВЕРКИ
hasLicensesbodyфлаг 1нетТолько субъекты с лицензиямиНаличие Документ/СвЛиценз
isHitechbodyфлаг 1нетИнновационная/высокотехнологичная продукцияСвязано с СвПрод/@ПрОтнПрод; точное правило фильтра ТРЕБУЕТ ПРОВЕРКИ
isPartnershipbodyфлаг 1нетУчастие в программах партнёрстваНаличие Документ/СвПрогПарт
okved1bodyстрока коданетВид деятельности ОКВЭД; виджет допускает до 1 000 значенийСвОКВЭД/СвОКВЭДОсн/@КодОКВЭД
trubodyстроковый коднетВиды продукции, работ, услугСвПрод/@КодПрод
slvdbodyстроковый коднетВиды лицензируемой деятельностиПоле XML-группы СвЛиценз; точная проекция ТРЕБУЕТ ПРОВЕРКИ
pagebodyнепрозрачный строковый токеннетТекущая страница или выбранный размер страницы; берётся из pageNav ответаНет поля: техническая пагинация
sortFieldbodyстроканетВ проверенном запросе NAME_EXНет поля: техническая сортировка витрины
sortbodyASC / DESCнетНаправление сортировкиНет поля: техническая сортировка витрины

Каскадный адресный виджет в коде страницы использует POST /kladr-proc.json с parentLevel (REGION, DISTRICT, CITY, LOCALITY) и parentCode; его JSON-ответ в этой проверке отдельно не снимался. ТРЕБУЕТ ПРОВЕРКИ: фактическая схема ответа и поведение всех уровней.

B. JSON-ответ поиска​

Проверенный запрос POST /search-proc.json с mode=quick&query=4707048043&sortField=NAME_EX&sort=ASC вернул один объект. Кодировка ответа — UTF-8; тело — JSON. Поля «обяз.» ниже означают наличие в этой фактической выдаче, а не опубликованный контракт API.

Поле JSONТипОбяз.СемантикаКлюч связкиИсточник
dtQueryBegin, dtQueryEndстрока ДД.ММ.ГГГГ ЧЧ:ММ:ССдаВремя выполнения поискового запроса на порталенетОтвет 2026-07-19
dataмассив объектовдаСтраница результатовнетОтвет 2026-07-19
data[].idчислодаТехнический идентификатор строки; в проверенной ЮЛ численно равен ОГРНне использоватьОтвет 2026-07-19
data[].innстрока из цифрдаИНН субъектадаОтвет 2026-07-19; ИНН
data[].ogrnстрока из цифрда для проверенной ЮЛОГРН проверенной ЮЛда, ЮЛОтвет 2026-07-19; ОГРН. Имя поля для ОГРНИП ИП ТРЕБУЕТ ПРОВЕРКИ
data[].nptypeстрокадаТип субъекта; в проверенной записи ULвместе с ИННОтвет 2026-07-19
data[].name_exстрокадаНаименование субъектанетОтвет 2026-07-19
data[].categoryцелоедаКод категории; в проверенной записи 1 (микропредприятие)нетОтвет 2026-07-19; UI и XML-сопоставление
data[].regioncodeстрокадаДвухзначный код региона, в примере 47группировка по регионуОтвет 2026-07-19; не ОКТМО
data[].dtregistry, data[].dtregistryoutстрока ДД.ММ.ГГГГ ЧЧ:ММ:СС / отсутствуетdtregistry да; dtregistryout опц.Дата включения и дата исключения; во включённой записи второго поля нетнетОтветы 2026-07-19: активная и исключённая записи
data[].is_active, isnewцелое 0 / 1да в проверенном объектеПризнак активности и вновь созданного субъектанетОтвет 2026-07-19
data[].okved1, okved1nameстрокада в проверенной записиОсновной ОКВЭД и его названиеОКВЭДОтвет 2026-07-19; ОКВЭД
data[].citytype, citynameстрокаопц.Городская часть адреса; в примере г. и Сосновый БорнетОтвет 2026-07-19
data[].has_licenses, has_contracts, is_hitech, is_partnership, pr_soc, is_ppцелые флагида в проверенной записиПризнаки, которые читает клиент; точная семантика has_contracts, pr_soc, is_pp без спецификации ТРЕБУЕТ ПРОВЕРКИнетОтвет 2026-07-19 и клиентский JS
data[].cntцелоедаВ двух проверенных ответах совпал с общим rowCountнетОтветы 2026-07-19
data[].tokenстрока из hex-символовдаНепрозрачный токен для ссылок на выписки/периодынетОтвет 2026-07-19; не хранить как постоянный ключ
queryTimeцелоедаВремя запроса; интерфейс показывает его как секунды после деления на 1000нетОтвет и search.js
rowCount, rowLimitцелыедаЧисло найденных строк и поле лимита; в запросах на 1 и 937 результатов rowLimit был 0нетОтветы 2026-07-19
pageNav.pages, pageNav.pageSizesмассивы пардаПодпись страницы/размера и токен или null для активного вариантанетОтвет 2026-07-19

Ниже приведено тело с фактической записью; технические токены размеров страницы в последней строке сокращены, поскольку новый запрос выдаёт другие значения:

{
"dtQueryEnd": "19.07.2026 07:43:13",
"dtQueryBegin": "19.07.2026 07:43:13",
"data": [
{
"id": 1224700016750,
"ogrn": "1224700016750",
"inn": "4707048043",
"isnew": 0,
"category": 1,
"regioncode": "47",
"dtregistry": "10.10.2022 00:00:00",
"is_active": 1,
"nptype": "UL",
"okved1": "35.22",
"okved1name": "Распределение газообразного топлива по газораспределительным сетям",
"citytype": "г.",
"cityname": "Сосновый Бор",
"name_ex": "ПОТРЕБИТЕЛЬСКИЙ КООПЕРАТИВ \"РОМАШКА-ГАЗ\" ПО ОБСЛУЖИВАНИЮ ЖИЛЫХ ДОМОВ В СНТ \"РОМАШКА\"",
"has_licenses": 0,
"has_contracts": 0,
"is_hitech": 0,
"is_partnership": 0,
"pr_soc": 0,
"is_pp": 1,
"cnt": 1,
"token": "2BBFEE11186F3A1DB7E9DA5193609CE91FFB257E96DF1440990120EC4AB1DF34A0848F96AA92F3CE2F010AF34B9C6107"
}
],
"queryTime": 1,
"rowCount": 1,
"rowLimit": 0,
"pageNav": {
"pages": [["1", null]],
"pageSizes": [["5", "<opaque token>"], ["10", null], ["25", "<opaque token>"], ["50", "<opaque token>"], ["100", "<opaque token>"]]
}
}

В последней строке примера токены размеров намеренно сокращены: они являются техническими значениями текущей сессии и не нужны для воспроизводимого первого запроса. Для следующей страницы или размера берите токен из своего свежего pageNav, передавая его как page; не конструируйте токен.

C. XLSX-выгрузка​

Кнопка «Экспорт в Excel» переводит текущую HTML-форму на POST /report.xlsx. Поля формы в результате поиска: mode, query, page, sortField, sort; формат body — application/x-www-form-urlencoded.

Однако реальная проверка выявила важное текущее ограничение. После обычного UI-поиска по 4707048043 экран показывал одну запись, но query в форме результата был пустым. Нажатие кнопки скачало rsmp_19.07.2026.xlsx с одним листом Лист1, размером 1 × 1: ячейка A1 — строка Единый реестр субъектов малого и среднего предпринимательства по состоянию на 19.07.2026. Табличного заголовка и строк данных в этом файле не было.

Колонка (заголовок)ПорядокТип ячейкиСоответствует полю JSON/XML
Титульная строка Единый реестр субъектов малого и среднего предпринимательства по состоянию на 19.07.2026A1строкаДата — текущая дата формирования файла, не поле записи
Столбцы данных результата поиска——ТРЕБУЕТ ПРОВЕРКИ: в фактически скачанном XLSX их нет, поэтому нельзя достоверно назвать порядок или типы

Не смешивайте это с HTML-таблицей результата: у неё подтверждены пять видимых колонок — «Наименование субъекта», «Категория», «Регион», «Дата включения в реестр», «Дата исключения из реестра». Они не подтверждают схему XLSX.

ТРЕБУЕТ ПРОВЕРКИ: максимально допустимое число строк XLSX. В UI подтверждены варианты размера одной страницы 5, 10, 25, 50, 100, но в короткой выдаче сообщения о лимите экспорта не было, а выгрузка не содержала строк.

Статистика​

Раздел «Статистика» позволяет выбрать statDate из того же наблюдаемого ряда дат. UI отображает число субъектов, работников и продукции; таблицу РФ → федеральных округов → регионов; распределения по ЮЛ/ИП и категориям микро/малое/среднее; социальные и вновь созданные микро-предприятия; диаграммы динамики, численности работников и топ-10 ОКВЭД. Статистика отделена от построчного поиска.

Проверенный программный запрос:

POST https://rmsp.nalog.ru/statistics-proc.json
Content-Type: application/x-www-form-urlencoded

statDate=10.07.2026

возвращает JSON-массив. Первая строка РФ содержала, в частности, stat_date, cnt_level: 2, cnt_name: "Российская Федерация", cnt_total: 6612445, cnt_ul_total: 2022689, cnt_ip_total: 4589756, cnt_worker_total: 15093124; у строк округов есть focode/foname, у регионов — ssrf и name. Это пригодно для программного извлечения агрегатов. В клиентском коде также есть запросы диаграмм с level, fo, region, type=chartstat или chartokvedstat и запрос по продукции ?type=tru; их ответы в этой проверке отдельно не сняты — ТРЕБУЕТ ПРОВЕРКИ перед автоматизацией.

Ключи связки с другими данными​

КлючПоле в выдаче порталаС чем соединятьПримечание
ИННdata[].innпоставщик/заказчик в XML-выгрузках ЕИС, получатель в реестре субсидий, записи 7707329152-rsmp и 7707329152-rsmpppХранить строкой. ЮЛ — 10 цифр, ИП — 12; всегда проверять длину и nptype, не преобразовывать в число.
ОГРНdata[].ogrn для проверенной ЮЛЕГРЮЛ, XML-набор 7707329152-rsmpАльтернативный ключ только для ЮЛ; в проверенной строке 1224700016750.
ОГРНИПполе ответа ИП ТРЕБУЕТ ПРОВЕРКИЕГРИП и XML-набор 7707329152-rsmpПортал принимает ОГРНИП в query, но JSON выдача ИП в этой проверке не снималась; не предполагайте имя поля.
ОКВЭДdata[].okved1, okved1nameОКВЭД, отраслевые разрезы закупок и статистикиВ проверенной строке 35.22; это основной код, не полный список дополнительных кодов XML.
Код регионаdata[].regioncode, в статистике ssrfрегиональные срезы, 7707329152-rsmpДвухзначный код субъекта РФ (47 в примере), не ОКТМО. Для муниципального уровня нужна внешняя геокодировка.

Периодичность обновления​

На 2026-07-19 витрина показывала текущую дату 10.07.2026; в обоих селекторах были видны даты срезов по месяцам, начиная с 01.08.2016. Для расширенного поиска дата передаётся в dtCategory, для статистики — в statDate, обе в виде ДД.ММ.ГГГГ.

Это наблюдаемая публикационная последовательность, а не заявленное расписание. Для массовой исторической обработки сверяйте и скачивайте соседние ZIP-срезы 7707329152-rsmp: там дата среза находится в самом файле и в архиве, а не только в контроле UI.

Ограничения и особенности​

  • Пагинация выдачи основана на непрозрачных токенах pageNav. В UI доступны 5, 10, 25, 50, 100 строк на странице. В проверенном поиске «Ромашка» rowCount был 937, на первой странице — 10 объектов; следующий переход требует токена из ответа.
  • Лимит строк report.xlsx и полный перечень XLSX-колонок ТРЕБУЮТ ПРОВЕРКИ: UI-экспорт фактической однострочной выборки выдал только заголовок реестра. Не строить массовый процесс на этом экспорте.
  • Сервер постоянно устанавливает JSESSIONID; поиск и статистика с curl работали без заранее сохранённой сессии и без специального User-Agent. Требование сохранять cookie для XLSX, лимиты запросов и допустимая частота не опубликованы на developers.html и ТРЕБУЮТ ПРОВЕРКИ нагрузочным тестом/официальным разъяснением.
  • CAPTCHA или отдельный anti-bot-челлендж не появились в проверенных браузерных действиях и HTTP-запросах. Это наблюдение, а не гарантия отсутствия защиты для других объёмов или IP.
  • Для снятых HTML и JSON-ответов кодировка — UTF-8; заголовка Content-Encoding не было. XLSX — бинарный Office Open XML; Content-Length у проверенных XLSX не передан, использован Transfer-Encoding: chunked.
  • В подтверждённой JSON-строке нет КПП, ОКТМО и полного почтового адреса: есть только городские компоненты. Глобальное отсутствие этих полей в недокументированной JSON-схеме ТРЕБУЕТ ПРОВЕРКИ; в XML-наборе 7707329152-rsmp КПП, ОКТМО и полный адрес также не публикуются.
  • Не используйте счётчик главной, rowCount результата или предполагаемый Excel как контроль точного объёма полного реестра. Для сверки считайте XML самостоятельно. Численное расхождение счётчиков портала и файлового набора на одну дату в этой проверке не установлено.
  • Не подменяйте принадлежность к МСП фактом получения поддержки: 7707329152-rsmppp и rmsp-pp.nalog.ru описывают меры поддержки, а не критерий включения в реестр МСП.

Что говорит страница «Разработчикам»​

Проверенная developers.html не публикует HTTP-спецификацию search-proc.json, лимит запросов, обязательный User-Agent, список заголовков или правила anti-bot. На ней указаны:

  • сервис СМЭВ 3.X «Предоставление сведений из реестра малого и среднего предпринимательства…», зарегистрированный в продуктивной среде 25.08.2016;
  • ссылка на каталог открытых данных ФНС https://www.nalog.gov.ru/opendata/;
  • три архива описаний форматов файлового реестра: fns-rrmsp406.zip, VO_RRMSPSV_2_213_04_04_06.zip, VO_SVRRMSPSV_2_213_02_04_08.zip на data.nalog.ru.

Следовательно, это полезный маршрут к официальным файловым контрактам и СМЭВ, но не документ для безопасной интеграции с внутренними JSON-обработчиками витрины.

Примеры доступа​

Команды и код ниже исполнены 2026-07-19. Поиск выполняется по публичной записи ЮЛ с ИНН 4707048043; он выбран для воспроизводимости, а не как рекомендация использовать этот субъект в анализе.

Проверка доступности главной без авторизации:

curl -sI 'https://rmsp.nalog.ru/' | head -n 7

Проверенный признак — HTTP/1.1 200, Content-Type: text/html;charset=utf-8, Set-Cookie: JSESSIONID=… и Transfer-Encoding: chunked.

Программный поиск. curl сам задаёт Content-Type: application/x-www-form-urlencoded при --data-urlencode:

curl -sS -X POST 'https://rmsp.nalog.ru/search-proc.json' \
--data-urlencode 'mode=quick' \
--data-urlencode 'query=4707048043' \
--data-urlencode 'sortField=NAME_EX' \
--data-urlencode 'sort=ASC'

Сокращённый фактический результат: rowCount: 1, data[0].inn: "4707048043", data[0].ogrn: "1224700016750", data[0].category: 1, data[0].regioncode: "47", data[0].okved1: "35.22"; полный пример тела приведён выше. Не передавайте старые pageNav-токены в новый запрос.

Потоковый разбор массива data и плоский CSV ключевых полей (Python 3.12 standard library; код исполнен против ответа выше):

import csv
import json
import sys
from urllib.parse import urlencode
from urllib.request import Request, urlopen

payload = urlencode({
"mode": "quick",
"query": "4707048043",
"sortField": "NAME_EX",
"sort": "ASC",
}).encode("utf-8")
request = Request(
"https://rmsp.nalog.ru/search-proc.json",
data=payload,
headers={"Content-Type": "application/x-www-form-urlencoded"},
method="POST",
)
fields = ["inn", "ogrn", "name_ex", "category", "regioncode", "dtregistry", "okved1"]
writer = csv.DictWriter(sys.stdout, fieldnames=fields)
writer.writeheader()
json_decoder = json.JSONDecoder()
marker = '"data":['
buffer = ""
inside_data = False
with urlopen(request, timeout=30) as response:
while chunk := response.read(8192):
buffer += chunk.decode("utf-8")
if not inside_data:
marker_at = buffer.find(marker)
if marker_at < 0:
buffer = buffer[-(len(marker) - 1):]
continue
buffer = buffer[marker_at + len(marker):]
inside_data = True
while inside_data:
buffer = buffer.lstrip()
if buffer.startswith("]"):
inside_data = False
break
try:
row, parsed_to = json_decoder.raw_decode(buffer)
except json.JSONDecodeError:
break
writer.writerow({field: row.get(field) for field in fields})
buffer = buffer[parsed_to:].lstrip()
if buffer.startswith(","):
buffer = buffer[1:]
elif buffer.startswith("]"):
inside_data = False
break
else:
break

Вывод проверки:

inn,ogrn,name_ex,category,regioncode,dtregistry,okved1
4707048043,1224700016750,"ПОТРЕБИТЕЛЬСКИЙ КООПЕРАТИВ ""РОМАШКА-ГАЗ"" ПО ОБСЛУЖИВАНИЮ ЖИЛЫХ ДОМОВ В СНТ ""РОМАШКА""",1,47,10.10.2022 00:00:00,35.22

Проверка XLSX, уже скачанного браузером. Код использует openpyxl==3.1.5, исполняется и безопасно сообщает о фактическом «титульном» файле; если портал начнёт отдавать таблицу, он нормализует даты в ISO, идентификаторы оставляет строками и создаёт pandas.DataFrame.

import sys
from datetime import date, datetime
from pathlib import Path

import pandas as pd # pandas==2.2.3
from openpyxl import load_workbook # openpyxl==3.1.5

path = Path(sys.argv[1])
workbook = load_workbook(path, read_only=True, data_only=True)
sheet = workbook[workbook.sheetnames[0]]
rows = list(sheet.iter_rows(values_only=True))

if len(rows) == 1 and len(rows[0]) == 1:
raise SystemExit(f"XLSX содержит только титул, без строк данных: {rows[0][0]!r}")

def normalize(value):
if isinstance(value, datetime):
return value.isoformat(sep=" ")
if isinstance(value, date):
return value.isoformat()
return value if value is None or isinstance(value, (int, float)) else str(value).strip()

headers = [normalize(value) for value in rows[1]]
records = [dict(zip(headers, map(normalize, row))) for row in rows[2:]]
frame = pd.DataFrame.from_records(records)
print(frame.dtypes)
print(frame.head(3).to_csv(index=False))

Запуск против фактически полученного файла завершается сообщением XLSX содержит только титул, без строк данных: 'Единый реестр субъектов малого и среднего предпринимательства по состоянию на 19.07.2026'. Это намеренный fail-fast: не интерпретировать титульную строку как набор данных.

Склейка результата поиска с внешней таблицей по ИНН (Python 3.12, pandas==2.2.3). Скрипт принимает два CSV: сначала результаты поиска, затем внешние данные; проверяет дубли ИНН в справочнике и использует validate="m:1".

import sys

import pandas as pd

subjects = pd.read_csv(sys.argv[1], dtype={"inn": "string"})
external = pd.read_csv(sys.argv[2], dtype={"inn": "string"})

for name, frame in {"subjects": subjects, "external": external}.items():
if "inn" not in frame:
raise ValueError(f"{name}: нет колонки inn")
frame["inn"] = frame["inn"].str.strip()
if frame["inn"].isna().any() or (~frame["inn"].str.fullmatch(r"\d{10}|\d{12}")).any():
raise ValueError(f"{name}: некорректный ИНН")

if subjects["inn"].duplicated().any():
raise ValueError("subjects: дубли ИНН; сначала выберите один срез/одну запись на субъект")

joined = external.merge(
subjects[["inn", "ogrn", "name_ex", "category", "regioncode", "okved1"]],
on="inn",
how="left",
validate="m:1",
)
joined.to_csv(sys.stdout, index=False)

Сводка для машинной обработки​

primary_url: "https://rmsp.nalog.ru/"
search_endpoint:
method: "POST"
url: "https://rmsp.nalog.ru/search-proc.json"
content_type: "application/x-www-form-urlencoded; response application/json;charset=UTF-8"
formats: ["html", "xlsx", "json"]
update_cadence: "наблюдаемые ежемесячные срезы; текущий 10.07.2026 на проверку 19.07.2026"
join_keys: ["inn", "ogrn", "ogrnip (ТРЕБУЕТ ПРОВЕРКИ в JSON ИП)", "okved1", "region_code"]
xlsx_export:
method: "POST"
url: "https://rmsp.nalog.ru/report.xlsx"
row_limit: "ТРЕБУЕТ ПРОВЕРКИ"
verified_workbook: "Лист1; A1 — только титульная строка, без таблицы"
columns: "ТРЕБУЕТ ПРОВЕРКИ"
date_slice_param:
search: "dtCategory (ДД.ММ.ГГГГ)"
statistics: "statDate (ДД.ММ.ГГГГ)"
statistics_endpoint: "POST https://rmsp.nalog.ru/statistics-proc.json"
archive_depth: "селектор дат: 01.08.2016 … 10.07.2026, наблюдение 2026-07-19"

Связанные страницы wiki​

Не путать с​

  • Единый реестр получателей поддержки МСП (rmsp-pp.nalog.ru) — показывает факты мер поддержки, а не саму принадлежность организации/ИП к МСП.
  • Набор 7707329152-rsmp — тот же предметный реестр, но канал официальных ZIP/XML-выгрузок, а не интерактивная витрина и её недокументированные JSON-обработчики.

Частые вопросы​

В: Чем эта витрина отличается от 7707329152-rsmp?

О: Это один реестр, но разные каналы. rmsp.nalog.ru даёт UI-поиск, исторический выбор даты и агрегаты; 7707329152-rsmp — полный файловый XML-срез с XSD, пригодный для массовой обработки.

В: Как выбрать исторический срез?

О: В расширенной форме выберите дату состояния категории МСП: браузер отправляет её как dtCategory в формате ДД.ММ.ГГГГ. В статистике используется отдельный параметр statDate. На дату проверки селекторы содержали даты от 01.08.2016 до 10.07.2026.

В: Можно ли программно выгрузить весь реестр из этой витрины в Excel?

О: Не следует рассчитывать на это. Публично подтверждён стабильный JSON-поиск по выборке, но не полный репликационный API; проверенный UI-XLSX даже для одной найденной записи отдал только титул без данных. Для полного реестра берите 7707329152-rsmp.

В: Какой ключ брать для склейки?

О: Основной ключ — строковый ИНН (10 цифр для ЮЛ, 12 для ИП), с проверкой типа субъекта. ОГРН полезен как дополнительный ключ только для ЮЛ; код региона не является ОКТМО.