Кейси12 листопада 2026 р.5 хв читання

Кейс: пошук судових рішень на 25 млн документів

Як ми будуємо sud.initask.com: реєстр судових рішень річними архівами, номер справи числом, сторони-компанії за ЄДРПОУ, маска персональних даних і моніторинг.


Юрист перед договором хоче знати, чи судиться контрагент, з ким і чим закінчились справи. Кредитний відділ перевіряє позичальника, бухгалтер нового постачальника. Реєстр судових рішень відкритий, але його офіційний пошук незручний для такої задачі: він шукає документи, а людині потрібна картина по компанії і сповіщення про нові справи. Ми будуємо sud.initask.com, сервіс зі сторінками справ, рішень, судів і компаній-сторін. Цей текст описує, як він влаштований, і чесно показує, яка частина ще в роботі.

Задача

  • Показати справи і рішення за кодом ЄДРПОУ, назвою сторони і номером справи.
  • Зробити сторінки судів і категорій з оглядами за місяцями.
  • Дати платний моніторинг: лист щоранку, коли одна з компаній стає стороною нового рішення.
  • Повʼязати сервіс з реєстром компаній і перевіркою контрагентів.
  • Поважати приватність: у судових рішеннях багато персональних даних людей.

Масштаб

Реєстр судових рішень один з найбільших відкритих наборів даних в Україні. Кожне рішення має дату, суд, форму судочинства, категорію, суддю і посилання на файл тексту, а тексти зберігаються у форматі RTF у старому кодуванні. Працювати з таким масивом на одному сервері можна, але кожне рішення про схему бази і порядок завантаження відчутно впливає на розмір і швидкість.

Станом на 26 вересня 2026 року в базі 24 948 354 документи, 10 202 360 справ і 625 судів, карта сайту містить понад 1,15 мільйона адрес. Метадані рішень уже на сайті. Тексти рішень і сторони-компанії наповнюються окремою чергою, тому сторінки компаній зʼявляються поступово, коли для них розібрано достатньо рішень.

Рішення

Одиниця оновлення це рік

Державна судова адміністрація публікує реєстр річними архівами. Архів поточного року перезбирається щодня, минулі роки оновлюються раз на кілька тижнів. Щоденних чи інкрементних наборів немає. Тому сервіс стежить за датою ресурсу кожного року і пропускає незмінені рядки без звернення до бази. Якщо завантаження року обірвалось, воно продовжується з місця збою: кожна пачка в тій самій транзакції пише, скільки рядків архіву вже в базі. Перезібраний архів проходиться з початку, а наявні рядки пропускаються зі швидкістю близько 100 тисяч на секунду.

Вилучені рішення

Рішення зі статусом «вилучене» прибирається щодня з усіх таблиць з поправкою лічильників, а його сторінка відповідає кодом 410. Пошуковик розуміє цей код як «сторінку видалено назавжди» і прибирає її з видачі.

Номер справи числом

Єдиний номер справи виду «код суду/номер/рік» кодується одним числом. Рядок номера з унікальним індексом важив більше за саме рішення, а на десятках мільйонів записів це гігабайти. Старі номери повторюються між судами, тому їхній ключ містить код суду.

Сторони-компанії

Сторони визначаються за кодом ЄДРПОУ з перевіркою контрольної суми, назвою і роллю. Одна пастка: код поруч зі словами «отримувач», «рахунок», «класифікація доходів» належить реквізитам судового збору. Без цього фільтра казначейство стало б учасником тисяч справ, у яких воно не бере участі.

Приватність

Повні тексти обробляються лише для цивільних, господарських і адміністративних справ, де сторони переважно компанії. Кримінальні справи і адмінправопорушення стосуються людей, тому сторінка такого рішення показує метадані і веде на оригінал у державному реєстрі. Персональні дані в текстах маскуються.

Стабільність запису

Одного разу повне завантаження впало після півтора мільйона рядків 2026 року з помилкою блокування бази: два процеси писали одночасно, і відкладена транзакція отримувала конфлікт миттєво, без очікування. Тепер кожен запис іде через транзакцію з негайним захопленням і повтором, завантаження комітить по 5 000 рядків, а процеси домовляються через оренду з обмеженим строком: якщо процес загинув, оренда сама звільняється за 15 хвилин. Сценарій відтворено автоматичним тестом.

Резервні копії

Повний знімок тому на десятки гігабайтів під час оновлення не робиться: реєстр можна завантажити заново. Окремо зберігається лише те, що відновити неможливо: підписники, статті, службові позначки.

