# EU & UK Public Tenders Search: TED + Find a Tender (`humble-echidna/eu-ted-tenders`) Actor

Search EU and UK public tenders in one format: TED (Tenders Electronic Daily), the EU's official procurement journal, and the UK's Find a Tender, through their official public APIs. Filter by keywords, CPV codes, country, buyer, notice type and date; get deadlines, values, buyers and official links.

- **URL**: https://apify.com/humble-echidna/eu-ted-tenders.md
- **Developed by:** [Michael Costa](https://apify.com/humble-echidna) (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 $2.00 / 1,000 notices

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

### What does EU & UK Public Tenders Search: TED + Find a Tender do?

**EU & UK Public Tenders Search** searches **public tenders** on **TED** (the EU's official procurement journal) and
the UK's **Find a Tender** in one go, and returns clean notice records: title, buyer, deadline, value, CPV codes and
links to the official notice. Official public APIs; no login, no key.

**Try it in one click:** the input comes pre-filled with the 20 newest open calls for tenders mentioning
"software" from each source: up to 40 notices, or about $0.08 (40 × $0.002 per notice, plus $0.00005 for the run
start). The UK part takes a few minutes (Find a Tender limits how fast it can be read, see the FAQ). **Then replace
it with what you actually want.**

### Monitor new public tenders (tender alerts)

EU & UK Public Tenders Search can run your search on a schedule and give you only the notices it hasn't returned
before. Set it up once:

1. **Save a task.** Fill in **Keywords**, **CPV codes** and **Buyer countries**, turn on **Only tenders still open**
   and **Only new notices** (`openOnly: true`, `onlyNew: true` in the API), and set **Published from** to `7 days`.
   Then click **Save as a new task** at the top right of the actor's page. The first run returns everything that
   matches; later runs return only notices this search hasn't returned before. "7 days" moves with every run.
2. **Schedule it.** In Apify Console, open **Schedules**, click **Create new**, pick the task and set how often it runs
   (for example every weekday at 07:00, cron `0 7 * * 1-5`).
3. **Send the new tenders where you work,** from the task's **Integrations** tab:
   - **Slack:** a message in the channel you choose when a run succeeds (you pick the events and can edit the
     message).
   - **Email:** *Send results email via Gmail* sends the run's results, with the dataset attached.
   - **Webhook:** a POST to your URL on the `ACTOR.RUN.SUCCEEDED` event. The payload's `resource.defaultDatasetId`
     points to the new notices: `GET https://api.apify.com/v2/datasets/<defaultDatasetId>/items?format=json` with
     your API token.
   - **Make, Zapier or n8n:** each has an Apify step that starts on a finished run and reads its dataset.

A run that finds nothing new returns 0 notices and costs only the $0.00005 start fee. Slack and email are sent for
every successful run, including a quiet one; to hear only about new tenders, use the webhook or Make/Zapier/n8n and
skip runs whose dataset is empty. Add the **run failed** event too, so a failed run doesn't go unnoticed. Keep the
task's filters fixed: the memory is per keyword line and filter set, so changing them starts a fresh search. If Find a
Tender refuses a run's UK requests, the next run still returns the UK notices it missed, as long as they are inside
its **Published from** window.

### What data does EU & UK Public Tenders Search return?

| Field | Example | Notes |
|---|---|---|
| `title` | `Growth Hub Website` | TED titles in the language you pick; `titleOriginal` keeps the buyer's own. |
| `source` | `find-a-tender` | `ted` or `find-a-tender`. |
| `buyerName`, `buyerCountry` | `York and North Yorkshire Combined Authority`, `GBR` | Plus `buyerCity` and `buyerWebsite` when given. |
| `deadline` | `2026-10-16T12:00+01:00` | The earliest tender deadline over all lots, with its time. |
| `participationRequestDeadline` | `null` | Often comes first in restricted and negotiated procedures. |
| `estimatedValue`, `estimatedValueCurrency` | `90000`, `GBP` | Numbers; `null` when the notice gives none. |
| `awardedValue`, `awardedValueCurrency` | `null` | On award notices. |
| `cpvCodes` | `72212224`, `72413000` | Each code once. |
| `placeOfPerformance` | `UKE` | NUTS codes (TED) or ITL codes (UK). |
| `noticeCategory`, `procedureType` | `competition`, `Below threshold - open competition` | `competition`, `award`, `prior`, `modification`, or `null`. |
| `publicationDate` | `2026-09-25` | |
| `description` | `Perkančioji organizacija numato...` | In the buyer's language; e-mail addresses and phone numbers removed. |
| `url`, `pdfUrl`, `xmlUrl` | `https://www.find-tender.service.gov.uk/Notice/091136-2026` | The official notice. |
| `id` | `fts:091136-2026` | Stable across runs, for deduplication. |

Every notice has the same fields; the full record is under [Output](#output).

### How much does it cost to search public tenders?

You pay per notice returned: **$2.00 per 1,000 notices**, plus $0.00005 each time a run starts. A search that fails costs
nothing, and a repeat run with nothing new costs only the start fee.

- **The example below:** 40 notices × $0.002 = $0.08, plus the $0.00005 start fee; the repeat run $0.00005.
- **A month, for example:** a daily alert for one CPV niche that sees about 10 new notices a day: 300 × $0.002 =
  **$0.60**, plus 30 starts ($0.0015).
- **Caps:** **Max results per run** in the input, and **Maximum cost per run** in the run options. It stops cleanly at
  whichever comes first, and stops fetching as soon as the limit is covered, so a capped run is also a fast one.

### How to search EU and UK public tenders

1. Open the actor and choose the **Sources**: TED (EU), Find a Tender (UK), or both.
2. Type one search per line into **Keywords**, and narrow it with **CPV codes**, **Buyer countries**, **Notice types**
   or **Only tenders still open**.
3. Click **Start**. With the UK source on, expect a few minutes.
4. Open the **Output** tab and export the notices as JSON, CSV or Excel, or read them through the API.
5. For tender alerts, save it as a task and schedule it (see *Monitor new public tenders* above).

The two sources:

- **TED (Tenders Electronic Daily)**, the EU's official journal of public procurement, where every public tender
  above the EU thresholds in the EU and EEA is published, plus many from EU institutions and other countries.
- **Find a Tender**, the UK government's service where UK public bodies publish their tenders, awards and
  planned purchases (since the Procurement Act 2023, below-threshold notices too).

### Example: open "software" tenders from the past week

The pre-filled search, set up as an alert (only open tenders, published in the last 7 days, only new notices):

```json
{"queries": ["software"], "sources": ["ted", "uk"], "noticeTypes": ["competition"], "openOnly": true,
 "publishedFrom": "7 days", "language": "en", "maxResultsPerQuery": 20, "onlyNew": true}
```

It returned 20 TED and 20 UK notices. The newest TED one (real output from a local run on 2026-09-25;
`description` shortened):

```json
{
  "id": "660594-2026",
  "title": "Lithuania – Programming services of systems and user software – Vilniaus turizmo informacijos centro skaitmeninimo paslaugos (Atviras tarptautinis pirkimas)",
  "noticeCategory": "competition",
  "procedureType": "open",
  "contractNature": ["services"],
  "publicationDate": "2026-09-25",
  "deadline": "2026-09-30T09:30+03:00",
  "buyerName": "VšĮ Vilniaus pirkimų agentūra",
  "buyerCountry": "LTU",
  "cpvCodes": ["72211000"],
  "estimatedValue": null,
  "description": "Perkančioji organizacija numato įsigyti Vilniaus turizmo informacijos centro skaitmeninimo paslaugas...",
  "url": "https://ted.europa.eu/en/notice/-/detail/660594-2026",
  "pdfUrl": "https://ted.europa.eu/en/notice/660594-2026/pdf"
}
```

And one of the UK notices from Find a Tender (real output from a local run on 2026-09-25, with the default input):

```json
{
  "id": "fts:091136-2026",
  "source": "find-a-tender",
  "title": "Growth Hub Website",
  "noticeType": "tender",
  "noticeCategory": "competition",
  "procedureType": "Below threshold - open competition",
  "publicationDate": "2026-09-25",
  "deadline": "2026-10-16T12:00+01:00",
  "buyerName": "York and North Yorkshire Combined Authority",
  "buyerCountry": "GBR",
  "cpvCodes": ["72212224", "72413000"],
  "placeOfPerformance": ["UKE"],
  "estimatedValue": 90000.0,
  "estimatedValueCurrency": "GBP",
  "url": "https://www.find-tender.service.gov.uk/Notice/091136-2026",
  "pdfUrl": "https://www.find-tender.service.gov.uk/Notice/091136-2026/PDF"
}
```

Run again straight after, the same search returned **0 notices** from either source, so only the start fee was
charged. The first run took about 4 minutes and the repeat about 3: the UK part reads the last 7 days of Find a
Tender at its allowed pace.

### Input

| Field | What it does |
|---|---|
| Sources | TED (EU) and/or Find a Tender (UK). The console pre-fills both; left out of an API call, TED only. |
| **Keywords** | One search per line, matched against the full text of each notice. Quotes make a phrase (`"road maintenance"`), `AND` / `OR` / `NOT` combine words, `*` is a wildcard. Leave empty to search by the filters alone. |
| CPV codes | Only notices under these CPV codes, e.g. `72000000` (IT services). A broad code includes every code below it. |
| Buyer countries | `DE`, `FR`, `EL`/`GR`... or three-letter codes (`DEU`). UK notices are included only when this is empty or includes `GB` / `UK`. |
| Buyer name | Words in the contracting authority's name, e.g. `Bundesagentur für Arbeit`. |
| Notice types | Open calls for tenders (default), contract awards, prior information notices, modifications. Empty = all kinds. |
| Only tenders still open | Only notices whose deadline for tenders is today or later. |
| Published from / to | A date (`2026-09-01`), or for "from" a number of days back (`7 days`). |
| Language | Language of TED's titles and links (24 EU languages). UK notices are in English. |
| Max notices per search | Per keyword line and source, newest first; up to TED's limit of 15,000. |
| Only new notices | Skip notices this search returned in earlier runs. |
| Max results per run | Cap the total number of notices across all searches. |

```json
{
  "queries": ["cloud hosting", "\"data centre\""],
  "cpvCodes": ["72000000"],
  "countries": ["DE", "AT", "CH"],
  "noticeTypes": ["competition"],
  "openOnly": true,
  "publishedFrom": "7 days",
  "language": "en",
  "maxResultsPerQuery": 100,
  "onlyNew": true
}
```

### Output

Every notice has the same fields. Fields the notice doesn't give are `null` (or an empty list).

```json
{
  "id": "658275-2026",
  "query": "software",
  "title": "Greece – Software package and information systems – Δράσεις Ψηφιακού Μετασχηματισμού του Δήμου Ναυπλιέων",
  "titleOriginal": "Δράσεις Ψηφιακού Μετασχηματισμού του Δήμου Ναυπλιέων",
  "originalLanguage": "ell",
  "noticeType": "cn-standard",
  "noticeCategory": "competition",
  "procedureType": "open",
  "contractNature": ["supplies"],
  "publicationDate": "2026-09-24",
  "deadline": "2026-10-27T13:00+02:00",
  "participationRequestDeadline": null,
  "buyerName": "ΔΗΜΟΣ ΝΑΥΠΛΙΕΩΝ",
  "buyerCountry": "GRC",
  "buyerCity": "ΝΑΥΠΛΙΟ",
  "buyerWebsite": "www.nafplio.gr",
  "cpvCodes": ["48000000", "32420000", "72268000", "80533100", "71356300"],
  "placeOfPerformance": ["EL651"],
  "placeOfPerformanceCountries": ["GRC"],
  "estimatedValue": 649923,
  "estimatedValueCurrency": "EUR",
  "awardedValue": null,
  "awardedValueCurrency": null,
  "description": "Αντικείμενο της σύμβασης είναι η προμήθεια νέων εφαρμογών και τεχνολογικών μέσων ...",
  "url": "https://ted.europa.eu/en/notice/-/detail/658275-2026",
  "pdfUrl": "https://ted.europa.eu/en/notice/658275-2026/pdf",
  "xmlUrl": "https://ted.europa.eu/en/notice/658275-2026/xml",
  "scrapedAt": "2026-09-24T21:30:00Z"
}
```

`source` is `ted` or `find-a-tender`. `id` is stable across runs, so you can use it to deduplicate: TED's
publication number, or `fts:` plus Find a Tender's notice ID. `noticeCategory` is
`competition`, `award`, `prior`, `modification`, or `null` for other notices (corrections, for example).
`deadline` is for tenders; restricted and negotiated procedures often have a `participationRequestDeadline` first.
The description stays in the language the buyer wrote it in.

#### How UK notices fit the same fields

- `noticeType` is Find a Tender's own type (`tender`, `award`, `planning`, `contractAmendment`, `tenderUpdate`,
  ...); `noticeCategory` groups them like TED's: `tender` is `competition`, `award` is `award`, `planning` is
  `prior`, `contractAmendment` is `modification`, and updates, cancellations and terminations are `null`.
- `procedureType` is the procedure as Find a Tender names it (`Open procedure`, `Competitive flexible procedure`,
  `Below threshold - open competition`, ...). `deadline` is the tender deadline;
  `participationRequestDeadline` the deadline for requests to participate (expressions of interest).
- `estimatedValue` is net of VAT when the notice gives both. `awardedValue` adds up the awards of an award notice
  when they share one currency. Suppliers' names aren't returned, as for TED.
- `placeOfPerformance` has ITL region codes (`UKE`, `UKG13`), the UK's successor to NUTS. `xmlUrl` is `null`.

### Run it on a schedule, or from your own code

- **Schedule:** save the input as a task and add it to a schedule, as in *Monitor new public tenders* above.
- **API:** fetch a task's latest results with
  `GET https://api.apify.com/v2/actor-tasks/<task id>/runs/last/dataset/items?status=SUCCEEDED&format=csv` and your
  API token (`format` can also be `json` or `xlsx`).
- **Webhooks and automation:** a webhook when a run succeeds, or Make, Zapier or n8n through Apify's integrations.

#### Can I use EU & UK Public Tenders Search from an AI agent (MCP)?

Yes. Connect the agent to Apify's MCP server (`https://mcp.apify.com`) and add `humble-echidna/eu-ted-tenders` as a
tool; the agent passes the same input JSON as above. The UK source takes minutes (see the FAQ), so leave it
out (`"sources": ["ted"]`, the API default) when the agent needs a quick answer. Keep **Max notices per search** small so answers stay short.
A field left out takes its default, and **Keywords** defaults to `software`: to search by CPV code or buyer alone,
pass `"queries": []`.

### Who it's for

Companies that bid for public contracts in the EU and the UK (IT, construction, consulting, medical supplies, and so
on), and the consultants who find tenders for them. The recurring job: a daily or weekly alert of new open calls for
tenders in your CPV codes and countries, with the deadline and value up front.

### Why this one?

- **EU and UK in one list.** Since Brexit, UK tenders are no longer on TED. Here they come back from Find a
  Tender in the same fields as TED's (CPV codes, deadlines, values, buyer, links), each marked with its `source`.
- **Tender alerts that don't repeat themselves.** Turn on **Only new notices** and schedule it: each run returns only
  notices that search hasn't returned before. "Published from: 7 days" moves with every run.
- **Readable in your language.** TED translates every notice title into all 24 EU languages; pick yours, and the
  links open the official notice in that language too. The buyer's own title and language are kept alongside.
- **Clean fields, not raw eForms.** TED repeats CPV codes, places and deadlines once per lot, as lists in 24
  languages; you get each value once, the earliest deadline over all lots (with its time), and values as numbers
  with their currency.
- **No personal data.** None of TED's contact-person, e-mail, phone or fax fields are requested, and e-mail
  addresses and phone numbers are removed from the free text.
- **Polite and safe.** It identifies itself honestly (User-Agent `HumbleEchidnaApify`), follows robots.txt, and stays
  under TED's fair usage policy (at most 600 requests a minute, 3 at a time; TED allows 700) and Find a Tender's
  request limit (one request every 10 seconds, one at a time; it allows about 12 per 2 minutes).
- **Reliable.** One failing search never affects the others in your run, and one source failing never affects the
  other. The run log and the `RUN_STATS`
  record say exactly which search had a problem and why.

### Limits

- **TED covers above-threshold tenders.** Below-threshold tenders in EU countries are usually only on national
  portals, which this actor doesn't read.
- **UK searches are slow** (about one day of notices per minute) and go back at most 14 days per search (see the FAQ).
- **At most "Max notices per search" per keyword line and source**, newest first (20 by default; TED allows up to
  15,000).

### FAQ

#### Which tenders are on TED?

Public contracts above the EU thresholds from the EU and EEA countries, plus
notices from EU institutions and some other countries, since 2016 in this API. Below-threshold tenders are usually
only on national portals.

#### How are UK notices searched?

Find a Tender's API lists notices by the day they were published or updated; it
has no keyword search. So this actor reads the UK notices day by day, from the newest back, and applies your
keywords and filters itself, in the same syntax as TED's (all words must appear, whole words, any case; `"phrase"`,
`OR`, `NOT`, `*`). A UK search stops once it has "Max notices per search" matches, or at 14 days back, whichever
comes first (the run log and `RUN_STATS` say which days were read).

#### Why are UK searches slow?

Find a Tender lets a caller make about 12 requests every 2 minutes, and answers
more with "Rate limit of 12 exceeded. Please retry after 120 seconds." A day of UK notices is about 5 requests
(roughly 400 notices), so this actor reads about one day of UK notices per minute (one request every 10 seconds)
and never tries to get around the limit. For a UK alert, set **Published from** to `1 days` or `7 days` and run it
daily or weekly. If Find a Tender still refuses (another program on the same Apify server may have used the
allowance), that run's UK searches fail with the reason in the log and `RUN_STATS`; TED's results are still
returned, and with **Only new notices** the next run still returns the UK notices it missed, as long as they are
inside its **Published from** window.

#### Why are there fewer results than on the TED website?

Each search line returns at most "Max notices per search"
(20 by default), newest first. TED's API allows up to 15,000 per search.

#### Why does a search fail with "TED rejected the search"?

TED couldn't read the query built from that line. The run log
shows the query; simplify the keywords (for example, a stray `AND` at the end). Other lines in the run still run.

#### Why does something that used to work now fail or return fewer results?

TED may have changed its API. The run log
names the search and what went wrong, and every other search in the run is unaffected. Please open an issue with
the input you used.

#### Is it legal to search and reuse TED and Find a Tender notices?

Yes, for both sources.

*TED.* It only uses TED's official Search API, which is public, needs no key and is documented for
data reusers ([TED API docs](https://docs.ted.europa.eu/api/latest/search.html)). TED's
[legal notice](https://ted.europa.eu/en/legal-notice) says: "Unless otherwise noted, the procurement notices
published in the Supplement to the Official Journal of the European Union can be freely reused, for commercial or
non-commercial purposes", under the Commission's reuse policy (Decision 2011/833/EU). Source: TED, © European
Union, 1998-2026; the records are reformatted (fields flattened, contact details removed). It stays within TED's
[fair usage policy](https://ted.europa.eu/en/news/fair-usage-policy-on-ted). It collects no personal contact data:
TED's contact-person, e-mail, phone and fax fields are never requested, and e-mail addresses and phone numbers are
removed from descriptions. Names written into a description's free text can't be detected reliably and may remain.
This actor is not affiliated with the Publications Office of the EU.

*Find a Tender (UK).* It only uses the OCDS API that Find a Tender publishes under "Data outputs" on its
[data and API page](https://www.find-tender.service.gov.uk/Developer/Documentation), which says: "Notice data is
available under the Open Government Licence". The
[Open Government Licence v3.0](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/) lets you
"exploit the Information commercially and non-commercially", on condition that you acknowledge the source:
Contains public sector information licensed under the Open Government Licence v3.0. Find a Tender's
[terms](https://www.find-tender.service.gov.uk/Home/TermsAndConditions) add: "We make most of the content on Find a
Tender available through feeds for other websites and applications to use." The licence doesn't cover personal
data, so contact points are never read, and e-mail addresses and phone numbers are removed from descriptions. It
keeps to Find a Tender's request limit (see above) and identifies itself in its User-Agent. This actor is
not affiliated with or endorsed by the Cabinet Office or Find a Tender.

### Related actors

| Actor | Use it when |
|---|---|
| [Dataset Transformer: Filter, Dedupe, Convert](https://apify.com/humble-echidna/dataset-transform) | You want to keep only notices above a value or with a deadline far enough away, and export them as CSV for your bid team. |

### Feedback and support

Found a bug, or need a field or source that isn't here? Open an issue on the **Issues** tab with the input you used.

### Versions

Current version: **1.1**. See the Changelog tab for what changed in each version.

# Changelog

This Actor's version history is a separate document: https://apify.com/humble-echidna/eu-ted-tenders/changelog.md

# Actor input Schema

## `sources` (type: `array`):

Where to search: `ted` (TED, the EU's official journal of public procurement) and/or `uk` (Find a Tender, the UK government's service; English only). Default \["ted"]. Find a Tender only lets callers make about 12 requests every 2 minutes, so a UK search takes about a minute per day of notices it reads and looks back at most 14 days (see the README). Every filter below applies to both.

## `queries` (type: `array`):

One search per line, matched against the full text of each notice (e.g. software, "road maintenance", cleaning AND hospital). Quotes make a phrase; AND, OR and NOT combine words; \* is a wildcard. Every filter below applies to every line. Left out, it defaults to software: pass an empty list to search by the filters alone.

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

Only notices classified under these CPV codes (the EU's procurement vocabulary, 8 digits, e.g. 72000000 for IT services), one per line. A broad code includes every code below it. Any one of the codes matches. Leave empty (the default) for any code.

## `countries` (type: `array`):

Only notices from buyers in these countries, as two-letter (DE, FR, EL or GR) or three-letter (DEU, FRA) codes. Any one of them matches. UK notices are included only when this is empty or includes GB (or UK, GBR).

## `buyerName` (type: `string`):

Only notices whose buyer (the contracting authority) name contains these words, e.g. Bundesagentur für Arbeit. Leave empty (the default) for any buyer.

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

Which kinds of notice to return: `competition` (open calls for tenders, i.e. contract notices), `award` (contract award notices: who won, for how much), `prior` (prior information notices: planned purchases), `modification` (contract modifications). Default \["competition"]. Pass an empty list for all kinds (including corrections and other notices).

## `openOnly` (type: `boolean`):

Default false. When true, only notices whose deadline for tenders is today or later.

## `publishedFrom` (type: `string`):

Only notices published on or after this: a date (2026-09-01) or a number of days back (7 days). Days back move with each run, so a scheduled run always looks at the last N days. Leave empty (the default) for no lower limit.

## `publishedTo` (type: `string`):

Only notices published on or before this date, as YYYY-MM-DD, e.g. 2026-09-30. Leave empty (the default) for no upper limit.

## `language` (type: `string`):

Language for the title and links, where TED has a translation, as a two-letter code: `en` (default), `de`, `fr`, `es`, `it`, `pl` and the other official EU languages. TED translates each notice's title into all 24 EU languages; the description stays in the language the buyer wrote it in. UK notices are in English.

## `maxResultsPerQuery` (type: `integer`):

At most this many notices per keyword line from each source, newest first: 1 to 15,000 (TED's own limit per search), default 20. With both sources and 3 keyword lines, a run can return up to 6 times this many.

## `onlyNew` (type: `boolean`):

Default false. When true, return only notices this search hasn't returned before (remembered in your Apify account, per keyword line and filter set). The first run returns everything. Good for scheduled tender alerts.

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

Stop after this many notices in total across all searches, e.g. 20. Minimum 1; leave empty (the default) for no limit. The run also stops cleanly at the maximum cost per run you set in the run options, whichever comes first. Set it to keep a run small and quick.

## Actor input object example

```json
{
  "sources": [
    "ted",
    "uk"
  ],
  "queries": [
    "software"
  ],
  "noticeTypes": [
    "competition"
  ],
  "openOnly": false,
  "language": "en",
  "maxResultsPerQuery": 20,
  "onlyNew": false
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `runStats` (type: `string`):

No description

# 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 = {
    "sources": [
        "ted",
        "uk"
    ],
    "queries": [
        "software"
    ],
    "maxResultsPerQuery": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("humble-echidna/eu-ted-tenders").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 = {
    "sources": [
        "ted",
        "uk",
    ],
    "queries": ["software"],
    "maxResultsPerQuery": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("humble-echidna/eu-ted-tenders").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 '{
  "sources": [
    "ted",
    "uk"
  ],
  "queries": [
    "software"
  ],
  "maxResultsPerQuery": 20
}' |
apify call humble-echidna/eu-ted-tenders --silent --output-dataset

```

## MCP server setup

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

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/YBku8nSdSeNCthyxS/builds/IBZJ4Gfn8RwXuSoQ1/openapi.json
