API KRSOpen API KRSodpis aktualny KRSodpis pełny KRSBiuletyn KRSKRS JSONdane spółekintegracje

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.

Zespół OutreachPilot8 listopada 202614 min czytania
API KRS: odpis aktualny w JSON, endpointy, pola i limity

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żkaParametryZwracaNasz test 1.11.2026
Odpis aktualny/api/krs/OdpisAktualny/{krs}rejestr=P (przedsiębiorcy) albo S (stowarzyszenia, fundacje), format=jsonobiekt odpis ze stanem bieżącym200, 63 KB, 0,3-0,6 s
Odpis pełny/api/krs/OdpisPelny/{krs}jak wyżejobiekt odpis z historią wszystkich wpisów200, 435 KB
Biuletyn dzienny/api/Krs/Biuletyn/{dzien}dzien jako RRRR-MM-DD, późniejszy niż 2021-12-08tablica numerów KRS zmienionych tego dnia30.10.2026: 4 871 pozycji, 3 242 unikalne
Biuletyn godzinowy/api/Krs/BiuletynGodzinowy/{dzien}?godzinaOd=GG&godzinaDo=GGgodziny od 00 do 23tablica numerów z okna godzin30.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żka odpisaktualny małymi literami zwróciła tę samą odpowiedź.
  • Numer KRS. Numer bez zer (28860) też zadziałał, ale numerKRS w 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, ale format=pdf dał HTTP 400. Wysyłaj format=json.
  • Parametr rejestr. Bez rejestr i format dostaliś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-After ani X-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żkaFormat i uwagi
Nazwaodpis.dane.dzial1.danePodmiotu.nazwawielkie litery, z formą prawną w nazwie
Forma prawnaodpis.dane.dzial1.danePodmiotu.formaPrawnanp. SPÓŁKA AKCYJNA
NIPodpis.dane.dzial1.danePodmiotu.identyfikatory.nip10 cyfr jako tekst
REGONodpis.dane.dzial1.danePodmiotu.identyfikatory.regonbywa 14 cyfr z zerami na końcu (61018820100000); w odpisie świeżej spółki z 1.10.2026 REGON-u jeszcze nie było
Siedzibaodpis.dane.dzial1.siedzibaIAdres.siedzibakraj, wojewodztwo, powiat, gmina, miejscowosc
Adresodpis.dane.dzial1.siedzibaIAdres.adresulica, nrDomu, nrLokalu, miejscowosc, kodPocztowy, poczta, kraj; ulica raz z prefiksem UL., raz bez
E-mailodpis.dane.dzial1.siedzibaIAdres.adresPocztyElektronicznejwielkie litery; gdy spółka go nie podała, klucza nie ma wcale
Strona wwwodpis.dane.dzial1.siedzibaIAdres.adresStronyInternetowejnp. WWW.ORLEN.PL, bez https://
Adres do e-Doręczeńodpis.dane.dzial1.siedzibaIAdres.adresDoDoreczenElektronicznychWpisanyDoBAEformat AE:PL-..., to nie jest skrzynka e-mail
Kapitał zakładowyodpis.dane.dzial1.kapital.wysokoscKapitaluZakladowegowartosc jako tekst z przecinkiem ("1451177561,25") i waluta
Kapitał PSAodpis.dane.dzial1.kapitalPSA.wysokoscKapitaluAkcyjnegoprosta spółka akcyjna ma osobne pole obok kapital
Data rejestracjiodpis.naglowekA.dataRejestracjiWKRSDD.MM.RRRR
Stan wpisuodpis.naglowekA.stanZDnia, numerOstatniegoWpisu, dataOstatniegoWpisudo wykrywania zmian; dataCzasOdpisu to tylko chwila wygenerowania odpowiedzi
PKD przeważająceodpis.dane.dzial3.przedmiotDzialalnosci.przedmiotPrzewazajacejDzialalnosci[0]kodDzial, kodKlasa, kodPodklasa, opis
PKD pozostałeodpis.dane.dzial3.przedmiotDzialalnosci.przedmiotPozostalejDzialalnosci[]ta sama budowa, bywa bez podklasy
Zarządodpis.dane.dzial2.reprezentacjanazwaOrganu, sposobReprezentacji (tekst), sklad[]
Rada nadzorczaodpis.dane.dzial2.organNadzoru[]nazwa, sklad[]
Prokurenciodpis.dane.dzial2.prokurenci[]osoba i rodzajProkury (tekst)
Wspólnicyodpis.dane.dzial1.wspolnicySpzoo[] (sp. z o.o.), odpis.dane.dzial1.wspolnicyPartnerzy[] (spółka jawna)zamaskowani jak zarząd
Sprawozdaniaodpis.dane.dzial3.wzmiankiOZlozonychDokumentach.wzmiankaOZlozeniuRocznegoSprawozdaniaFinansowego[]dataZlozenia, zaOkresOdDo
Zaległości, kurator, likwidacjaodpis.dane.dzial4, dzial5, dzial6pusty 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 nazwa zawierało nazwisko wspólnika, choć ten sam wspólnik w wspolnicyPartnerzy był zamaskowany.
  • Pola opisowe to wolny tekst przepisany z wpisu. Maskowanie ich nie obejmuje: w jednym z odpisów sprawdzonych 1.11.2026 pole rodzajProkury zawierało pełne imiona, nazwiska i numery PESEL prokurentów. Jeśli nie potrzebujesz pól rodzajProkury i sposobReprezentacji, 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:

  1. Nagłówek nazywa się odpis.naglowekP i ma listę wpis[] ze wszystkimi wpisami (numerWpisu, opis, dataWpisu, sygnatura akt, sąd). ORLEN miał 222 wpisy od rejestracji 19.07.2001.
  2. 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ł).
  3. 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 z 30-10-2026 dał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 404 rejestr=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łasnyWynik
