Analiza przetargów: kto wygrywa zamówienia, do których startujesz

Wyniki zamówień publicznych powyżej progów unijnych, z ogłoszeń o wyniku postępowania w TED, jako JSON: kto wygrał, jaki zamawiający, kod CPV, kwota i liczba złożonych ofert. Do oceny, czy warto startować, wyceny na tle dotychczasowego wykonawcy i śledzenia konkurencji. To wyniki, nie ogłoszenia o przetargach w toku.

Najpierw granice: wyniki powyżej progów unijnych

API zwraca udzielone zamówienia, nie przetargi w toku. Dla Polski pochodzą z ogłoszeń o wyniku postępowania opublikowanych w TED (Tenders Electronic Daily), czyli z zamówień powyżej progów unijnych. Zamówienia poniżej progów unijnych zamawiający ogłaszają w Biuletynie Zamówień Publicznych na platformie e-Zamówienia, którą prowadzi Urząd Zamówień Publicznych; ich w API nie ma. Nie znajdziesz tu też ogłoszeń o zamówieniu, terminów składania ofert ani SWZ.

Pytania zespołu przetargowego, na które odpowiada API

  • Kto wygrywa u tego zamawiającego w mojej kategorii i za ile? Filtruj po nazwie zamawiającego (buyer, wystarczy fragment, minimum 3 znaki) i po prefiksie CPV, czyli Wspólnego Słownika Zamówień (cpv=45 to roboty budowlane, 45233 roboty drogowe).
  • Co wygrał konkurent? Filtruj po jego NIP (nif) albo po nazwie (supplier). Przy ofercie wspólnej każdy z wykonawców ma własny wiersz (n_suppliers mówi, ilu ich jest), a kwota kontraktu jest dzielona między nich po równo.
  • Czy warto startować? bids_received mówi, ile ofert złożono: zamawiający, u którego kontrakty przyciągają jedną ofertę, to okazja albo zamknięte pole, a historia pokazuje które. Pusta wartość oznacza brak informacji, nie jedną ofertę.
  • O ile niżej od wartości szacunkowej schodzą zwycięzcy? amount_eur względem amount_estimated_eur, tam gdzie ogłoszenie podaje wartość szacunkową; w ogłoszeniach z Polski robi to tylko część wyników.
  • W jakim trybie udzielono zamówienia? procedure: open to przetarg nieograniczony, a negotiated_without_publicity tryb bez uprzedniego ogłoszenia o zamówieniu. Taki wynik nie pokazuje, jak wygrać przetarg, bo nie było otwartej konkurencji.
  • Czy obecny wykonawca jest zdrowy? company_id łączy wynik z rekordem spółki, gdy NIP z ogłoszenia i nazwa zgadzają się z rejestrem: status, forma prawna, adres.

Co niesie jeden wynik

PoleCo oznacza
supplier_name, supplier_tax_id, supplier_id_schemeWykonawca, jego numer i rodzaj numeru: NIP, czasem REGON
buyer, buyer_id, buyer_cityZamawiający, jego NIP i miasto
subject, cpv, contract_typePrzedmiot zamówienia, kod CPV i rodzaj: works (roboty budowlane), services (usługi), supplies (dostawy)
amount_eur, amount_contract_eur, n_suppliersUdział wykonawcy, wartość całego kontraktu (w euro) i liczba wykonawców; przy ofercie wspólnej udział to kwota kontraktu podzielona po równo
amount_estimated_eurWartość szacunkowa z ogłoszenia, tylko gdy zamawiający ją podał
bids_received, procedure, smeLiczba ofert, tryb udzielenia i to, czy wykonawca jest MŚP (gdy ogłoszenie to podaje)
award_date, source_urlData udzielenia zamówienia i link do ogłoszenia w TED
company_idId rekordu spółki w GET /companies/{id}, gdy wykonawcę da się powiązać z rejestrem

