🇨🇦 CanadaBuys Tender Watch — Federal Opportunities & Awards avatar

🇨🇦 CanadaBuys Tender Watch — Federal Opportunities & Awards

Pricing

from $13.40 / 1,000 procedure deltas

Go to Apify Store
🇨🇦 CanadaBuys Tender Watch — Federal Opportunities & Awards

🇨🇦 CanadaBuys Tender Watch — Federal Opportunities & Awards

Watch Government of Canada procurement from the official CanadaBuys open data: new and amended tender opportunities and awards by buyer, province and UNSPSC, as deduplicated delta-only events. Seed-zero watch mode with a source receipt on every run.

Pricing

from $13.40 / 1,000 procedure deltas

Rating

0.0

(0)

Developer

NexGen Watch

NexGen Watch

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Categories

Share

Government of Canada opportunities move fast and the open-data CSV is a moving target. This turns the official CanadaBuys tender-notice feed into a deduplicated, delta-only watch by buyer, province, and UNSPSC — with a receipt on every run.

What you get

  • tender_notice — open and amended tender-opportunity records with buyer, category, value, closing date and source URL
  • award_notice — award records with winner names/ids, incumbent keys, award value, and the linked tender
  • procedure_delta — watch-mode change events: new opportunity, notice updated, tender-to-award, incumbent change
  • Province and UNSPSC/GSIN targeting so a national feed narrows to the segment you actually bid on
  • source_receipt on every run — terminal state, counts, and a source-shape canary result, never billed

Use cases by team

  • Suppliers & bid teams: Watch the departments and UNSPSC categories you sell into and catch new solicitations on publication day.
  • Regional resellers: Filter to your provinces so a federal feed becomes a local pipeline.
  • Incumbency analysts: Track award outcomes and incumbent turnover across federal buyers.
  • Procurement-intelligence vendors: Ship a bounded, deduplicated Canadian feed without owning the CSV-drift problem.

Example inputs

Last 7 days, everything (default window)

{
"maxItems": 500
}

Watch one department in two provinces

{
"buyerNames": [
"Public Services and Procurement Canada"
],
"provinces": [
"ON",
"QC"
],
"watchMode": true,
"baselineId": "pspc-on-qc"
}

UNSPSC targeting over an explicit window

{
"publishedFrom": "2026-07-01",
"publishedTo": "2026-07-24",
"unspscCodes": [
"43230000"
],
"keywords": [
"software"
]
}

📊 Sample Output

{
"record_type": "tender_notice",
"procedure_id": "cb-2026-doc-884213",
"buyer_name": "Public Services and Procurement Canada",
"buyer_province": "ON",
"title": "Software licence renewal",
"unspsc_codes": [
"43230000"
],
"estimated_value_cad": 1180000,
"closes_at": "2026-08-14",
"notice_kind": "open",
"language": "ENG",
"source_url": "https://canadabuys.canada.ca/en/tender-opportunities/tender-notice/884213",
"observed_at": "2026-07-25T00:00:00Z"
}

How it works

Give it a date window and optional buyer / province / UNSPSC / keyword filters. It reads the CanadaBuys open-data tender-notice CSV (canadabuys.canada.ca/opendata) as an anonymous public client, normalizes each row into tender_notice and award_notice records, links awards back to their tender when linkAwards is on, and — in watch mode — diffs against a private baseline to emit only procedure_delta events. Every run closes with a source_receipt whose canary check catches CSV column drift before it can silently corrupt your feed.

Pricing

EventPrice (FREE tier)
Actor start (apify-actor-start)$0.02 flat, once per run
Procedure delta (procedure_delta) — primary$0.02
Tender notice (tender_notice)$0.004
Award notice (award_notice)$0.006
Source check (source_check)$0.10, once per run

