Rejestry API → CRBR API
CRBR API
Beneficjenci rzeczywiści z oficjalnej bramki SOAP Ministerstwa Finansów — nie z nieoficjalnego backendu portalu.
RODO — ograniczenie u źródła. Z numeru PESEL beneficjenta wyprowadzamy wyłącznie rok urodzenia. Samego numeru nie zwracamy, nie logujemy i nie przechowujemy — dotyczy to także surowej odpowiedzi zapisywanej jako dowód w certyfikacie. Maskowanie dzieje się w warstwie pobrania, więc PESEL nie istnieje nigdzie poza pamięcią procesu w chwili parsowania.
not_found tu znaczy coś innego niż gdzie
indziej.
Oznacza brak wpisu w rejestrze, a nie brak podmiotu. Z obowiązku
zgłoszenia zwolnione są m.in. spółki publiczne, a jednoosobowe
działalności w CRBR w ogóle nie figurują. Nie interpretuj tego jako
„spółka ukrywa beneficjentów”.
CRBR jest świadomie poza agregatem
/v1/subjects — dane o osobach fizycznych pobieramy tylko
wtedy, gdy o nie wprost poprosisz. Agregat mówi o tym jawnie w polu
notIncluded.
Przykład zapytania i odpowiedzi
Beneficjenci rzeczywiści podmiotu po NIP-ie. Klucz testowy zwraca wyłącznie beneficjenta syntetycznego, bo piaskownica nie dotyka rejestru z danymi osobowymi.
curl -s https://api.debtstrike.eu/v1/crbr/7740001454 \
-H "Authorization: Bearer ds_test_TWOJ_KLUCZ"
Zapytanie działa z kluczem testowym ds_test_. Taki klucz zwraca stałe, syntetyczne dane podmiotu testowego (NIP 7740001454, KRS 0000028860, REGON 610188201), nie dotyka rejestrów i nie zdejmuje ani jednej jednostki pakietu ("billed": 0). Każdy inny numer zwraca status: not_found, więc przećwiczysz też tę ścieżkę. Z kluczem ds_live_ zmienia się tylko klucz, a dane są prawdziwe.
{
"status": "found",
"data": {
"nip": "7740001454",
"krs": "0000028860",
"name": "PODMIOT TESTOWY SPÓŁKA AKCYJNA (SANDBOX)",
"legalFormCode": "SA",
"legalForm": "SPÓŁKA AKCYJNA",
"address": { "city": "PŁOCK", "postalCode": "09-411", "building": "7",
"flat": null, "commune": "M. PŁOCK", "county": "M. PŁOCK" },
"beneficiaries": [
{
"firstName": "JAN",
"lastName": "KOWALSKI",
"birthYear": 1985,
"citizenship": ["PL"],
"countryOfResidence": "PL",
"role": "UDZIAŁOWIEC BEZPOŚREDNI",
"shares": [ { "amount": "51", "unit": "PROCENT", "privilege": null } ]
}
],
"reportedAt": "2020-01-13",
"referenceNumber": "SANDBOX-0001"
},
"meta": { "billed": 0 }
}
Dane beneficjenta w przykładzie są wymyślone i nie dotyczą żadnej prawdziwej osoby. Fragment odpowiedzi: koperta jest opisana na stronie przeglądowej.
Pola odpowiedzi w data
| Pole | Typ | Znaczenie |
|---|---|---|
nip, krs, name |
string albo null | Identyfikatory i nazwa podmiotu, którego dotyczy zgłoszenie. |
legalFormCode, legalForm |
string albo null | Kod i nazwa formy prawnej. |
address |
object | Adres podmiotu: city, postalCode, building, flat, commune, county. |
beneficiaries[] |
array | Lista beneficjentów rzeczywistych ze zgłoszenia. |
beneficiaries[].firstName, lastName |
string | Imię i nazwisko beneficjenta. |
beneficiaries[].birthYear |
number | Rok urodzenia. To jedyna dana wyprowadzona z numeru PESEL, samego numeru nie zwracamy ani nie przechowujemy. |
beneficiaries[].citizenship |
string[] | Obywatelstwa (kody państw). |
beneficiaries[].countryOfResidence |
string | Kraj zamieszkania (kod państwa). |
beneficiaries[].role |
string | Charakter uprawnień beneficjenta, np. UDZIAŁOWIEC BEZPOŚREDNI. |
beneficiaries[].shares[] |
array | Udziały: amount (tekst), unit (np. PROCENT) i privilege (uprzywilejowanie lub null). |
reportedAt, referenceNumber |
string | Data zgłoszenia do CRBR i numer referencyjny zgłoszenia. |
Odpowiedzi i błędy tego endpointu
| HTTP | Kod lub status |
Kiedy |
|---|---|---|
| 200 | found |
W CRBR jest zgłoszenie podmiotu. |
| 200 | not_found |
Brak wpisu w CRBR. Nie znaczy to, że podmiot ukrywa beneficjentów: z obowiązku zgłoszenia zwolnione są m.in. spółki publiczne, a jednoosobowych działalności w CRBR w ogóle nie ma. |
| 200 | unavailable |
Bramka MF nie odpowiedziała. To brak wiedzy, nie dowód braku wpisu. |
| 400 | invalid_identifier |
NIP bez 10 cyfr lub z błędną sumą kontrolną. |
| 403 | source_not_in_plan |
Klucz nie ma zakresu crbr. |
Pozostałe kody (401, 429, 500) są wspólne dla wszystkich źródeł i opisane w
tabeli błędów. Błędy mają format application/problem+json (RFC 9457) z polami code i requestId.
Pozostałe rejestry w tym samym API
Wszystkie źródła mają tę samą kopertę, ten sam sposób uwierzytelniania i te same kody błędów:
- KRS API: odpis aktualny po NIP, KRS albo REGON
- API białej listy VAT: status podatnika i weryfikacja rachunku
- API REGON / GUS: tożsamość, adres i PKD
- BZP API: postępowania publiczne
- SUDOP API: pomoc publiczna i de minimis
- Agregat podmiotu: REGON, VAT i KRS jednym zapytaniem
Zanim wyślesz pierwsze zapytanie
Zasady wspólne dla wszystkich źródeł opisuje strona przeglądowa:
uwierzytelnianie kluczem,
koperta odpowiedzi,
różnica między not_found a unavailable, rozliczenie zapytań i
limity. Pełny kontrakt:
/v1/openapi.json.