REST API · JSON · through RapidAPI
EU Public Tender Monitor (TED) API
New public procurement notices from the EU's official TED search API for a CPV code prefix, buyer country and keyword, returning only the notices that are new or changed since your last run.
Read from the official source when you call (api.ted.europa.eu); no personal data. GET /v1/ted-tender-monitor answers {"product", "count", "items", "fetched_at"}.
Get a key on RapidAPI plans and pricing are on the listing; one key covers every endpoint.
Parameters
| Parameter | Type | What it does | Example |
|---|---|---|---|
cpv_prefix | string | Start of the CPV code to follow (for example 72 for IT services, 45 for construction, 33 for medical equipment). | "72" |
country | string | Country of the buying organisation, as a three-letter ISO code. One of: AUT, BEL, BGR, HRV, CYP, CZE, DNK, EST, FIN, FRA, DEU, GRC, HUN, IRL, ITA, LVA, LTU, LUX, MLT, NLD, POL, PRT, ROU, SVK, SVN, ESP, SWE, NOR, ISL. | "FRA" |
keyword | string | Optional word that the notice title must contain. Leave empty to keep all notices. | "services" |
published_since | string | Only notices published on or after this date, written YYYYMMDD. | "20250101" |
limit | integer | At most this many results (1–1000, default 100). | 20 |
What each result holds
| Field | Type |
|---|---|
notice_id | id |
publication_date | date |
buyer | text |
country_code | text |
title | text |
cpv_codes | list |
procedure | text |
deadline | date |
estimated_value | number |
currency | text |
url | url |
Call it
With curl:
curl -G "https://clinical-trials-eu-tenders-open-data-api.p.rapidapi.com/v1/ted-tender-monitor" \ --data-urlencode cpv_prefix=72 \ --data-urlencode country=FRA \ --data-urlencode keyword=services \ --data-urlencode published_since=20250101 \ --data-urlencode limit=20 \ -H "X-RapidAPI-Key: $RAPIDAPI_KEY" \ -H "X-RapidAPI-Host: clinical-trials-eu-tenders-open-data-api.p.rapidapi.com"
With Python (pip install requests):
import os, requests
r = requests.get(
"https://clinical-trials-eu-tenders-open-data-api.p.rapidapi.com/v1/ted-tender-monitor",
params={'cpv_prefix': '72',
'country': 'FRA',
'keyword': 'services',
'published_since': '20250101',
'limit': 20},
headers={"X-RapidAPI-Key": os.environ["RAPIDAPI_KEY"], "X-RapidAPI-Host": "clinical-trials-eu-tenders-open-data-api.p.rapidapi.com"},
timeout=120,
)
for item in r.json()["items"]:
print(item)
For code and AI agents that pick tools at run time, GET /v1/products lists every endpoint with its parameters and fields.
Questions
How fresh is it? Each call reads the official source then; an identical query within 15 minutes is answered from a cache.
What if the source is down? The answer says so: a 502, or "partial": true when only some of its requests failed.