Dla programistów · REST i MCP

API KRS po NIP
REST/JSON bez klucza

Dane z Krajowego Rejestru Sądowego po numerze NIP — jednym zapytaniem GET, w odpowiedzi czysty JSON. Bez klucza API i bez rejestracji. Nie musisz znać numeru KRS: wyszukiwanie idzie po NIP, a w odpowiedzi dostajesz formę prawną, kapitał zakładowy, zarząd, sposób reprezentacji i kody PKD.

Jeden GET, jeden JSON

Endpoint jest publiczny, metoda GET, a parametr ?format=json zwraca dane maszynowo (bez niego dostajesz stronę HTML dla człowieka). Dane z KRS znajdziesz w polu krs:

curl "https://skanfirmy.pl/nip/5260250995?format=json"

W polu krs dostajesz komplet danych rejestrowych — numer KRS, nazwę, formę prawną, kapitał zakładowy, organ reprezentacji wraz ze sposobem reprezentacji, skład zarządu i kody PKD:

{
  "krs": {
    "numerKRS": "0000010681",
    "nazwa": "ORANGE POLSKA SPÓŁKA AKCYJNA",
    "formaPrawna": "SPÓŁKA AKCYJNA",
    "nip": "5260250995",
    "regon": "012100784",
    "opp": false,
    "adres": "AL. JEROZOLIMSKIE 160, 02-326, WARSZAWA",
    "kapital": "3937072437,00 PLN",
    "organ": "ZARZĄD SPÓŁKI",
    "sposobReprezentacji": "PREZES ŁĄCZNIE Z CZŁONKIEM ZARZĄDU",
    "sklad": ["CZŁONEK ZARZĄDU", "..."],
    "pkdMain": [{ "code": "61.10.B", "opis": "POZOSTAŁA DZIAŁALNOŚĆ W ZAKRESIE TELEKOMUNIKACJI ..." }],
    "pkdOther": [{ "code": "78.10.Z", "opis": "..." }],
    "dataRejestracji": "02.05.2001",
    "dataOstatniegoWpisu": "24.04.2026",
    "stanZDnia": "24.04.2026",
    "dataCzasOdpisu": "25.08.2026 14:59:57"
  }
}

Bez klucza API i bez rejestracji

Endpoint działa od razu — nie musisz zakładać konta ani generować klucza API. To celowa różnica względem komercyjnych nakładek na KRS: chcemy, żeby integrację dało się wpiąć w minutę, także z poziomu agenta AI. Serwis jest utrzymywany bezpłatnie; przy dużym, automatycznym ruchu prosimy tylko o rozsądek (pojedyncze zapytania inicjowane przez użytkowników, nie masowy scraping).

Wyszukiwanie po NIP, nie po numerze KRS

Oficjalne API KRS Ministerstwa Sprawiedliwości działa po numerze KRS — musisz go najpierw skądś mieć, a odpowiedź to pełny odpis w rozbudowanej strukturze JSON (osobno rubryki, działy i wpisy). W praktyce najczęściej masz jednak NIP, nie numer KRS. Nasz endpoint przyjmuje NIP, po stronie serwera znajduje właściwy wpis i zwraca spłaszczony, gotowy do użycia zestaw pól.

Co zwraca pole krs w odpowiedzi /nip/{nip}:

PoleZnaczenie
numerKRSNumer w Krajowym Rejestrze Sądowym
nazwa, formaPrawnaOficjalna nazwa i forma prawna (np. SPÓŁKA AKCYJNA, SPÓŁKA Z OGRANICZONĄ ODPOWIEDZIALNOŚCIĄ)
kapitalKapitał zakładowy (dla spółek kapitałowych)
organ, sposobReprezentacjiOrgan uprawniony do reprezentacji i zasada reprezentacji (kto i jak podpisuje w imieniu spółki)
skladLista osób w organie reprezentacji (skład zarządu)
pkdMain, pkdOtherKody PKD — przeważający i pozostałe — każdy jako { code, opis }
dataRejestracjiData pierwszego wpisu do KRS
oppZnacznik organizacji pożytku publicznego (true/false)

Jeśli podmiot nie figuruje w KRS (np. jednoosobowa działalność zarejestrowana wyłącznie w CEIDG), pole krs jest null, a pole krsError może wyjaśnić powód. W takim przypadku sięgnij po dane z rejestru REGON przez /regon/{nip}.

W Pythonie

Z biblioteką requests całość to kilka linii:

import requests

def dane_krs(nip: str) -> dict | None:
    r = requests.get(f"https://skanfirmy.pl/nip/{nip}?format=json", timeout=10)
    r.raise_for_status()
    return r.json().get("krs")

k = dane_krs("5260250995")
if k:
    print(k["formaPrawna"], "·", k["kapital"])
    for osoba in k["sklad"]:
        print(" -", osoba)
# SPÓŁKA AKCYJNA · 3937072437,00 PLN

