К содержимому
К содержимому
Реестрюридических лиц

Документация для разработчиков

API для разработчиков

Партнёрский API — данные о юридических лицах Кыргызстана программно: полное досье компании по ИНН одним запросом. Доступ по ключу в заголовке X-Api-Key.

Быстрый старт

  1. Получите API-ключ в личном кабинете, раздел «Профиль → API» (доступен при активной подписке с доступом к API). Ключ вида rk_… показывается один раз — сразу сохраните его.

  2. Подставьте ключ в заголовок X-Api-Key, а ИНН — в адрес запроса.

  3. Отправьте запрос — в ответ придёт JSON с досье.

Пример запроса
curl -H "X-Api-Key: rk_ВАШ_КЛЮЧ" https://api.reestr.kg/partner/v1/companies/01234567890123

Подставьте свой ключ вместо rk_ВАШ_КЛЮЧ и нужный ИНН вместо образцового. В ответ придёт JSON примерно такого вида:

Пример ответа
{
  "tin": "01234567890123",
  "recordId": "3f8b1c42-0e77-4a19-9b2e-5c6d7a8f0011",
  "registrationNumber": "168742-3301-ООО",
  "statNo": "27904561",
  "fullNameRu": "Общество с ограниченной ответственностью «Пример»",
  "shortNameRu": "ООО «Пример»",
  "fullNameKy": "«Мисал» жоопкерчилиги чектелген коому",
  "fullNameEn": null,
  "directorName": "Иванов Иван Иванович",
  "state": "REGISTERED",
  "orderDate": "2019-04-12T00:00:00",
  "primaryRegistrationDate": "2019-04-12T00:00:00",
  "reRegistrationDate": null,
  "liquidationDate": null,
  "registrationType": "Регистрация",
  "denyReregistration": false,
  "denyElimination": false,
  "denyNotification": false,
  "legalForm": "Общество с ограниченной ответственностью",
  "ownershipForm": "Частная",
  "hasForeignCapital": false,
  "mainActivity": "Розничная торговля в неспециализированных магазинах",
  "okedCode": "47110",
  "okedSection": "G",
  "regionCode": "01",
  "founders": [
    { "name": "Иванов Иван Иванович", "type": "person", "tin": null },
    { "name": "ОсОО «Холдинг»", "type": "company", "tin": "01234567890999" },
    { "name": "Мэрия города Пример", "type": "state", "tin": null }
  ],
  "actualAddress": "г. Бишкек, ул. Примерная, 1, кв. 5",
  "workPhone": "+996700123456",
  "email": "info@example.kg",
  "bankName": "ОАО «Банк»",
  "accountNumber": "1234567890123456",
  "bic": "128001",
  "hasDebt": false,
  "taxAuthorityCode": "001",
  "taxAuthorityShortName": "Октябрьский р-н",
  "taxAuthorityFullName": "УГНС по Октябрьскому району г. Бишкек",
  "bankruptcyStatus": null,
  "sanctions": [],
  "licenses": [
    {
      "kind": "Construction",
      "authority": "Минстрой",
      "category": "Level3",
      "series": "КРЖ-2",
      "number": "012293",
      "activity": null,
      "issuedOnRaw": "2025-06-19",
      "issuedOn": "2025-06-19T00:00:00",
      "validUntilRaw": null,
      "validUntil": null,
      "status": "Active",
      "statusNote": null,
      "matchedBy": "Tin",
      "details": []
    }
  ],
  "riskScore": null,
  "location": null,
  "constructionObjects": [],
  "isRegisteredSupplier": false,
  "lastCheckedAt": "2026-08-25T04:11:07",
  "freshness": {
    "profileCheckedAt": "2026-08-25T04:11:07",
    "taxCheckedAt": "2026-08-20T21:03:44",
    "documentsCheckedAt": "2026-08-25T04:11:09",
    "hasExtractPdf": true,
    "hasCertificatePdf": true
  }
}
Базовый адрес (https://api.reestr.kg) выдаётся вместе с ключом. На время тестирования адрес может отличаться — используйте тот, что вам сообщили.

Эндпоинт

Полное досье одной компании:

GET /partner/v1/companies/{ИНН}
  • {ИНН} — от 3 до 14 цифр (короткие ИНН бывают у старых и ликвидированных компаний).
  • Ключ передаётся заголовком X-Api-Key. Только по HTTPS.
  • Ответ — 200 OK с телом-досье, либо ошибка с полями code и message.

Что приходит в ответе

Успешный ответ — один объект JSON с карточкой компании. Ниже — полный состав полей: партнёр получает их все, без деления на секции.

ГруппаПоляЧто это
Идентификаторыtin, recordId, registrationNumber, statNoИНН, идентификатор записи в реестре Минюста, регистрационный номер, код ОКПО.
НаименованияfullNameRu, shortNameRu, fullNameKy, fullNameEn, directorNameПолное и сокращённое название на трёх языках, ФИО руководителя.
Статус и датыstate, orderDate, primaryRegistrationDate, reRegistrationDate, liquidationDate, registrationTypeТекущий статус, дата приказа, первичная регистрация, перерегистрация, ликвидация.
ЗапретыdenyReregistration, denyElimination, denyNotificationЗапреты на перерегистрацию, ликвидацию и извещения — отметки реестра.
Форма и деятельностьlegalForm, ownershipForm, hasForeignCapital, mainActivity, okedCode, okedSection, regionCodeПравовая форма, форма собственности, иностранное участие, вид деятельности и коды.
Учредителиfounders[] → { name, type, tin }Тип принимает пять значений: person — физлицо, company — юрлицо, state — госорган или орган местного самоуправления, foreign — иностранная компания, ngo — некоммерческая организация. Разбирайте его как открытый перечень: строгая проверка на два значения упадёт на первой же компании с учредителем-госорганом. ИНН заполнен только у учредителя-юрлица, чья карточка у нас есть; name у безымянного узла приходит заглушкой «(без ИНН)».
Адрес и контактыactualAddress, workPhone, emailФактический адрес, рабочий телефон и электронная почта — если известны.
Банковские реквизитыbankName, accountNumber, bicБанк, расчётный счёт и БИК — если реквизиты встречались в данных.
Налоговый органhasDebt, taxAuthorityCode, taxAuthorityShortName, taxAuthorityFullNameПризнак задолженности (да/нет) и инспекция, к которой приписана компания.
БанкротствоbankruptcyStatusТекущий статус из реестра банкротств; null — компании там нет.
Санкцииsanctions[] → { source, listedName, listingBasis, subjectType, matchedSubject, confidence, sourceCount, subjectKey, isActive, delistedDate }Подтверждённые совпадения со списками: источник, основание, чьё имя совпало, уверенность 0–100, действует ли сейчас. Один фигурант приходит несколькими записями — он попадает и в несколько списков сразу, и по нескольку раз внутри одного; чтобы показать его одной строкой, склеивайте записи по subjectKey.
Лицензии и разрешенияlicenses[] → { kind, authority, category, series, number, activity, issuedOnRaw, issuedOn, validUntilRaw, validUntil, status, statusNote, matchedBy, details[] }Все реестры одним списком: вид реестра лежит в kind (сейчас только Construction — реестр Минстроя; перечень будет пополняться, обрабатывайте незнакомое значение как «прочая лицензия», а не как ошибку). Ограничения приходят здесь же — со статусом Restricted и дословной формулировкой в statusNote. При matchedBy = Name привязка сделана по наименованию (ИНН источник не публикует) — повод проверить вручную, а не готовый вывод. Дату показывайте строкой issuedOnRaw: источники заполняют её небрежно, часто стоит 1899-12-30 — это «даты нет», а не 1899 год. В details[] лежат поля, свои для реестра, парами { label, value }.
Оценка рискаriskScore → { totalScore, level, factors[] }СЕЙЧАС ВСЕГДА null: расчёт оценки риска отключён, и пустое значение приходит по любой компании. Поле остаётся в ответе, чтобы контракт не менялся, когда расчёт вернут; форму объекта (балл, уровень, разбор по признакам) смотрите в машиночитаемом описании. Строить логику на этом поле пока нельзя.
Точка адреса на картеlocationВСЕГДА null: точка юридического адреса на карте партнёрам не отдаётся (решение владельца 2026-09-13). Поле есть в ответе, чтобы контракт не менялся; строить логику на нём нельзя.
Объекты МинстрояconstructionObjects[]ВСЕГДА пустой список: стройки из реестра объектов Минстроя партнёрам не отдаются (решение владельца 2026-09-13). Поле оставлено ради стабильности контракта; строить логику на нём нельзя.
ГосзакупкиisRegisteredSupplierЗамороженный снимок, а не текущее состояние: сборщик, который заполнял этот признак, снят, новые записи не появляются и старые не обновляются. Возраст значения по компании неизвестен, поэтому как источник о госзакупках его использовать нельзя.
Свежесть данныхlastCheckedAt, freshness → { profileCheckedAt, taxCheckedAt, documentsCheckedAt, hasExtractPdf, hasCertificatePdf }Когда мы последний раз сверяли данные и есть ли сохранённые PDF-документы. Сам объект freshness приходит всегда, пустыми бывают только отдельные его даты — пустая дата значит «источник по этой компании ещё не запрашивали». lastCheckedAt тоже пуст, пока компанию ни разу не сверяли.
Поле, по которому данных нет, приходит со значением null (а список — пустым). Это не ошибка: сведения в реестрах заполнены неравномерно.
На что нельзя опираться прямо сейчас. riskScore приходит пустым по любой компании — расчёт оценки риска отключён, поле оставлено в ответе, чтобы контракт не менялся, когда расчёт вернут. isRegisteredSupplier — замороженный снимок неизвестной давности: сборщик этого признака снят, значения не обновляются. Оба поля остаются в ответе, но выводов по ним делать нельзя.
Про даты. Даты приходят в виде 2019-04-12T00:00:00 без буквы Z и без смещения часового пояса. Отметки времени («когда проверяли») — по UTC; регистрационные даты — календарные, время у них нулевое и смысла не несёт. Разбирайте их как местное-без-пояса и сами считайте UTC: строгий разбор по RFC 3339 такую строку не примет, а нестрогий подставит часовой пояс вашей машины и сдвинет дату на сутки.
Машиночитаемое описание. Тот же контракт в формате OpenAPI — импортируется в Postman, Insomnia и генераторы клиентов: https://api.reestr.kg/openapi/partner-v1.json. Ключ для его загрузки не нужен.

Коды ответов

Ошибки из таблицы ниже приходят в одном формате: поле code — машиночитаемое, по нему и ориентируйтесь, а message — для человека.

Исключение — код 500. Непредвиденный сбой приходит с пустым телом, без code и message. Разбирайте тело ответа только после проверки, что оно непустое, и считайте 500 поводом повторить запрос позже. Предвиденный сбой инфраструктуры — это 503 из таблицы, у него тело есть.

HTTPcodeЧто значитРасходует запрос
200Досье найдено и возвращеноДа
400InvalidTinИНН не из 3–14 цифрНет
401InvalidApiKeyНет заголовка X-Api-Key, либо ключ недействителен или отозванНет
403ApiSubscriptionExpiredПодписка не даёт доступа к API или истеклаНет
403AccountTemporarilyFrozenАккаунт временно заморожен из-за аномальной активности — напишите в поддержкуНет
404CompanyNotFoundКомпании с таким ИНН нет в реестреНет
429RateLimitExceededПревышен лимит запросов в минуту — по вашему ключу либо по IP-адресу, с которого идут запросы. Заголовок Retry-After: 60Нет
429QuotaExceededИсчерпана месячная квота. В теле — used и quota
503TemporarilyUnavailableВременный сбой на нашей стороне. Заголовок Retry-After: 5 — повторитеНет

Квота и лимиты

Месячная квота. Число запросов в месяц берётся из вашего тарифа. Один запрос списывается за успешно отданное досье (200); отказы квоту не расходуют. При исчерпании приходит 429 QuotaExceeded до обновления квоты в следующем месяце.
Скоростной лимит. Ограничение на число запросов в минуту (тоже из тарифа). При превышении — 429 RateLimitExceeded с заголовком Retry-After (сколько секунд ждать). Правильная реакция — подождать указанное время и повторить, не долбить в цикле.
Отдельный лимит по IP-адресу. До проверки ключа работает общий лимит на адрес, с которого пришёл запрос — 120 запросов в минуту по умолчанию, независимо от вашего тарифа. Отказ тот же: 429 RateLimitExceeded с Retry-After: 60, и отличить его от тарифного по телу ответа нельзя. Такое возможно, если ваши запросы уходят через общий внешний адрес — офисный шлюз, общий NAT, чужой облачный прокси, — и лимит расходуете не только вы. Если ваша частота явно ниже тарифной, а 429 приходит, дело почти наверняка в этом: напишите нам — лимит на адрес мы поднять можем, но не мгновенно. Изменение вступает в силу после планового перезапуска нашего сервиса, поэтому мы согласуем его заранее, а не применяем в ту же минуту.
Один ключ на аккаунт. Генерация нового ключа сразу отзывает предыдущий. Если ключ утёк — просто перевыпустите его, старый мгновенно перестанет работать.
Вопросы по подключению — info@reestr.kg.