DEV Community

Cover image for KRS Scraper: Pełne Nazwiska Zarządu z KRS
Peter
Peter

Posted on • Originally published at apify.com

KRS Scraper: Pełne Nazwiska Zarządu z KRS

TL;DR

  • KRS (Krajowy Rejestr Sądowy) to oficjalny rejestr spółek, fundacji i stowarzyszeń w Polsce
  • Oficjalne API (api-krs.ms.gov.pl) celowo anonimizuje dane osobowe - nazwiska stają się L******
  • Odpis PDF z tego samego portalu rządowego zawiera pełne, niezanonimizowane dane
  • Zbudowałem KRS dane zarządu scraper na Apify, który replikuje szyfrowanie AES portalu i pobiera odpisy PDF - zwraca JSON z pełnymi nazwiskami zarządu za $0.04 za firmę

Czym jest KRS i dlaczego dane zarządu są kluczowe

KRS - Krajowy Rejestr Sądowy - to centralny rejestr podmiotów gospodarczych prowadzony przez Ministerstwo Sprawiedliwości. Każda polska spółka z o.o., spółka akcyjna, fundacja i stowarzyszenie musi być tu zarejestrowana. Rejestr zawiera dane ponad 800 000 podmiotów, w tym ich formę prawną, adres siedziby, kapitał zakładowy oraz - co kluczowe - nazwiska członków zarządu, rady nadzorczej i wspólników.

Dane o zarządzie to fundament prospectingu B2B, compliance i due diligence w Polsce. Jeśli oceniasz potencjalnego dostawcę, weryfikujesz kto kontroluje firmę na potrzeby KYC/AML, albo budujesz listę decydentów do cold outreach - potrzebujesz nazwisk osób, które faktycznie prowadzą te firmy. Problem polega na tym, że najwygodniejszy sposób dostępu do danych KRS - oficjalne API - celowo ukrywa właśnie te informacje.

Dlaczego API KRS anonimizuje nazwiska

Oficjalne API KRS na api-krs.ms.gov.pl zwraca dane spółek, ale z ukrytymi danymi osobowymi:

{
  "nazwa": "EXAMPLE SP. Z O.O.",
  "reprezentacja": {
    "sklad": [
      { "nazwisko": "L******", "imiona": "A***" }
    ]
  }
}
Enter fullscreen mode Exit fullscreen mode

To bezużyteczne, jeśli potrzebujesz wiedzieć kto faktycznie zarządza firmą. Stanowisko rządu jest niespójne - dane osobowe w KRS są publiczne z mocy prawa, publikowane w Monitorze Sądowym i Gospodarczym. Każdy może przyjść do sądu rejonowego i zamówić odpis za kilka złotych. Ale API redaguje nazwiska, powołując się na RODO, jednocześnie udostępniając te same dane w formie PDF na tym samym portalu.

Ta niespójność tworzy praktyczną lukę - programiści budujący systemy automatyczne nie mogą uzyskać ustrukturyzowanych danych o nazwiskach przez oficjalną ścieżkę API.

Jak działa KRS dane zarządu scraper

Portal wyszukiwarka-krs.ms.gov.pl oferuje odpisy PDF zawierające pełne, niezanonimizowane dane. Zarząd, rada nadzorcza, wspólnicy - wszystko z kompletnymi nazwiskami.

Haczyk: pobranie tych PDF-ów wymaga replikacji dwóch mechanizmów bezpieczeństwa portalu.

Szyfrowanie AES-128-CBC

Numer KRS jest szyfrowany przed wysłaniem do API. Klucz szyfrowania?

TopSecretApiKey1
Enter fullscreen mode Exit fullscreen mode

Tak, naprawdę. Klucz jest zahardcodowany w JavaScript frontendu Angular. IV (wektor inicjalizacji) = klucz. Każdy kto przejrzy źródło frontendu może zreplikować szyfrowanie - i dokładnie to robi scraper.

Steganografia Tokenowa

Po zaszyfrowaniu portal generuje 512-znakowy token, który ukrywa numer KRS i timestamp na określonych pozycjach tablicy:

  1. Tworzy tablicę 512 losowych znaków alfanumerycznych
  2. Wstawia zaszyfrowany KRS na pozycje np. [193, 8, 327, 501, 112, 74, 409, 226, 16, 306]
  3. Wstawia sumę kontrolną na pozycje [24, 46, 174, 345]
  4. Wykonuje circular right-shift na całej tablicy
  5. Łączy w string i wysyła jako parametr API

Scraper replikuje cały proces generowania tokenu, a następnie parsuje pobrany PDF na ustrukturyzowane pola JSON.

KRS dane zarządu: co dostajesz

Pole Przykład
companyName EXAMPLE SP. Z O.O.
krsNumber 0000019193
nip 5261006099
regon 010058960
legalForm SPÓŁKA Z OGRANICZONĄ ODPOWIEDZIALNOŚCIĄ
address ul. Przykładowa 1, 00-001 Warszawa
boardMembers [{fullName, firstName, surname, role}]
supervisoryBoard [{fullName, firstName, surname, role}]
shareholders [{name, sharesValue, sharesCount}]
shareCapital 500000.00

