# UK Public Tenders - Find a Tender and Contracts Finder (`grit-77/uk-find-a-tender`) Actor

UK public tender and contract-award scraper from Find a Tender and Contracts Finder. Export matching OCDS releases as JSON with available buyer, date, value, CPV and award fields.

- **URL**: https://apify.com/grit-77/uk-find-a-tender.md
- **Developed by:** [Grit](https://apify.com/grit-77) (community)
- **Categories:** Business, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$2.00 / 1,000 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 Tenders - Find a Tender and Contracts Finder

UK Find a Tender scraper returns public procurement notice releases from Find a Tender and Contracts Finder. UK tender API output includes buyer, status, dates, values, CPV codes, suppliers, awards, and source links when the release provides them.

### What it does

Select either public portal or both. Filters are applied to retrieved OCDS releases, and each matching release is a dataset row. A procurement can have multiple releases or appear on both portals. Inspect `RUN_SUMMARY` for source errors and scan limits.

### Input example

```json
{
  "sources": [
    "find-a-tender"
  ],
  "stages": [
    "award"
  ],
  "maxItems": 10
}
```

The example uses fields defined in the actor input schema. Other filters can be set in the Apify input form.

### Output fields

Examples below come from the first record in [sample_output.json](sample_output.json); long strings and arrays are shown as excerpts. Other modes and error rows can have different fields.

| Field | Type in sample | Example value |
|---|---|---|
| `source` | string | `"find-a-tender"` |
| `noticeId` | string | `"006488-2025"` |
| `ocid` | string | `"ocds-h6vhtk-0425f2"` |
| `title` | string | `"Lead Provider of Community Ophthalmology Services"` |
| `description` | string | `"North Central London Integrated Care Board  is procuring a Lead Provider of Commu…` |
| `publishedAt` | string | `"2025-02-20T23:46:57Z"` |
| `stage` | string | `"award"` |
| `tags` | array | `["award", "contract"]` |
| `status` | string | `"complete"` |
| `buyerName` | string | `"North Central London Integrated Care Board"` |
| `buyerId` | string | `"GB-NHS-QMJ"` |
| `valueAmount` | number | `2864100` |
| `valueCurrency` | string | `"GBP"` |
| `valueSource` | string | `"contracts[0].value"` |
| `valueMinAmount` | number | `2864100` |
| `valueMaxAmount` | number | `2864100` |
| `cpvCodes` | array | `["85100000"]` |
| `procurementMethod` | string | `"open"` |
| `tenderDeadline` | null | `null` |
| `contractStart` | null | `null` |
| `contractEnd` | null | `null` |
| `suppliers` | array | `[{"id": "GB-NHS-RP6", "name": "Moorfields Eye Hospital NHS Foundation Trust"}]` |
| `awards` | array | `[{"id": "006488-2025-1", "relatedLots": ["1"], "title": "Lead Provider of Communit…` |
| `documents` | array | `[]` |
| `sourceUrl` | string | `"https://www.find-tender.service.gov.uk/Notice/006488-2025"` |
| `apiUrl` | string | `"https://www.find-tender.service.gov.uk/api/1.0/ocdsReleasePackages/006488-2025"` |
| `errors` | array | `[]` |
| `fetchedAt` | string | `"2026-10-05T14:44:45.371903+00:00"` |

### Output example

A trimmed record copied from [sample_output.json](sample_output.json):

```json
{
  "source": "find-a-tender",
  "noticeId": "006488-2025",
  "ocid": "ocds-h6vhtk-0425f2",
  "title": "Lead Provider of Community Ophthalmology Services",
  "publishedAt": "2025-02-20T23:46:57Z",
  "stage": "award",
  "status": "complete",
  "buyerName": "North Central London Integrated Care Board",
  "valueAmount": 2864100,
  "valueCurrency": "GBP",
  "cpvCodes": [
    "85100000"
  ],
  "suppliers": [
    {
      "id": "GB-NHS-RP6",
      "name": "Moorfields Eye Hospital NHS Foundation Trust"
    }
  ],
  "sourceUrl": "https://www.find-tender.service.gov.uk/Notice/006488-2025",
  "errors": [],
  "fetchedAt": "2026-10-05T14:44:45.371903+00:00"
}
```

### FAQ

**Does this include every UK tender?** No. Coverage depends on releases returned by the selected public APIs, the date filters, and `maxPagesPerSource`. A notice or amendment may appear as a separate release.

**Do I need a proxy or login?** The source APIs are public and unauthenticated. This actor does not require a source login or proxy.

**What is the pricing model?** The proposed pay-per-event price is $0.002 per successful matching `notice` release. Errors, duplicates, and filtered-out releases do not trigger that event. The owner must configure the price in Apify before publication.

**What happens when a source rate limits requests?** Requests for each source are paced at least one second apart. Transient failures get at most four attempts and honor `Retry-After`; a delay above 300 seconds becomes a source error. Contracts Finder HTTP 403 stops that source without retrying.

**How fresh are the notices?** The actor reads the live public APIs at run time. `publishedAt` is the release date and `fetchedAt` is retrieval time. Find a Tender server-side date bounds use update times, so an older release outside that window can be missed.

### Use with AI agents / MCP

After this actor is available to your account, configure it as an actor tool in the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp), or start a run through the [Apify API](https://docs.apify.com/api/v2) with the same input JSON. Give the agent the actor identifier and access through your Apify credentials. Read the completed run’s default dataset through the returned run or dataset reference, check error fields before using records, and keep source URLs with quoted data. Limit the input to the task the agent is answering.

### Source and reuse notes

The captured source packages identify the [Open Government Licence v3](https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/); check attachment-specific terms before reuse. Missing source fields remain null. This actor does not add private contact data. An empty or malformed source response can become an error rather than proof that no matching notices exist.

# Actor input Schema

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

Select one or both public OCDS APIs. Releases are kept separate by source.

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

Case-insensitive literal substring in title, description or buyer name; an empty value matches all notices.

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

Match any CPV prefix, e.g. 72 for IT or 72000000. Full codes with a check digit are accepted. Leave empty for all sectors.

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

Inclusive UTC date (YYYY-MM-DD), or timezone-aware ISO timestamp. Defaults to seven days before today. Filters release.date, which may be an amendment date.

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

Inclusive UTC date or timezone-aware ISO timestamp. Date-only input includes the whole day. Defaults to today.

## `minValue` (type: `number`):

Minimum amount in the chosen currency. Value intervals match when they overlap. Missing values are excluded.

## `maxValue` (type: `number`):

Maximum amount in the chosen currency; leave unset for no upper bound.

## `currency` (type: `string`):

Three-letter currency code used when a value bound is set. No currency conversion is performed.

## `statuses` (type: `array`):

Exact tender.status values. Active is the source status at publication, not a guarantee the deadline is still open. Missing statuses do not match.

## `stages` (type: `array`):

Filter release stage. Leave empty to include all. Status and stage are separate filters.

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

Shared cap across both sources including uncharged error rows.

## `maxPagesPerSource` (type: `integer`):

Bounds scanning even when filters find no matches. A limit is reported in RUN_SUMMARY; increase it for wider coverage.

## `pageSize` (type: `integer`):

Official API page size, from 1 to 100.

## `concurrency` (type: `integer`):

One or two concurrent requests. Pages within each source are sequential and paced at least one second apart.

## `includeRaw` (type: `boolean`):

Adds rawOcds for auditing. Larger output, same notice event price.

## Actor input object example

```json
{
  "sources": [
    "find-a-tender",
    "contracts-finder"
  ],
  "keyword": "",
  "currency": "GBP",
  "maxItems": 100,
  "maxPagesPerSource": 20,
  "pageSize": 100,
  "concurrency": 2,
  "includeRaw": false
}
```

# Actor output Schema

## `dataset` (type: `string`):

Open the default dataset items as JSON; export to CSV or Excel in Apify Console.

# 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("grit-77/uk-find-a-tender").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("grit-77/uk-find-a-tender").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 grit-77/uk-find-a-tender --silent --output-dataset

```

## MCP server setup

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

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/O3iLu1dpoFSu1CQr6/builds/AJzE2pRwcvJxFXmmC/openapi.json
