# UK, Australia & Canada Government Tenders Feed (OCDS) (`moment-data/commonwealth-tenders-feed`) Actor

One normalized OCDS-style feed of public tenders, contract awards and contracts from UK Find a Tender, UK Contracts Finder, AusTender and CanadaBuys. Filter by country, stage, CPV/UNSPSC, keywords, value and date. No API key.

- **URL**: https://apify.com/moment-data/commonwealth-tenders-feed.md
- **Developed by:** [Luke Miller](https://apify.com/moment-data) (community)
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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, Australia & Canada Government Tenders Feed (OCDS, no API key)

One clean, **normalized OCDS-style feed of public-sector tenders, contract awards and contracts** from four official government sources:

| Country | Source | What you get | Licence |
|---|---|---|---|
| GB | **UK Find a Tender (FTS)** OCDS API | above-threshold tenders, awards (with winning suppliers), pipeline/planning notices | OGL v3 |
| GB | **UK Contracts Finder** OCDS API | below-threshold opportunities and awards | OGL v3 |
| AU | **AusTender** OCDS API | contract notices (awarded Commonwealth contracts) with supplier and value | CC BY 3.0 AU |
| CA | **CanadaBuys** open data | new and open federal tender notices with UNSPSC codes and closing dates | OGL-Canada |

Every record has the same fields whatever the source: country, source, notice ID / OCID, stage (`tender` / `award` / `contract` / `planning`), title, trimmed description, buyer, CPV and UNSPSC codes, value + currency, deadline, published date, procurement method, supplier organisations (awards), region, contract period and a link to the official notice.

### Who it's for

- **Bid teams and B2G sales**: daily new opportunities in your CPV/UNSPSC codes across three markets in one run.
- **Competitive intelligence**: who is winning which public contracts, for how much (UK awards, AusTender contracts).
- **Bid-writing consultancies, market researchers, govtech investors, data teams and AI agents**: clean JSON, stable IDs, official links.

### Quick start

1. Click **Start** with `{}`: 40 of the newest notices, evenly from all four sources.
2. IT services tenders in all three countries: `{"stages": ["tender"], "codePrefixes": ["72", "4321", "8111"], "maxItems": 100}`
3. UK construction awards over £1M: `{"countries": ["GB"], "stages": ["award"], "codePrefixes": ["45"], "minValue": 1000000, "maxItems": 200}`
4. Australian contracts this week: `{"countries": ["AU"], "daysBack": 7, "maxItems": 1000}`
5. Keyword alerts: `{"keywords": ["cyber", "penetration testing", "SOC"], "daysBack": 2, "maxItems": 200}`
6. Canadian open tenders posted in the last 14 days: `{"countries": ["CA"], "daysBack": 14, "maxItems": 500}`

Schedule it daily with `daysBack: 1` (or 2 for overlap) and your filters to get a bid alert feed.

### Input

| Field | Default | Notes |
|---|---|---|
| `countries` | all | `GB` (or `UK`), `AU`, `CA` |
| `sources` | all | `uk-find-a-tender`, `uk-contracts-finder`, `au-austender`, `ca-canadabuys` |
| `stages` | tender, award, contract | add `planning` for UK pipeline / market engagement notices |
| `codePrefixes` | - | CPV (UK) or UNSPSC (AU/CA) prefixes, e.g. `72`, `45`, `4321` |
| `keywords` | - | any keyword in title, description, buyer, supplier or code text |
| `minValue` / `includeNoValue` | - / false | in the notice's own currency, no FX |
| `daysBack` | 7 | window ending now (UTC); results are newest first |
| `maxItems` | 40 | split evenly across sources, short sources topped up by the others |
| `descriptionMaxChars` | 500 | |
| `maxPagesPerSource`, `timeBudgetSeconds` | 30, 240 | safety caps for narrow filters on long windows |

### Output example

```json
{
  "country": "GB", "source": "uk-find-a-tender", "noticeId": "103472-2026", "ocid": "ocds-h6vhtk-...", "stage": "tender",
  "title": "Mission Feasibility Studies – Spacecraft", "buyerName": "Department for Science, Innovation and Technology",
  "cpvCodes": ["34712100", "34700000"], "unspscCodes": [], "valueAmount": 2100000, "currency": "GBP",
  "deadline": "2026-11-27T13:00:00.000Z", "publishedDate": "2026-10-30T18:56:03.000Z", "procurementMethod": "open",
  "suppliers": [], "region": "UK", "url": "https://www.find-tender.service.gov.uk/Notice/103472-2026"
}
```

The run summary (`OUTPUT` in the key-value store) shows per-source counts, pages read, and any source that failed (the run still delivers from the others).

### Notes and limits

- **Stages per source**: AusTender's OCDS API publishes contract notices (`stage: contract`); CanadaBuys open data used here is tender notices (`stage: tender`, no value). UK sources have all stages; an FTS "award + contract" release is `award`.
- **Organisations only**: supplier names are delivered only when they clearly look like an organisation (company register ID or organisational word such as Ltd, Pty, Council, University). Names that may be sole traders are withheld and counted in `suppliersWithheld`; "Person T/A Business Ltd" becomes "Business Ltd". Contact names, emails and phone numbers are never output.
- **Values** are as published (estimated value for tenders, award/contract value for awards), in GBP/AUD/CAD.
- **Links**: AusTender links open the AusTender contract-notice search for the CN ID (AusTender pages need a browser).
- **Polite**: one request at a time per source with a minimum gap, automatic back-off on HTTP 429 (Find a Tender is rate-limited) using `Retry-After`.
- Stateless: each run reads the window you ask for. For alerts, schedule daily with `daysBack: 1`-`2` and dedupe on `source` + `releaseId`.

Data: UK Find a Tender and Contracts Finder (Crown copyright, Open Government Licence v3.0); AusTender (Commonwealth of Australia, CC BY 3.0 AU); CanadaBuys (Government of Canada, Open Government Licence - Canada). This Actor is not affiliated with any government.

# Actor input Schema

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

GB (or UK), AU, CA. Empty = all three.

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

Optional: uk-find-a-tender, uk-contracts-finder, au-austender, ca-canadabuys (short forms fts, cf, austender, canadabuys also work). Empty = all sources of the chosen countries.

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

tender (open opportunities), award (contract awards with winning suppliers), contract (AusTender contract notices; UK contract-only updates), planning (UK pipeline / preliminary market engagement notices). Empty = tender, award, contract.

## `codePrefixes` (type: `array`):

Keep notices with any CPV (UK) or UNSPSC (AU, CA) code starting with one of these, e.g. 72 (IT services, CPV), 45 (construction works, CPV), 4321 (computers, UNSPSC), 8111 (computer services, UNSPSC). Empty = all.

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

Case-insensitive; a notice matches if any keyword appears in its title, description, buyer, supplier or classification text. Empty = all.

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

Minimum estimated (tender) or awarded (award/contract) value in the notice's own currency (GBP, AUD, CAD; no FX conversion). Notices without a value are dropped unless 'Keep notices without a value' is on. CanadaBuys notices carry no value.

## `includeNoValue` (type: `boolean`):

With a minimum value set, also keep notices that state no value.

## `daysBack` (type: `integer`):

Look-back window ending now (UTC). Results are newest first, so a short run only reads the newest pages. CanadaBuys: 1 = today's new notices file only; more = also the open-notices file filtered by publication date.

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

Cap on delivered notices (also caps your spend). Split evenly across the selected sources; a source that runs short is topped up by the others.

## `descriptionMaxChars` (type: `integer`):

Descriptions are trimmed to this many characters (0 = no trimming).

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

Safety cap on API pages (100 notices each) read per OCDS source. Raise it for narrow filters over long windows.

## `timeBudgetSeconds` (type: `integer`):

Stop paging sources after this long and deliver what was found.

## Actor input object example

```json
{
  "includeNoValue": false,
  "daysBack": 7,
  "maxItems": 40,
  "descriptionMaxChars": 500,
  "maxPagesPerSource": 30,
  "timeBudgetSeconds": 240
}
```

# Actor output Schema

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

Normalized tender, award and contract notices.

## `summary` (type: `string`):

Window, sources used, per-source counts and errors, why the run stopped.

# 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("moment-data/commonwealth-tenders-feed").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("moment-data/commonwealth-tenders-feed").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 moment-data/commonwealth-tenders-feed --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,moment-data/commonwealth-tenders-feed"
        }
    }
}
```

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/qblIQ1v3h5pRNYTXY/builds/Vh9zxE1bHpbl9N5Tr/openapi.json