Okres8.10.2026 16:33 do 1.11.2026 09:24, ponad 3 tygodnie
Tempo40 zapytań na minutę, zwykle 50-58 tys. numerów na dobę
Sprawdzone numery1 175 945, w tym ok. 49,3 tys. w czasie awarii (do ponownego sprawdzenia)
HTTP 4290
HTTP 5xx0 w dziennych odczytach logu
Błędy sieci13 numerów z „fetch failed” po 3 próbach, zwykle parami i najczęściej ok. 23:00
Timeouty i urwany JSONpojedyncze przypadki, ponowienie pomagało
Awariaod 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ć:

  1. Sprawdzaj Content-Type przed parsowaniem. Poprawny odpis ma application/json; HTML przy statusie 200 to błąd przejściowy, nie brak spółki.
  2. Parsuj w try. Urwana odpowiedź daje błąd parsowania, a ponowienie zwykle pomaga. W Node błąd sieci widać jako TypeError: fetch failed.
  3. Ponawiaj z rosnącym odstępem i losowym rozrzutem (2, 4, 8 s), z limitem czasu na zapytanie (u nas 15 s).
  4. Nie przesuwaj kursora po błędzie i nie oznaczaj numeru jako pustego, tylko wrzuć go do kolejki ponowień.
  5. Po serii błędów z rzędu wstrzymaj całą kolejkę na kilkanaście minut: 40-godzinnej przerwy nie przeczeka backoff jednego zapytania.
  6. 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śmyCo zrobić
200, application/jsonodpis albo Biuletynparsuj
200, text/htmlprzerwa techniczna 16-18.10.2026błąd przejściowy, ponów później
204 bez treściodpis aktualny spółki wykreślonej z KRS (30.09.2026)zapisz jako wykreśloną, historię weź z OdpisPelny
400numer z literami (abc), format=pdf, data Biuletynu 30-10-2026błąd po Twojej stronie, nie ponawiaj
404brak podmiotu w tym rejestrze, np. spółka z P zapytana z rejestr=Ssprawdź drugi rejestr; 404 w obu oznacza nieużywany numer
5xxw dokumentacji jako błąd usługi; u nas nie wystąpiłponów z odstępem
429nie 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, pole krs), ale z limitem 100 zapytań search na 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.

ZadanieSamo Open API KRSOutreachPilot.pl
Dane spółki po numerze KRSjedno zapytanie GETwyszukiwarka w aplikacji po numerze KRS
Dane spółki po NIPmost przez Białą listę (100 zapytań na dobę) i drugie zapytanieSprawdź NIP bez rejestracji; w aplikacji po NIP, KRS albo REGON
Nowe spółki z ostatnich dniBiuletyn, odpis każdego numeru, porównanie dat, własny filtr PKDRadar: 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 KRSok. 1,28 mln numerów i własna bazajeszcze nie (kopia rejestru w budowie)
Firmy jednoosobowe po PKD i mieścieto już nie KRS, tylko CEIDG z osobnym APIbaza firm CEIDG w wyszukiwarce aplikacji
E-mail do firmytylko gdy spółka wpisała go do KRSwyszukiwanie i weryfikacja adresu przed wysyłką
Kampania do wybranych firmpoza zakresem APIwysył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

API CEIDGCEIDG APIHurtownia danych CEIDG

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.

10 listopada 202614 min