Rejestry API → BZP API
BZP API
Postępowania, w których podmiot wystąpił jako
wykonawca albo zamawiający. Parametr
limit (domyślnie 50, maksimum 200) ogranicza liczbę
zwróconych ogłoszeń.
{
"status": "found",
"data": {
"summary": { "asContractor": 0, "asOrganization": 2,
"latestPublicationDate": "2026-07-02T07:13:35.000Z" },
"coverage": { "from": "2025-07-26T05:15:20.000Z",
"to": "2026-07-26T08:34:58.000Z",
"noticesIndexed": 545503 },
"notices": [
{
"noticeNumber": "2026/BZP 00318648/01",
"noticeType": "ContractNotice",
"publicationDate": "2026-07-02T07:13:35.000Z",
"role": "organization",
"orderObject": "„Przebudowa wraz z modernizacją Szkoły Podstawowej…”",
"cpvCode": "45000000-7 (Roboty budowlane)",
"organizationName": "Gmina Pyrzyce"
}
]
},
"warnings": [
{ "code": "bzp_coverage",
"message": "Odpowiedź obejmuje ogłoszenia z zakresu 2025-07-26 – 2026-07-26. Poza tym zakresem nie wiemy…" }
]
}
To nasz indeks, nie proxy — i mówimy, co w nim jest.
API Biuletynu nie potrafi wyszukiwać po NIP, nie ma paginacji i ucina
wynik na 500 rekordach, więc zbudowaliśmy własny indeks. Pole
data.coverage podaje zakres, który realnie mamy
zaindeksowany.
Pusta lista nie jest dowodem braku postępowań poza tym
zakresem
— i dlatego ostrzeżenie bzp_coverage jest w każdej
odpowiedzi.
Szukamy po wszystkich znanych identyfikatorach podmiotu (NIP, KRS, REGON), bo zamawiający wpisują je zamiennie w jedno pole — na realnej próbce 19% wykonawców miało tam coś innego niż NIP. Bez tego wyszukiwanie gubiłoby co piątego wykonawcę.
Przykład zapytania i odpowiedzi
Postępowania, w których podmiot wystąpił jako wykonawca albo zamawiający. Parametr limit (domyślnie 50, maksimum 200) ogranicza liczbę ogłoszeń. Klucz testowy zwraca pustą, ale poprawną strukturę, bo indeks produkcyjny jest wspólny. Przykład z prawdziwymi ogłoszeniami jest wyżej.
curl -s "https://api.debtstrike.eu/v1/bzp/7740001454?limit=20" \
-H "Authorization: Bearer ds_test_TWOJ_KLUCZ"
Zapytanie działa z kluczem testowym ds_test_: nie dotyka indeksu ani rejestrów i nie zdejmuje ani jednej jednostki pakietu ("billed": 0). Z kluczem ds_live_ zmienia się tylko klucz, a dane są prawdziwe.
{
"status": "found",
"data": {
"notices": [],
"summary": { "asContractor": 0, "asOrganization": 0,
"latestPublicationDate": null },
"coverage": null
},
"warnings": [ { "code": "bzp_index_empty", "message": "Indeks ogłoszeń jest pusty …" } ],
"meta": { "billed": 0 }
}
W odpowiedzi klucza ds_live_ w coverage jest zakres dat, który realnie mamy zaindeksowany, a ostrzeżenie ma kod bzp_coverage.
Pola odpowiedzi w data
| Pole | Typ | Znaczenie |
|---|---|---|
notices[] |
array | Ogłoszenia, w których wystąpił podmiot, najnowsze pierwsze. |
notices[].noticeNumber |
string | Numer ogłoszenia w Biuletynie Zamówień Publicznych. |
notices[].noticeType |
string | Typ ogłoszenia, np. ContractNotice. |
notices[].publicationDate |
string | Data publikacji, ISO 8601. |
notices[].role |
string | contractor (wykonawca) albo organization (zamawiający). |
notices[].orderObject |
string | Przedmiot zamówienia. |
notices[].cpvCode |
string | Kod CPV wraz z opisem. |
notices[].procedureResult |
string albo null | Wynik postępowania, jeśli ogłoszenie go zawiera. |
notices[].organizationName |
string | Nazwa zamawiającego. |
summary |
object | asContractor i asOrganization to liczby zwróconych ogłoszeń w danej roli, latestPublicationDate to data najnowszego. |
coverage |
object albo null | Zakres naszego indeksu: from, to, noticesIndexed. Poza tym zakresem nie wiemy, więc pusta lista nie jest dowodem braku postępowań. |
Odpowiedzi i błędy tego endpointu
| HTTP | Kod lub status |
Kiedy |
|---|---|---|
| 200 | found |
Zawsze przy poprawnym NIP-ie. Pusta lista notices jest pełnoprawną odpowiedzią, a ostrzeżenie bzp_coverage mówi, jaki zakres dat obejmuje indeks. |
| 200 | warnings: bzp_index_empty |
Indeks ogłoszeń jest pusty, więc odpowiedź nie jest dowodem braku postępowań. |
| 400 | invalid_identifier |
NIP bez 10 cyfr lub z błędną sumą kontrolną. |
| 403 | source_not_in_plan |
Klucz nie ma zakresu bzp. |
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
- CRBR API: beneficjenci rzeczywiści
- 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.