# Canada Government Tenders — CanadaBuys, SEAO, NS Feed (`truenorthdata/canada-tenders-scraper`) Actor

Monitor Canadian public tenders in one feed — federal (CanadaBuys), Québec (SEAO), Nova Scotia. Filter by category, keyword, and closing date to catch bids early. JSON/CSV, refreshed often; run daily so you never miss a relevant government contract. For govcon vendors and bid consultants.

- **URL**: https://apify.com/truenorthdata/canada-tenders-scraper.md
- **Developed by:** [Vadim Zabin](https://apify.com/truenorthdata) (community)
- **Categories:** Lead generation, News, Automation
- **Stats:** 1 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Canada Tenders Scraper — Federal + Québec (CanadaBuys, SEAO)

The only Actor that combines **two official Canadian government tender sources in one normalized feed**:

- **CanadaBuys** — every federal tender notice (Government of Canada system of record)
- **SEAO** — Québec's entire public sector: ministries, municipalities, health care, education
- **Nova Scotia** — awarded public tenders across government and the MASH sector, with **winning vendor and award amount in CAD**

Filter by keyword, procurement category, region, UNSPSC code and closing date. Built exclusively on official open data (Open Government Licence – Canada, CC-BY Québec) — no proxies, no blocks, no login.

### Why this Actor?

- **Widest coverage.** Other actors return only the federal CSV. This one adds the Québec public sector — thousands of provincial and municipal opportunities others miss. More provinces (Ontario, BC) are on the roadmap.
- **One schema.** Both sources are normalized into the same clean record: title, buyer, category, UNSPSC, closing date, contact, notice URL, source, jurisdiction.
- **Built for monitoring.** Turn on *Incremental mode* and schedule daily/weekly runs: you only get (and pay for) tenders you haven't seen before.
- **Filters that save you money.** You only pay for records that match your keywords, categories, regions and closing window.
- **Award data (Québec).** Optionally include awarded contracts with values in CAD — useful for market research and competitor analysis.

### Use cases

- Contractors and consultants monitoring RFPs in their industry or province
- Bid-writing agencies tracking opportunities for clients across jurisdictions
- Market research on government spending (who buys what, award values)
- Feeding procurement data into AI agents, CRMs or Slack alerts via the Apify API

### Input example

```json
{
    "sources": ["canadabuys", "seao"],
    "keywords": ["software", "cloud", "informatique"],
    "closingWithinDays": 30,
    "onlyNewSinceLastRun": true,
    "maxResults": 500
}
```

Tip: SEAO titles are in French — add French keywords (e.g. "informatique", "construction") to catch Québec tenders.

### Output example

```json
{
    "id": "ocds-ec9k95-20068432",
    "titleFr": "Services d'architecture — rénovation école primaire",
    "solicitationNumber": "CFP-2526-009",
    "publicationDate": "2026-06-28",
    "closingDate": "2026-07-25T14:00:00-04:00",
    "status": "active",
    "procurementCategory": "services",
    "buyerOrg": "Ville de Montréal",
    "regionsOfDelivery": "Quebec",
    "unspsc": "81110000",
    "noticeUrl": "https://seao.gouv.qc.ca/avis-resultat-recherche/consulter?ItemId=...",
    "source": "seao",
    "jurisdiction": "quebec",
    "country": "CA"
}
```

### FAQ

**How fresh is the data?** CanadaBuys publishes new tenders every 2 hours; the full open-tenders file refreshes daily. SEAO publishes weekly open-data files; the Actor automatically picks the newest ones from the Données Québec catalogue.

**Which provinces are covered?** Federal (all of Canada) + Québec open tenders + Nova Scotia awarded contracts. Ontario and BC are next — open an issue to vote.

**How do I get alerts for new tenders?** Enable `onlyNewSinceLastRun`, save your filters as a Task, add a Schedule, and connect email/Slack via Apify integrations.

**How do I scrape Canadian government tenders without coding?** Press *Run* — the default input returns current federal + Québec tenders as a table you can export to Excel, CSV or JSON.

### Use with AI agents (MCP)

This Actor works as a tool for AI agents via the [Apify MCP server](https://mcp.apify.com). Claude, Cursor, or any MCP-compatible agent can monitor Canadian government tenders on demand — e.g. *"find open construction tenders in Quebec closing in the next two weeks"*.

Add this to your MCP client configuration (Claude Desktop, Cursor, VS Code):

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=truenorthdata/canada-tenders-scraper"
    }
  }
}
```

On first connection you'll sign in to Apify via OAuth. Your agent can then call the Actor with any input this README describes. Works with agentic payments (x402/Skyfire) too.

### Use in Clay and n8n (no code)

Plug government tenders straight into the tools your team already uses.

**Clay** — add a source → **Import from Apify Actor** → search `canada-tenders-scraper` → set your input (e.g. `sources` = \["canadabuys","seao"], `keywords`, `closingWithinDays`). Turn on auto-update to append new matching tenders as rows, then enrich the buying organizations.

**n8n** — add the official **Apify** node (`@apify/n8n-nodes-apify`): **Run Actor** on `truenorthdata/canada-tenders-scraper` with your filters, then **Get Dataset Items**, and route to Google Sheets, a CRM, or a Slack alert. Add a **Schedule** trigger and turn on `onlyNewSinceLastRun` for a running feed of only newly published tenders.

**Ready-made n8n templates:** import a working lead-gen workflow in one click — see [Two free n8n templates for Canadian B2B lead lists](https://dev.to/truenorthdata/two-free-n8n-templates-for-canadian-b2b-lead-lists-copy-paste-import-1mkd).

### More Canada open-data Actors by TrueNorthData

- [Building Permits Canada](https://apify.com/truenorthdata/canada-building-permits) — fresh building permits from Toronto, Vancouver, Calgary, Edmonton & Montréal
- [Contractor License Scraper Canada](https://apify.com/truenorthdata/canada-contractor-licenses) — Quebec RBQ + Ontario HCRA builder & trade licences
- [Canada Charities Scraper](https://apify.com/truenorthdata/canada-charities) — CRA registered charities directory
- [Canada New Incorporations](https://apify.com/truenorthdata/canada-new-incorporations) — fresh federal company registrations, daily

All built on official Canadian open data.

# Actor input Schema

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

CanadaBuys = all federal tenders. SEAO = Quebec public sector. Nova Scotia = awarded public tenders (gov + municipalities, academic, health) with winning vendor and amount.

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

'open' = all tenders currently open for bidding (refreshed daily). 'new' = tenders published today (refreshed every 2 hours).

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

Only include tenders whose title or description (EN or FR) contains at least one of these keywords. Case-insensitive. Leave empty for all.

## `procurementCategories` (type: `array`):

CNST = construction, GD = goods, SRV = services, SRVTGD = services related to goods. Leave empty for all.

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

Only include tenders whose delivery region contains one of these strings, e.g. "Ontario", "British Columbia", "Quebec". Leave empty for all of Canada.

## `unspscPrefixes` (type: `array`):

Only include tenders whose UNSPSC code starts with one of these prefixes, e.g. "43" for IT. Leave empty for all.

## `closingWithinDays` (type: `integer`):

Only include tenders that close within this many days from now. 0 = no limit.

## `onlyNewSinceLastRun` (type: `boolean`):

Skip tenders already returned by previous runs of this task. Ideal for scheduled monitoring - you only pay for new records.

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

Hard cap on the number of records returned (cost guard).

## `includeRawRow` (type: `boolean`):

Attach the complete original CSV row under the 'raw' key of each record.

## `seaoWeeksBack` (type: `integer`):

How many recent weekly SEAO files to read (each file = one week of notices).

## `seaoIncludeAwarded` (type: `boolean`):

Also return awarded/completed Quebec contracts (with award value in CAD), not only open notices.

## `nsAwardedWithinDays` (type: `integer`):

Only NS tenders awarded in the last N days.

## Actor input object example

```json
{
  "sources": [
    "canadabuys",
    "seao",
    "novascotia"
  ],
  "dataset": "open",
  "keywords": [],
  "procurementCategories": [],
  "regions": [],
  "unspscPrefixes": [],
  "closingWithinDays": 0,
  "onlyNewSinceLastRun": false,
  "maxResults": 500,
  "includeRawRow": false,
  "seaoWeeksBack": 4,
  "seaoIncludeAwarded": false,
  "nsAwardedWithinDays": 365
}
```

# 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("truenorthdata/canada-tenders-scraper").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("truenorthdata/canada-tenders-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).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 truenorthdata/canada-tenders-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=truenorthdata/canada-tenders-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/IOb3ZMnpbWR1VXtqq/builds/MUMzGab9utzsOtsvk/openapi.json
