Rejestry API to część platformy DebtStrike — sprawdzania kontrahentów i windykacji.Sprawdź firmę bez integracji →

Rejestry API → BZP API

BZP API

GET /v1/bzp/{nip}

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:

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.

Uzyskaj dostęp do API →