Ausschreibungen finden mit der TED Search API
Was ist die TED Search API?
TED (Tenders Electronic Daily) ist das offizielle Amtsblatt der EU für das öffentliche Auftragswesen, in dem jede oberhalb der Schwellenwerte liegende Bekanntmachung aus allen 27 Mitgliedstaaten veröffentlicht wird. Die TED Search API stellt diese Bekanntmachungen als JSON über einen einzigen Endpunkt bereit:
POST https://api.ted.europa.eu/v3/notices/search
Sie können sie ohne Authentifizierung aufrufen, sie steht also jedem Weiterverwender offen. Die vollständige Referenz für Anfrage und Antwort finden Sie in der Swagger-Dokumentation.
Brauchen Sie einen API-Schlüssel?
Nicht zum Suchen. Die Search API ist vollständig öffentlich, und ein Schlüssel erhöht lediglich Ihre Ratenlimits und schaltet weitere Endpunkte frei, etwa zum Verwalten eigener Bekanntmachungen. Falls Sie doch einen möchten, sind es drei Schritte:
- Besuchen Sie das TED Developer Portal.
- Melden Sie sich mit Ihren EU-Login-Daten an.
- Erzeugen Sie Ihren Schlüssel unter Manage API Keys.
Ausschreibungen mit Python suchen
Jede Anfrage besteht aus drei Teilen: einer query, den fields, die Sie zurückerhalten möchten, und einem limit. Die query selbst verwendet die Expert-Search-Syntax von TED, geschrieben als field operator value und kombiniert mit AND, OR und NOT. Diese Felder benötigen Sie am häufigsten:
| Feld | Beispiel | Bedeutung |
|---|---|---|
classification-cpv | classification-cpv=38000000 | CPV-Code (Branche) |
buyer-country | buyer-country=DEU | Land des Auftraggebers, ISO 3-stellig |
publication-date | publication-date>=20260420 | Veröffentlicht am oder nach einem Datum |
estimated-value-proc | estimated-value-proc>=50000 | Geschätzter Auftragswert |
Statt die Syntax auswendig zu lernen, erstellen Sie Ihre Abfrage visuell in der TED Expert Search und kopieren die entstandene Abfragezeichenfolge in Ihren Code. Wenn Sie nicht sicher sind, welcher CPV-Code zu Ihrer Branche passt, schlagen Sie ihn mit unserer CPV-Code-Suche nach.
Das folgende Beispiel findet Ausschreibungen für Laborausrüstung (CPV 38000000), die seit Jahresbeginn veröffentlicht wurden, mit einem geschätzten Wert zwischen 50.000 und 500.000 EUR, von Auftraggebern in Deutschland. Da eine einzelne Seite höchstens 250 Bekanntmachungen enthält, blättert es im Iterationsmodus durch die Ergebnisse und holt fünf Seiten mit je 100 Einträgen, also bis zu 500 Bekanntmachungen in einem Durchlauf:
import requests
import time
URL = "https://api.ted.europa.eu/v3/notices/search"
query = " AND ".join([
"classification-cpv=38000000", # Laborausrüstung
"buyer-country=DEU", # Deutschland
"publication-date>=20260101",
"estimated-value-proc>=50000",
"estimated-value-proc<=500000",
])
payload = {
"query": query,
"fields": [
"publication-number",
"notice-title",
"classification-cpv",
"estimated-value-proc",
"estimated-value-cur-proc",
],
"limit": 100,
"scope": "ACTIVE",
"paginationMode": "ITERATION",
}
notices = []
for _ in range(5): # Fünf Seiten abrufen.
data = requests.post(URL, json=payload).json()
notices.extend(data["notices"])
# Iterations-Token nutzen, um effizient zu paginieren.
token = data.get("iterationNextToken")
if not token or len(data["notices"]) < payload["limit"]:
break
payload["iterationNextToken"] = token
time.sleep(1)
for notice in notices:
number = notice["publication-number"]
title = notice["notice-title"]["deu"]
cpv = ", ".join(notice["classification-cpv"])
value = notice.get("estimated-value-proc", "n/a")
currency = notice.get("estimated-value-cur-proc", "")
print(f"{number} | {title} | {value} {currency} | {cpv}")
Ein paar Details zur Antwort sind wissenswert. notice-title ist nach Sprachcode aufgeschlüsselt, sodass notice-title["deu"] den deutschen Titel liefert, während classification-cpv als Liste von Codes zurückkommt. Im Iterationsmodus liefert jede Seite ein iterationNextToken, das Sie bei der nächsten Anfrage wieder mitgeben; die Schleife stoppt, sobald eine Seite kleiner als Ihr Limit zurückkommt. Von hier aus können Sie DEU durch ein beliebiges Länderkürzel oder 38000000 durch die Branche ersetzen, auf die Sie bieten.
Grenzen und gute Praxis
Die Search API ist großzügig, aber einige Grenzen bestimmen die Nutzung:
- Seitengröße. Eine Anfrage liefert höchstens 250 Bekanntmachungen; alles Größere benötigt
paginationMode: "ITERATION"und die oben gezeigte Token-Schleife. - Abfragegröße. Eine einzelne Abfrage darf bis zu 2.000 Klauseln enthalten. Wenn Sie viele CPV-Codes ansprechen, fassen Sie sie mit
IN (...)zusammen, statt eine lange Reihe vonOR-Bedingungen zu verketten. - Ratenlimits. Anonyme Aufrufe werden gedrosselt; registrieren Sie einen API-Schlüssel, bevor Sie umfangreiche oder geplante Jobs ausführen.
- Feldformate. Viele Felder sind mehrsprachig oder kommen als Listen zurück, weshalb das Beispiel sie defensiv mit
.get()und einem Sprachschlüssel ausliest. - Seien Sie fair. Speichern Sie Abgerufenes zwischen und vermeiden Sie es, dieselben Bekanntmachungen doppelt zu laden. TED aktualisiert über den Tag verteilt, sodass eine stündliche oder tägliche Synchronisierung meist ausreicht.
Das ist die gesamte Schleife: Abfrage bauen, per POST senden, JSON lesen und paginieren. Von dort aus können Sie Bekanntmachungen in einer Datenbank speichern, Ihr Team benachrichtigen oder sie direkt in Ihr eigenes Produkt einspeisen.