# EU TED Tenders Scraper & Monitor (`cliqtomedia/eu-ted-tenders-scraper`) Actor

Search and monitor EU public tenders from TED (Tenders Electronic Daily) by date, CPV code, buyer country and notice type. Deadlines with time zone, estimated values with currency, lots and direct notice links; monitor mode returns only new notices.

- **URL**: https://apify.com/cliqtomedia/eu-ted-tenders-scraper.md
- **Developed by:** [Cliqto Media](https://apify.com/cliqtomedia) (community)
- **Categories:** Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.50 / 1,000 notice records

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

EU TED Tenders Scraper & Monitor searches public tender notices on TED (Tenders Electronic Daily, the EU's official journal for public procurement) by publication date, CPV code, buyer country, notice type and keywords, and saves one clean row per notice: title, buyer, deadline with time zone, estimated value with currency, lots and direct TED links.

Use it to find new EU tenders for your sales team, track a market every day, or feed tender data into a CRM or AI agent. The smallest run takes a few seconds: CPV code `72000000` (IT services), the last 7 days, 20 notices.

![EU TED Tenders Monitor: filters by date, CPV and country, one row per tender notice with deadline and value, monitor mode returns only new notices](https://api.apify.com/v2/key-value-stores/ZD8ECQbhAFBo9juYc/records/README-BANNER-20261011B.png)

### Table of contents

- [What it does](#what-it-does)
- [What data you get](#what-data-you-get)
- [Quick start](#quick-start)
- [Input](#input)
- [Input examples](#input-examples)
- [Output](#output)
- [Pricing](#pricing)
- [Use cases](#use-cases)
- [Monitoring and schedules](#monitoring-and-schedules)
- [API, integrations and AI agents (MCP)](#api-integrations-and-ai-agents-mcp)
- [Limits and partial results](#limits-and-partial-results)
- [Troubleshooting](#troubleshooting)
- [FAQ](#faq)
- [Related Actors](#related-actors)
- [Support](#support)

### What it does

The Actor sends your filters to the public [TED Search API](https://docs.ted.europa.eu/api/latest/search.html) and turns each published notice into one flat Dataset row. It works in two modes:

- **search** — returns every matching notice in the date window, newest first, up to `maxResults`.
- **monitor** — returns only notices that earlier runs of the same monitor did not deliver yet. Schedule it every day and you get only new tenders.

It reads only public notice data. It does not log in, does not download PDF or XML files (it gives you the links), and does not collect personal contact data.

#### Good fit

- Sales and bid teams who want new contract notices for their CPV codes and countries every morning.
- Market research on who buys what in the EU: award notices with values and currencies.
- Lead generation: buyer name, country, city and website for each tender.

#### Not a fit

- Full tender documents. The Actor gives `procurementDocumentsUrl`, `pdfUrl` and `xmlUrl`, but does not download them.
- Personal contacts. E-mail addresses and phone numbers are not in the output; e-mails inside descriptions are replaced with `[e-mail removed]`.
- Very old archives in one run. One run covers at most 31 days.

### What data you get

One row = one published TED notice. For each notice you get:

- **Identity:** publication number, eForms notice ID and version, procedure ID, notice type, form type, procedure type, change-notice links.
- **Text:** title, description and buyer name, each with the language that was actually used.
- **Buyer:** name, all buyer names, country, city, website.
- **Dates:** publication date, dispatch date, tender deadline and request-to-participate deadline with the time zone offset that TED publishes.
- **Money:** estimated value and total value, each with its currency. A value that TED does not publish is `null`, never `0`.
- **Scope:** main CPV code, all CPV codes, lots, places of performance, official languages.
- **Links:** TED notice page, PDF, XML and the buyer's procurement documents page.

### Quick start

1. Open the **Input** tab. The form is already filled: CPV `72000000`, last 7 days, 20 notices.
2. Optional: add buyer countries, for example `DEU` and `FRA`, or choose a notice type such as `cn-standard`.
3. Click **Start**.
4. Open the **Output** tab and look at the **Overview** view: title, buyer, country, deadline, value and link.

Expected result: up to 20 IT-services notices from the last 7 days, newest first. A run like this took 1–4 seconds in our tests.

### Input

All fields are optional. With an empty input the Actor returns the newest 100 notices of the last 7 days for all CPV codes and countries.

| Field | Type | Default / prefill | Allowed values | What it changes | Recommendation |
| --- | --- | --- | --- | --- | --- |
| `mode` | string | default `search` | `search`, `monitor` | `search`: every match. `monitor`: only notices not delivered by earlier runs of the same monitor. | Use `monitor` for daily schedules. |
| `lastDays` | integer | default `7`, prefill `7` | 1–31 | Publication window: the last N calendar days (UTC), including today. Used when `dateFrom` is empty. | 1–3 for a daily monitor; 7 or more for a one-off search (TED does not publish at weekends). |
| `dateFrom` | string | none | `YYYY-MM-DD` | First publication day, inclusive. Overrides `lastDays`. | Use for a fixed period. |
| `dateTo` | string | today | `YYYY-MM-DD` | Last publication day, inclusive. Works only together with `dateFrom`. | The window from `dateFrom` to `dateTo` must be 31 days or less. |
| `cpvCodes` | array of strings | prefill `["72000000"]` | up to 50 codes, 8 digits | Only notices with these CPV codes or their sub-codes. A `-N` check digit is ignored. Empty: all codes. | Use a broad code (e.g. `45000000` construction) to get all sub-codes. |
| `buyerCountries` | array of strings | empty | up to 60 ISO alpha-3 codes | Only buyers from these countries. Two-letter EU codes like `DE` are converted. Empty: all countries. | `DEU`, `FRA`, `POL`, … |
| `noticeTypes` | array of strings | empty | 20 eForms types | Only these notice types. Empty: all types. | `cn-standard` for open calls; add `can-standard` for award results. |
| `keywords` | string | empty | up to 200 characters | Full-text search in all languages of the notice. Quotes, brackets and operators are removed. | Short phrases such as `cloud computing`. |
| `preferredLanguage` | string | `ENG` | 24 EU languages | Language for title, description and links. If TED has no text in it, the row falls back to English, then to the original language. | Your team's language. |
| `maxResults` | integer | default `100`, prefill `20` | 1–2500 | Maximum rows per run, newest first. Each row is one paid notice event. | Keep it low for tests; raise for full exports. |
| `monitorStateName` | string | `default` | `a-z`, `0-9`, `-`, 1–40 characters | Monitor mode only: the name of the saved list of delivered notices. | One name per saved search, e.g. `it-services-de`. |

#### How settings work together

- Different filters are combined with AND: CPV **and** country **and** notice type **and** keywords. Several values inside one filter are combined with OR.
- `dateFrom` wins over `lastDays`. When `dateTo` is empty, it is today.
- In monitor mode `maxResults` limits how many **new** notices one run delivers. If there are more, the rest comes in the next run, without repeats.
- Invalid input (for example a 45-day window) stops the run before any request with status `INVALID_INPUT`. Codes that TED rejects (for example an unknown country) give the same status.

### Input examples

#### New IT tenders in Germany and Austria

```json
{
  "lastDays": 3,
  "cpvCodes": ["72000000"],
  "buyerCountries": ["DEU", "AUT"],
  "noticeTypes": ["cn-standard"],
  "maxResults": 100
}
```

Expected output: open contract notices with title, buyer, `tenderDeadline`, `estimatedValue` and `noticeUrl`.

#### Daily monitor for construction tenders in France, in French

```json
{
  "mode": "monitor",
  "lastDays": 3,
  "cpvCodes": ["45000000"],
  "buyerCountries": ["FRA"],
  "preferredLanguage": "FRA",
  "maxResults": 500,
  "monitorStateName": "construction-fr"
}
```

Expected output: the first run returns all matches; later runs return only new notices with `monitorStatus: "new"`. A run without new notices ends with status `NO_NEW` and 0 rows.

#### Award results for a fixed month

```json
{
  "dateFrom": "2026-09-01",
  "dateTo": "2026-09-30",
  "cpvCodes": ["48000000"],
  "noticeTypes": ["can-standard"],
  "maxResults": 1000
}
```

Expected output: award notices with `totalValue` and `totalValueCurrency` (the awarded total, when TED publishes it).

### Output

Each row is one TED notice. The Dataset has two views: **Overview** (the main columns) and **Details** (the key fields). Every field listed below is in the JSON, CSV and Excel exports. The run summary is saved as `RUN_SUMMARY` in the run's key-value store.

#### Output example

A real row from a run with CPV `72000000` and `preferredLanguage: "ENG"` (trimmed: `description` and some identifiers removed):

```json
{
  "publicationNumber": "700154-2026",
  "procedureId": "c8e5ed0b-9c1a-4c7b-b32a-130c6ceda6a4",
  "noticeType": "cn-standard",
  "formType": "competition",
  "procedureType": "open",
  "publicationDate": "2026-10-09",
  "title": "Germany – IT services: consulting, software development, Internet and support – Wartungleistungen von Server- und Storagesystemen sowie Switchen",
  "titleLanguage": "ENG",
  "buyerName": "Land Hessen, vertreten durch die Hessische Zentrale für Datenverarbeitung",
  "buyerNameLanguage": "DEU",
  "buyerCountry": "DEU",
  "buyerCity": "Wiesbaden",
  "buyerWebsite": "https://vergabe.hessen.de",
  "mainCpvCode": "72000000",
  "tenderDeadline": "2026-11-09T10:00:00+01:00",
  "tenderDeadlineDateOnly": false,
  "requestDeadline": null,
  "estimatedValue": 345600,
  "estimatedValueCurrency": "EUR",
  "estimatedValueSource": "procedure",
  "lotsCount": 1,
  "lotIds": ["LOT-0000"],
  "noticeUrl": "https://ted.europa.eu/en/notice/-/detail/700154-2026",
  "pdfUrl": "https://ted.europa.eu/en/notice/700154-2026/pdf",
  "xmlUrl": "https://ted.europa.eu/en/notice/700154-2026/xml",
  "linkLanguage": "ENG",
  "dataModel": "eforms",
  "monitorStatus": null,
  "source": "TED",
  "fetchedAt": "2026-10-11T02:17:31.898Z"
}
```

`null` means TED did not publish this value for the notice. It never means zero.

#### Output fields

| Field | Type | Can be empty? | Example | Meaning |
| --- | --- | --- | --- | --- |
| `publicationNumber` | string | no | `700154-2026` | TED publication number. One row per notice; a changed notice is a new row with its own number. |
| `noticeId` | string | yes (legacy notices) | UUID | eForms notice identifier. |
| `noticeVersion` | integer | yes (legacy) | `1` | eForms notice version. |
| `procedureId` | string | yes | UUID | Procedure identifier. Several notices can belong to one procedure. |
| `isChangeNotice` | boolean | no | `false` | True when the notice changes an earlier notice. |
| `changesNotice` | string | yes | `657981-2026` | Which notice this one changes. |
| `changeReasonCode` | string | yes | `cor-buy` | TED change reason code. |
| `noticeType` | string | yes | `cn-standard` | eForms notice type (contract notice, award, prior information, …). |
| `noticeSubtype` | string | yes | `16` | eForms subtype as published. |
| `formType` | string | yes | `competition` | planning, competition, result, change, … |
| `procedureType` | string | yes | `open` | Procedure type code. |
| `publicationDate` | string | yes | `2026-10-09` | Publication day in the Official Journal S. |
| `publicationDateRaw` | string | yes | `2026-10-09+02:00` | Publication date exactly as TED returns it. |
| `dispatchDate` | string | yes | `2026-10-08` | Day the buyer sent the notice to TED. |
| `ojsNumber` | string | yes | `196/2026` | Official Journal S issue. |
| `title` | string | yes | see example | Title in the preferred language or the fallback. |
| `titleLanguage` | string | yes | `ENG` | Language actually used for `title`. |
| `originalTitle` | string | yes | `Wartungleistungen …` | Short title in the buyer's original language. |
| `description` | string | yes | text | Procedure description, cut at 4,000 characters; e-mails removed. |
| `descriptionLanguage` | string | yes | `DEU` | Language actually used for `description`. |
| `buyerName` | string | yes | `Land Hessen, …` | Buyer name. TED usually has it only in the original language. |
| `buyerNameLanguage` | string | yes | `DEU` | Language of `buyerName`. |
| `buyerNames` | array | can be `[]` | `["Land Hessen, …"]` | All buyers of a joint procurement. |
| `buyerCountry` | string | yes | `DEU` | Buyer country, ISO alpha-3. |
| `buyerCountries` | array | can be `[]` | `["DEU"]` | All buyer countries. |
| `buyerCity` | string | yes | `Wiesbaden` | Buyer city. |
| `buyerWebsite` | string | yes | `https://vergabe.hessen.de` | Buyer organisation website as published; sometimes a bare domain. |
| `cpvCodes` | array | can be `[]` | `["72000000"]` | All CPV codes of the procedure and its lots. |
| `mainCpvCode` | string | yes | `72000000` | Main CPV code. |
| `placeOfPerformanceCountries` | array | can be `[]` | `["DEU"]` | Countries of performance, when published. |
| `tenderDeadline` | string | yes | `2026-11-09T10:00:00+01:00` | Earliest deadline for tenders across lots, with the offset that TED publishes. Null when the notice has none (for example award notices). |
| `tenderDeadlineDateOnly` | boolean | yes | `false` | True when TED gave only a day, no time. |
| `requestDeadline` | string | yes | `YYYY-MM-DDThh:mm:ss+hh:mm` or `YYYY-MM-DD` | Earliest deadline for requests to participate (restricted and negotiated procedures). |
| `estimatedValue` | number | yes | `345600` | Estimated value without VAT. Null when not published. |
| `estimatedValueCurrency` | string | yes | `EUR` | Currency of `estimatedValue`. |
| `estimatedValueSource` | string | yes | `procedure` | `procedure` or `lots_sum` (sum of lot estimates in one currency). |
| `totalValue` | number | yes | `345600` | Total value from TED; for award notices the awarded total. |
| `totalValueCurrency` | string | yes | `EUR` | Currency of `totalValue`. |
| `lotsCount` | integer | no | `1` | Number of lots (0 for legacy notices). |
| `lotIds` | array | can be `[]` | `["LOT-0000"]` | Lot identifiers. |
| `officialLanguages` | array | can be `[]` | `["DEU"]` | Languages the notice was published in. |
| `procurementDocumentsUrl` | string | yes | URL | Where the buyer publishes the tender documents. |
| `noticeUrl` | string | no | URL | Notice page on ted.europa.eu. |
| `pdfUrl` | string | yes | URL | PDF of the notice (link only). |
| `xmlUrl` | string | yes | URL | eForms XML of the notice (link only). |
| `linkLanguage` | string | yes | `ENG` | Language of `noticeUrl` and `pdfUrl`. |
| `dataModel` | string | no | `eforms` | `eforms` or `legacy` (older notices have fewer identifiers). |
| `monitorStatus` | string | yes | `new` | `new` in monitor mode; null in search mode. |
| `source` | string | no | `TED` | Data source. |
| `fetchedAt` | string | no | ISO date-time | When the Actor read the notice. |

#### Run status

The run summary (`RUN_SUMMARY`) and the run status message show one of these statuses:

| Status | Meaning | Rows |
| --- | --- | --- |
| `COMPLETE` | All matches were returned. | all matches |
| `CAPPED` | More matches exist; `maxResults` stopped the run. | `maxResults` |
| `NO_RESULTS` | TED answered, but nothing matches the filters. | 0 |
| `NO_NEW` | Monitor mode: nothing new since the last run. | 0 |
| `PARTIAL` | Some pages were read, then TED timed out or the run deadline came. Saved rows stay. | some |
| `CHARGE_LIMIT` | Your maximum cost per run was reached. | some |
| `CANCELLED` | The run was aborted. Saved rows stay. | some |
| `INVALID_INPUT` | Input or filters are not valid. The run fails. | 0 |
| `ERROR` | TED was not reachable or answered with an error before any row. The run fails; it is never shown as an empty success. | 0 |

### Pricing

This Actor uses pay-per-event pricing. You pay only these events; platform usage is included.

| Event | Price | When |
| --- | ---: | --- |
| Actor start | $0.01 | Once per run (the Actor runs on 256 MB, so it is always one start event). |
| Notice record | $0.0035 | For each notice saved to the Dataset. |

| Scenario | Rows | Total price |
| --- | ---: | ---: |
| Test run (prefill) | 20 | $0.08 |
| Daily search | 100 | $0.36 |
| Large export | 1,000 | $3.51 |
| Maximum run | 2,500 | $8.76 |
| Filter with no matches | 0 | $0.01 |
| Monitor run with no new notices | 0 | $0.01 |

A failed or invalid run costs the start event, plus the notices that were saved before the stop. Use the **Maximum cost per run** setting to cap spending: the Actor stops before a row that would go over the limit (status `CHARGE_LIMIT`).

### Use cases

| Job | Input | Key fields | Next step |
| --- | --- | --- | --- |
| Find open tenders to bid on | `cpvCodes`, `buyerCountries`, `noticeTypes: ["cn-standard"]` | `title`, `tenderDeadline`, `estimatedValue`, `procurementDocumentsUrl` | Send to a sheet or CRM |
| Daily tender alerts | `mode: "monitor"`, schedule | `monitorStatus`, `title`, `noticeUrl` | Slack or e-mail via integrations |
| Market and competitor research | `noticeTypes: ["can-standard"]`, `dateFrom`/`dateTo` | `buyerName`, `totalValue`, `totalValueCurrency`, `cpvCodes` | Export to CSV or BI |
| Public-sector lead lists | `buyerCountries`, `cpvCodes` | `buyerName`, `buyerCity`, `buyerWebsite` | Enrich in your CRM |

### Monitoring and schedules

1. Set `mode` to `monitor` and give the search a `monitorStateName`, for example `it-services-de`.
2. Keep `lastDays` at 1–3 so the window always covers the time since the last run.
3. Create a schedule in Apify (for example every working day at 08:00 UTC). TED publishes on working days.

The first run returns all current matches. The Actor saves the publication numbers it delivered in your named key-value store `eu-ted-tenders-monitor`. Each later run returns only notices with new publication numbers. If TED is down, the run fails with `ERROR` and the saved list is not changed, so you do not lose or repeat notices. Use a different `monitorStateName` for each saved search.

### API, integrations and AI agents (MCP)

- **API:** start a run with `POST https://api.apify.com/v2/acts/cliqtomedia~eu-ted-tenders-scraper/runs` and the input JSON, then read the Dataset items. See the **API** tab for ready code in JavaScript, Python and cURL.
- **Export:** JSON, CSV, Excel, XML or HTML from the Output tab or the Dataset API.
- **Schedules and webhooks:** use Apify schedules for daily monitors and webhooks or integrations (Make, Zapier, Slack, Google Sheets) to send new rows.

#### Use with AI agents (MCP)

- MCP server URL with only this Actor: `https://mcp.apify.com?tools=cliqtomedia/eu-ted-tenders-scraper`
- Smallest useful input (same as the prefill):

```json
{ "lastDays": 7, "cpvCodes": ["72000000"], "maxResults": 20 }
```

- Key output fields: `title` (what is bought), `buyerName` and `buyerCountry` (who buys), `tenderDeadline` (when offers are due, with time zone), `estimatedValue` with `estimatedValueCurrency` (how much, `null` if not published), `noticeUrl` (official notice page).
- Typical run: 1–10 seconds for up to 1,000 rows. Cost: $0.01 per run plus $0.0035 per row. Limits: 31-day window, 2,500 rows per run.

### Limits and partial results

- **Window:** at most 31 days per run. For longer periods, run once per month.
- **Rows:** at most 2,500 rows per run (`maxResults`). In our tests 2,500 rows took about 25 seconds.
- **TED query window:** TED serves only the first 15,000 notices of one query. A monitor run with very broad filters stops there with status `PARTIAL` and a warning; narrow the filters or use `lastDays` of 1–3.
- **Run time:** the Actor stops reading TED after about 4 minutes and keeps the rows it has (`PARTIAL`).
- **Values as published:** deadlines keep the time zone offset that TED publishes, even if it looks unusual. An `estimatedValue` of `0` means the buyer published 0; a missing value is `null`.
- **Languages:** buyer names and descriptions are often only in the original language. The `…Language` fields tell you which language you got.
- **No personal contacts:** contact e-mails and phone numbers are not returned.

### Troubleshooting

#### The run finished with 0 rows

Check the status message. `NO_RESULTS` means TED has no notice for these filters in this window: try a broader CPV code, more countries or a longer `lastDays`. `NO_NEW` in monitor mode means nothing new since the last run. An outage is never shown as 0 rows: it ends with `ERROR`.

#### The run failed with INVALID_INPUT

The message names the field. Common reasons: the date window is longer than 31 days, `dateFrom` is after `dateTo`, a CPV code does not have 8 digits, or TED did not accept a country code.

#### The run failed with ERROR

TED was not reachable or returned a server error. Wait a few minutes and start the run again. In monitor mode the saved list was not changed.

#### The title is not in my language

TED does not translate every notice. The row falls back to English, then to the original language, and `titleLanguage` shows which one you got.

### FAQ

#### Do I need a TED account or API key?

No. The Actor uses the public anonymous TED Search API.

#### Is this an official TED product?

No. This Actor is not affiliated with or endorsed by the Publications Office of the European Union. Source: TED — Tenders Electronic Daily, Publications Office of the European Union, reused under the [Commission's reuse decision 2011/833/EU](https://eur-lex.europa.eu/eli/dec/2011/833/oj). Always check the official notice before you bid. Each row links to the official notice on ted.europa.eu.

#### How fresh is the data?

Each run reads TED live, so you get what TED shows at that moment. TED publishes new notices on working days (Monday–Friday).

#### Why are there several rows with the same procedure?

A procedure can have several notices: a contract notice, corrections, an award notice. Each notice is its own row; `procedureId` connects them.

#### What is a CPV code?

The Common Procurement Vocabulary is the EU code list for what is bought. You can search codes on [SIMAP](https://simap.ted.europa.eu/cpv).

### Related Actors

- [USAspending Federal Awards & Recipient Monitor](https://apify.com/cliqtomedia/usaspending-federal-awards-monitor) — the same job for US federal contract and grant awards.
- [France Company & SIRET Search](https://apify.com/cliqtomedia/france-sirene-company-search) — check French buyers or winners in the official Sirene register.

### Support

Open an issue in the **Issues** tab of this Actor. Include the run ID, the input (without private data) and the status message. Never send API tokens or passwords.

# Actor input Schema

## `mode` (type: `string`):

search: every matching notice in the date window. monitor: only notices that earlier runs of the same monitor (monitorStateName) have not delivered yet — schedule it daily to get new tenders only. The first monitor run returns every match.

## `lastDays` (type: `integer`):

Publication window when Date from is empty: the last N calendar days (UTC), including today. TED publishes on working days (Monday–Friday). 1–31, default 7, so the window always contains several working days.

## `dateFrom` (type: `string`):

First publication day (YYYY-MM-DD), inclusive. Overrides Last N days. The window may be at most 31 days.

## `dateTo` (type: `string`):

Last publication day (YYYY-MM-DD), inclusive. Default: today (or Date from, when it is in the future).

## `cpvCodes` (type: `array`):

Up to 50 CPV codes (8 digits; a -N check digit is ignored), e.g. 72000000 for IT services or 45000000 for construction. TED also matches every sub-code of a broader code. Empty: all CPV codes.

## `buyerCountries` (type: `array`):

ISO 3166-1 alpha-3 codes of the buyer country, e.g. DEU, FRA, POL (two-letter EU codes such as DE are converted). Empty: all countries.

## `noticeTypes` (type: `array`):

eForms notice types. Empty: all types. Most bidders want cn-standard (contract notices); market research often adds can-standard (award notices).

## `keywords` (type: `string`):

Optional full-text search in TED (all languages of the notice), e.g. cloud computing. Up to 200 characters; quotes, brackets and operators are removed.

## `preferredLanguage` (type: `string`):

Language for title, description and links. When TED has no text in it, the row falls back to English, then to the notice's original language, and says which language was used (titleLanguage, buyerNameLanguage). Buyer names are usually only in the original language.

## `maxResults` (type: `integer`):

Maximum notices (Dataset rows) per run, newest first. Each row is one paid notice event. 1–2500, default 100.

## `monitorStateName` (type: `string`):

Monitor mode only: name of the snapshot of delivered notices (a-z, 0-9, -). Use a different name for each saved search, e.g. it-services-de. Stored in your named key-value store eu-ted-tenders-monitor.

## Actor input object example

```json
{
  "mode": "search",
  "lastDays": 7,
  "cpvCodes": [
    "72000000"
  ],
  "preferredLanguage": "ENG",
  "maxResults": 20,
  "monitorStateName": "default"
}
```

# Actor output Schema

## `notices` (type: `string`):

One row per TED notice: title, buyer, CPV, deadline, value and links.

## `details` (type: `string`):

eForms identifiers, change references, lots, languages and links.

## `runSummary` (type: `string`):

Status, counts, query, source attribution and request statistics.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "lastDays": 7,
    "cpvCodes": [
        "72000000"
    ],
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("cliqtomedia/eu-ted-tenders-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "lastDays": 7,
    "cpvCodes": ["72000000"],
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("cliqtomedia/eu-ted-tenders-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "lastDays": 7,
  "cpvCodes": [
    "72000000"
  ],
  "maxResults": 20
}' |
apify call cliqtomedia/eu-ted-tenders-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,cliqtomedia/eu-ted-tenders-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/qULew1akamUHjnOqO/builds/bPmFmM1hptfT5hEzN/openapi.json
