# EU + UK Public Tenders Feed (Unofficial) (`graylabs/eu-uk-tenders`) Actor

Public tenders from the EU's TED and UK Contracts Finder in one schema, from official keyless APIs. Filter by date, keyword, CPV, country, region, value and notice kind. Change tracking. Not affiliated with the EU Publications Office or Crown Commercial Service.

- **URL**: https://apify.com/graylabs/eu-uk-tenders.md
- **Developed by:** [Gray Labs](https://apify.com/graylabs) (community)
- **Categories:** Business, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 notice saveds

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 + UK Public Tenders Feed (Unofficial)

### What does EU + UK Public Tenders Feed (Unofficial) do?

This Actor gives you **public procurement notices from the EU and the UK in one clean, flat format**: calls for tender, prior information notices and contract award notices, one row per notice, each with a link to the original notice. Every row is checked against a fixed schema before it is saved.

It reads two official, keyless sources:

- **TED (Tenders Electronic Daily)**, the EU's public procurement journal, through TED's public Search API. Covers the procurement notices published in the Supplement to the Official Journal of the EU.
- **UK Contracts Finder**, the UK government's notice service, through its public OCDS search API.

You don't need an account or API key for either source. Put it on a schedule for a daily feed of new and changed notices for your CPV codes, countries, regions or keywords, or run it once to research a market.

> This Actor is unofficial. It is not affiliated with, endorsed by, or sponsored by the Publications Office of the European Union, the European Commission or Crown Commercial Service. Data comes from their public APIs.

### What data can you extract?

| Field                                                             | What it is                                                                                                              |
| ----------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| `noticeId`                                                        | Unique key: `ted:<publication number>` or `cf:<notice id>`                                                              |
| `source`, `sourceName`                                            | `ted` or `contracts_finder`, and the source's full name                                                                 |
| `noticeUrl`                                                       | Link to the original notice on ted.europa.eu or contractsfinder.service.gov.uk                                          |
| `title`, `titleLanguage`, `titleIsOriginal`                       | Title (English where the source offers one; see Languages)                                                              |
| `originalTitle`, `originalLanguage`                               | Title in the notice's original language                                                                                 |
| `noticeKind`                                                      | `planning`, `tender`, `award` or `other` (same meaning for both sources)                                                |
| `noticeType`, `procedureType`, `contractNature`                   | The source's own notice type, procedure (e.g. open) and works/supplies/services                                         |
| `buyerName`, `buyerCountry`, `buyerRegion`                        | Buying organisation, its country (ISO 3-letter) and region (TED: NUTS code)                                             |
| `nutsCodes`, `deliveryRegions`, `placeOfPerformanceCountries`     | Where the work happens (TED: NUTS codes; Contracts Finder: UK region names)                                             |
| `cpvCodes`, `mainCpvCode`, `mainCpvDescription`                   | CPV classification codes                                                                                                |
| `estimatedValue`, `estimatedValueCurrency`, `estimatedValueBasis` | Estimated value as published, in the notice's own currency, and how it was derived (see Lots)                           |
| `awardedValue`, `awardedValueCurrency`                            | Total awarded value for award notices, when published                                                                   |
| `lotCount`                                                        | Number of lots (TED)                                                                                                    |
| `publishedAt`, `deadlineAt`                                       | Publication date and the submission deadline (earliest lot deadline)                                                    |
| `contractStart`, `contractEnd`, `suitableForSme`                  | Contract period and the SME-suitability flag, when published                                                            |
| `suppliers`, `suppliersWithheld`                                  | Winning organisations, only when **Include supplier / winner organisations** is on (off by default; see Supplier names) |
| `description`                                                     | Notice description, only when **Include descriptions** is on (otherwise `null`)                                         |
| `changeStatus`                                                    | `new`, `updated` or `unchanged` when change tracking is on                                                              |
| `attribution`                                                     | Source credit and licence line for that row                                                                             |
| `retrievedAt`                                                     | When the row was fetched                                                                                                |

**Organisations only.** Contact names, email addresses, phone numbers, street addresses and other named individuals are **not** included.

### Reliability

- **Validated rows.** Every row is checked against a fixed schema before it is saved. Rows that fail are skipped, counted in the run summary and not charged.
- **One source can fail without stopping the other.** If TED or Contracts Finder is down or rate-limits the run, rows from the other source are still saved and the run is marked `partial` with the reason.
- **Retries and polite pacing.** Server errors are retried with backoff; `429 Retry-After` is honoured; Contracts Finder's documented 5-minute pause after a `403` is respected.
- **Duplicates removed** across pages; **change tracking** labels each notice `new`, `updated` or `unchanged`, and can save only what changed.
- **Run summary.** A `RUN_SUMMARY` record lists per-source counts, requests, waits, skipped rows, the newest publication date seen, and warnings (for example when a source returned nothing for several days or changed its format).

### Use cases

- **Suppliers and SMEs:** a daily list of new EU and UK tenders in your CPV codes and countries.
- **Bid and business development teams:** track prior information notices before the tender opens, and award notices to see who won (organisations only).
- **Consultants:** one saved search per client, sent to a spreadsheet or CRM.
- **Market researchers:** award values and buyers by CPV code, country or region.
- **Developers:** one JSON schema for both sources through the Apify API.

### How to use it

1. Choose **Sources** (both by default).
2. Pick a date range: **Last N days** (default 3: today and the two previous days, in UTC) or **Published from / to** (up to 90 days per run).
3. Add any filters: keywords, CPV codes, buyer countries, NUTS regions (TED), UK regions (Contracts Finder), notice kinds, value range.
4. Set **Maximum results** and click **Start**. For a daily feed, schedule it once a day with **Track changes between runs** and **Only new or updated notices** on.

Download results as JSON, CSV or Excel, or connect them to your tools.

### Input examples

These are also in the `examples/` folder.

Daily feed of IT tenders in Germany, France and the UK (`examples/daily-it-tenders-de-fr-uk.json`):

```json
{
    "lastNDays": 3,
    "cpvCodes": ["72000000"],
    "countries": ["DEU", "FRA", "GBR"],
    "noticeKinds": ["tender"],
    "maxResults": 500,
    "trackChanges": true,
    "onlyNewOrUpdated": true
}
```

UK award notices over £100,000 in the last week, with winning organisations (`examples/uk-awards-over-100k.json`):

```json
{
    "sources": ["contracts_finder"],
    "lastNDays": 7,
    "noticeKinds": ["award"],
    "minValue": 100000,
    "includeSuppliers": true,
    "maxResults": 1000
}
```

EU construction tenders over €1 million in Germany, Austria and the Netherlands, with descriptions (`examples/construction-tenders-eu.json`):

```json
{
    "sources": ["ted"],
    "lastNDays": 7,
    "cpvCodes": ["45000000"],
    "countries": ["DEU", "AUT", "NLD"],
    "noticeKinds": ["tender"],
    "minValue": 1000000,
    "includeDescriptions": true,
    "maxResults": 300
}
```

### Output example

Real sample: 3 rows from a test run on October 17, 2026, with the default input (links shown without \`\`; the dataset has full links).

```json
[
    {
        "noticeId": "ted:718661-2026",
        "source": "ted",
        "sourceName": "TED (Tenders Electronic Daily), Publications Office of the European Union",
        "noticeUrl": "ted.europa.eu/en/notice/-/detail/718661-2026",
        "title": "Germany – Road transport services – Speisenlogistik zur Versorgung des Klinikstandortes Campus Hallerwiese",
        "titleLanguage": "eng",
        "titleIsOriginal": false,
        "originalTitle": "Speisenlogistik zur Versorgung des Klinikstandortes Campus Hallerwiese",
        "originalLanguage": "deu",
        "noticeKind": "tender",
        "noticeType": "cn-standard",
        "procedureType": "open",
        "contractNature": "services",
        "buyerName": "Klinikum Nürnberg",
        "buyerCountry": "DEU",
        "buyerRegion": "DE254",
        "nutsCodes": ["DE254", "DE259"],
        "deliveryRegions": [],
        "placeOfPerformanceCountries": ["DEU"],
        "cpvCodes": ["60100000", "63520000", "63521000"],
        "mainCpvCode": "60100000",
        "mainCpvDescription": null,
        "estimatedValue": null,
        "estimatedValueCurrency": null,
        "estimatedValueBasis": null,
        "awardedValue": null,
        "awardedValueCurrency": null,
        "lotCount": 1,
        "publishedAt": "2026-10-16",
        "deadlineAt": "2026-11-13",
        "contractStart": null,
        "contractEnd": null,
        "suitableForSme": null,
        "suppliers": null,
        "suppliersWithheld": 0,
        "description": null,
        "changeStatus": null,
        "attribution": "Source: TED, © European Union, ted.europa.eu. Procurement notices published in the Supplement to the Official Journal of the EU can be freely reused for commercial or non-commercial purposes (Commission Decision 2011/833/EU). Normalised by this Actor; not an official reproduction.",
        "retrievedAt": "2026-10-18T00:04:24.000Z"
    },
    {
        "noticeId": "cf:71be42f6-fdb6-43ed-99b3-366dce762502",
        "source": "contracts_finder",
        "sourceName": "UK Contracts Finder (Crown Commercial Service)",
        "noticeUrl": "www.contractsfinder.service.gov.uk/Notice/71be42f6-fdb6-43ed-99b3-366dce762502",
        "title": "Grounds Maintenance",
        "titleLanguage": "eng",
        "titleIsOriginal": true,
        "originalTitle": "Grounds Maintenance",
        "originalLanguage": "eng",
        "noticeKind": "award",
        "noticeType": "award",
        "procedureType": "Call-off from a framework agreement",
        "contractNature": "services",
        "buyerName": "THE CAMBRIDGE HOUSING SOCIETY LIMITED",
        "buyerCountry": "GBR",
        "buyerRegion": null,
        "nutsCodes": [],
        "deliveryRegions": ["East of England"],
        "placeOfPerformanceCountries": ["GBR"],
        "cpvCodes": ["77314000"],
        "mainCpvCode": "77314000",
        "mainCpvDescription": "Grounds maintenance services",
        "estimatedValue": 482798,
        "estimatedValueCurrency": "GBP",
        "estimatedValueBasis": "notice",
        "awardedValue": 482798,
        "awardedValueCurrency": "GBP",
        "lotCount": null,
        "publishedAt": "2026-10-16T16:18:51+01:00",
        "deadlineAt": null,
        "contractStart": "2021-11-01T00:00:00Z",
        "contractEnd": "2027-03-31T23:59:59+01:00",
        "suitableForSme": true,
        "suppliers": null,
        "suppliersWithheld": 0,
        "description": null,
        "changeStatus": null,
        "attribution": "Contains public sector information licensed under the Open Government Licence v3.0. Licence: www.nationalarchives.gov.uk/doc/open-government-licence/version/3/. Source: UK Contracts Finder, www.contractsfinder.service.gov.uk. Normalised by this Actor.",
        "retrievedAt": "2026-10-18T00:04:24.000Z"
    },
    {
        "noticeId": "ted:718660-2026",
        "source": "ted",
        "sourceName": "TED (Tenders Electronic Daily), Publications Office of the European Union",
        "noticeUrl": "ted.europa.eu/en/notice/-/detail/718660-2026",
        "title": "Croatia – Pollution-control vessels – Nabava plovila za uklanjanje onečišćenja i opreme",
        "titleLanguage": "eng",
        "titleIsOriginal": false,
        "originalTitle": "Nabava plovila za uklanjanje onečišćenja i opreme",
        "originalLanguage": "hrv",
        "noticeKind": "tender",
        "noticeType": "cn-standard",
        "procedureType": "open",
        "contractNature": "supplies",
        "buyerName": "MINISTARSTVO UNUTARNJIH POSLOVA",
        "buyerCountry": "HRV",
        "buyerRegion": "HR050",
        "nutsCodes": ["HR031", "HR050"],
        "deliveryRegions": [],
        "placeOfPerformanceCountries": ["HRV"],
        "cpvCodes": ["34513600", "34512000", "34113200", "34711200", "35512400"],
        "mainCpvCode": "34513600",
        "mainCpvDescription": null,
        "estimatedValue": 4534400,
        "estimatedValueCurrency": "EUR",
        "estimatedValueBasis": "procedure",
        "awardedValue": null,
        "awardedValueCurrency": null,
        "lotCount": 7,
        "publishedAt": "2026-10-16",
        "deadlineAt": "2026-11-20",
        "contractStart": null,
        "contractEnd": null,
        "suitableForSme": null,
        "suppliers": null,
        "suppliersWithheld": 0,
        "description": null,
        "changeStatus": null,
        "attribution": "Source: TED, © European Union, ted.europa.eu. Procurement notices published in the Supplement to the Official Journal of the EU can be freely reused for commercial or non-commercial purposes (Commission Decision 2011/833/EU). Normalised by this Actor; not an official reproduction.",
        "retrievedAt": "2026-10-18T00:04:24.000Z"
    }
]
```

The full field list is in the Output tab.

### How much does it cost?

- **$0.01 per run start** (Apify's Actor start event) plus **$4 per 1,000 notices saved** ($0.004 each, the `tender` event). Example: 1,000 notices = $0.01 + $4 = $4.01. Runs using more than 1 GB of memory incur one extra start charge per additional GB.
- You pay only for rows that are saved. Rows skipped as duplicates, invalid, filtered out or unchanged are free.
- Set **Maximum cost per run** when you start a run; the Actor stops when it reaches your cap.

### Languages

- **TED** publishes some fields in many EU languages. `title` is TED's English title when TED provides one; TED builds it as "Country – CPV description – original title", so the last part stays in the original language (`titleIsOriginal: false`). If there is no English title, `title` is the original-language title (`titleIsOriginal: true`). `originalTitle` and `originalLanguage` (ISO 639-2, e.g. `deu`) always give the original. Descriptions, when included, are in the original language. The Actor does not machine-translate anything.
- **Contracts Finder** notices are in English (`eng`).

### Lots

TED notices can have several lots. The Actor saves **one row per notice**, not per lot:

- `lotCount` gives the number of lots.
- `estimatedValue` is the procedure's total estimated value when the notice gives one (`estimatedValueBasis: "procedure"`). Otherwise it is the single lot's value (`single_lot`) or the sum of lot values (`sum_of_lots`), but only when every lot has exactly one value in one currency; if not, it is `null` rather than a guess.
- `deadlineAt` is the earliest lot deadline. CPV codes and regions are combined across lots.
- Contracts Finder values are taken from the notice (`estimatedValueBasis: "notice"`).

### Filters: what each source supports

| Filter          | TED                                                                                                                                     | Contracts Finder                                                                                                                               |
| --------------- | --------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- |
| Dates           | Server-side (publication date)                                                                                                          | Server-side (published from/to)                                                                                                                |
| Keywords        | Server-side full-text search of the notice                                                                                              | Matched in the title (and description when included)                                                                                           |
| CPV codes       | Server-side; a parent code covers its children (72000000 covers 72212000)                                                               | Matched after download, same parent/child rule                                                                                                 |
| Buyer countries | Server-side (ISO 3-letter, e.g. DEU)                                                                                                    | UK only: skipped unless `GBR` is in the list or the list is empty                                                                              |
| NUTS regions    | Matched after download (TED only)                                                                                                       | Not supported                                                                                                                                  |
| UK regions      | Not supported                                                                                                                           | Matched after download against the notice's region names (e.g. "London"); many notices have no region and are excluded when this filter is set |
| Notice kinds    | Server-side                                                                                                                             | Matched after download                                                                                                                         |
| Value range     | Matched after download on `estimatedValue`, in the notice's own currency (no currency conversion); notices without a value are excluded | Same                                                                                                                                           |

Filters matched after download still use requests: a narrow Contracts Finder filter over a long window can read many pages to find a few matches. The cap is **Maximum requests per source** (default 60).

### Privacy: organisations only

- Contact persons, email addresses, phone numbers, fax numbers and street addresses are dropped from both sources.
- **Supplier names are off by default.** See [Supplier names: how the filter works and its limits](#supplier-names-how-the-filter-works-and-its-limits).
- **Descriptions are off by default.** With **Include descriptions** on, emails and phone numbers are replaced with placeholders, but descriptions are free text written by buyers and can still mention people by name.

### Supplier names: how the filter works and its limits

**Off by default.** Unless you turn on **Include supplier / winner organisations** (`includeSuppliers: true`), `suppliers` is `null` in every row and the Actor doesn't even request winner names from TED.

**When you turn it on**, the Actor tries to keep organisations and drop private individuals. For each winner named in an award notice:

1. **Natural-person flag (TED).** If TED marks any winner in the notice as a natural person, *all* winner names in that notice are withheld. (TED lists names and person flags separately, so the Actor can't safely tell which name the flag belongs to.)
2. **Register identifier (Contracts Finder).** A name with a UK company, charity or public-body register identifier in the notice (for example a Companies House number) is kept.
3. **Organisation words.** Otherwise the name is kept only if it contains a legal form (Ltd, Limited, LLP, plc, GmbH, S.A., S.r.l., B.V., AB, …) or an organisation word (Council, University, Trust, Services, Consulting, Group, …).
4. **Everything else is withheld.** Names that pass none of these checks, such as a bare "Jane Doe", are dropped and counted in `suppliersWithheld`, so you can see how many were held back.

**Limits (please read):**

- **It's a heuristic, not identity checking.** It looks at the wording of the name, not at who is behind it.
- **Some personal names get through.** A sole trader who trades under their own name plus a business word is kept: for example **"John Smith Consulting"** or "Jane Doe Services Ltd". If your use case must exclude every individual, don't turn this option on, or review the names yourself.
- **Some organisations are held back.** An organisation whose name has no legal form or organisation word (for example a short brand name) is withheld even though it's a company.
- **No enrichment.** Names are passed through as the source publishes them. The Actor doesn't look them up anywhere else, link them to other data, or build profiles.
- **Contact details are never included,** with the option on or off: no contact persons, emails, phone numbers or addresses.
- Many notices don't name a winner at all, so `suppliers` can be an empty list even when the option is on.

### Limits

- **Up to 90 days per run** and up to 50,000 results; run again for older periods.
- **TED fair use.** TED's developer page sets fair-use limits per IP address (700 requests per minute and 600 views or downloads per 6 minutes). The Actor sends one request at a time with pacing well below that.
- **Contracts Finder rate limits.** Contracts Finder's API documentation says that after a `403` no further requests should be made for 5 minutes. The Actor waits 5 minutes and tries again (at most twice per run), then keeps what it has and marks the source as failed in the summary. It also paces requests 2 seconds apart.
- **TED publishing days.** TED publishes Monday to Friday, excluding certain public holidays (see TED's release calendar), so a window covering only a weekend or holiday returns no TED notices.
- **Dates.** TED `publishedAt` is a date (`2026-10-16`); Contracts Finder gives a full timestamp with offset. Date windows are in UTC.
- **UK coverage.** Only Contracts Finder is included for the UK. UK notices published only on other UK services are not covered.
- **Not an official reproduction.** TED's legal notice says only the electronically signed notices published in the Supplement to the Official Journal of the EU are authentic. Always check the original notice before bidding.

### Integrations and API

Schedule runs daily, send results to Google Sheets, Slack or email through Apify integrations, trigger webhooks when a run finishes, or start runs and fetch results from your own code with the Apify API. The `RUN_SUMMARY` record in the key-value store lists counts per source, requests used, waits and anything skipped.

### FAQ

**Which data sources does it use?** Only two official APIs: TED's Search API (api.ted.europa.eu), which TED's documentation says is "primarily targeted at data reusers and does not require authentication", and Contracts Finder's public OCDS notice search. It doesn't scrape website pages.

**Can I reuse the data?** TED's 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." Contracts Finder content is available under the Open Government Licence v3.0. Every row carries an `attribution` line; keep it when you republish. Contains public sector information licensed under the Open Government Licence v3.0. This is not legal advice; read each source's terms for your own use case.

**Why are some suppliers missing?** Supplier names are off by default. When on, names that may belong to a private individual are withheld (see Supplier names), and many notices don't name a winner.

**Why did I get fewer results than expected?** Check the run summary: the date window (TED publishes Monday to Friday only), your filters, the request cap per source, or a rate limit can reduce results. Rows skipped as duplicates, filtered out or unchanged are listed there too.

**Why are values in different currencies?** Values are shown as published. The Actor doesn't convert currencies, and the value filter compares numbers in each notice's own currency.

**How do I report a problem?** Open an issue on the Issues tab with the run ID.

### Related actors

# Changelog

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

# Actor input Schema

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

Which official sources to query. Both are public and need no account or key: TED (EU tenders, Search API) and UK Contracts Finder (OCDS API).

## `lastNDays` (type: `integer`):

Notices published in the last N days (UTC), including today. Default 3. Ignored if you set a published-from or published-to date. Maximum 90.

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

Start of the publication window (UTC, inclusive).

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

End of the publication window (UTC, inclusive). Defaults to today.

## `keywords` (type: `array`):

Match any of these words or phrases. TED searches the full notice text; Contracts Finder rows are matched on title and description.

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

8-digit CPV codes, e.g. 72000000 (IT services). Broader codes include their sub-codes (72000000 matches 72220000).

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

E.g. DEU, FRA, IRL. Applies to TED. Contracts Finder is UK-only, so it is skipped unless the list is empty or includes GBR.

## `nutsCodes` (type: `array`):

NUTS code prefixes for the buyer or place of performance, e.g. DE2 or FR10. Applies to TED rows only.

## `ukRegions` (type: `array`):

Contracts Finder delivery regions, e.g. London, North East, Scotland. Exact names, case-insensitive. Applies to Contracts Finder rows only; many notices have no region.

## `noticeKinds` (type: `array`):

planning (prior information), tender (open opportunities), award (results), other (corrections, modifications). Empty = all.

## `minValue` (type: `integer`):

In the notice's own currency (no conversion). Notices without an estimated value are excluded when a value filter is set.

## `maxValue` (type: `integer`):

In the notice's own currency (no conversion).

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

Stop after saving this many notices (each saved notice is one charged result).

## `maxRequestsPerSource` (type: `integer`):

Safety cap on API calls per source per run (TED returns up to 250 notices per call, Contracts Finder 100).

## `includeSuppliers` (type: `boolean`):

Off by default. When on, award notices list winning organisations only. Names that may belong to individuals are withheld and counted.

## `includeDescriptions` (type: `boolean`):

Off by default. Adds the notice's free-text description (up to 10,000 characters), in the original language.

## `trackChanges` (type: `boolean`):

Mark each notice new, updated or unchanged compared with earlier runs of the same search.

## `onlyNewOrUpdated` (type: `boolean`):

With change tracking, skip notices already seen unchanged (they are not charged).

## Actor input object example

```json
{
  "sources": [
    "ted",
    "contracts_finder"
  ],
  "lastNDays": 3,
  "keywords": [],
  "cpvCodes": [],
  "countries": [],
  "nutsCodes": [],
  "ukRegions": [],
  "noticeKinds": [],
  "maxResults": 20,
  "maxRequestsPerSource": 60,
  "includeSuppliers": false,
  "includeDescriptions": false,
  "trackChanges": false,
  "onlyNewOrUpdated": false
}
```

# Actor output Schema

## `tenders` (type: `string`):

No description

## `runSummary` (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",
        "contracts_finder"
    ],
    "lastNDays": 3,
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("graylabs/eu-uk-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",
        "contracts_finder",
    ],
    "lastNDays": 3,
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("graylabs/eu-uk-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",
    "contracts_finder"
  ],
  "lastNDays": 3,
  "maxResults": 20
}' |
apify call graylabs/eu-uk-tenders --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,graylabs/eu-uk-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/Nd3Yccra0HVc1AZNm/builds/Ruuwrgu2eJEoR1vhg/openapi.json
