# UK Public Tender Alerts (Find a Tender, new notices only) (`buttery_dingo/uk-tender-alerts`) Actor

Incremental alerts for UK public procurement notices from the official Find a Tender OCDS API. Filter by keywords, CPV codes, value and region; only notices not seen in previous runs are output.

- **URL**: https://apify.com/buttery_dingo/uk-tender-alerts.md
- **Developed by:** [shaolin mo](https://apify.com/buttery_dingo) (community)
- **Categories:** Lead generation, Automation, Business
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 0.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$4.00 / 1,000 new tender 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

## UK Public Tender Alerts — new notices only

Get **only the UK public procurement notices you haven't seen yet**, filtered by keywords, CPV codes, contract value and region. Data comes from the official **Find a Tender** OCDS API run by the UK Cabinet Office, published under the **Open Government Licence v3.0**.

Schedule it daily (or hourly) and connect the dataset to email, Slack, Google Sheets or a webhook to get a clean tender alert feed.

### Why this Actor

- **Incremental by design** – a named key-value store remembers every notice already delivered, so each run outputs new notices only.
- **Fair pricing** – pay-per-event: you are charged only per *new matching notice*. A run that finds nothing new costs nothing for results.
- **Official open data** – uses the public API, no browser scraping, no login, no anti-bot workarounds.
- **No personal data** – named contact persons, emails and phone numbers are dropped from every record.

### Input

| Field | Description |
|---|---|
| `keywords` | Any of these words in title/description (case-insensitive). |
| `cpvCodes` | CPV prefixes, e.g. `72` (IT services), `79410000`. |
| `minValue` / `maxValue` | Value range in the notice currency (GBP for UK, usually EUR for TED). `requireValue` drops notices with no stated value. |
| `regions` | NUTS/ITL prefixes, e.g. `UKI` (London), `UKM` (Scotland). |
| `noticeStages` | `planning`, `tender`, `award`, `contract`. Default `tender` (open opportunities). |
| `lookbackDays` | How far back to scan (1–30, default 3). |
| `maxResults` | Cap of new results per run. |
| `stateStoreName` | Dedup store name — use one per alert profile. |

Example:

```json
{ "keywords": ["software", "cloud"], "cpvCodes": ["72"], "minValue": 50000, "regions": ["UK"], "lookbackDays": 3 }
```

### Output (one item per new notice)

`noticeId, ocid, noticeType, publishedDate, title, description (≤2000 chars), status, buyerName, buyerCountry, valueAmount, valueCurrency, deadline, procurementMethod, cpvCodes[], regions[], url, source`

See `sample-output.json` for real records.

### Pricing

Pay per event `new-notice` (one charge per new delivered notice). Zero new notices = zero result charges. Platform usage is minimal (a few JSON API calls).

### Data source & licence

- API: `https://www.find-tender.service.gov.uk/api/1.0/ocdsReleasePackages` ([documentation](https://www.find-tender.service.gov.uk/apidocumentation))
- Licence: [Open Government Licence v3.0](http://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/), as stated in every API response. Attribution: *Contains public sector information licensed under the Open Government Licence v3.0.*

This Actor is independent and not affiliated with the UK Government or Cabinet Office.

### Limitations

- Covers UK Find a Tender only.
- Region and value filters depend on what the buyer published; many award notices carry no value.

### Optional source: EU TED (off by default)

Set `includeTed: true` to also receive notices from TED (Tenders Electronic Daily). UK Find a Tender remains the default; set `includeUk: false` for a TED-only run.

**Not an official EU service. Not affiliated with or endorsed by the EU, the EU Publications Office or TED.** No TED logo is used.

- Data comes only from the official TED Search API (`POST https://api.ted.europa.eu/v3/notices/search`). No web pages are scraped. Requests are throttled to at most 60 per minute.
- Filters: `cpvCodes` (prefixes, applied server-side as full 8-digit codes and re-checked locally), `tedCountries` (buyer country, ISO alpha-3), `tedNoticeTypes`, `keywords` (title only), `regions` (NUTS prefix on place of performance), `minValue`/`maxValue` (sum of estimated lot values, notice currency), `lookbackDays`.
- Every TED item carries `url` (the original notice on ted.europa.eu), plus `source` and `disclaimer` fields.
- Personal data: the Actor requests only a whitelist of non-personal fields (publication number, title, notice type, dates, buyer organisation name and country, CPV, place of performance, estimated value, deadline). Contact names, e-mails, phones, fax and all winner/tenderer fields are never requested, so names of natural-person awardees cannot appear. Free text is additionally scrubbed of e-mail addresses and phone numbers.
- Dedup: the same key-value store is used with source-prefixed keys (`uk:<id>`, `ted:<publication-number>`).

Attribution (included in every TED item):

> Source: TED – Tenders Electronic Daily, © European Union, https://ted.europa.eu. Data reused under Commission Decision 2011/833/EU; summarised and filtered by UK & EU Tender Alerts. Not affiliated with or endorsed by the EU Publications Office. Only notices published in the Supplement to the OJEU are authentic.

### Pricing

Pay per event: **$0.004 per new matching notice** delivered (either source). Duplicates already delivered and runs with zero new results are free.

# Actor input Schema

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

Match any keyword (case-insensitive) in title or description. Empty = no keyword filter.

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

e.g. 72 (IT services) or 79410000. A notice matches if any of its CPV codes starts with a prefix.

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

Notices without a stated value are kept unless 'Require value' is on.

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

Upper limit on the estimated contract value, in the notice's own currency (GBP for UK, usually EUR for TED). Notices above this are dropped. Leave empty for no upper limit. Notices with no stated value are kept unless 'Require value' is on.

## `requireValue` (type: `boolean`):

Drop notices with no stated value when a min/max is set.

## `regions` (type: `array`):

e.g. UKI (London), UKM (Scotland). Matches delivery or buyer region by prefix.

## `noticeStages` (type: `array`):

OCDS release tags to keep. Default: open tenders only. (UK only.)

## `lookbackDays` (type: `integer`):

How many days back to search for newly published notices (1-30). For a daily schedule, 2-3 days gives overlap so nothing is missed; already-delivered notices are skipped by the dedup store, so overlap is never billed twice.

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

Safety cap on how many new notices are pushed to the dataset in one run. Each new notice is one billable result, so this also caps your cost per run.

## `stateStoreName` (type: `string`):

Named key-value store that remembers notices already delivered. Use different names for different alert profiles.

## `includeUk` (type: `boolean`):

Default source.

## `includeTed` (type: `boolean`):

Off by default. Uses only the official TED Search API, throttled to max 60 requests/minute. Not an official EU service; not affiliated with the EU or TED.

## `tedCountries` (type: `array`):

e.g. DEU, IRL, FRA. Empty = all.

## `tedNoticeTypes` (type: `array`):

TED eForms notice-type codes. Default: contract notices (open competitions).

## Actor input object example

```json
{
  "keywords": [],
  "cpvCodes": [],
  "requireValue": false,
  "regions": [],
  "noticeStages": [
    "tender"
  ],
  "lookbackDays": 3,
  "maxResults": 500,
  "stateStoreName": "uk-tender-alerts-state",
  "includeUk": true,
  "includeTed": false,
  "tedCountries": [],
  "tedNoticeTypes": [
    "cn-standard",
    "cn-social"
  ]
}
```

# Actor output Schema

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

Dataset of new UK Find a Tender and optional EU TED notices that matched the run filters and were not seen before.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("buttery_dingo/uk-tender-alerts").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 = {}

# Run the Actor and wait for it to finish
run = client.actor("buttery_dingo/uk-tender-alerts").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 '{}' |
apify call buttery_dingo/uk-tender-alerts --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,buttery_dingo/uk-tender-alerts"
        }
    }
}
```

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/KpyumfmyYa0PPaNYr/builds/ShLsdze4VpPu4aGxy/openapi.json
