Документация для разработчиков
API для разработчиков
Партнёрский API — данные о юридических лицах Кыргызстана программно: полное досье компании по ИНН одним запросом. Доступ по ключу в заголовке X-Api-Key.
Быстрый старт
Получите API-ключ в личном кабинете, раздел «Профиль → API» (доступен при активной подписке с доступом к API). Ключ вида
rk_…показывается один раз — сразу сохраните его.Подставьте ключ в заголовок
X-Api-Key, а ИНН — в адрес запроса.Отправьте запрос — в ответ придёт 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 такую строку не примет, а нестрогий подставит часовой пояс вашей машины и сдвинет дату на сутки.Коды ответов
Ошибки из таблицы ниже приходят в одном формате: поле code — машиночитаемое, по нему и ориентируйтесь, а message — для человека.
Исключение — код 500. Непредвиденный сбой приходит с пустым телом, без code и message. Разбирайте тело ответа только после проверки, что оно непустое, и считайте 500 поводом повторить запрос позже. Предвиденный сбой инфраструктуры — это 503 из таблицы, у него тело есть.
| HTTP | code | Что значит | Расходует запрос |
|---|---|---|---|
| 200 | — | Досье найдено и возвращено | Да |
| 400 | InvalidTin | ИНН не из 3–14 цифр | Нет |
| 401 | InvalidApiKey | Нет заголовка X-Api-Key, либо ключ недействителен или отозван | Нет |
| 403 | ApiSubscriptionExpired | Подписка не даёт доступа к API или истекла | Нет |
| 403 | AccountTemporarilyFrozen | Аккаунт временно заморожен из-за аномальной активности — напишите в поддержку | Нет |
| 404 | CompanyNotFound | Компании с таким ИНН нет в реестре | Нет |
| 429 | RateLimitExceeded | Превышен лимит запросов в минуту — по вашему ключу либо по IP-адресу, с которого идут запросы. Заголовок Retry-After: 60 | Нет |
| 429 | QuotaExceeded | Исчерпана месячная квота. В теле — used и quota | — |
| 503 | TemporarilyUnavailable | Временный сбой на нашей стороне. Заголовок Retry-After: 5 — повторите | Нет |
Квота и лимиты
200); отказы квоту не расходуют. При исчерпании приходит 429 QuotaExceeded до обновления квоты в следующем месяце.429 RateLimitExceeded с заголовком Retry-After (сколько секунд ждать). Правильная реакция — подождать указанное время и повторить, не долбить в цикле.429 RateLimitExceeded с Retry-After: 60, и отличить его от тарифного по телу ответа нельзя. Такое возможно, если ваши запросы уходят через общий внешний адрес — офисный шлюз, общий NAT, чужой облачный прокси, — и лимит расходуете не только вы. Если ваша частота явно ниже тарифной, а 429 приходит, дело почти наверняка в этом: напишите нам — лимит на адрес мы поднять можем, но не мгновенно. Изменение вступает в силу после планового перезапуска нашего сервиса, поэтому мы согласуем его заранее, а не применяем в ту же минуту.