Строить продукт на данных, а не на их добыче
Когда данные из государственных источников нужны в продукте, команда обычно сначала пишет сбор, а потом годами его чинит. Это работа без конца и без ценности для пользователя. Мы отдаём готовый слой данных, одинаковый для всех источников, с понятными обязательствами по доступности и свежести.
Ситуация
Полкоманды занято сбором, а не продуктом
Сбор данных выглядит как задача на пару недель, а превращается в постоянную. Источники меняются, форматы расходятся, что-то отваливается в выходные. Инженеры, которых нанимали делать продукт, дежурят у парсеров, а сроки по фичам едут.
Что даёт API
Слой данных перестаёт быть вашей зоной ответственности.
Один формат на всё
Источники отдаются одинаково: обработка пишется один раз.
Один токен
Новый источник не требует ни новой интеграции, ни нового договора.
Опубликованные обязательства
Доступность и лаг данных известны до договора и зафиксированы в нём.
История снимков
Состояние объекта на любую дату: можно строить динамику, а не только срез.
Оплата за сбор
Читать собранное бесплатно: кэшировать у себя ради экономии не нужно.
Предсказуемые ответы
Пока объект собирается, приходит статус, а не ошибка: ретраи не нужны.
Какие источники закрывают задачу
Ни один источник не отвечает на вопрос целиком. Ниже те, что нужны именно для этой работы.
| Источник | Что даёт для задачи |
|---|---|
| Все источники каталога | Реестры, суды, производства, отчётность, закупки, проверки |
| Один метод | Запрос по естественному идентификатору объекта |
| Один формат | Одинаковая структура ответа и одинаковые статусы |
| Датированные снимки | История состояний для аналитики и отчётности |
| Собственный расчёт | Готовая оценка риска поверх собранных данных |
| Кредиты вместо запросов | Тариф не наказывает за частое чтение |
Весь каталог: источники данных →
Как это выглядит в коде
Один и тот же код для любого источника: меняется только адрес метода.
# одинаковый вызов для всех источников каталога
def fetch(source, **params):
r = requests.get(
f"{API_BASE}/api/v3/{source}",
params=params,
headers={"Authorization": f"Bearer {TOKEN}"},
).json()
# объект ещё собирается: статус, а не ошибка
if r.get("status") in ("queued", "card-parsed"):
return None
return r["result"]
company = fetch("company", inn=inn)
cases = fetch("case", case=case_number)
finance = fetch("finance", inn=inn)Возьмите готовый слой данных
Дадим тестовый доступ и базовый адрес: соберите прототип на реальных данных до всякого договора.
manager@kazna.tech