Skip to content

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/search

Example ​

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 ​

FieldTypeDescription
titlestringTenders whose title contains this text. Case insensitive.
sourcesstring[]Only these portals. Values: ted, vergabe, enarocanje, boamp, anac, tenderned, placsp, bzp, simap. See Portals.
cpvCodesstring[]8 digit CPV codes. A code also matches all codes below it. A tender matches if it has any of the codes.
buyerCountriesstring[]Three letter country codes of the buyer, for example DEU.
buyerNamestringBuyers whose name contains this text. Case insensitive. For an exact organisation, use Organisation Tenders instead.
statusesstring[]Values: planning, open, awarded, cancelled, unknown.
serviceTypesstring[]Values: works, supplies, services, mixed, unknown.
publishedAtDateRangePublication date range.
deadlineAtDateRangeSubmission deadline range. Deadlines have a time, so set until to the end of the day to include that whole day.
estimatedValueValueRangeEstimated contract value range.
sortBystringpublicationDate (default), deadline or estimatedValue. See Sorting.
sortOrderstringasc or desc. Default depends on sortBy.
limitintegerResults per page. Default 25, maximum 100.
cursorstringCursor 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".

FieldTypeDescription
fromstring | nullStart of the range, ISO 8601. Inclusive.
untilstring | nullEnd of the range, ISO 8601. Inclusive.

ValueRange ​

FieldTypeDescription
minValuenumber | nullLowest estimated value to include.
maxValuenumber | nullHighest estimated value to include.
currencystringCurrency 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 ​

FieldTypeDescription
idstringUnique id. Use it with Get Tender.
titlestringTender title.
abstractstring | nullShort description, when the portal provides one.
statusstringplanning, open, awarded, cancelled or unknown.
serviceTypestringworks, supplies, services, mixed or unknown.
sourcestringPortal identifier. See Portals.
publicationDatestringPublication date, ISO 8601.
deadlinestring | nullSubmission deadline, ISO 8601 in UTC. See Dates.
deadlineHasTimebooleantrue when the portal published the hour. false when only the day is known, the deadline is then the end of that day.
buyer.namestringBuyer name. Empty string when unknown.
buyer.countrystringBuyer country, three letter code.
cpvCodesstring[]CPV codes of the tender.
estimatedValueobject | nullEstimated contract value, or null when not published.
estimatedValue.valuenumberValue as published.
estimatedValue.currencystringCurrency of value.
estimatedValue.valueEurnumber | nullvalue converted to EUR, rounded to cents.
linkstringURL of the original notice on the portal.

Page ​

See Pagination for nextCursor and total.

Beta. Free to use, no API key required.