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***" }
]
}
}
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
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:
- Tworzy tablicę 512 losowych znaków alfanumerycznych
- Wstawia zaszyfrowany KRS na pozycje np.
[193, 8, 327, 501, 112, 74, 409, 226, 16, 306] - Wstawia sumę kontrolną na pozycje
[24, 46, 174, 345] - Wykonuje circular right-shift na całej tablicy
- Łą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']}")
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}`));
}
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)