# Public Tenders UK & EU — Contracts Finder, Find a Tender, TED (`rein8/public-tenders-uk-eu`) Actor

No API key: public tenders and contract awards as company data from Contracts Finder + Find a Tender (UK, OGL v3) and TED (EU). Buyer, CPV, value, deadline, days left, winner + company number. No contact persons. Unofficial: not affiliated with the Cabinet Office or the EU Publications Office.

- **URL**: https://apify.com/rein8/public-tenders-uk-eu.md
- **Developed by:** [Rein X](https://apify.com/rein8) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $3.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

**Public tenders and contract awards from the UK and the EU as clean company-level rows — government tenders, procurement notices and awards from Contracts Finder, Find a Tender and TED in one Actor, no API key, no contact persons. $3 per 1,000 notices, the first 3 rows free.**

- 📄 **What you get** — one row per notice: title, buyer (name, registration id, town, region, **type**: health / council / central government / education), CPV codes **with the division's name**, procedure, estimated or awarded value, publication date, deadline and **days left**, stage (tender / award / planning), the winning supplier with its registration id, scheme and **Companies House number**, contract dates, and the link to the notice.
- 🏛️ **Sources** — the UK government's own notice services under the *Open Government Licence v3.0* (Contracts Finder: every public-sector opportunity and award; Find a Tender: the above-threshold notices), and the EU's *Tenders Electronic Daily* (TED, Publications Office of the European Union: notice data reused under Commission Decision 2011/833/EU, "for commercial or non-commercial purposes", source acknowledged; editorial content CC BY 4.0). The attribution is on every row.
- 💵 **Price** — $3 per 1,000 notices; the first 3 rows are free (Preview).
- 🔑 **No API key, no account** — the three read routes are public and documented; the Actor declares who it is and reads one page at a time.
- 🔒 **No personal data** — the contact officer, e-mail and telephone that every notice carries are never read; buyers and suppliers are organisations.
- ⏱️ **Time to first result** — Preview: 3 notices, free; a week of UK software tenders in about a minute.

| Stage | Title | Buyer | Value | Deadline / awarded to | CPV |
|---|---|---|---:|---|---|
| tender | H\&C1025 Sexual Health Services | East Riding of Yorkshire Council (HU17, Yorkshire and the Humber) | £8,400,000 | 2026-10-26 | 85000000 |
| award | Website hosting and support | Home Office (SW1P) | £232,874 | Encircle Solutions Limited (GB-CFS-338659) | 72000000 |
| award | Client Transport Services 2026 - 2034 - Child Mainstream | Surrey County Council (RH2, UKJ26) | £14,537 | iconnectcar (GB-FTS-11163) | 60000000 |
| tender | France – Miscellaneous software development services – Outil Digitalisation Achats | Aéroport de Toulouse-Blagnac (SIRET 49329240300018, FR) | €460,000 | neg-w-call procedure | 72212900 |

*Real rows from test runs on 26 Sep 2026: Contracts Finder and Find a Tender with `{"maxItems": 20}`, TED with `{"source": "ted", "tedQuery": ["PD>=today(-3) AND buyer-country=FRA AND FT~\"logiciel\""]}`. Every row also carries the description, procurement category, procedure, contract period, SME flag (Contracts Finder), the additional CPV codes, the CPV division name (85 = *Health and social work services*), the buyer type (`council`, `central-government`, `health`…), the days left to the deadline, the winners' Companies House numbers, the notice URL and a one-sentence `summary`.*

**Price:** $3 per 1,000 notices — 3 rows free. Apify's free plan ($5 of credit a month) covers about 1,600 notices a month at no cost to you.

#### Try it in 60 seconds

1. Tick **Preview (3 notices, free)** and press **Start**: three real notices, no charge.
2. Untick Preview and press **Start** again: the form is prefilled with Contracts Finder, published in the last 7 days (the date is set at run time), keyword "software", 100 notices — back in about a minute.
3. Download CSV, Excel or JSON — the dataset has an **Open tenders** view, a **Closing soon** view (by days left) and a **Contract awards** view — or call it from code:

```bash
curl -X POST "https://api.apify.com/v2/acts/rein8~public-tenders-uk-eu/run-sync-get-dataset-items?token=$APIFY_TOKEN&format=csv" \
  -H 'Content-Type: application/json' -d '{"source":"cf","keyword":"software","maxItems":100}'
```

### What does this public tenders Actor do?

It reads the three official notice services that together publish nearly every public contract opportunity and award in the UK and the EU, and turns each notice into one flat row a bid team, a CRM or a spreadsheet can use: who is buying, what (CPV codes, title, description), for how much, by when, and — on award notices — who won and under which company registration. **Contracts Finder** (UK) lists every public-sector opportunity above £12,000 (central government) or £30,000 (the rest) and its award; **Find a Tender** (UK) lists the high-value notices above the Procurement Act thresholds; **TED** (EU) is the Supplement to the Official Journal, where every EU above-threshold notice is published. One source per run; three Tasks give you all three on a schedule.

**When to use it:** bid pipelines (which tenders to go for, by when), win/loss intelligence (which suppliers win which buyers), lead lists of public buyers by sector and region, market sizing by CPV code, monitoring a buyer or a competitor, feeding a CRM or a Google Sheet on a schedule. **Not a tender-alert subscription:** Stotles, Tussell, BidStats and Tenders Direct sell curated alerts and analytics from £475 a month; this Actor gives you the same public notices as rows, at $3 per 1,000, to build your own. **Not for:** contact persons — no buyer's procurement officer, e-mail or phone is ever returned; use the notice URL and the buyer's own procurement portal for that. Not the tender documents themselves (they sit behind each notice URL). Not sub-threshold notices published only on a council's own portal.

**Official sources, open licences, company-level only.** Contracts Finder and Find a Tender publish their notice data under the Open Government Licence v3.0 ("Notice data is available under the Open Government Licence" — Find a Tender developer documentation); TED notices are published by the Publications Office of the European Union for reuse with acknowledgement of the source. The Actor reads only the documented read routes, identifies itself, and never requests or maps the `contactPoint` block of a notice.

### Why use official tender data?

- **Bid teams and SMEs selling to government** — every open opportunity in your CPV codes and region, with the deadline, the estimated value, the procedure and the SME-suitability flag, as a daily feed.
- **Consultancies and bid writers** — who is buying what, where and how often; the awards show which incumbents to unseat and at what price.
- **Market analysts** — the awards of a whole sector or a whole buyer group (NHS, councils, ministries) by month, with values and winners, for market-share and pricing studies.
- **Sales teams** — a contract award is a public statement that a company has just won money: the supplier list is a lead list with the buyer, the value and the contract period.
- **Compliance-friendly** — official sources under open licences, the licence stamped on every row, no personal data.

#### Why this one

| | This Actor |
|---|---|
| Sources | Contracts Finder + Find a Tender (Cabinet Office, OCDS APIs) + TED (Publications Office of the EU, Search API v3) |
| Account or API key | None |
| Personal data | None: the contact person, e-mail and phone of every notice are never read; only organisations |
| Licence | OGL v3.0 / TED reuse notice, stamped on every row (`_source`, `_licence`, `_sourceUrl`) |
| Monitoring | *Only notices not delivered before* + a daily schedule = a feed of new notices matching your filters |
| Pay for what you use | $3 per 1,000 notices delivered; a filtered-out notice is never charged |
| Buyer intelligence in the row | buyer type (health / council / central government / education), CPV division name, days to deadline, the winners' Companies House numbers — as filters and columns, no extra request |

#### How this compares

*Store facts from the survey of 2026-09-24 (public Store API); rivals' figures change daily.*

| Actor | Users / 30 d | Notes | Price per 1,000 |
|---|---|---|---|
| **This actor** | new | three sources in one listing, no key, no contact persons | $3.00 |
| ciel\_labs/uk-government-tenders-contracts-finder | 9 | Contracts Finder only, success 72% | — |
| dltik/ted-europa-scraper | 4 | TED only | — |
| publicrecords/uk-find-a-tender-scraper | 2 | Find a Tender only | — |

### Examples — ready-made inputs

#### Examples (one click)

Each example below is also a public Task with its own page — open it, press **Start**, and the input is already filled in:

- [Open UK software and IT tenders this week](https://apify.com/rein8/public-tenders-uk-eu/examples/uk-software-tenders-this-week)
- [New NHS tenders, daily feed](https://apify.com/rein8/public-tenders-uk-eu/examples/nhs-tenders-daily)
- [EU IT tenders over EUR 1 million (TED)](https://apify.com/rein8/public-tenders-uk-eu/examples/eu-it-tenders-over-1m)
- [Who won UK construction contracts this month](https://apify.com/rein8/public-tenders-uk-eu/examples/contract-awards-construction-uk-monthly)
- [French service tenders on TED, weekly](https://apify.com/rein8/public-tenders-uk-eu/examples/ted-france-services-notices-weekly)
- [UK tenders closing in the next 14 days](https://apify.com/rein8/public-tenders-uk-eu/examples/open-tenders-closing-in-14-days-uk)
- [Companies awarded UK public contracts this month (lead list)](https://apify.com/rein8/public-tenders-uk-eu/examples/uk-contract-winners-this-month)
- [Council tenders across the UK, weekly](https://apify.com/rein8/public-tenders-uk-eu/examples/council-tenders-uk-weekly)
- [SME-suitable UK tenders, daily feed](https://apify.com/rein8/public-tenders-uk-eu/examples/sme-suitable-tenders-uk-daily)
- [German construction contract awards on TED, weekly](https://apify.com/rein8/public-tenders-uk-eu/examples/ted-germany-construction-awards-weekly)

Or copy one into the **JSON** tab of the input, or save it as a Task.

**`uk-software-tenders-this-week`** — open UK software and IT opportunities of the last 7 days (Contracts Finder, CPV 72 and 48; an empty `publishedFrom` = the last 7 days; run weekly):

```json
{ "source": "cf", "stage": "tender", "cpvCodes": "72, 48", "maxItems": 500 }
```

**`nhs-tenders-daily`** — every new NHS / health-sector opportunity, once a day, only notices you have not received yet:

```json
{ "source": "cf", "stage": "tender", "buyerType": "health", "incremental": true, "maxItems": 500 }
```

**`open-tenders-closing-in-14-days-uk`** — UK tenders whose deadline is at most 14 days away (the **Closing soon** view sorts them by days left):

```json
{ "source": "cf", "stage": "tender", "closingWithinDays": 14, "publishedFrom": "2026-08-27", "maxItems": 1000 }
```

**`uk-contract-winners-this-month`** — every company awarded a UK public contract this month: a lead list with the buyer, the value and the Companies House number to join to the register:

```json
{ "source": "cf", "stage": "award", "publishedFrom": "2026-09-01", "maxItems": 5000 }
```

**`council-tenders-uk-weekly`** — open opportunities from councils and other local authorities, last 7 days:

```json
{ "source": "cf", "stage": "tender", "buyerType": "council", "maxItems": 1000 }
```

**`sme-suitable-tenders-uk-daily`** — only the opportunities flagged suitable for SMEs, daily, only new ones:

```json
{ "source": "cf", "stage": "tender", "smeOnly": true, "incremental": true, "maxItems": 500 }
```

**`eu-it-tenders-over-1m`** — EU IT tenders (CPV 72) with an estimated value of at least €1 million, last 7 days (TED does the narrowing):

```json
{ "source": "ted", "tedQuery": ["PD>=today(-7) AND classification-cpv=72* AND estimated-value-proc>=1000000 AND notice-type IN (cn-standard cn-social cn-desg)"], "maxItems": 500 }
```

**`contract-awards-construction-uk-monthly`** — who won UK construction contracts (CPV 45) in the last month, above-threshold notices from Find a Tender:

```json
{ "source": "fts", "stage": "award", "cpvCodes": "45", "publishedFrom": "2026-08-26", "maxItems": 2000 }
```

**`ted-france-services-notices-weekly`** — French service tenders published on TED in the last 7 days (schedule weekly with incremental on):

```json
{ "source": "ted", "tedQuery": ["PD>=today(-7) AND buyer-country=FRA AND contract-nature=services AND notice-type IN (cn-standard cn-social cn-desg)"], "incremental": true, "maxItems": 1000 }
```

**`ted-germany-construction-awards-weekly`** — who won construction contracts (CPV 45) from German public buyers on TED, last 7 days:

```json
{ "source": "ted", "tedQuery": ["PD>=today(-7) AND buyer-country=DEU AND classification-cpv=45* AND notice-type IN (can-standard can-social can-desg)"], "incremental": true, "maxItems": 1000 }
```

**Lead list recipe — companies awarded contracts this month.** Run `uk-contract-winners-this-month` (or any `stage: "award"` run), take the `supplierCompanyNumbers` column and paste it into the [Check a list of UK company numbers](https://apify.com/rein8/uk-companies-house-snapshot/examples/check-uk-company-numbers) Task of the Companies House Actor: each winner comes back with its status, SIC code, incorporation date, registered-office town and accounts due dates — a lead list of companies that have just won public money, with the buyer, the value and the contract period from this Actor and the company facts from the register.

### Contracts Finder API, Find a Tender search and TED tenders search — in one Actor

People arrive here looking for a *Contracts Finder API* without a key, a *Find a Tender search* they can export, a *TED tenders search* by CPV and country, or simply *public sector tenders UK* as a spreadsheet. This Actor is all four: it reads the documented, keyless routes of the three services and delivers the same rows from each, so one schedule covers below-threshold UK notices, above-threshold UK notices and every EU notice.

| Source | What it publishes | Read through | Rows carry | Best for |
|---|---|---|---|---|
| **Contracts Finder** (UK) | every public-sector opportunity above £12,000 (central government) / £30,000 (others) and its award, incl. copies of the above-threshold notices | OCDS search API (`Published/Notices/OCDS/Search`), 100 per page, cursor | buyer id (GB-CFS / GB-COH), delivery region name, SME flag, supplier id + Companies House number | UK pipelines, SME-suitable work, council and NHS feeds |
| **Find a Tender** (UK) | notices above the Procurement Act thresholds (works £5.4m, goods/services £139k–£214k) | OCDS release packages (`api/1.0/ocdsReleasePackages`), 100 per page, cursor, by update date | buyer PPON + ITL/NUTS region, supplier scheme (GB-COH / GB-PPON / GB-FTS), contract period, several awards per notice | high-value awards, win/loss intelligence |
| **TED** (EU + EEA) | every notice above the EU thresholds from the 27 member states, Norway, Iceland, Liechtenstein, Switzerland and a few others | Search API v3 (`POST /v3/notices/search`), 250 per page, expert query | buyer national id (SIRET, USt-IdNr…), ISO country, winner name + id + country, total and estimated values, English title (TED translates every title) | EU market sizing, country and CPV feeds |

### How to scrape public tender data

1. Pick the **Source**: `cf` (Contracts Finder — UK, everything), `fts` (Find a Tender — UK, above-threshold) or `ted` (TED — EU).
2. Set a **date window** (`publishedFrom` / `publishedTo`, written 2026-09-19; empty = the last 7 days, set at run time). On TED write it in the query instead: `PD>=today(-7)`.
3. Add **filters**: keyword in title/description, CPV prefix (72 = IT services, 45 = construction, 85 = health), buyer name or **buyer type** (health / council / central government / education), region or country, value range, stage (tender / award), **closing within N days**, **SME-suitable only**. Every filter is optional; they combine with AND; a notice that does not match is never charged.
4. Set **Max notices** (default 500) and run. Download the dataset as JSON, CSV or Excel — the **Open tenders** and **Contract awards** views pick the right columns — or read it through the API.
5. Optional: tick **Only notices not delivered before** and schedule the Actor daily to receive only new notices (and changed ones, marked `_changed`).

Tick **Preview** for 3 notices free of charge.

### Input

| Field | What it does |
|---|---|
| `source` | `cf` Contracts Finder (UK) · `fts` Find a Tender (UK) · `ted` TED (EU). One per run. |
| `tedQuery` | \[TED only] one TED expert query per line — `PD>=today(-7)` (default), `AND FT~"software"`, `AND classification-cpv=72*`, `AND buyer-country=FRA`, `AND buyer-name~"hospital"`, `AND estimated-value-proc>=1000000`, `AND notice-type IN (cn-standard cn-social)`. The same syntax as the Expert search on ted.europa.eu. |
| `publishedFrom`, `publishedTo` | publication-date window, `YYYY-MM-DD`, both ends inclusive; sent to the two UK APIs as query parameters (Contracts Finder gets `publishedTo` as 23:59:59 — a bare date would exclude that day), applied to the rows on TED. Empty `publishedFrom` = the last 7 days (set at run time). |
| `closingWithinDays` | open tenders whose deadline is at most N days away (`14`); drops notices with no or a passed deadline. |
| `buyerType` | `health` (NHS trusts, health boards, hospitals) · `central-government` (ministries, departments, agencies) · `council` (local and regional authorities) · `education` · `other` — from the buyer's name. |
| `smeOnly` | `true` = only notices flagged suitable for SMEs (Contracts Finder publishes the flag; the other sources do not). |
| `keyword` | text in the title or description, case-insensitive; commas = any of them. On TED prefer `FT~"…"` in the query. |
| `cpvCodes` | prefix(es) of the main CPV code: `72` IT services, `48` software, `45` construction, `85` health, `79` business services, `90` environment, `60` transport. |
| `buyerName` | contracting authority's name contains (`NHS`, `council`, `Ministry`). |
| `region` | Contracts Finder: the delivery region name (`London`, `Scotland`); Find a Tender: the buyer's ITL/NUTS code prefix (`UKE`, `UKI`). |
| `country` | ISO-2 buyer country (`FR, DE`); UK sources are always `GB`. |
| `minValue`, `maxValue` | published value range in the notice's currency; a notice without a value fails a value filter. |
| `stage` | `tender` (open opportunities) · `award` (who won) · empty = everything incl. planning notices. |
| `maxItems` | maximum notices delivered (default 500). |
| `incremental`, `stateKey` | only notices not delivered before, per memory name (each saved Task gets its own memory automatically). |
| `preview` | 3 notices, free. |

### What data can this Actor extract?

#### All fields

| Field | Meaning |
|---|---|
| `noticeId`, `ocid` | the notice's identifier in its service; the Open Contracting process id (UK sources) |
| `source` | `contracts-finder`, `find-a-tender` or `ted` |
| `title`, `description`, `searchText` | title; description without HTML, cut to 500 characters, any e-mail address or phone number a buyer typed into it replaced by `[e-mail removed]` / `[phone removed]`; the text the keyword filter searches |
| `noticeType`, `stage`, `status` | the source's tags or notice type; tender / award / planning / other; OCDS status |
| `procurementMethod`, `procurementCategory` | open / selective / limited / direct (or the TED procedure type); goods / works / services |
| `cpvMain`, `cpvAdditional`, `cpvText` | main CPV code (the one the CPV filter matches by prefix); additional codes; the English name of the main code's division (`72` → *IT services: consulting, software development, Internet and support*) from the EU Vocabularies CPV table |
| `buyerName`, `buyerType`, `buyerId`, `buyerIdScheme` | the contracting authority; its type (health / central-government / council / education / other, from the name); its id (GB-CFS, GB-PPON, GB-COH, or a national registration number on TED) and scheme |
| `buyerCity`, `buyerPostcodeDistrict`, `buyerRegion`, `buyerCountry` | town, outward postcode (UK), region name or ITL/NUTS code, ISO-2 country |
| `valueAmount`, `valueCurrency` | estimated (tender) or awarded (award) value |
| `publicationDate`, `deadline`, `contractStartDate`, `contractEndDate`, `awardDate` | dates, `YYYY-MM-DD` |
| `daysToDeadline` | whole days from the run date to the deadline (0 = closes today); empty once the deadline has passed or when the notice has none |
| `smeSuitable` | the buyer marked it suitable for SMEs (Contracts Finder) |
| `awardSupplierName`, `awardSupplierNames`, `awardSupplierId`, `awardSupplierIdScheme`, `awardSupplierCountry` | the winner(s) of the notice's first award: organisation name(s), id (GB-COH = a Companies House number follows), scheme, country (TED) |
| `supplierCompanyNumbers` | the Companies House numbers of those winners (`01234567, OC407254`), ready to paste into the Companies House Actor's *check-uk-company-numbers* Task; empty when the ids are the services' own (GB-FTS, PPON) or on TED |
| `awardValueAmount`, `awardValueCurrency` | the awarded / contract value |
| `noticeUrl`, `language` | the notice page; language (UK sources) |
| `summary` | one plain-English sentence per row, for AI agents |
| `scrapedAt`, `_source`, `_licence`, `_sourceUrl`, `_changed` | when read; attribution on every row; changed since the last incremental run |

#### Example output

```json
{
  "noticeId": "091206-2026",
  "ocid": "ocds-h6vhtk-077b06",
  "source": "find-a-tender",
  "title": "Client Transport Services 2026 - 2034 - Child Mainstream",
  "description": "Client Transport Services 2026 - 2034 - Lot 1 Standard Transport - Taxi/MPV (1-8 passenger seats) - Child Mainstream",
  "noticeType": "award, contract",
  "stage": "award",
  "status": "complete",
  "procurementMethod": "limited",
  "procurementCategory": "services",
  "cpvMain": "60000000",
  "cpvText": "Transport services (excl. Waste transport)",
  "buyerName": "Surrey County Council",
  "buyerType": "council",
  "buyerId": "GB-PPON-PWRH-8974-TNBV",
  "buyerIdScheme": "GB-PPON",
  "buyerCity": "Reigate",
  "buyerPostcodeDistrict": "RH2",
  "buyerRegion": "UKJ26",
  "buyerCountry": "GB",
  "valueAmount": 14537.14,
  "valueCurrency": "GBP",
  "publicationDate": "2026-09-26",
  "contractStartDate": "2026-09-15",
  "contractEndDate": "2027-07-30",
  "awardDate": "2026-09-14",
  "awardSupplierName": "iconnectcar",
  "awardSupplierId": "GB-FTS-11163",
  "awardSupplierIdScheme": "GB-FTS",
  "supplierCompanyNumbers": null,
  "awardValueAmount": 14537.14,
  "awardValueCurrency": "GBP",
  "noticeUrl": "https://www.find-tender.service.gov.uk/Notice/091206-2026",
  "_source": "Find a Tender (Cabinet Office)",
  "_licence": "Open Government Licence v3.0 — contains public sector information licensed under the OGL v3.0",
  "summary": "Client Transport Services 2026 - 2034 - Child Mainstream: award notice by Surrey County Council (GB), published 2026-09-26, value 14,537.14 GBP, CPV 60000000, awarded to iconnectcar."
}
```

### Output

One dataset item per notice (fields above), plus a `STATS` record in the key-value store: counts, pages read, the source and the filters of the run, the identity and pacing used, and any errors. The dataset offers four views: **Notices** (everything), **Open tenders** (deadline, days left, buyer and type, value, procedure, SME flag), **Closing soon** (the open tenders with days left first — run with *Closing within N days* to keep only those) and **Contract awards** (supplier, its id, scheme and Companies House numbers, value, dates).

*If this helped, an honest review on the Store page helps others find official-source tender data; if it did not, an issue on the Issues tab gets a reply within one business day.*

**Fields for AI agents.** Every row also carries `summary` — one plain-English sentence built from the row, empty values left out (e.g. *Website hosting and support: award notice by Home Office (GB), published 2026-09-25, value 232,874 GBP, CPV 72000000, awarded to Encircle Solutions Limited.*).

### How much will it cost to get public tender data?

| Event | When | Price |
|---|---|---|
| `result` | each notice delivered | $0.003 |

So **$3 per 1,000 notices**. Award details (supplier, value, date) come in the same row at no extra charge — none of the three sources needs a second request for them.

| Scenario | Rows | Cost |
|---|---|---|
| Preview | 3 | $0 |
| A week of UK software tenders (Contracts Finder, CPV 72 + 48) | ~100–200 | ~$0.30–0.60 |
| Every NHS opportunity, daily feed | ~20–60 / day | ~$0.06–0.18 / day |
| A month of UK construction awards (Find a Tender, CPV 45) | ~300–600 | ~$0.90–1.80 |
| EU IT tenders over €1 million, weekly | ~150–250 / week | ~$0.45–0.75 / week |

A curated alert service charges £475–950 a month for the same public notices. You are charged only for notices delivered: a notice your filters reject is never charged, duplicates inside a run are never charged, and in incremental mode a notice already delivered is charged again only when it comes back changed (marked `_changed`). The Actor stops cleanly at your maximum charge.

Apify adds its own **Actor start** event on top of these prices: $0.00005 per GB of run memory, once per run (about $0.0001 at 2 GB, $0.0002 at 4 GB). It is the platform's charge, not this Actor's, and it shows as "Actor start" on your bill.

### Integrations and automation

- **API (curl):** `curl -X POST "https://api.apify.com/v2/acts/rein8~public-tenders-uk-eu/run-sync-get-dataset-items?token=$APIFY_TOKEN&format=csv" -H 'Content-Type: application/json' -d '{"source":"fts","stage":"award","cpvCodes":"45","publishedFrom":"2026-08-26","maxItems":500}'`
- **Python:** `ApifyClient(token).actor("rein8/public-tenders-uk-eu").call(run_input={"source": "cf", "stage": "tender", "buyerName": "NHS", "maxItems": 200})` then `client.dataset(run["defaultDatasetId"]).iterate_items()`.
- **Schedule + Google Sheets:** a daily schedule with *Only notices not delivered before* on, and the Apify → Google Sheets integration in append mode, is a tender feed for your sector.
- **n8n / Make / Zapier:** Apify node → *Run actor* → *Get dataset items* → CRM, Slack, e-mail.
- **AI assistants:** see the next section — this Actor is an MCP tool.

### Use with AI agents (MCP, Claude, Cursor)

Once published, this Actor is a tool on Apify's hosted MCP server. Add it to Claude Desktop, Claude.ai, Cursor, VS Code or ChatGPT with one URL — the server signs you in with OAuth on first connect, so no API token goes into the config:

`https://mcp.apify.com?tools=rein8/public-tenders-uk-eu`

```json
{ "mcpServers": { "apify": { "type": "http", "url": "https://mcp.apify.com?tools=rein8/public-tenders-uk-eu" } } }
```

| You ask | The Actor runs with |
|---|---|
| "Open NHS software tenders this week" | `source: "cf"`, `stage: "tender"`, `buyerName: "NHS"`, `cpvCodes: "72, 48"`, `publishedFrom: <7 days ago>` |
| "Who won construction contracts in Yorkshire last month?" | `source: "fts"`, `stage: "award"`, `cpvCodes: "45"`, `region: "UKE"`, `publishedFrom: <30 days ago>` |
| "EU cloud tenders over €1m" | `source: "ted"`, `tedQuery: ["PD>=today(-30) AND FT~\"cloud\" AND estimated-value-proc>=1000000"]` |
| "What did Surrey County Council award recently?" | `source: "fts"`, `stage: "award"`, `buyerName: "Surrey County Council"` |
| "Council tenders closing in the next two weeks" | `source: "cf"`, `stage: "tender"`, `buyerType: "council"`, `closingWithinDays: 14` |

Example prompt: *"List the open UK tenders for software with a deadline after next week and an estimated value above £100,000, with buyer and deadline."* — the agent runs `source: "cf"`, `stage: "tender"`, `cpvCodes: "72, 48"`, `minValue: 100000` and reads `deadline`, `buyerName` and `valueAmount` from the rows.

### Where the data comes from — and why it is clean

- **Contracts Finder** (contractsfinder.service.gov.uk, Cabinet Office): the OCDS search API, `Published/Notices/OCDS/Search`, documented on the service's "Data and API" page; every response carries the Open Government Licence v3.0 as its `license`. The footer of the service: "All content is available under the Open Government Licence v3.0 except where otherwise stated."
- **Find a Tender** (find-tender.service.gov.uk, Cabinet Office): the OCDS release-package API, `api/1.0/ocdsReleasePackages`; the developer documentation says "Notice data is available under the Open Government Licence."
- **TED** (ted.europa.eu, Publications Office of the European Union): the Search API v3, `api.ted.europa.eu/v3/notices/search` — "TED API allows anonymous access to all services manipulating published notices" (TED Developer Docs). Reuse of TED content is allowed with acknowledgement of the source (Commission Decision 2011/833/EU (notice data; CC BY 4.0 applies only to editorial content); Commission Decision 2011/833/EU on the reuse of Commission documents: "for commercial or non-commercial purposes").
- **CPV names** (`cpvText`): the 45 division names of the Common Procurement Vocabulary (CPV 2008) come from the EU Vocabularies table of the Publications Office of the European Union, read through its public SPARQL endpoint; the Publications Office publishes it for reuse under Commission Decision 2011/833/EU ("for commercial or non-commercial purposes", with acknowledgement of the source).
- The Actor reads one page at a time (500 ms between requests), declares its identity, respects robots.txt and stops on a throttle. It never fetches notice documents or buyer portals.
- **Attribution lines** (keep them with any copy of the data): *Contains public sector information licensed under the Open Government Licence v3.0 (Contracts Finder / Find a Tender, Cabinet Office).* · *© European Union, 1998–2026, https://ted.europa.eu — TED, Tenders Electronic Daily, Publications Office of the European Union; reused with acknowledgement of the source (Commission Decision 2011/833/EU (notice data; CC BY 4.0 applies only to editorial content)).*

### Limits and honest notes

- **Filters run on the rows** for keyword, CPV, buyer, region, country and value: the Actor reads the source's pages (newest first) and delivers only the matches, so a rare keyword with a large `maxItems` reads many pages. A date window (`publishedFrom`, or `PD>=` on TED) keeps runs short; on TED put every criterion in the query, which the source narrows itself.
- **An empty `publishedFrom` means the last 7 days** on the UK sources (the date is set at run time, so a saved Task never goes stale); set your own date for a longer window. A run then reads from the newest notice backwards until `maxItems`.
- **One row per notice, not per supplier.** A Find a Tender notice can carry several awards (11 of 100 award notices on 26 Sep 2026) and an award several suppliers (a pharmacy framework listed 60): the row carries the first award's suppliers (`awardSupplierNames`, `supplierCompanyNumbers` list them all), and `ocid` groups every notice of the same procurement so you can join the rest.
- **TED values on multi-lot notices**: `valueAmount` / `awardValueAmount` is the notice's total (`total-value`), else the estimated value, else the first lot's value; lot-level values are not delivered. TED repeats a winner once per lot, so `awardSupplierNames` can name the same company twice.
- **Notice pages need a browser**: `noticeUrl` opens on contractsfinder.service.gov.uk, find-tender.service.gov.uk and ted.europa.eu for a person; the three sites answer scripts with 403 / a challenge page, so do not fetch them from code.
- **Buyer type is a keyword classification** of the name (first match: health → central government → council → education → other); a fire service, a housing association or a police force is `other`, and an unusual name can land in the wrong class — filter by `buyerName` when a specific organisation matters.
- **Contract awards can be sole traders** whose registered name is a person's name — the register publishes it as the supplier. `awardSupplierIdScheme` = `GB-COH` means a Companies House number follows; `GB-FTS` / `GB-CFS` ids are the services' own.
- **Values are what the buyer published**: estimated for tenders, awarded for awards, in the notice's currency; some TED award notices publish token values (1, -1). A notice without a value fails a min/max filter.
- **Find a Tender lists notices by update date**; an amended notice comes back as a new notice number.
- **TED names are multilingual**: the Actor takes the English title and, for buyer and winner, the last language of the notice (deterministic; almost every notice has one).
- **Not for:** contact persons, e-mail addresses or phone numbers; the tender documents; notices published only on regional portals; US or other non-UK/EU procurement.

### FAQ, Disclaimers, and Support

**What is the basis for using this data?** Official open data. Contracts Finder and Find a Tender publish under the Open Government Licence v3.0, which permits commercial reuse with attribution; TED notices are published by the Publications Office of the EU for reuse with acknowledgement of the source. This is a description of the sources' own published terms, not legal advice.

**Intended use:** bid pipelines, market research on public procurement, supplier and buyer intelligence, monitoring of new notices. It is not a tool for profiling individuals, and it does not output personal data.

**Personal data / GDPR:** every notice names a contact officer with an e-mail and a telephone number. This Actor never requests or maps that block; buyers and suppliers are delivered as organisations with their registration ids. If you combine this output with personal data from other sources, you are responsible for having a lawful basis under GDPR.

**Is it affiliated with the UK government or the EU?** No. **Unofficial: not affiliated with, endorsed by or reviewed by the Cabinet Office, Contracts Finder, Find a Tender, or the Publications Office of the European Union / TED.**

#### Do I need an API key or an account?

No. The three read routes are public: Contracts Finder and Find a Tender's OCDS APIs answer without credentials, and the TED Developer Docs say the Search API "does not require a key". The Actor declares who it is on every request.

#### Why is there no contact person, e-mail or phone in the rows?

Because the rows are about organisations, and that is enough for every use above: the buyer's procurement mailbox is on the notice page (`noticeUrl`), where the buyer chose to publish it. The `contactPoint` block that every OCDS notice carries and TED's person, touchpoint and e-mail fields are never requested or mapped; if a buyer typed an e-mail address or a phone number into the free-text description, it is replaced by `[e-mail removed]` / `[phone removed]` before the row is written. Field requests for contact persons are declined.

#### How much of TED is covered?

Everything the TED Search API publishes: every notice from the 27 EU member states, the EEA countries and the other states that publish on TED (31 buyer countries in one day's 3,444 notices on 26 Sep 2026), of every type (contract notices, award notices, prior-information, corrections and the social / design variants). Your expert query narrows it (date, CPV, country, full text, value, notice type); a query without a `PD` window reads pages of 250 back to `maxItems`. Titles come in English for every notice (TED translates them); descriptions and names stay in the notice's language. Lot-level detail (per-lot values and winners) is folded into the notice row (see the limits).

#### Which source should I use?

Contracts Finder for everything published by UK public bodies (it includes the above-threshold notices too, as OCDS releases); Find a Tender when you want only the high-value notices in the richest OCDS form (buyer ITL region, Companies House ids for many suppliers); TED for the EU (and EEA) above-threshold notices.

#### Can I get only new notices on a schedule?

Yes: tick *Only notices not delivered before*, keep *State key* at `default` (every saved Task gets its own memory), and schedule the Task daily or weekly. Each run delivers only notices not delivered before, plus notices whose delivered fields changed (marked `_changed`).

#### How do I search TED?

Write the same expert query you would type on ted.europa.eu: `PD>=today(-7) AND FT~"software" AND buyer-country=FRA`. Fields you will use most: `PD` (publication date, `YYYYMMDD` or `today(-N)`), `FT` (full text), `classification-cpv` (`72*` = prefix), `buyer-country` (ISO-3), `buyer-name`, `estimated-value-proc`, `notice-type` (`cn-standard` contract notice, `can-standard` contract award notice, `pin-only` prior information).

#### Removal requests

The rows are organisation-level notice facts republished from official sources. If a row names you as a sole trader and you want it removed from a dataset you did not produce, ask the dataset's owner; the source's own removal process applies to the notice itself.

#### What does this Actor NOT do?

Contact persons, e-mail or phone lookup, tender documents, bid writing, notices from regional portals not federated into the three services, or the US (see the USAspending family for that).

**Support:** open an issue on the Actor's **Issues** tab — questions and field requests are answered within one business day. If this Actor saves you a subscription, a review on the Store page helps others find official-source data.

### More official-data Actors by rein8

Same rules on every one: the source's own open route, no API key, the licence on every row, company-level data only.

- [Companies House Data — UK Company Search, No API Key](https://apify.com/rein8/uk-companies-house-snapshot) — every live UK company from the free monthly snapshot; paste `supplierCompanyNumbers` into its *check-uk-company-numbers* Task for the winners' SIC code, status, incorporation date and accounts due dates. **Companies awarded contracts this month** = `uk-contract-winners-this-month` here + that Task there: a lead list of businesses that have just won public money.
- [UK Company Watch — Companies House Changes on Your List, No Key](https://apify.com/rein8/uk-company-watch) — paste the winners' company numbers and get, each month, only the ones that changed (strike-off, liquidation, overdue accounts, new charges).
- [UK Company Accounts Data — Companies House Accounts, Net Assets](https://apify.com/rein8/uk-company-financials) — net assets, cash and employees from the accounts the winning companies file.
- [LEI Lookup & Changes — Legal Entity Identifier Data, No API Key](https://apify.com/rein8/lei-legal-entity-lookup) — a supplier's LEI and parent group from its register number.
- [Sirene Company Search — France SIREN/SIRET Lookup, No API Key](https://apify.com/rein8/france-company-search) — French buyers' and winners' SIRET numbers resolve here.
- [Form D Scraper — Startup Funding Leads from SEC Form D, No Key](https://apify.com/rein8/sec-form-d-funding-rounds) — every private raise filed with the U.S. SEC.
- [New Business Filings by State — Secretary of State Data, No Key](https://apify.com/rein8/us-state-business-filings) — new LLCs and corporations from five US Secretary of State portals.

### Changelog

- 0.1 (2026-09-26) — first release: Contracts Finder, Find a Tender and TED in one listing; date window (empty = last 7 days), keyword, CPV, buyer name and type, region, country, value, stage, closing-within-days and SME filters; CPV division name, buyer type, days to deadline and the winners' Companies House numbers on every row; award supplier with registration id and scheme; e-mail addresses and phone numbers scrubbed from descriptions; incremental mode; company-level fields only.

# Actor input Schema

## `source` (type: `string`):

Which notice service this run reads. One source per run — schedule one run per source for several. cf = Contracts Finder (every UK public-sector opportunity and award over £12k / £30k, OCDS); fts = Find a Tender (UK notices above the Procurement Act thresholds, OCDS); ted = TED (the EU's Official Journal supplement: every EU above-threshold notice).

## `tedQuery` (type: `array`):

\[TED only] One TED expert query per line, the syntax of the Expert search on ted.europa.eu. PD>=today(-7) = last 7 days; add AND FT~"software" (full text), AND classification-cpv=72\* (CPV prefix), AND buyer-country=FRA (ISO-3), AND buyer-name~"hospital", AND estimated-value-proc>=1000000, AND notice-type IN (cn-standard cn-social) for tenders or (can-standard can-social) for awards. Ignored by the UK sources. Narrowing here is faster and cheaper than the filters below.

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

Earliest publication date, written 2026-09-19. Empty = the last 7 days (today minus 7, set at run time, so a saved Task or the daily test never goes stale). Contracts Finder and Find a Tender receive it as a query parameter (fewer pages); on TED write PD>=20260919 or PD>=today(-7) in the query instead.

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

Latest publication date, INCLUSIVE, written 2026-09-26 (Contracts Finder treats a bare date as that day at 00:00, so the Actor sends 23:59:59 for you). Leave empty for 'until today'.

## `keyword` (type: `string`):

Keep only notices whose title or description contains this text (case-insensitive); several words separated by commas = any of them (software, IT services, cloud). Applied to every notice read: a notice that does not match is never charged. On TED prefer AND FT~"software" in the query, which makes the source do the narrowing.

## `cpvCodes` (type: `string`):

Common Procurement Vocabulary prefix of the notice's main classification, or several separated by commas: 72 = IT services, 48 = software packages, 45 = construction works, 85 = health and social work, 79 = business services, 90 = environmental services, 60 = transport. 4521 = building construction only. The additional codes of a notice are in the cpvAdditional column.

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

Keep only notices whose contracting authority's name contains this text: NHS, council, Ministry of Defence, université. Several separated by commas = any of them.

## `region` (type: `string`):

Contracts Finder: the delivery region as the notice names it (Yorkshire and the Humber, London, Scotland, North West). Find a Tender: the buyer's ITL/NUTS code, e.g. UKE = Yorkshire, UKI = London, UKM = Scotland (a prefix works: the match is 'contains'). TED has no region column — put the country in the query. Several separated by commas = any of them.

## `country` (type: `string`):

Two-letter country code(s) of the buyer, separated by commas: FR, DE, NL. The two UK sources are always GB. On TED this is applied after reading; AND buyer-country=FRA in the query is faster.

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

Keep only notices whose published value (estimated or awarded, in the notice's own currency) is at least this amount. A notice that publishes no value does not pass a value filter.

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

Keep only notices whose published value is at most this amount (same currency caveat as the minimum).

## `stage` (type: `string`):

Leave empty for every stage (tenders, awards and the planning / pipeline notices of Find a Tender and TED). Contracts Finder and Find a Tender receive it as stages=; on TED the row's stage (from the notice type) is filtered after reading — notice-type IN (cn-standard cn-social cn-desg) in the query is faster.

## `closingWithinDays` (type: `integer`):

Keep only open tenders whose submission deadline is at most this many days away (14 = closing in the next two weeks). Notices with no deadline or a deadline already passed are dropped when this is set. The dataset's daysToDeadline column carries the number for every row.

## `buyerType` (type: `string`):

Keep only buyers of one type, classified from the buyer's name by keyword patterns (UK and the main EU languages): health, central-government, council, education or other. Leave empty for every buyer. The buyerType column carries the class on every row; use 'Buyer name contains' for a specific organisation.

## `smeOnly` (type: `boolean`):

Keep only notices the buyer flagged as suitable for small and medium-sized enterprises. Contracts Finder publishes the flag; Find a Tender and TED do not, so on those sources this filter returns nothing.

## `maxItems` (type: `integer`):

Maximum number of notices to deliver in total (default 500). You are charged only for notices delivered. The sources list newest first, so without a date window this is 'the newest N that match'.

## `incremental` (type: `boolean`):

Remember which notices were already delivered (per 'State key') and return only new ones, plus notices whose delivered fields changed (marked \_changed). With a daily schedule and no date window this is a feed of new notices matching your filters.

## `stateKey` (type: `string`):

Name of the memory used by 'Only notices not delivered before'. Left as 'default', every saved Task gets its own memory automatically. Type a name to share one memory between schedules on purpose.

## `preview` (type: `boolean`):

Return 3 notices without any charge, to check the output format.

## Actor input object example

```json
{
  "source": "cf",
  "tedQuery": [
    "PD>=today(-7)"
  ],
  "keyword": "software",
  "smeOnly": false,
  "maxItems": 100,
  "incremental": false,
  "stateKey": "default",
  "preview": false
}
```

# Actor output Schema

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

One item per notice. Add ?format=csv or ?format=xlsx to the URL for other formats; the dataset views 'Open tenders' and 'Contract awards' pick the columns for each use.

## `stats` (type: `string`):

Counts, pages read, the source and filters of the run, the declared identity and pacing, and any errors.

# 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 = {
    "tedQuery": [
        "PD>=today(-7)"
    ],
    "keyword": "software",
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("rein8/public-tenders-uk-eu").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 = {
    "tedQuery": ["PD>=today(-7)"],
    "keyword": "software",
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("rein8/public-tenders-uk-eu").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 '{
  "tedQuery": [
    "PD>=today(-7)"
  ],
  "keyword": "software",
  "maxItems": 100
}' |
apify call rein8/public-tenders-uk-eu --silent --output-dataset

```

## MCP server setup

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

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/cF36FnsdHHKbDJxL5/builds/sglPSO4j9gX5n1g4t/openapi.json