Jeden wiersz to jedno udzielenie jednemu wykonawcy. Kwoty są w euro: zamówienia opublikowane w złotych przeliczamy po średnim rocznym kursie EBC z roku udzielenia, a currency pokazuje walutę z ogłoszenia, więc do porównania z własną ceną w złotych przelicz ją tym samym kursem albo porównuj stosunki, na przykład cenę do wartości szacunkowej. Kwoty są przed VAT, gdy źródło rozróżnia VAT. Wynik oznaczony amount_is_ceiling to pułap umowy ramowej lub dynamicznego systemu zakupów, a amount_suspect wartość domyślna formularza, a nie cena: wyklucz oba z analiz cen. Suma wyników jednego zamawiającego jest górną granicą, bo umowa ramowa z jednym wykonawcą może wyglądać jak zwykły kontrakt.

Konkurencja i cena w kilku linijkach

Wywołanie bez żadnego filtra jest odrzucane (400): podaj co najmniej jeden z company_id, nif, supplier, buyer, cpv albo date_from. Poniższy kod liczy, ile wyników z robót drogowych (CPV 45233) w tym roku miało jedną ofertę i o ile niżej od wartości szacunkowej schodzono tam, gdzie ją podano, a potem wypisuje wygrane konkurenta po NIP (tu BUDIMEX S.A.).

import requests

BASE = 'https://api.prometiam.com/functions/v1/risk-api'
H = {'Authorization': 'Bearer rk_live_...'}


def wyniki(**filtry):
    """Wszystkie wyniki dla filtrów, z kursorem (2 kredyty za stronę do 100 wyników)."""
    kursor = None
    while True:
        p = {**filtry, 'limit': 100, **({'cursor': kursor} if kursor else {})}
        r = requests.get(f'{BASE}/procurement/awards', headers=H, params=p)
        r.raise_for_status()
        body = r.json()
        yield from body['data']
        kursor = (body.get('pagination') or {}).get('next_cursor')
        if not kursor:
            break


# Jak konkurencyjne są roboty drogowe (CPV 45233) w tym roku
drogi = [a for a in wyniki(country='PL', cpv='45233', date_from='2026-01-01')
         if not a['amount_is_ceiling'] and not a['amount_suspect']]
jedna_oferta = sum(1 for a in drogi if a['bids_received'] == 1)
nizej = sorted(1 - a['amount_eur'] / a['amount_estimated_eur'] for a in drogi
               if a['amount_eur'] and a['amount_estimated_eur'])
print(len(drogi), 'wyników;', jedna_oferta, 'z jedną ofertą;',
      f'mediana: {nizej[len(nizej) // 2]:.1%} poniżej wartości szacunkowej' if nizej else 'brak wartości szacunkowych')

# Wygrane konkurenta po NIP (BUDIMEX S.A.)
for a in wyniki(country='PL', nif='5261003187', date_from='2026-01-01'):
    print(a['award_date'], a['buyer'], a['amount_eur'], a['cpv'], a['bids_received'], a['procedure'])

Tak wyglądają trzy wyniki BUDIMEX S.A. (NIP 5261003187) z odpowiedzi API; każdy ma company_id, więc rekord spółki jest o jedno wywołanie dalej:

DataZamawiającyCPVOfertyTrybKwota
2026-09-24Generalna Dyrekcja Dróg Krajowych i Autostrad4523312010open36,2 mln €
2026-10-01Centralny Port Komunikacyjny sp. z o.o.452313002open15,7 mln €
2026-10-12PKP Polskie Linie Kolejowe S.A.450000001negotiated_without_publicity1,7 mln €

Zamawiającego śledzisz tak samo: buyer=Dróg Krajowych zawęża wyniki do jednostek, których nazwa zawiera ten fragment, min_amount odcina drobne kontrakty, a date_from i date_to wyznaczają okno.

Wykonawca obok wyniku: rekord i ryzyko

Wynik z company_id otwiera rekord spółki: GET /companies/{id} zwraca status (w tym likwidację i upadłość), formę prawną, siedzibę, kapitał zakładowy i poprzednie nazwy (uzupełniane stopniowo, więc wiele spółek nie ma ich jeszcze). Wykonawcę, którego chcesz obserwować, dodasz do POST /monitor i dostaniesz alert przy zmianie siedziby, nazwy lub statusu; zdarzenia w rejestrze są dostępne od 14 października 2026 r. Jak krok po kroku sprawdza się kontrahenta, opisujemy w przypadku użycia weryfikacja kontrahenta.