Dostępne są dwa typy odpisów: aktualny (tylko bieżący stan) i pelny (pełna historia zmian - byli członkowie zarządu, zmiany adresu, zmiany kapitału).

Jak używać KRS Scraper

Python

from apify_client import ApifyClient

client = ApifyClient("YOUR_API_TOKEN")

run = client.actor("minute_contest/krs-fullnames-scraper").call(
    run_input={
        "krsNumbers": ["0000019193", "0000366824"],
        "extractType": "aktualny"  # 'aktualny' = bieżące, 'pelny' = pełna historia
    }
)

items = client.dataset(run["defaultDatasetId"]).list_items().items
for company in items:
    print(f"{company['companyName']} (KRS: {company['krsNumber']})")
    for member in company.get("boardMembers", []):
        print(f"  {member['role']}: {member['fullName']}")
Enter fullscreen mode Exit fullscreen mode

JavaScript (Node.js)

import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });

const run = await client.actor('minute_contest/krs-fullnames-scraper').call({
    krsNumbers: ['0000019193', '0000366824'],
    extractType: 'aktualny'
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
for (const company of items) {
    console.log(`${company.companyName} - NIP: ${company.nip}`);
    company.boardMembers.forEach(m => console.log(`  ${m.role}: ${m.fullName}`));
}
Enter fullscreen mode Exit fullscreen mode

Praktyczny przypadek: prospecting B2B na polskim rynku

Wyobraź sobie, że jesteś SDR-em w firmie SaaS celującej w polskie średnie firmy. Masz listę 500 numerów KRS z katalogu branży. Musisz znaleźć prezesa zarządu każdej firmy do spersonalizowanego outreach.

Bez tego scrapera Twoje opcje to: (1) odwiedzić wyszukiwarka-krs.ms.gov.pl 500 razy i ręcznie pobrać każdy PDF, (2) zapłacić 900-2200 zł/mies. za subskrypcję komercyjnego dostawcy danych, (3) użyć API i dostać L****** zamiast nazwisk.

Z KRS scraperem przekazujesz wszystkie 500 numerów KRS w jednym wywołaniu API. W ciągu kilku minut dostajesz JSON z pełnym nazwiskiem i rolą każdego członka zarządu. Filtruj po PREZES ZARZĄDU i masz listę do outreach - ze zweryfikowanymi NIP i REGON do porównania z innymi rejestrami.

Całkowity koszt: około 85 zł za 500 firm.

Kto potrzebuje danych o zarządzie z KRS

  • Sprzedaż B2B - znajdź imiona i nazwiska decydentów przed cold outreach
  • Compliance KYC/AML - zweryfikuj kto kontroluje firmę
  • Due diligence - sprawdź skład zarządu przed inwestycją
  • Ryzyko kredytowe - sprawdź powiązania między firmami przez wspólnych członków zarządu
  • Kancelarie prawne - identyfikacja stron w sporach i negocjacjach kontraktowych

Porównanie cen KRS Scraper

Dostawca Model Koszt za 100 firm
Oficjalne API KRS Darmowe 0 zł (ale nazwiska ukryte)
Transparent Data Subskrypcja ~130 zł
MGBI Subskrypcja 900-2200 zł/mies.
Ten aktor Pay-per-use ~17 zł

Darmowe $5 kredytów Apify = ~125 firm za darmo.

FAQ

Czy dane o zarządzie z KRS są legalnie publiczne?

Tak. KRS jest rejestrem publicznym z mocy ustawy (Ustawa o Krajowym Rejestrze Sądowym). Każdy może zamówić pełny odpis w sądzie rejonowym za niewielką opłatę. Dane są też publikowane w Monitorze Sądowym i Gospodarczym. Anonimizacja w API to decyzja polityczna rządu, nie wymóg prawny - odpisy PDF z tego samego portalu zawierają pełne nazwiska.

Czy mogę szukać firm po NIP zamiast numeru KRS?

KRS dane zarządu scraper przyjmuje numery KRS jako input. Jeśli masz tylko NIP, możesz najpierw użyć oficjalnego endpointu wyszukiwania API KRS, żeby znaleźć odpowiadający numer KRS, a następnie przekazać go do aktora. Alternatywnie, aktor eKRS do sprawozdań finansowych z tej serii przyjmuje NIP bezpośrednio.

Jak aktualne są dane?

Scraper pobiera oficjalny odpis z portalu Ministerstwa Sprawiedliwości w czasie rzeczywistym. Dane odzwierciedlają aktualny stan rejestru KRS - typowo aktualizowany w ciągu kilku dni od złożenia wniosku w sądzie. To te same dane, które dostałbyś odwiedzając portal ręcznie.

Wypróbuj: apify.com/minute_contest/krs-fullnames-scraper


Ten artykuł jest częścią serii Polish Business Data APIs o programistycznym dostępie do polskich rejestrów publicznych.

Top comments (0)