# Public Tenders: EU, UK, Canada & Australian Contract Awards (`everyotherfriday/public-tenders`) Actor

Search public tenders; Australia: awarded contracts only. Contact identities removed. Data: TED (EU, CC BY 4.0), UK Find a Tender/Contracts Finder (OGL v3.0), CanadaBuys (OGL Canada), AusTender (CC BY 3.0 AU). Credits on every row. Not affiliated with or endorsed by any government.

- **URL**: https://apify.com/everyotherfriday/public-tenders.md
- **Developed by:** [Paul Vasquez](https://apify.com/everyotherfriday) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

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

### What it does

Search five official procurement feeds through one consistent output: TED, UK Contracts Finder, UK Find a Tender, CanadaBuys and Australian contract awards. Use the actor to discover purchasing opportunities, monitor awards and prepare a procurement research dataset. It uses key-free public endpoints without a proxy, browser, login or account connection.

Each successful row represents a published notice or release. Australian rows are always awards. UK and TED results can include both tenders and awards; a tender row does not guarantee that bidding remains open. The Canadian feed contains open tender notices and is refreshed approximately every two hours. Document bodies are never downloaded.

### Input

`sources` is a multi-select containing `ted`, `uk-contracts-finder`, `uk-find-a-tender`, `canada` and `australia-awards`. The default selects TED, Find a Tender and Canada. Sources run independently, and results are merged in rotation so that one busy source does not consume the entire output allowance.

`keywords` is a string list. Matching is case-insensitive, and any keyword can match the normalised title or description. Leave it empty to return all subjects. `publishedFrom` and `publishedTo` accept inclusive `YYYY-MM-DD` dates; omitting them selects the last seven days through today, using UTC to choose the defaults. These are publication dates, not submission deadlines.

`cpvCodes` optionally filters by CPV prefixes. Notices lacking CPV codes do not match, so this filter normally excludes Canada and Australia, which use other classification systems. `countries` filters TED buyer countries only, using TED three-letter codes such as `DEU`, `FRA` and `POL`. It has no effect on other sources.

`maxResults` defaults to 100 and caps successful rows across all sources. Free diagnostics are additional rows. `includeDocumentsList` defaults to false; enabling it adds available notice or attachment links. Australian ATM document links are always excluded.

```json
{"keywords":["software"],"maxResults":60}
```

### Output

Rows contain `source`, `noticeId`, `noticeType`, `title`, `description`, `buyerName`, `buyerCountry`, `value`, `currency`, `publishedAt`, `deadline`, `cpvCodes`, `categoryCodes`, `noticeUrl`, `licence` and `attribution`. `documents` appears only when requested. Descriptions are trimmed to 4,000 characters. Missing values are null; codes remain strings, and monetary values are numbers in the stated currency, without conversion.

Source timestamps retain their supplied precision and offset. TED countries use three-letter codes, while the other adapters identify their national feed with GB, CA or AU. Classification codes are deduplicated; non-CPV entries carry a scheme prefix. Named contacts identified in source contact fields, labelled contact blocks, email addresses and phone numbers are removed. Organisation names remain. Error and empty rows carry `status` and `message`, with the source licence and credit, and are never charged.

### Example output

Real trimmed Australian award captured on 27 September 2026:

```json
{
  "source": "australia-awards",
  "noticeType": "award",
  "title": "SCO002996",
  "description": "ICT Software",
  "buyerName": "Australian Financial Security Authority",
  "buyerCountry": "AU",
  "value": 24333.02,
  "currency": "AUD",
  "publishedAt": "2026-09-25T22:15:35Z",
  "categoryCodes": ["UNSPSC:43230000"]
}
```

The complete saved row also contains its identifier, notice URL and attribution.

### Use cases

- A software vendor can monitor new procurement notices mentioning its product category.
- A bid consultancy can prepare a dated opportunity shortlist for clients in several markets.
- A procurement analyst can compare Australian award descriptions and disclosed contract values.
- A market researcher can build a source-attributed dataset for sector and buyer analysis.

### Pricing example

The `notice` event costs **$0.004** per successful row. A requested document list with at least one link uses `notice-with-documents-list` at **$0.006**, instead of the base event. An empty document list costs the base price. Thus, 100 ordinary notices cost $0.40; 80 ordinary notices plus 20 with links cost $0.44. Failed sources, empty results and diagnostics cost nothing. Processing stops when the charge allowance is exhausted, retaining the final granted row.

### Sources and licences

- TED — CC BY 4.0: **© European Union, https://ted.europa.eu**. [Legal notice](https://ted.europa.eu/en/legal-notice).
- Both UK sources: **Contains public sector information licensed under the Open Government Licence v3.0.** [Terms](https://www.contractsfinder.service.gov.uk/Home/TermsAndConditions).
- Canada: **Contains information licensed under the Open Government Licence - Canada.** [Dataset](https://open.canada.ca/data/en/dataset/6abd20d4-7a1c-4b38-baa2-9525d0bb2fd2).
- Australia: **AusTender materials are released by the Department of Finance. AusTender materials are subject to change and should be verified on the AusTender website to ensure the information is up to date and correct: www.tenders.gov.au.** [CC BY 3.0 AU](https://creativecommons.org/licenses/by/3.0/au/). [Terms](https://www.tenders.gov.au/infolinks/termsofuse).

No government or source endorsement is implied. Preserve attribution when reusing exported rows.

### Limitations

SAM.gov is excluded because its terms prohibit automated gathering. AusTender open tenders and Approach to Market materials are excluded because their reproduction and commercialisation are restricted; only the contract-publication OCDS endpoint is used.

Requests are paced at up to four starts per second per source, with two retries and one/two-second backoff. Retry-After takes precedence, including HTTP dates; a wait exceeding the remaining run window is deferred through a free error row. Each source scans at most 50 pages within a shared time window. Results are not an exhaustive archive. Broad filters, amendments, missing fields, source outages and description trimming can affect coverage. Verify deadlines, eligibility and award details with the publisher before acting. Hosted execution and actual platform billing still require deployment validation.

# Actor input Schema

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

Approved procurement feeds. Australia includes contract awards only.

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

Case-insensitive OR matching in normalised title or description; empty means all.

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

Optional CPV prefixes; records without a matching CPV are excluded, including Canada and Australia.

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

Optional TED three-letter country codes, for example DEU, FRA or POL. Only TED is filtered.

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

Inclusive YYYY-MM-DD publication date. Omit for the last seven days through today (UTC).

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

Inclusive YYYY-MM-DD publication date. Omit for the last seven days through today (UTC).

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

Global successful-row cap, merged fairly across selected sources. Free diagnostics are extra.

## `includeDocumentsList` (type: `boolean`):

List available public notice/attachment links without downloading documents. Australia never includes ATM links.

## Actor input object example

```json
{
  "sources": [
    "ted",
    "uk-find-a-tender",
    "canada"
  ],
  "maxResults": 100,
  "includeDocumentsList": false
}
```

# Actor output Schema

## `items` (type: `string`):

No description

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

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

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

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,everyotherfriday/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/3wCM4AA463ZZqeRga/builds/J39nhXsSCBwH2DMKn/openapi.json
