Appearance
Search Tenders
Search and filter tenders from all connected portals. Every filter is optional. Filters you send are combined, so a tender must match all of them.
Endpoint
POST /api/v1/tenders/searchExample
Open construction tenders from German buyers, sorted by the closest deadline.
bash
curl -X POST https://api.tenderapi.eu/api/v1/tenders/search \
-H "Content-Type: application/json" \
-d '{
"buyerCountries": ["DEU"],
"cpvCodes": ["45000000"],
"statuses": ["open"],
"sortBy": "deadline",
"limit": 10
}'python
import requests
res = requests.post(
"https://api.tenderapi.eu/api/v1/tenders/search",
json={
"buyerCountries": ["DEU"],
"cpvCodes": ["45000000"],
"statuses": ["open"],
"sortBy": "deadline",
"limit": 10,
},
)
for tender in res.json()["tenders"]:
print(tender["deadline"], tender["title"])ts
const res = await fetch("https://api.tenderapi.eu/api/v1/tenders/search", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({
buyerCountries: ["DEU"],
cpvCodes: ["45000000"],
statuses: ["open"],
sortBy: "deadline",
limit: 10,
}),
});
const data = await res.json();
for (const tender of data.tenders) {
console.log(tender.deadline, tender.title);
}Request body
All fields are optional. An empty body {} returns the newest tenders from all portals.
json
{
"title": "road",
"sources": ["ted", "vergabe"],
"cpvCodes": ["45000000"],
"buyerCountries": ["DEU", "AUT"],
"buyerName": "Ministry",
"statuses": ["open", "planning"],
"serviceTypes": ["works"],
"publishedAt": { "from": "2025-01-01T00:00:00Z", "until": null },
"deadlineAt": { "from": "2025-06-01T00:00:00Z", "until": "2025-12-31T23:59:59Z" },
"estimatedValue": { "minValue": 100000, "maxValue": 5000000, "currency": "EUR" },
"sortBy": "deadline",
"sortOrder": "asc",
"limit": 25,
"cursor": null
}Fields
| Field | Type | Description |
|---|---|---|
title | string | Tenders whose title contains this text. Case insensitive. |
sources | string[] | Only these portals. Values: ted, vergabe, enarocanje, boamp, anac, tenderned, placsp, bzp, simap. See Portals. |
cpvCodes | string[] | 8 digit CPV codes. A code also matches all codes below it. A tender matches if it has any of the codes. |
buyerCountries | string[] | Three letter country codes of the buyer, for example DEU. |
buyerName | string | Buyers whose name contains this text. Case insensitive. For an exact organisation, use Organisation Tenders instead. |
statuses | string[] | Values: planning, open, awarded, cancelled, unknown. |
serviceTypes | string[] | Values: works, supplies, services, mixed, unknown. |
publishedAt | DateRange | Publication date range. |
deadlineAt | DateRange | Submission deadline range. Deadlines have a time, so set until to the end of the day to include that whole day. |
estimatedValue | ValueRange | Estimated contract value range. |
sortBy | string | publicationDate (default), deadline or estimatedValue. See Sorting. |
sortOrder | string | asc or desc. Default depends on sortBy. |
limit | integer | Results per page. Default 25, maximum 100. |
cursor | string | Cursor from a previous response. See Pagination. |
List values are case sensitive. "TED" or "Open" return a 400 error.
DateRange
Both fields are optional. Use only from for "after this date" or only until for "before this date".
| Field | Type | Description |
|---|---|---|
from | string | null | Start of the range, ISO 8601. Inclusive. |
until | string | null | End of the range, ISO 8601. Inclusive. |
ValueRange
| Field | Type | Description |
|---|---|---|
minValue | number | null | Lowest estimated value to include. |
maxValue | number | null | Highest estimated value to include. |
currency | string | Currency of minValue and maxValue. Required. |
Values are compared in EUR using the latest European Central Bank rates, so you can filter in USD and still match tenders published in PLN. Common codes like EUR, USD, GBP, CHF or PLN work. An unsupported code returns a 400 error. Tenders without an estimated value never match a value filter.
More examples
Tenders published this year with an estimated value of at least 1 million EUR, biggest first.
json
{
"publishedAt": { "from": "2025-01-01T00:00:00Z" },
"estimatedValue": { "minValue": 1000000, "currency": "EUR" },
"sortBy": "estimatedValue",
"sortOrder": "desc"
}IT service tenders from Slovenia and Austria that are still open.
json
{
"buyerCountries": ["SVN", "AUT"],
"cpvCodes": ["72000000"],
"serviceTypes": ["services"],
"statuses": ["open"]
}Response
json
{
"tenders": [
{
"id": "0195f1c2-7b3e-7a10-9c4d-3f2a8e6b1d05",
"title": "Road construction works, section B12",
"abstract": "Renewal of 4.2 km of federal road including drainage and lighting.",
"status": "open",
"serviceType": "works",
"source": "ted",
"publicationDate": "2025-03-15T00:00:00Z",
"deadline": "2025-05-01T08:00:00Z",
"deadlineHasTime": true,
"buyer": {
"name": "Federal Ministry of Transport",
"country": "DEU"
},
"cpvCodes": ["45233000", "45316110"],
"estimatedValue": {
"value": 2500000,
"currency": "EUR",
"valueEur": 2500000
},
"link": "https://ted.europa.eu/en/notice/-/detail/162345-2025"
}
],
"page": {
"nextCursor": "eyJkIjoiMjAyNS0wMy0xNSIsImlkIjoiLi4uIn0",
"total": { "count": 4821, "capped": false }
}
}Tender
| Field | Type | Description |
|---|---|---|
id | string | Unique id. Use it with Get Tender. |
title | string | Tender title. |
abstract | string | null | Short description, when the portal provides one. |
status | string | planning, open, awarded, cancelled or unknown. |
serviceType | string | works, supplies, services, mixed or unknown. |
source | string | Portal identifier. See Portals. |
publicationDate | string | Publication date, ISO 8601. |
deadline | string | null | Submission deadline, ISO 8601 in UTC. See Dates. |
deadlineHasTime | boolean | true when the portal published the hour. false when only the day is known, the deadline is then the end of that day. |
buyer.name | string | Buyer name. Empty string when unknown. |
buyer.country | string | Buyer country, three letter code. |
cpvCodes | string[] | CPV codes of the tender. |
estimatedValue | object | null | Estimated contract value, or null when not published. |
estimatedValue.value | number | Value as published. |
estimatedValue.currency | string | Currency of value. |
estimatedValue.valueEur | number | null | value converted to EUR, rounded to cents. |
link | string | URL of the original notice on the portal. |
Page
See Pagination for nextCursor and total.