Skip to content

Getting Started ​

TenderAPI collects public tenders from TED and national procurement portals across Europe, cleans them up, and serves them through one REST API. You can search tenders, look up a single tender, and find the organisations that buy or win contracts.

The API is free to use while in beta. No API key or sign-up is needed. Field names and behaviour may still change, so check back here now and then.

Base URL ​

https://api.tenderapi.eu

All endpoints live under /api/v1. Every request and response uses JSON.

  • Search endpoints are POST requests with a JSON body. Send the header Content-Type: application/json.
  • Single item endpoints are GET requests with the id in the URL.

Your first request ​

Fetch five recent tenders from Irish buyers.

bash
curl -X POST https://api.tenderapi.eu/api/v1/tenders/search \
  -H "Content-Type: application/json" \
  -d '{"buyerCountries": ["IRL"], "limit": 5}'
python
import requests

res = requests.post(
    "https://api.tenderapi.eu/api/v1/tenders/search",
    json={"buyerCountries": ["IRL"], "limit": 5},
)
for tender in res.json()["tenders"]:
    print(tender["title"], tender["link"])
ts
const res = await fetch("https://api.tenderapi.eu/api/v1/tenders/search", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ buyerCountries: ["IRL"], limit: 5 }),
});
const data = await res.json();
for (const tender of data.tenders) {
  console.log(tender.title, tender.link);
}

The response has a tenders list and a page object. Here it is cut to one tender:

json
{
  "tenders": [
    {
      "id": "01a081e3-88a2-7089-b004-c05ce794265e",
      "title": "Contract for Housing First for Tenancy Support and Property Sourcing Services -Lot 1",
      "abstract": "Provision of Housing First tenancy support and Property Sourcing services",
      "status": "awarded",
      "serviceType": "services",
      "source": "ted",
      "publicationDate": "2026-09-04T00:00:00Z",
      "deadline": null,
      "deadlineHasTime": false,
      "buyer": {
        "name": "Dublin City Council",
        "country": "IRL"
      },
      "cpvCodes": ["85310000", "85311000", "85320000", "98000000", "85000000", "85300000"],
      "estimatedValue": {
        "value": 4838930,
        "currency": "EUR",
        "valueEur": 4838930
      },
      "link": "https://ted.europa.eu/en/notice/-/detail/609885-2026"
    }
  ],
  "page": {
    "nextCursor": "eyJkIjoiMjAyNi0wOS0wNCIsImlkIjoiMDFhMDgxZTMtODhhMi03MDg5LWIwMDQtYzA1Y2U3OTQyNjVlIiwicSI6IjE0ZjI5YzM0YTdiMSJ9",
    "total": { "count": 14, "capped": false }
  }
}

The full list of fields is on the Search Tenders page. To get the next five results, send the same request again with cursor set to nextCursor. See Pagination.

Endpoints ​

MethodPathDescription
POST/api/v1/tenders/searchSearch Tenders
GET/api/v1/tenders/{id}Get Tender
POST/api/v1/organisations/searchSearch Organisations
GET/api/v1/organisations/{id}Get Organisation
GET/api/v1/organisations/{id}/tendersOrganisation Tenders

Common values ​

Country codes ​

Countries use three letter ISO 3166-1 alpha-3 codes, for example DEU for Germany, FRA for France and SVN for Slovenia. Two letter codes like DE are rejected. Kosovo, which has no official ISO code, uses XKX.

CPV codes ​

Tenders are classified with Common Procurement Vocabulary (CPV) codes. A CPV code is 8 digits and describes what is being bought. Filtering by a code also matches all codes below it, so 45000000 (construction work) includes 45233000 (road works).

Find the right code for your sector with our CPV code search.

Dates ​

Dates in requests and responses use ISO 8601, for example 2025-03-15T00:00:00Z. Publication dates are day precision, so their time part is always midnight UTC.

Deadlines are returned in UTC and carry the hour when the portal publishes one, and deadlineHasTime is true. When a portal gives only a day, the deadline is the end of that day in the portal's local time and deadlineHasTime is false.

Limits ​

There are no enforced rate limits during beta. Please keep requests reasonable, and use limit and cursors instead of pulling the same data repeatedly.

Next steps ​

  • Search Tenders lists every filter you can use.
  • Pagination explains how to walk through large result sets.
  • Portals shows where the data comes from and how to filter by portal.
  • Errors explains the error format.

Beta. Free to use, no API key required.