--- url: https://docs.tenderapi.eu/search-tenders.md description: >- Search and filter EU tenders by keyword, CPV code, country, value, status and deadline across all connected portals. --- # 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. ::: code-group ```bash [cURL] 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 [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 [TypeScript] 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](/portals). | | `cpvCodes` | `string[]` | 8 digit [CPV codes](/getting-started#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](/getting-started#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](/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](/pagination#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](/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](/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](/portals). | | `publicationDate` | `string` | Publication date, ISO 8601. | | `deadline` | `string \| null` | Submission deadline, ISO 8601 in UTC. See [Dates](/getting-started#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](/pagination) for `nextCursor` and `total`.