# UK & EU Public Tenders Finder: Government Contracts (`somepineapple/uk-eu-public-tenders`) Actor

Finds open UK and EU government contracts that match your keywords. Pulls from Contracts Finder, Find a Tender and TED into one table with the buyer, value, deadline and a link to apply. Handy for small businesses, bid writers and agencies.

- **URL**: https://apify.com/somepineapple/uk-eu-public-tenders.md
- **Developed by:** [Ollie Wood](https://apify.com/somepineapple) (community)
- **Categories:** Lead generation, Business, Automation
- **Stats:** 2 total users, 1 monthly users, 66.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 tender founds

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

## UK & EU Public Tenders Finder: Government Contracts

Government contracts are good steady work, but finding them means checking three or four clunky sites, which gets old fast.

Put in a few keywords and this checks Contracts Finder, Find a Tender and the EU's TED for you, keeps the ones that are still open and gives you one list: who's buying, what it's worth, when it closes and where to apply. Stick it on a daily schedule and you've basically got your own tender alerts.

### What it does

- Searches Contracts Finder, Find a Tender and the EU's TED in one run
- Shows the same UK tender once, even when it's on both UK services
- Leaves out closed, old and off-topic notices, with an optional minimum value
- EU tenders in English where TED has a translation, with value, deadline and codes
- Never returns buyer contact names, emails or phone numbers
- If one service is down, you still get the others and a note saying so

### Use cases

- A daily list of new contracts in your trade (cleaning, IT, building, consultancy, whatever you do).
- Bid writers and agencies finding work for clients.
- Keeping an eye on what councils, NHS trusts or universities are putting out.
- Sending new tenders straight into a spreadsheet, CRM or Slack with Make or Zapier.

### How to use

1. Add your keywords. Short and specific works best, like 'window cleaning' or 'CCTV'. Short words in capitals (IT, HR) are treated as acronyms.
2. Pick UK, EU or both, and how many days back to look. 3 days is about right for a daily run.
3. Hit Start. It takes a few minutes because Find a Tender only lets you read it slowly.

You can also call it from the Apify API, run it on a schedule, or hook it up to Make, Zapier or n8n. AI agents can use it through Apify's MCP server.

### Input

```json
{
  "keywords": [
    "software",
    "website"
  ],
  "publishedWithinDays": 1,
  "sources": [
    "uk",
    "eu"
  ],
  "maxResults": 20
}
```

### Output

You get one row per result, with these fields: `source`, `noticeId`, `title`, `buyer`, `country`, `region`, `description`, `valueAmount`, `currency`, `publishedDate`, `deadline`, `daysLeft`, `procedure`, `category`, `cpvCodes`, `cpvDescription`, `smeSuitable`, `url`, `matchedKeywords`, `licence`, `error`.

Here's a real result:

```json
{
  "source": "Find a Tender",
  "noticeId": "1284",
  "title": "Penetration Testing",
  "buyer": "Senedd Cymru / Welsh Parliament",
  "country": "United Kingdom",
  "region": "UKL",
  "description": "The Senedd is looking to procure a penetration testing service to provide independent assurance over the security of its technology estate and to identify vulnerabilities that may expose the organisation to cyber security risk. The contract will include the planning, execution and reporting of penetration testing activities against Commission systems and services. Testing may include external infr",
  "valueAmount": 80000.0,
  "currency": "GBP",
  "publishedDate": "2026-10-21",
  "deadline": "2026-11-24",
  "daysLeft": 33,
  "procedure": "Below threshold - open competition",
  "category": "services",
  "cpvCodes": [
    "72000000"
  ],
  "cpvDescription": null,
  "smeSuitable": null,
  "url": "https://www.find-tender.service.gov.uk/Notice/099362-2026",
  "matchedKeywords": [
    "cyber security"
  ],
  "licence": "Contains public sector information licensed under the Open Government Licence v3.0.",
  "error": null
}
```

### Pricing

**$0.002 per tender found.** You only pay for results that work. Anything that fails comes back with an `error` and is free. You can set a max spend per run in the run options.

So 100 tenders cost about $0.20, and 1,000 about $2.00.

### FAQ

**Where's the data from?**

Contracts Finder and Find a Tender (UK government) and TED (the EU's tender site). It's all public information under the Open Government Licence and EU open data rules.

**Why does it take a few minutes?**

Find a Tender blocks you if you go too fast, so this goes at the pace it allows. Fewer days back is quicker.

**Do I get contact details?**

No, names, emails and phone numbers are left out. The link takes you to the full notice where they're listed.

**Why do some EU titles start with a country?**

That's how TED does its English titles, e.g. 'Germany – Software package – ...'. The rest might be in the original language.

**What does it cost?**

You only pay for tenders it actually finds. If nothing matches, you don't pay for results.

### Limitations

- It matches keywords in the title and description, so a tender that only mentions your word in an attached document won't show up.
- Lots of EU notices are only partly in English, so some matches get held back. You'll get a note saying how many, and you can turn on 'Include loose EU matches' to see them.
- It's what the buyers published, so always read the full notice before you bid.
- Contains public sector information licensed under the Open Government Licence v3.0. EU notices: TED, © European Union.

### Other tools you might like

- [Package Health Checker](https://apify.com/somepineapple/package-health-checker): check npm and PyPI packages for vulnerabilities, licences and abandonment.
- [Wikipedia Pageview Trends](https://apify.com/somepineapple/wikipedia-pageview-trends): see if interest in a topic is going up or down, with real numbers.
- [Security Headers Checker](https://apify.com/somepineapple/security-headers-audit): grade a list of websites on their security headers, A to F.

### Support

This Actor is built and maintained by an automated system run by its publisher. If something's wrong, open an
issue and it'll be looked at within 7 days. Please don't put passwords or personal details in an issue.

# Actor input Schema

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

Words or phrases to look for in the title and description, e.g. software, cleaning services, cyber security (max 20).

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

uk (Contracts Finder and Find a Tender) and/or eu (TED).

## `publishedWithinDays` (type: `integer`):

How far back to look, 1-30 days. The UK services are read slowly to respect their limits, so each day of UK notices takes about a minute.

## `onlyOpen` (type: `boolean`):

Leave out tenders whose deadline has passed.

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

Leave out tenders with a known value below this (in the tender's own currency). Tenders with no published value are kept.

## `euCountries` (type: `array`):

Optional: only EU tenders from these countries, as two-letter codes (ie, de, fr, nl...).

## `includeLooseEuMatches` (type: `boolean`):

TED also matches translations and secondary product codes, which is mostly noise. Off by default.

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

Up to 1000. Soonest deadlines come first.

## Actor input object example

```json
{
  "keywords": [
    "software",
    "website"
  ],
  "sources": [
    "uk",
    "eu"
  ],
  "publishedWithinDays": 3,
  "onlyOpen": true,
  "includeLooseEuMatches": false,
  "maxResults": 200
}
```

# Actor output Schema

## `results` (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 = {
    "keywords": [
        "software",
        "website"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("somepineapple/uk-eu-public-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 = { "keywords": [
        "software",
        "website",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("somepineapple/uk-eu-public-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 '{
  "keywords": [
    "software",
    "website"
  ]
}' |
apify call somepineapple/uk-eu-public-tenders --silent --output-dataset

```

## MCP server setup

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