# Canada Contract Awards (CanadaBuys) & Supplier Analytics (`zhucl1006/canadabuys-contract-awards`) Actor

Search Canadian federal government contract awards from official CanadaBuys open data by keyword, department, supplier, UNSPSC, region, province, procurement method, date and value. Clean records plus department/supplier spend rankings.

- **URL**: https://apify.com/zhucl1006/canadabuys-contract-awards.md
- **Developed by:** [leo zhu](https://apify.com/zhucl1006) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.01 / 1,000 results

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

## Canada Contract Awards (CanadaBuys) & Supplier Analytics

Search **Canadian federal government contract awards** from the official **CanadaBuys** open data (Public Services and Procurement Canada) and get clean, de-duplicated award records - or a ready-made **spend ranking** of departments, suppliers, UNSPSC segments, provinces, procurement methods or fiscal years.

For bid and capture teams, B2B sales, market researchers and journalists who want to know **which departments buy what, from whom, how, and for how much**.

**Keywords:** Canada government contracts, Canadian federal procurement data, CanadaBuys award notices, PSPC contracts, National Defence contracts, sole-source / non-competitive contracts, government supplier list, public sector spend analysis, UNSPSC, standing offers, supply arrangements.

### Use cases

- **Bid / capture teams**: who won contracts in your UNSPSC codes, at what value, with which procurement method and trade agreements.
- **B2B sales & lead generation**: departments that recently bought IT, engineering, training or construction services - plus supplier city and province.
- **Competitor intelligence**: every federal award won by a competitor, and their top departments.
- **Sole-source watch**: non-competitive awards (`procurementMethods: ["non-competitive"]`) with the limited-tendering reason.
- **Research & journalism**: spend by department, fiscal year, province or UNSPSC segment, back to 2012.

### What you get

**Award records** (one row per contract x supplier; amendments folded into the latest version by default):

| Field | Example |
|---|---|
| `awardDate`, `publishedDate` | 2026-08-28, 2026-09-01 |
| `buyerName`, `endUserEntities` | Department of Public Works and Government Services (PSPC), \[Department of National Defence (DND)] |
| `supplierName`, `supplierCity`, `supplierProvince`, `supplierPostalCode`, `supplierCountry` | Fanshawe College of Applied Arts and Technology, London, Ontario |
| `awardedAmount`, `valueBasis`, `contractAmount`, `totalContractValue`, `currency` | 34447466.89, totalContractValue, CAD |
| `title`, `titleFr`, `description` | Royal Canadian Air Force Aircraft Maintenance Engineer (AME) Training |
| `procurementMethod`, `limitedTenderingReason`, `selectionCriteria` | Competitive - Open bidding |
| `unspscCodes`, `unspscDescriptions`, `unspscSegment`, `gsin` | 86100000 Vocational training |
| `regionsOfDelivery`, `tradeAgreements`, `procurementCategories` | Ontario (except NCR); CFTA, CCFTA ... ; services |
| `contractNumber`, `solicitationNumber`, `referenceNumber`, `amendmentNumber`, `amendmentType` | CW2444393, 000 |
| `contractStartDate`, `contractEndDate`, `awardStatus`, `fiscalYear` | 2026-08-28, 2030-08-31, Active, 2026 |

**Spend summary rows** (`outputMode` = `summary` or `both`) grouped by supplier, department, department + supplier, fiscal year, UNSPSC segment, region of delivery, procurement method or supplier province: total CAD, number of awards, distinct departments/suppliers, average/median/max, share of total, first/last award date and top 5 counterparties.

### How to use

1. Pick a **publication date range** (default: last 30 days). Anything from 2012 onwards works; ranges before August 2022 also read the large historical file.
2. Optionally filter by **keywords** (English or French), **departments** (matches the contracting entity *and* the end-user department, so "National Defence" also finds contracts PSPC bought for DND), **suppliers**, **UNSPSC prefixes**, **regions**, **supplier provinces**, **procurement methods** (e.g. `non-competitive`), **status**, **award date** or **value**.
3. Choose **Award records**, **Spend summary** or **Both**.

Example - non-competitive National Defence contracts over CAD 100,000 since 2025, with a supplier ranking:

```json
{
  "publishedFrom": "2025-01-01",
  "buyers": ["National Defence"],
  "procurementMethods": ["non-competitive"],
  "minAmount": 100000,
  "outputMode": "both",
  "summaryBy": "supplier",
  "summaryTopN": 10
}
```

### Output example

Award record (abbreviated, real data):

```json
{
  "recordType": "award",
  "awardDate": "2026-08-28",
  "publishedDate": "2026-09-01",
  "buyerName": "Department of Public Works and Government Services (PSPC)",
  "supplierName": "Fanshawe College of Applied Arts and Technology",
  "supplierCity": "London",
  "supplierProvince": "Ontario",
  "awardedAmount": 34447466.89,
  "valueBasis": "totalContractValue",
  "currency": "CAD",
  "title": "Royal Canadian Air Force Aircraft Maintenance Engineer (AME) Training",
  "procurementMethod": "Competitive - Open bidding",
  "unspscCodes": ["43232500", "86100000"],
  "regionsOfDelivery": ["Ontario (except NCR)"],
  "contractNumber": "CW2444393",
  "contractStartDate": "2026-08-28",
  "contractEndDate": "2030-08-31",
  "awardStatus": "Active",
  "fiscalYear": 2026
}
```

Summary rows have `recordType: "summary"`, `groupKey`, `rank`, `totalAwarded` (CAD), `awardCount`, `averageAward`, `medianAward`, `maxAward`, `shareOfTotalPct`, first/last award date and `topCounterparties`.

More example inputs:

```json
{"publishedFrom": "2025-04-01", "publishedTo": "2026-03-31", "outputMode": "summary", "summaryBy": "supplier", "summaryTopN": 100}
```

```json
{"publishedFrom": "2026-01-01", "suppliers": ["Deloitte"], "outputMode": "both", "summaryBy": "buyer"}
```

```json
{"publishedFrom": "2019-04-01", "publishedTo": "2023-03-31", "outputMode": "summary", "summaryBy": "buyerFiscalYear"}
```

### Pricing (pay per event)

- Run start: small fixed fee per run
- **Award record**: per award row returned
- **Summary row**: per ranking row returned

Example: 50 award records + 10 summary rows = 0.005 + 50 x 0.002 + 10 x 0.01 = about **USD 0.21**. You only pay for rows you receive; set a maximum cost per run and the Actor stops cleanly when it is reached. See the Pricing tab for current prices.

### Good to know

- **Coverage**: federal government award notices published on CanadaBuys (from 2022-08-08) plus the archived 2012-2022 award notices. Provincial and municipal awards are not included. Files are refreshed by the government once a day.
- **Values**: `awardedAmount` is the total contract value to date (original plus amendments) when published, otherwise the award amount; `valueBasis` says which. Standing offers and supply arrangements often have no value (`awardedAmount` = null). Values include taxes, as published.
- **Currencies**: most awards are in CAD. Awards in USD/EUR keep their own currency in records and are counted, but not added to CAD totals in summaries.
- **Amendments**: with `latestVersionOnly` (default) each contract x supplier appears once in its latest version. Turn it off to get every original and amendment notice.
- Speed: typically 2-15 seconds for recent ranges; historical ranges read a ~270 MB file (under a minute).
- Personal contact details (contact names, emails, phone numbers) are not exported.

### FAQ

**Where does the data come from?** The official CanadaBuys award notice files published by Public Services and Procurement Canada on open.canada.ca (refreshed daily). The Actor downloads those files only - it does not crawl the CanadaBuys website.

**Does it include open tenders?** No - awarded contracts only.

**Can I export to Excel / CSV / Google Sheets?** Yes, via the Apify dataset export, API or integrations; schedule it weekly to track new awards.

**Why do some awards have no value?** Standing offers and supply arrangements are frameworks without a fixed value; they are still listed so you can see who holds them.

### Data licence and attribution

Contains information licensed under the [Open Government Licence - Canada](https://open.canada.ca/en/open-government-licence-canada). Source: [CanadaBuys award notices](https://open.canada.ca/data/en/dataset/a1acb126-9ce8-40a9-b889-5da2b1dd20cb), Public Services and Procurement Canada. Every record carries `source` and `licence` fields; keep that attribution if you republish. This Actor is not affiliated with or endorsed by the Government of Canada.

# Actor input Schema

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

Earliest notice publication date (YYYY-MM-DD). Default: 30 days ago. Earliest: 2012-01-01 (ranges before 2022-08-08 read the large historical file and take longer).

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

Latest notice publication date (YYYY-MM-DD, inclusive). Default: today.

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

Words or phrases to find in the English/French title, description, solicitation or contract number (case-insensitive).

## `keywordMatch` (type: `string`):

Match ANY keyword or ALL keywords.

## `buyers` (type: `array`):

Partial, case-insensitive names, e.g. 'National Defence', 'PSPC', 'Parks Canada'.

## `suppliers` (type: `array`):

Partial, case-insensitive supplier legal names, e.g. 'IBM', 'Deloitte'.

## `unspscCodes` (type: `array`):

UNSPSC code prefixes, e.g. '43' (IT equipment), '81' (engineering/IT services), '72' (construction).

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

Partial region names, e.g. 'Ontario', 'National Capital Region', 'British Columbia'.

## `supplierProvinces` (type: `array`):

Province of the supplier's address, e.g. 'Quebec', 'Alberta'.

## `procurementMethods` (type: `array`):

Partial match, e.g. 'Non-competitive', 'Open bidding', 'Selective', 'Advance contract award notice'.

## `awardStatuses` (type: `array`):

Keep only these statuses (empty = all).

## `awardDateFrom` (type: `string`):

Optional extra filter on the contract award date.

## `awardDateTo` (type: `string`):

Optional extra filter on the contract award date.

## `minAmount` (type: `integer`):

Only awards with a stated value at or above this.

## `maxAmount` (type: `integer`):

Only awards with a stated value at or below this.

## `latestVersionOnly` (type: `boolean`):

Amended contracts appear once, with the latest amendment and total contract value to date. Turn off to get every original and amendment notice as a separate row.

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

Maximum number of award records to output (0 = no limit). Summary rows are not counted.

## `sortBy` (type: `string`):

Order of award records in the output.

## `outputMode` (type: `string`):

Award records, an aggregated spend ranking, or both.

## `summaryBy` (type: `string`):

Grouping for the spend summary: total CAD, award count, average/median/max, share of total, first/last award date and top counterparties. Non-CAD awards are counted but not added to CAD totals.

## `summaryTopN` (type: `integer`):

How many summary rows to output, ranked by total value (0 = all).

## Actor input object example

```json
{
  "publishedFrom": "2026-04-01",
  "keywords": [
    "software"
  ],
  "keywordMatch": "any",
  "latestVersionOnly": true,
  "maxItems": 100,
  "sortBy": "awardDateDesc",
  "outputMode": "records",
  "summaryBy": "supplier",
  "summaryTopN": 50
}
```

# Actor output Schema

## `results` (type: `string`):

No description

## `runSummary` (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 = {
    "publishedFrom": "2026-04-01",
    "keywords": [
        "software"
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("zhucl1006/canadabuys-contract-awards").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 = {
    "publishedFrom": "2026-04-01",
    "keywords": ["software"],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("zhucl1006/canadabuys-contract-awards").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 '{
  "publishedFrom": "2026-04-01",
  "keywords": [
    "software"
  ],
  "maxItems": 100
}' |
apify call zhucl1006/canadabuys-contract-awards --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,zhucl1006/canadabuys-contract-awards"
        }
    }
}
```

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/gPgwyLyzK2jwEoorZ/builds/neiiFyo4rfX48EMnP/openapi.json