NIP z błędną sumą kontrolną zwraca 400, a podmiot spoza KRS ma krs: null — warto obsłużyć oba przypadki, zamiast zakładać, że każdy NIP ma wpis w rejestrze sądowym.

W JavaScripcie

const r = await fetch("https://skanfirmy.pl/nip/5260250995?format=json");
const { krs } = await r.json();
if (krs) {
  console.log(krs.formaPrawna, krs.kapital);
  console.log(krs.pkdMain[0].code, krs.pkdMain[0].opis);
}

W PHP

$ch = curl_init("https://skanfirmy.pl/nip/5260250995?format=json");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$krs = json_decode(curl_exec($ch), true)["krs"];
if ($krs) {
    echo $krs["formaPrawna"] . " · " . $krs["kapital"];
}

Więcej niż KRS — jednym NIP-em

Ten sam endpoint /nip/{nip}?format=json, oprócz pola krs, zwraca też status VAT z Wykazu podatników VAT (Biała Lista, Ministerstwo Finansów) i numer REGON — wszystko w jednej odpowiedzi. Pozostałe endpointy (wszystkie GET → JSON, bez klucza):

  • /nip/{nip} — status VAT + Biała Lista + KRS + REGON
  • /regon/{nip} — dane z rejestru REGON (GUS)
  • /nips/{lista} — wiele NIP-ów naraz (rozdzielonych przecinkami)
  • /vies/{kraj}/{numer} — walidacja unijnego numeru VAT (VIES, Komisja Europejska)

Dla agentów AI pod adresem https://skanfirmy.pl/mcp stoi serwer Model Context Protocol (MCP) z narzędziem sprawdz_nip, które zwraca to samo pole krs (oraz kilkoma innymi do REGON, VIES i list NIP) — również bez klucza. Mapa endpointów dla modeli jest w llms.txt. Weryfikację po NIP w interfejsie zrobisz w narzędziu Dane z KRS.

Publiczny endpoint a typowe płatne API KRS

Większość komercyjnych nakładek REST na KRS działa w modelu freemium — konto, klucz API i dzienny limit zapytań w darmowym progu — a do tego wyszukuje po numerze KRS. Ten endpoint jest publiczny, bezpłatny i przyjmuje NIP. Różnice w skrócie:

Typowe płatne API KRSskanfirmy.pl /nip (pole krs)
Klucz APIwymaganyniepotrzebny
Rejestracja / kontotaknie
Limit w darmowym proguzwykle jestbrak twardego limitu (prosimy o rozsądek)
Format odpowiedziREST/JSONREST/JSON
Serwer MCP dla agentów AIzwykle braktak
Wyszukiwaniepo numerze KRSpo NIP
Modelfreemium / abonamentbezpłatnie

To nie jest oficjalne API KRS — dane pochodzą z tego samego źródła (Krajowy Rejestr Sądowy, Ministerstwo Sprawiedliwości), tylko udostępnione jednym zapytaniem GET po numerze NIP.

Skąd pochodzą dane i czym to nie jest

Dane pochodzą wprost z Krajowego Rejestru Sądowego prowadzonego przez Ministerstwo Sprawiedliwości. To niezależne narzędzie — nie jest oficjalnym API KRS ani z nim powiązane; jedynie udostępnia jego dane w wygodniejszej formie. Kody i opisy PKD to prawna klasyfikacja działalności w Polsce i zwracane są w oryginale (nie są tłumaczone). Zakres i aktualność danych są takie, jak w KRS.

Najczęstsze pytania

Czy potrzebny jest numer KRS, żeby pobrać dane?

Nie. Wyszukiwanie idzie po numerze NIP — wyślij GET na /nip/{NIP}?format=json, a numer KRS znajdziesz w odpowiedzi (pole krs.numerKRS). Nie musisz go znać wcześniej. To różnica względem oficjalnego API KRS, które wyszukuje po numerze KRS.

Czy potrzebny jest klucz API albo rejestracja?

Nie. Endpoint /nip/{nip} jest publiczny — zwraca JSON po dodaniu ?format=json, bez klucza API i bez zakładania konta. Dane z KRS są w polu krs.

Jakie dane z KRS zwraca to API?

Pole krs zawiera numer KRS, nazwę, formę prawną, kapitał zakładowy, organ i sposób reprezentacji, skład zarządu (sklad), kody PKD przeważający i pozostałe (pkdMain, pkdOther), datę rejestracji oraz znacznik organizacji pożytku publicznego (opp).

Co, jeśli firma nie figuruje w KRS?

Wtedy pole krs jest null, a pole krsError może wyjaśnić powód — na przykład dla jednoosobowej działalności zarejestrowanej wyłącznie w CEIDG. W takim przypadku użyj endpointu /regon/{nip}, który korzysta z rejestru REGON.

Czy korzystanie jest płatne?

Nie. Endpoint jest bezpłatny i bez rejestracji. Dane pochodzą wprost z Krajowego Rejestru Sądowego prowadzonego przez Ministerstwo Sprawiedliwości.