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.
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.
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).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.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ę.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.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.company_id łączy wynik z rekordem spółki, gdy NIP z ogłoszenia i nazwa zgadzają się z rejestrem: status, forma prawna, adres.| Pole | Co oznacza |
|---|---|
supplier_name, supplier_tax_id, supplier_id_scheme | Wykonawca, jego numer i rodzaj numeru: NIP, czasem REGON |
buyer, buyer_id, buyer_city | Zamawiający, jego NIP i miasto |
subject, cpv, contract_type | Przedmiot zamówienia, kod CPV i rodzaj: works (roboty budowlane), services (usługi), supplies (dostawy) |
amount_eur, amount_contract_eur, n_suppliers | Udział 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_eur | Wartość szacunkowa z ogłoszenia, tylko gdy zamawiający ją podał |
bids_received, procedure, sme | Liczba ofert, tryb udzielenia i to, czy wykonawca jest MŚP (gdy ogłoszenie to podaje) |
award_date, source_url | Data udzielenia zamówienia i link do ogłoszenia w TED |
company_id | Id 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.
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:
| Data | Zamawiający | CPV | Oferty | Tryb | Kwota |
|---|---|---|---|---|---|
| 2026-09-24 | Generalna Dyrekcja Dróg Krajowych i Autostrad | 45233120 | 10 | open | 36,2 mln € |
| 2026-10-01 | Centralny Port Komunikacyjny sp. z o.o. | 45231300 | 2 | open | 15,7 mln € |
| 2026-10-12 | PKP Polskie Linie Kolejowe S.A. | 45000000 | 1 | negotiated_without_publicity | 1,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.
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.
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.
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.
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.