API KRS: odpis aktualny w JSON, endpointy, pola i limity
Przewodnik po Open API KRS dla programisty: adresy OdpisAktualny, OdpisPelny i Biuletyn, ścieżki pól JSON, kody błędów, limity i kod w curl, Node i Pythonie.
Krótka odpowiedź
Open API KRS to bezpłatne REST API Ministerstwa Sprawiedliwości pod adresem api-krs.ms.gov.pl. Bez klucza i rejestracji zwraca w JSON odpis aktualny albo pełny podmiotu po numerze KRS oraz Biuletyn, czyli numery KRS zmienione danego dnia. Dokumentacja jest na prs.ms.gov.pl/krs/openApi. Wyszukiwania po nazwie, NIP ani PKD w API nie ma.
Poniżej: adresy i parametry, mapa pól JSON sprawdzona na prawdziwych odpowiedziach, kody błędów, limity i wzorzec kodu odpornego na awarie. Zapytania wykonaliśmy 1.11.2026 między 19:00 a 19:10, głównie na odpisie ORLEN S.A. (KRS 0000028860), a dane o niezawodności pochodzą z naszej kopii rejestru przedsiębiorców, pobieranej przez to API od 8.10.2026. Odpis do banku albo sądu, bez programowania, opisuje poradnik o odpisie KRS.
Jakie endpointy ma Open API KRS?
Dokumentacja na Portalu Rejestrów Sądowych (odczyt 1.11.2026, 19:00) opisuje cztery usługi GET pod adresem bazowym https://api-krs.ms.gov.pl. API uruchomiło Ministerstwo Sprawiedliwości 8.03.2022, a zakres danych odpowiada odpisowi aktualnemu i pełnemu.
| Usługa | Ścieżka | Parametry | Zwraca | Nasz test 1.11.2026 |
|---|---|---|---|---|
| Odpis aktualny | /api/krs/OdpisAktualny/{krs} | rejestr=P (przedsiębiorcy) albo S (stowarzyszenia, fundacje), format=json | obiekt odpis ze stanem bieżącym | 200, 63 KB, 0,3-0,6 s |
| Odpis pełny | /api/krs/OdpisPelny/{krs} | jak wyżej | obiekt odpis z historią wszystkich wpisów | 200, 435 KB |
| Biuletyn dzienny | /api/Krs/Biuletyn/{dzien} | dzien jako RRRR-MM-DD, późniejszy niż 2021-12-08 | tablica numerów KRS zmienionych tego dnia | 30.10.2026: 4 871 pozycji, 3 242 unikalne |
| Biuletyn godzinowy | /api/Krs/BiuletynGodzinowy/{dzien}?godzinaOd=GG&godzinaDo=GG | godziny od 00 do 23 | tablica numerów z okna godzin | 30.10.2026, okno 10-11: 622 pozycje, 443 unikalne |
Dokumentacja wymienia statusy 200, 404 (podmiot nie znaleziony) i 5xx (błąd usługi); w praktyce jest ich więcej, patrz sekcja o kodach odpowiedzi. Co sprawdziliśmy poza dokumentacją:
- Wielkość liter. Dokumentacja pisze
/api/krs/przy odpisach i/api/Krs/przy Biuletynie. Ścieżkaodpisaktualnymałymi literami zwróciła tę samą odpowiedź. - Numer KRS. Numer bez zer (
28860) też zadziałał, alenumerKRSw odpowiedzi ma zawsze 10 cyfr (0000028860). Normalizuj do 10 cyfr, żeby klucze w bazie się zgadzały. - Parametr
format. Według dokumentacji API zawsze zwraca JSON, aleformat=pdfdał HTTP 400. Wysyłajformat=json. - Parametr
rejestr. Bezrejestriformatdostaliśmy odpis z rejestru P. To zachowanie nieudokumentowane, więc podawaj rejestr jawnie. - Brak autoryzacji. Zapytania szły bez klucza, tokenu i ciasteczek. W nagłówkach nie ma
Retry-AfteraniX-RateLimit.
PDF-u odpisu API nie generuje. Karta podmiotu w wyszukiwarce KRS ma przyciski PDF i JSON dla informacji aktualnej i pełnej (odczyt 29.10.2026).
Jak pobrać odpis aktualny z API KRS?
Wystarczy zwykły GET. Przykłady pobierają odpis ORLEN S.A. i wypisują nazwę oraz NIP; uruchomiliśmy je 1.11.2026 o 19:09 (Node 24, Python z requests 2.34). Najpierw curl z jq:
curl -s -H "Accept: application/json" \ "https://api-krs.ms.gov.pl/api/krs/OdpisAktualny/0000028860?rejestr=P&format=json" \ | jq '.odpis.dane.dzial1.danePodmiotu | {nazwa, formaPrawna, nip: .identyfikatory.nip}'
Wersja dla Node 18 i nowszych, z wbudowanym fetch. Funkcja od razu obsługuje pułapki opisane niżej: 404, 204, HTML przy statusie 200, urwany JSON i błędy sieci.
// krs.mjs, Node 18+ const BASE = "https://api-krs.ms.gov.pl/api/krs"; const sleep = (ms) => new Promise((r) => setTimeout(r, ms)); export class BladTrwaly extends Error {} export async function pobierzOdpis(numer, rejestr = "P", proby = 4) { const krs = String(numer).replace(/\D/g, "").padStart(10, "0"); const url = `${BASE}/OdpisAktualny/${krs}?rejestr=${rejestr}&format=json`; for (let proba = 1; proba <= proby; proba++) { try { const res = await fetch(url, { headers: { Accept: "application/json" }, signal: AbortSignal.timeout(15_000), }); if (res.status === 404) return { status: "brak", krs, rejestr }; if (res.status === 204) return { status: "wykreslony", krs, rejestr }; if (res.status === 400) throw new BladTrwaly(`HTTP 400: ${url}`); const typ = res.headers.get("content-type") ?? ""; if (res.ok && typ.includes("application/json")) { const dane = JSON.parse(await res.text()); // urwany JSON rzuci błąd i wróci do pętli return { status: "ok", krs, rejestr, odpis: dane.odpis }; } // 429, 5xx albo 200 z HTML-em („Przerwa techniczna”): błąd przejściowy throw new Error(`HTTP ${res.status}, Content-Type: ${typ}`); } catch (err) { if (err instanceof BladTrwaly || proba === proby) throw err; await sleep(Math.min(60_000, 2_000 * 2 ** (proba - 1)) + Math.random() * 1_000); } } } export const kodPkd = ({ kodDzial, kodKlasa, kodPodklasa }) => [kodDzial, kodKlasa, kodPodklasa].filter(Boolean).join("."); const wynik = await pobierzOdpis(28860); const podmiot = wynik.odpis.dane.dzial1.danePodmiotu; const pkd = wynik.odpis.dane.dzial3.przedmiotDzialalnosci; console.log(podmiot.nazwa, podmiot.identyfikatory.nip); console.log("PKD przeważające:", kodPkd(pkd.przedmiotPrzewazajacejDzialalnosci[0]));
To samo w Pythonie z biblioteką requests:
import random import time import requests BASE = "https://api-krs.ms.gov.pl/api/krs" class BladTrwaly(Exception): pass def pobierz_odpis(numer, rejestr="P", proby=4): krs = "".join(c for c in str(numer) if c.isdigit()).zfill(10) url = f"{BASE}/OdpisAktualny/{krs}" for proba in range(1, proby + 1): try: r = requests.get( url, params={"rejestr": rejestr, "format": "json"}, headers={"Accept": "application/json"}, timeout=15, ) if r.status_code == 404: return {"status": "brak", "krs": krs, "rejestr": rejestr} if r.status_code == 204: return {"status": "wykreslony", "krs": krs, "rejestr": rejestr} if r.status_code == 400: raise BladTrwaly(f"HTTP 400: {r.url}") typ = r.headers.get("Content-Type", "") if r.ok and "application/json" in typ: return {"status": "ok", "krs": krs, "rejestr": rejestr, "odpis": r.json()["odpis"]} # 429, 5xx albo 200 z HTML-em („Przerwa techniczna”): błąd przejściowy raise RuntimeError(f"HTTP {r.status_code}, Content-Type: {typ}") except BladTrwaly: raise except (requests.RequestException, ValueError, RuntimeError): if proba == proby: raise time.sleep(min(60, 2 * 2 ** (proba - 1)) + random.random()) wynik = pobierz_odpis("0000028860") podmiot = wynik["odpis"]["dane"]["dzial1"]["danePodmiotu"] print(podmiot["nazwa"], podmiot["identyfikatory"]["nip"])
Oba skrypty wypisały 1.11.2026 ORLEN SPÓŁKA AKCYJNA 7740001454, a Node dodatkowo PKD przeważające 19.20.Z.
Mapa najważniejszych pól JSON odpisu aktualnego
Odpis aktualny ma trzy części: odpis.rodzaj ("Aktualny"), nagłówek odpis.naglowekA i dane w odpis.dane, podzielone na działy 1-6 jak w papierowym odpisie. Ścieżki sprawdziliśmy 1.11.2026 na odpisach spółki akcyjnej i jawnej oraz na zapisanym odpisie nowej sp. z o.o. z 1.10.2026.
| Dane | Ścieżka | Format i uwagi |
|---|---|---|
| Nazwa | odpis.dane.dzial1.danePodmiotu.nazwa | wielkie litery, z formą prawną w nazwie |
| Forma prawna | odpis.dane.dzial1.danePodmiotu.formaPrawna | np. SPÓŁKA AKCYJNA |
| NIP | odpis.dane.dzial1.danePodmiotu.identyfikatory.nip | 10 cyfr jako tekst |
| REGON | odpis.dane.dzial1.danePodmiotu.identyfikatory.regon | bywa 14 cyfr z zerami na końcu (61018820100000); w odpisie świeżej spółki z 1.10.2026 REGON-u jeszcze nie było |
| Siedziba | odpis.dane.dzial1.siedzibaIAdres.siedziba | kraj, wojewodztwo, powiat, gmina, miejscowosc |
| Adres | odpis.dane.dzial1.siedzibaIAdres.adres | ulica, nrDomu, nrLokalu, miejscowosc, kodPocztowy, poczta, kraj; ulica raz z prefiksem UL., raz bez |
odpis.dane.dzial1.siedzibaIAdres.adresPocztyElektronicznej | wielkie litery; gdy spółka go nie podała, klucza nie ma wcale | |
| Strona www | odpis.dane.dzial1.siedzibaIAdres.adresStronyInternetowej | np. WWW.ORLEN.PL, bez https:// |
| Adres do e-Doręczeń | odpis.dane.dzial1.siedzibaIAdres.adresDoDoreczenElektronicznychWpisanyDoBAE | format AE:PL-..., to nie jest skrzynka e-mail |
| Kapitał zakładowy | odpis.dane.dzial1.kapital.wysokoscKapitaluZakladowego | wartosc jako tekst z przecinkiem ("1451177561,25") i waluta |
| Kapitał PSA | odpis.dane.dzial1.kapitalPSA.wysokoscKapitaluAkcyjnego | prosta spółka akcyjna ma osobne pole obok kapital |
| Data rejestracji | odpis.naglowekA.dataRejestracjiWKRS | DD.MM.RRRR |
| Stan wpisu | odpis.naglowekA.stanZDnia, numerOstatniegoWpisu, dataOstatniegoWpisu | do wykrywania zmian; dataCzasOdpisu to tylko chwila wygenerowania odpowiedzi |
| PKD przeważające | odpis.dane.dzial3.przedmiotDzialalnosci.przedmiotPrzewazajacejDzialalnosci[0] | kodDzial, kodKlasa, kodPodklasa, opis |
| PKD pozostałe | odpis.dane.dzial3.przedmiotDzialalnosci.przedmiotPozostalejDzialalnosci[] | ta sama budowa, bywa bez podklasy |
| Zarząd | odpis.dane.dzial2.reprezentacja | nazwaOrganu, sposobReprezentacji (tekst), sklad[] |
| Rada nadzorcza | odpis.dane.dzial2.organNadzoru[] | nazwa, sklad[] |
| Prokurenci | odpis.dane.dzial2.prokurenci[] | osoba i rodzajProkury (tekst) |
| Wspólnicy | odpis.dane.dzial1.wspolnicySpzoo[] (sp. z o.o.), odpis.dane.dzial1.wspolnicyPartnerzy[] (spółka jawna) | zamaskowani jak zarząd |
| Sprawozdania | odpis.dane.dzial3.wzmiankiOZlozonychDokumentach.wzmiankaOZlozeniuRocznegoSprawozdaniaFinansowego[] | dataZlozenia, zaOkresOdDo |
| Zaległości, kurator, likwidacja | odpis.dane.dzial4, dzial5, dzial6 | pusty obiekt {}, gdy nic nie wpisano |
Numeru telefonu w odpisie nie ma. Pola www i e-mail są puste, gdy spółka ich nie ma, bo art. 38 pkt 1a ustawy o KRS każe je wpisać tylko „w przypadku gdy podmiot je posiada”.
Kody PKD: przeważający i pozostałe
Kod składasz z kodDzial, kodKlasa i kodPodklasa: 19 + 20 + Z daje 19.20.Z. W pozostałych kodach ORLEN-u 5 z 9 pozycji nie miało podklasy (np. 20 + 1 to grupa 20.1); funkcja kodPkd z przykładu w Node obsługuje oba przypadki.
Starsze spółki mają kody PKD 2007, nowe PKD 2025 (np. 62.10.B zamiast 62.01.Z), a w sprawdzonych odpisach nie było pola z wersją klasyfikacji. Jak filtrować po obu naraz, opisujemy w tekście o nowych spółkach, a kody sprawdzisz w wyszukiwarce PKD.
Osoby: co jest zamaskowane, a co nie
W polach strukturalnych osób (zarząd, rada nadzorcza, prokurenci, wspólnicy) Open API zostawia pierwszą literę i gwiazdki, a z numeru PESEL pierwszą cyfrę. Kształt rekordu (litery podmienione):
{ "nazwisko": { "nazwiskoICzlon": "N*****" }, "imiona": { "imie": "J*******" }, "identyfikator": { "pesel": "7**********" }, "funkcjaWOrganie": "PREZES ZARZĄDU", "czyZawieszona": false }
Dostaniesz liczbę członków zarządu i ich funkcje, ale nie nazwiska. Łatwo przeoczyć dwie rzeczy:
- Nazwa nie jest maskowana. W sprawdzonym odpisie spółki jawnej pole
nazwazawierało nazwisko wspólnika, choć ten sam wspólnik wwspolnicyPartnerzybył zamaskowany. - Pola opisowe to wolny tekst przepisany z wpisu. Maskowanie ich nie obejmuje: w jednym z odpisów sprawdzonych 1.11.2026 pole
rodzajProkuryzawierało pełne imiona, nazwiska i numery PESEL prokurentów. Jeśli nie potrzebujesz pólrodzajProkuryisposobReprezentacji, nie zapisuj ich w swojej bazie.
Czym różni się odpis pełny od aktualnego?
Odpis aktualny pokazuje stan bieżący, a pełny całą historię wpisów. Ten sam adres z OdpisPelny zamiast OdpisAktualny zmienia trzy rzeczy:
- Nagłówek nazywa się
odpis.naglowekPi ma listęwpis[]ze wszystkimi wpisami (numerWpisu,opis,dataWpisu, sygnatura akt, sąd). ORLEN miał 222 wpisy od rejestracji 19.07.2001. - Prawie każde pole staje się tablicą wersji. Wersja ma
nrWpisuWprow(wpis, który ją wprowadził) i, jeśli już nie obowiązuje,nrWpisuWykr(wpis, który ją wykreślił). - Odpowiedź jest dużo większa: 435 KB zamiast 63 KB dla tej samej spółki.
Przykład z odpisu pełnego, pole odpis.dane.dzial1.danePodmiotu.nazwa:
"nazwa": [ { "nazwa": "POLSKI KONCERN NAFTOWY ORLEN SPÓŁKA AKCYJNA", "nrWpisuWykr": "151", "nrWpisuWprow": "1" }, { "nazwa": "ORLEN SPÓŁKA AKCYJNA", "nrWpisuWprow": "151" } ]
Bieżąca wartość to wersja bez nrWpisuWykr, a datę zmiany odczytasz z naglowekP.wpis po numerze wpisu. Odpis pełny przydaje się, gdy chcesz wiedzieć, kiedy zmieniła się nazwa, adres albo zarząd (zastosowania w sprzedaży opisuje osobny wpis). Do synchronizacji wystarczy odpis aktualny.
Spółka wykreślona z KRS zwraca w odpisie aktualnym HTTP 204 bez treści, a odpis pełny nadal oddaje jej historię (sprawdzone 30.09.2026 na spółce wykreślonej tego dnia; dokumentacja kodu 204 nie wymienia).
Jak działa Biuletyn KRS?
Biuletyn to dziennik zmian: dla wskazanego dnia zwraca numery KRS podmiotów, w których sąd coś wpisał. Nie mówi, co się zmieniło, więc po każdy numer i tak idziesz do odpisu. Co warto wiedzieć, zanim go użyjesz:
- Format dnia to
RRRR-MM-DD, dzień późniejszy niż 2021-12-08. Zapytanie z30-10-2026dało HTTP 400. - Odpowiedź to tablica tekstów, nie liczb, bez zer wiodących (
"2777") i z duplikatami: 30.10.2026 było 4 871 pozycji, ale 3 242 unikalne numery. - Biuletyn nie podaje rejestru. Numeracja jest wspólna dla P i S, więc sprawdzaj najpierw
rejestr=P, a przy 404rejestr=S. W naszej próbie 110 wpisów z Biuletynów z 22-30.09.2026 104 były w rejestrze P, 6 w S. - Bieżący dzień jest niepełny. Wpisy dochodzą do końca doby (1.10.2026 o 11:19 Biuletyn tego dnia miał 1 231 unikalnych numerów), więc dzień zamykaj dopiero następnego dnia.
- Biuletyn godzinowy zwraca to samo dla okna godzin: 30.10.2026 w oknie 10-11 było 622 pozycje (443 unikalne), wszystkie obecne też w Biuletynie dziennym.
Normalizacja numerów z Biuletynu w Node:
const res = await fetch("https://api-krs.ms.gov.pl/api/Krs/Biuletyn/2026-10-30", { headers: { Accept: "application/json" }, }); const numery = [...new Set(await res.json())].map((n) => n.padStart(10, "0")).sort(); console.log(numery.length); // 3242 dla 30.10.2026
Biuletyn służy do synchronizacji przyrostowej: po pełnym pobraniu odświeżasz tylko numery, które się w nim pojawiły. Pomaga też wykrywać nowe podmioty, ale nowej spółki nie rozpoznasz po samym numerze, bo numery nie rosną ściśle z datą wpisu: trzeba porównać dataRejestracjiWKRS z dniem Biuletynu. Jak z tego zrobić listę firm do kontaktu, opisuje wpis o nowych spółkach z KRS.
Jaki jest limit zapytań do API KRS?
Oficjalnego limitu nie znaleźliśmy: ani strona API Rejestrów Sądowych, ani komunikat o uruchomieniu API z 2022 r. go nie podają (odczyt 1.11.2026), a odpowiedzi nie mają nagłówków limitu. Mamy za to pomiar własny z kopii rejestru, pobieranej z jednego serwera:
| Pomiar własny | Wynik |
|---|---|
| Okres | 8.10.2026 16:33 do 1.11.2026 09:24, ponad 3 tygodnie |
| Tempo | 40 zapytań na minutę, zwykle 50-58 tys. numerów na dobę |
| Sprawdzone numery | 1 175 945, w tym ok. 49,3 tys. w czasie awarii (do ponownego sprawdzenia) |
| HTTP 429 | 0 |
| HTTP 5xx | 0 w dziennych odczytach logu |
| Błędy sieci | 13 numerów z „fetch failed” po 3 próbach, zwykle parami i najczęściej ok. 23:00 |
| Timeouty i urwany JSON | pojedyncze przypadki, ponowienie pomagało |
| Awaria | od 16.10 ok. 16:15 do 18.10 ok. 08:10: HTTP 200 z HTML-em zamiast JSON |
40 zapytań na minutę to nasze tempo, nie limit z dokumentacji: API nie odmówiło ani razu, ale granicy nie znamy.
Pułapka, o której nie piszą poradniki: od 16.10.2026 ok. 16:15 do 18.10.2026 ok. 08:10 API odpowiadało na zapytania kodem HTTP 200, ale z treścią
text/html: stroną „Przerwa techniczna”. Klient, który sprawdza tylko status, uzna to za sukces albo za brak danych. Nasz crawler zapisał wtedy ok. 49 tys. numerów jako nieczytelne i przesunął kursor, więc ten zakres trzeba pobrać jeszcze raz. Samego 17.10 log zanotował 15 192 błędy parsowania JSON. Awaria objęła też Biuletyn.
Jak się przed tym bronić:
- Sprawdzaj
Content-Typeprzed parsowaniem. Poprawny odpis maapplication/json; HTML przy statusie 200 to błąd przejściowy, nie brak spółki. - Parsuj w
try. Urwana odpowiedź daje błąd parsowania, a ponowienie zwykle pomaga. W Node błąd sieci widać jakoTypeError: fetch failed. - Ponawiaj z rosnącym odstępem i losowym rozrzutem (2, 4, 8 s), z limitem czasu na zapytanie (u nas 15 s).
- Nie przesuwaj kursora po błędzie i nie oznaczaj numeru jako pustego, tylko wrzuć go do kolejki ponowień.
- Po serii błędów z rzędu wstrzymaj całą kolejkę na kilkanaście minut: 40-godzinnej przerwy nie przeczeka backoff jednego zapytania.
- Trzymaj stałe tempo. 1,5 s między zapytaniami to najwyżej 40 na minutę.
Wzorzec kolejki z bezpiecznikiem, oparty na funkcji pobierzOdpis z przykładu wyżej:
const ODSTEP_MS = 1_500; // najwyżej 40 zapytań na minutę export async function przejdzNumery(numery, zapisz) { const doPonowienia = []; let bledyZRzedu = 0; for (const numer of numery) { try { await zapisz(await pobierzOdpis(numer)); bledyZRzedu = 0; } catch (err) { if (err instanceof BladTrwaly) { console.error(err.message); // zły numer lub parametr: popraw dane, nie ponawiaj } else { doPonowienia.push(numer); // numer wraca do kolejki, nie jest „pusty” if (++bledyZRzedu >= 5) { console.warn("API KRS nie oddaje JSON-a, pauza 15 min:", err.message); await sleep(15 * 60_000); bledyZRzedu = 0; } } } await sleep(ODSTEP_MS); } return doPonowienia; }
Kody odpowiedzi API KRS i co z nimi robić
| Odpowiedź | Kiedy ją widzieliśmy | Co zrobić |
|---|---|---|
200, application/json | odpis albo Biuletyn | parsuj |
200, text/html | przerwa techniczna 16-18.10.2026 | błąd przejściowy, ponów później |
| 204 bez treści | odpis aktualny spółki wykreślonej z KRS (30.09.2026) | zapisz jako wykreśloną, historię weź z OdpisPelny |
| 400 | numer z literami (abc), format=pdf, data Biuletynu 30-10-2026 | błąd po Twojej stronie, nie ponawiaj |
| 404 | brak podmiotu w tym rejestrze, np. spółka z P zapytana z rejestr=S | sprawdź drugi rejestr; 404 w obu oznacza nieużywany numer |
| 5xx | w dokumentacji jako błąd usługi; u nas nie wystąpił | ponów z odstępem |
| 429 | nie wystąpił przy 40 zapytaniach na minutę | gdyby się pojawił, zwolnij i ponów |
Odpowiedzi 400 i 404 mają treść JSON w formacie problem details, z polami type, title, status i traceId, więc w logu łatwo je odróżnić od awarii.
Czego Open API KRS nie da?
Kilku rzeczy, o które programiści pytają najczęściej, w API nie ma:
- Wyszukiwania po nazwie, NIP ani REGON. API przyjmuje tylko numer KRS. Po nazwie, NIP i REGON szuka wyszukiwarka KRS w przeglądarce. Numer KRS po NIP zwraca API Białej listy VAT (
https://wykazpodatnikowvat.mf.gov.pl/api/search/nip/{nip}?date=RRRR-MM-DD, polekrs), ale z limitem 100 zapytańsearchna dobę (Ministerstwo Finansów, odczyt 29.10.2026). - Listy spółek po PKD, mieście albo dacie. API nie ma filtrów, a Ministerstwo nie publikuje pliku z całym rejestrem (na dane.gov.pl jest tylko opis API, odczyt 29.10.2026). Pełną listę zbudujesz, sprawdzając kolejne numery od 1 do ok. 1,28 mln. Przy 40 zapytaniach na minutę to ok. 3,5-4 tygodni ciągłej pracy; tyle trwa nasze pierwsze przejście.
- Pełnych danych osób. Ustawa z 26.09.2025 (Dz.U. 2025 poz. 1556, w mocy od 29.11.2025) dodała do ustawy o KRS art. 4 ust. 4c-4m: dostęp do informacji z Rejestru przez usługi sieciowe po zgodzie Ministra Sprawiedliwości wydanej w drodze decyzji. Wniosek może złożyć podmiot publiczny albo podmiot realizujący zadania publiczne, gdy dostęp jest niezbędny do tych zadań, a art. 60a przewiduje karę za uzyskiwanie informacji tą drogą bez uprawnienia. Według Prawo.pl chodzi o dane wraz z imionami, nazwiskami i PESEL. Przesłanki dotyczą zadań publicznych, nie celów handlowych.
- Telefonu i sprawozdań finansowych. Telefonu odpis nie zawiera. W odpisie są tylko wzmianki o złożeniu sprawozdań, a same dokumenty pobierzesz po numerze KRS z Przeglądarki Dokumentów Finansowych (działała 1.11.2026).
Samo API czy gotowa baza?
Gdy potrzebujesz danych kilku spółek, których numery znasz, samo API wystarczy i nic nie kosztuje. Lista firm z branży i miasta to już utrzymanie kopii rejestru: ok. 1,28 mln numerów, dzienna delta z Biuletynu, obrona przed awariami, PKD w dwóch klasyfikacjach i weryfikacja adresów. Tę pracę wykonujemy w OutreachPilot.pl, więc nie musisz pisać crawlera. Stan na dziś: kopię rejestru przedsiębiorców budujemy od 8.10.2026 (stąd pomiar powyżej), a wyszukiwania po PKD i mieście w całym KRS jeszcze nie udostępniamy. Nowe spółki z Biuletynu i firmy z CEIDG po PKD i mieście są w aplikacji już teraz.
| Zadanie | Samo Open API KRS | OutreachPilot.pl |
|---|---|---|
| Dane spółki po numerze KRS | jedno zapytanie GET | wyszukiwarka w aplikacji po numerze KRS |
| Dane spółki po NIP | most przez Białą listę (100 zapytań na dobę) i drugie zapytanie | Sprawdź NIP bez rejestracji; w aplikacji po NIP, KRS albo REGON |
| Nowe spółki z ostatnich dni | Biuletyn, odpis każdego numeru, porównanie dat, własny filtr PKD | Radar: nowe spółki z KRS filtrowane po PKD (stare i nowe kody), mieście i województwie, w płatnych planach i trialu |
| Spółki po PKD i mieście z całego KRS | ok. 1,28 mln numerów i własna baza | jeszcze nie (kopia rejestru w budowie) |
| Firmy jednoosobowe po PKD i mieście | to już nie KRS, tylko CEIDG z osobnym API | baza firm CEIDG w wyszukiwarce aplikacji |
| E-mail do firmy | tylko gdy spółka wpisała go do KRS | wyszukiwanie i weryfikacja adresu przed wysyłką |
| Kampania do wybranych firm | poza zakresem API | wysyłka z Twojej skrzynki (Gmail, Google Workspace albo SMTP i IMAP) |
Co dokładnie pokazujemy z KRS, opisuje strona baza firm KRS, a skalę rejestrów porównuje wpis o liczbie firm w Polsce. Plan Free kosztuje 0 zł i daje 50 leadów miesięcznie, a nowe konto ma 14 dni planu Pro bez karty (cennik). Załóż darmowe konto, jeśli wolisz gotowe dane zamiast własnego crawlera. Do integracji z własnym systemem jest też REST API OutreachPilot.
Co mówi prawo o danych z KRS?
Krótko i bez porad prawnych, na podstawie ustawy o KRS w tekście jednolitym z 2025 r. i zmiany z Dz.U. 2025 poz. 1556:
- Jawność. Art. 8 ust. 1 brzmi: „Rejestr jest jawny.” Każdy ma prawo dostępu do danych przez Centralną Informację (ust. 2).
- Bezpłatny dostęp. Według art. 4 ust. 4a Centralna Informacja udostępnia bezpłatnie w sieci aktualne i pełne informacje o podmiotach.
- Ponowne wykorzystanie i API. Art. 4b przekazuje dane do ponownego wykorzystywania na zasadach ustawy o otwartych danych z 11.08.2021 i wprost wymienia API. Na te przepisy powołuje się dokumentacja Open API.
- Dane osobowe. Dokumentacja powołuje się też na RODO, a API maskuje osoby w polach strukturalnych. Nazwa spółki jawnej i pola opisowe mogą jednak zawierać imiona i nazwiska. Jeśli je przechowujesz, stosuje się RODO, m.in. obowiązek informacyjny z art. 14 (RODO w cold mailingu).
- Kontakt handlowy. Jawność rejestru nie rozstrzyga, czy możesz wysłać ofertę na adres z odpisu; opisujemy to przy art. 398 PKE.
To materiał informacyjny, nie porada prawna.
Najczęstsze pytania
Czy API KRS jest darmowe?
Tak. Open API KRS działa bez opłat, bez klucza i bez rejestracji, wystarczy zwykłe zapytanie GET. Bezpłatny dostęp do aktualnych i pełnych informacji z Rejestru przewiduje art. 4 ust. 4a ustawy o KRS, a dokumentacja API powołuje się na art. 4b o ponownym wykorzystywaniu danych.
Czy do API KRS potrzebny jest klucz albo token?
Nie. Wszystkie zapytania z tego przewodnika (1.11.2026) poszły bez nagłówków autoryzacji i bez ciasteczek, a dokumentacja nie wspomina o żadnym kluczu.
Jak wyszukać spółkę w API KRS po nazwie albo NIP?
W samym API się nie da, bo przyjmuje tylko numer KRS. Po nazwie, NIP i REGON szukasz w wyszukiwarce KRS Ministerstwa Sprawiedliwości, a numer KRS po NIP zwraca też API Białej listy VAT (100 zapytań wyszukiwania na dobę). Z numerem pytasz Open API o odpis.
Jaki jest limit zapytań API KRS?
Dokumentacja nie podaje limitu (odczyt 1.11.2026). W naszym pomiarze od 8.10 do 1.11.2026, przy 40 zapytaniach na minutę, nie dostaliśmy ani jednego HTTP 429. Większym ryzykiem są awarie, np. HTTP 200 ze stroną HTML „Przerwa techniczna” w dniach 16-18.10.2026.
Czy odpis z API KRS ma moc dokumentu urzędowego?
Przepisy nie rozstrzygają tego wprost. Art. 4 ust. 4aa ustawy o KRS zrównuje z dokumentami Centralnej Informacji samodzielnie pobrane wydruki komputerowe informacji z Rejestru, ale nie wspomina o danych JSON z API. Gdy potrzebujesz dokumentu dla urzędu, banku lub sądu, pobierz informację z wyszukiwarki KRS albo zamów odpis w Centralnej Informacji.
Czym różni się odpis aktualny od pełnego w API?
Odpis aktualny (OdpisAktualny) pokazuje bieżący stan wpisu, a pełny (OdpisPelny) całą historię: listę wpisów w naglowekP.wpis i każde pole jako tablicę wersji z numerami wpisów, które je wprowadziły i wykreśliły. Pełny bywa kilka razy większy (w naszym teście 435 KB wobec 63 KB).
Dlaczego API KRS zwraca 404 dla istniejącej spółki?
Najczęściej przez zły rejestr: spółki są w rejestrze przedsiębiorców (rejestr=P), a fundacje i stowarzyszenia bez działalności gospodarczej w rejestrze S. Numeracja jest wspólna, więc przy 404 spróbuj drugiego rejestru. Spółka wykreślona z KRS zwraca w odpisie aktualnym nie 404, tylko 204 bez treści.
Stan na 1 listopada 2026. Endpointy, parametry, kody i ścieżki pól sprawdziliśmy 14 zapytaniami GET do api-krs.ms.gov.pl 1.11.2026 w godz. 19:00-19:10 (odpisy ORLEN S.A. i spółki jawnej, Biuletyny z 30.10.2026, przykłady kodu). Dokumentację odczytaliśmy tego dnia na prs.ms.gov.pl/krs/openApi, przepisy w ISAP (Dz.U. 2025 poz. 869 i 1556). Limity i awarie to pomiar własny z dziennika kopii rejestru (8.10-1.11.2026); Biuletyn z 1.10.2026, próba 110 wpisów i kod 204 to pomiary własne z 30.09-1.10.2026.
Od czytania do pierwszej kampanii.
Znajdź firmy B2B w Google Maps, PKT.pl i CEIDG, a AI napisze maile po polsku. Każde konto zaczyna od 14 dni planu Pro bez karty.
14 dni Pro bez karty · potem Free 0 zł
Podobne artykuły
Odpis z KRS: jak pobrać za darmo (aktualny, pełny, PDF)
Jak pobrać bezpłatnie odpis aktualny i pełny z KRS jako PDF lub JSON, ile kosztuje odpis z Centralnej Informacji i co sprawdzić w odpisie kontrahenta.
API CEIDG v3: token, endpointy, limity i przykłady kodu
Przewodnik po API CEIDG v3 dla programisty: bezpłatny klucz z Hurtowni danych, endpointy /firmy i /firma, filtry, pola JSON, limity i kod w curl, JS i Pythonie.
MCP co to jest i jak podłączyć Claude i ChatGPT do leadów
MCP to otwarty standard, dzięki któremu Claude lub ChatGPT czyta dane konta sprzedażowego i wykonuje w nim akcje. Sprawdź, jak go podłączyć i czego pilnować.
