GET /api/v1/cities/{slug}/public-tenders
Public procurement notices per city (oeffentlichevergabe.de, Tier A)
A city's public procurement notices from the German federal procurement publication service (oeffentlichevergabe.de, OCDS): running procedures and decided procedures, each with title, status, buyer, value and a source link; decided procedures additionally carry the contractors (suppliers, list of names; empty when the source does not disclose them) and the actually awarded value (award_value/award_currency, separate from the tender estimate value). status is derived semantically from the notice_type: active = running procedure (contract notice), complete = decided procedure incl. cancelled awards; the raw award status is in the award_status field (active/pending/unsuccessful/null). Amounts of 0 or less from the source are treated as not stated (null). The submission deadline is almost always missing in the source export and then only found in the original notice via source_url. Read-only from the deduplicated store (no live pull in the request path). Filter by status (active/complete) and match (buyer_city/place_of_performance), with pagination (limit/offset). No notices -> 200 source_status="no_data", data=null (honest). CC0 (Tier A). Disabled -> 200 source_status="disabled".
Parameters
| Name | In | Required | Type | Description |
|---|---|---|---|---|
slug | path | yes | string | |
status | query | no | string | Verfahrens-Status (active = laufendes Vergabeverfahren, complete = entschiedenes Verfahren inkl. aufgehobener Vergaben; Detail im Feld award_status). |
match | query | no | string | Stadt-Zuordnung (buyer_city = Sitz des Amts, place_of_performance = Erfüllungsort). |
q | query | no | string | Titel-Stichwort (Teilstring, parametrisierter LIKE-Filter). |
since | query | no | string | Nur Bekanntmachungen ab diesem ISO-Datum YYYY-MM-DD; ungültiges Datum -> 422. |
limit | query | no | integer | Seitengröße (Default 50, Cap 200). |
offset | query | no | integer | Seiten-Offset (>= 0); Overflow -> leere Seite, no_data. |
Code samples
curl "https://infranode.dev/api/v1/cities/hamburg/public-tenders"const res = await fetch("https://infranode.dev/api/v1/cities/hamburg/public-tenders");
const data = await res.json();
console.log(data);import httpx
res = httpx.get("https://infranode.dev/api/v1/cities/hamburg/public-tenders")
res.raise_for_status()
print(res.json())