Pay-per-event on a four-tier ladder (FREE → GOLD, with Platinum/Diamond floored at the Gold rate). Primary event procedure_delta: $0.02 / $0.018 / $0.016 / $0.0134. Notices: $0.004 / $0.0036 / $0.0032 / $0.00268 (tender) and $0.006 / $0.0054 / $0.0048 / $0.00402 (award). source_check: $0.10 / $0.09 / $0.08 / $0.067. Worked example — a watch run on FREE that finds 12 procedure deltas: $0.02 start + $0.10 source check + 12 × $0.02 = $0.36. A seed run or a genuine-zero run charges the start + source check only; receipts are never billed. New to Apify? Start free.

Run it — API, CLI, MCP

API:

curl -X POST "https://api.apify.com/v2/acts/nexgenwatch~canadabuys-tender-watch/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" -d @input.json

CLI:

$apify call nexgenwatch/canadabuys-tender-watch -i @input.json

MCP: expose nexgenwatch/canadabuys-tender-watch through Apify's MCP server, select it as a tool, and pass the same input object.

ActorWhat it does
EU TED Tender & Award WatchWatch EU-wide public procurement: tenders, awards, incumbent changes.
UK Find a Tender WatchWatch UK tenders, award results and incumbent changes.
AusTender Award WatchWatch Australian federal contract awards and incumbents.
GeBIZ Tender & Award WatchWatch Singapore GeBIZ tenders open, change, close and award.
MAS Directory Change WatchWatch Singapore MAS financial-institution licence changes.

Compliance & honest limits

  • Public, logged-out official source only — no API key, login, cookie, CAPTCHA, or access-control defeating.
  • Client-side targeting: filters are applied to the bounded window this actor fetched, not pushed into the upstream query.
  • Watch mode's first run seeds a private baseline and emits zero deltas by design — deltas start on the second run.
  • A source-confirmed empty window is SUCCEEDED-0: GENUINE_EMPTY; truncated runs are PARTIAL; exhausted retries are BLOCKED.
  • source_receipt records are always emitted and are never billed.

FAQ

Where does the data come from?

The official CanadaBuys (canadabuys.canada.ca) open-data tender-notice CSV public, logged-out feed. No API key, login, or cookie is used, and no access control is defeated.

What does watch mode actually do?

The first run stores a private baseline and emits zero deltas. Every later run emits only procedure_delta events keyed on the source-native procedure id — new opportunity, notice updated, tender-to-award, and incumbent change.

Does zero results mean I was blocked?

No, and you never have to guess. Every run emits a source_receipt with an explicit terminal state: NORMAL, GENUINE_EMPTY, PARTIAL, or BLOCKED, plus a source-shape canary result.

What am I charged when nothing changed?

The $0.02 start and the $0.10 source check. Deltas are the primary billable unit, so a quiet window is cheap by design. Receipts are never billed.

How do I bound the window?

Use publishedFrom / publishedTo — it defaults to a recent bounded window rather than attempting the full historical archive.

Can I track a specific buyer or category?

Yes — that is the main targeting path. Pass buyerNames, provinces, unspscCodes, or keywords.

Will this reconstruct the full contract history?

No. It is a bounded, deduplicated recurring feed, not a historical archive backfill. That honesty is deliberate.

Troubleshooting

  • Watch mode emitted nothing? Expected on the first run — it seeds the baseline. Deltas begin on run two with the same baselineId.
  • Zero records? Check the date window first, then read the source_receipt: GENUINE_EMPTY means the source really had nothing in that window.
  • Run marked PARTIAL? Collection was truncated against maxItems or a retry budget. Raise maxItems or narrow the window and re-run.
  • Filters returning too little? Filters apply client-side to the fetched window, so widen the date window before widening the filters.
  • Need the untouched upstream payload? Set includeRaw: true to carry the raw source object alongside the normalized record.

About

Part of the NexGenData procurement-watch family — one honest, deterministic contract across UK, EU, Canadian, Australian and Singaporean public procurement. Built by NexGenData. Questions or need a custom feed? Open an issue on the Actor page.