Стек

  • Node.js 22 без зовнішніх залежностей, вбудований SQLite з режимом WAL і тайм-аутом очікування.
  • Потоковий читач ZIP з підтримкою ZIP64, розбір RTF у кодуванні windows-1251 у текст абзацами.
  • Агрегати для хабів і оглядів ведуться приростом під час завантаження, тому сторінки суду і категорії відкриваються швидко.
  • Моніторинг з ключем каси, зашифрованим AES-GCM, і розсилкою через спільний поштовий сервіс мережі.
  • Docker на віртуальній машині Azure, карта сайту частинами, IndexNow для свіжих текстів.
  • Тести без мережі з фікстурами з реального архіву 2026 року і пʼятьма справжніми RTF.

Що отримує користувач

  • Пошук справ за назвою, кодом компанії і номером справи.
  • Сторінку справи з усіма рішеннями, сторонами і датами.
  • Сторінки судів і категорій з помісячною статистикою.
  • Моніторинг до 50 компаній з листом щоранку о 07:00 про нові рішення: платний доступ готується до запуску разом з наповненням сторін.
  • Перехід до картки компанії в реєстрі і до повної перевірки контрагента.

Про роботу ШІ в юридичній практиці читайте у статті ШІ для юриста.

Уроки

Регулярні вирази в JavaScript за замовчуванням знають лише латиницю. Шаблон «третя особа» не спрацьовував, бо символьний клас слова не включав кирилицю. Усюди, де текст український, використовуються класи Unicode.

Свіжість даних треба перевіряти фактом. Позначка останнього дня в базі одного разу показала місце збою завантаження замість дати джерела. Тепер стан завантаження видно в перевірці здоровʼя сервісу.

Сервіс мусить бути чесним про те, що вже є. Поки тексти наповнюються, сторінки показують метадані і посилання на оригінал, а сторінки компаній зʼявляються з першими розібраними рішеннями.

Для кого сервіс

Юрист компанії. Перед підписанням договору перевіряє, чи є в контрагента справи з іншими постачальниками і чим вони закінчились.

Юридична фірма. Стежить за справами клієнтів і їхніх контрагентів і отримує лист, щойно зʼявилось нове рішення.

Фінансист і кредитний відділ. Бачить судові спори позичальника про стягнення боргу, які часто сигналізують про проблеми з оплатою раніше за звітність.

Бухгалтер. Перевіряє нового постачальника разом з карткою в реєстрі і досьє контрагента.

Як це повʼязано з іншими сервісами

Сторінка компанії в судових рішеннях посилається на її картку в реєстрі, а картка реєстру показує блок з кількістю справ. Повна перевірка контрагента бере судові справи як одне з джерел поруч з санкційними переліками, реєстрами і податковим боргом. Так людина, яка прийшла з пошуку на одну сторінку, отримує повну картину по компанії в кілька кліків.

Чому SQLite на десятках мільйонів рядків

Для сервісу, який переважно читає і пише пачками одним процесом, вбудована база дає простоту: один файл, жодного окремого сервера баз даних, копія одним файлом. Обмеження теж відомі: запис має йти через одну чергу, а кожен запит треба міряти на повному обсязі. За цих умов сервіс на десятки мільйонів документів працює на одній машині, і витрати на інфраструктуру лишаються передбачуваними.

Потрібна система для юридичного відділу

Робимо сервіси моніторингу, пошуку по документах і контролю строків у напрямах розробка AI-агентів, RAG і база знань і парсинг і збір даних.

Опишіть, що потрібно відстежувати, у формі заявки. Оцінку дамо після брифу за робочий день.

Часті запитання

Звідки сервіс бере судові рішення?

З Єдиного державного реєстру судових рішень, який Державна судова адміністрація публікує на порталі відкритих даних річними архівами. Архів поточного року оновлюється щодня до кінця попереднього дня.

Чи показує сервіс рішення у кримінальних справах?

Для кримінальних справ і справ про адмінправопорушення сторінка показує метадані і посилання на оригінал. Повні тексти обробляються для цивільних, господарських і адміністративних справ, де сторонами найчастіше є компанії.

Що дає моніторинг судів контрагента?

Ви додаєте коди ЄДРПОУ компаній, і щоранку приходить лист про нові рішення, де одна з них є стороною: позов, відкриття провадження, рішення, постанова апеляції. Платний моніторинг запускається після наповнення сторін-компаній.

Потрібен такий агент у вашому бізнесі?

Проєктуємо, будуємо і запускаємо AI-агентів під ваш процес, зазвичай за 3-5 тижнів.