Czego ta strona nie robi

  • Nie jest wyszukiwarką przetargów w toku. Nie zwracamy ogłoszeń o zamówieniu, terminów ani dokumentów zamówienia. Aktualne postępowania znajdziesz w BZP na e-Zamówienia i w TED.
  • Nie obejmuje wszystkich zamówień. Tylko te powyżej progów unijnych; mniejsze zamówienia są w BZP, którego nie obsługujemy.
  • Nie punktuje wykonawców. Beta oceny zamawiających (Hiszpania i Francja) opisuje urząd, nigdy firmę, która składa ofertę, i nie obejmuje Polski.
  • Nie zwraca zamówień udzielonych osobom fizycznym.
  • Pola bywają puste albo nieprawdopodobne. Wartość szacunkowa jest tylko w części wyników, sme bywa puste, a duration_months pochodzi z formularza i potrafi być błędne (widzieliśmy wartość w tysiącach miesięcy).

Source: TED, Publications Office of the European Union. Dane z ogłoszeń zamawiających, przetworzone przez Prometiam: kwoty przeliczone na euro, wykonawcy powiązani z rejestrem. Prometiam nie jest źródłem urzędowym.

Ile to kosztuje

Każde wywołanie /procurement/awards kosztuje 2 kredyty i zwraca do 100 wyników, a błędy nic nie kosztują. Rok wyników jednego zamawiającego w jednej kategorii mieści się zwykle w kilku wywołaniach. Starter kosztuje 9,99 € miesięcznie za 1 000 kredytów, Professional 29,99 € za 10 000, a Scale 99,99 € za 50 000. Okres próbny trwa 14 dni i obejmuje 500 kredytów: wymaga karty, w jego trakcie nic nie jest pobierane, a potem obowiązuje Starter, jeśli nie anulujesz.

Powiązane strony

Rozpocznij 14-dniowy darmowy okres próbny · Dokumentacja API

Okres próbny trwa 14 dni i obejmuje 500 kredytów. Wymagana jest karta, w trakcie okresu próbnego nic nie jest pobierane; potem obowiązuje plan Starter (9,99 € miesięcznie), jeśli go nie anulujesz.

Frequently asked questions

Czy API pokazuje przetargi w toku, w które mogę jeszcze złożyć ofertę?
Nie. Zwraca wyniki, czyli udzielone zamówienia: wykonawcę, zamawiającego, kwotę i liczbę ofert. Postępowania w toku znajdziesz w Biuletynie Zamówień Publicznych na e-Zamówieniach, a powyżej progów unijnych także w TED.
Czy są tu zamówienia poniżej progów unijnych?
Nie. Dla Polski dane pochodzą z ogłoszeń w TED, czyli z zamówień powyżej progów unijnych. Mniejsze zamówienia zamawiający ogłaszają w BZP, którego nie obsługujemy.
Jak znaleźć wygrane konkurenta?
Po jego NIP: GET /procurement/awards?country=PL&nif=5261003187 (tu BUDIMEX S.A.), albo po nazwie z parametrem supplier. Każdy wynik niesie zamawiającego, CPV, kwotę i liczbę ofert.
Czy mogę porównać cenę z wartością szacunkową?
Tylko tam, gdzie ogłoszenie ją podaje (amount_estimated_eur); w danych z Polski robi to część wyników. Kwoty są w euro po średnim kursie EBC z roku udzielenia, ale stosunek ceny do wartości szacunkowej nie zależy od waluty.
Dlaczego pole company_id jest czasem puste?
Wynik łączy się z rekordem spółki, gdy NIP z ogłoszenia i nazwa wykonawcy zgadzają się z rejestrem. Gdy się nie zgadzają, wynik zwracamy mimo to, ale bez company_id.
Ile kosztuje wywołanie?
2 kredyty za wywołanie do 100 wyników; błędy są bezpłatne. Okres próbny trwa 14 dni i obejmuje 500 kredytów (karta wymagana, w trakcie nic nie jest pobierane).