Aurelix

Tools › Business

Government Tenders Scraper

Get new government tenders from SAM.gov, CanadaBuys and TED (EU) in one run, with buyer, codes, value and deadline, for $2.00 per 1,000 tenders, no login.

For contractors, suppliers and bid teams. Filter by NAICS, UNSPSC and CPV codes, keywords and countries, and get only new notices with a Slack or webhook digest after each run.

$2.00 per 1,000 tenders ($1.40 on paid Apify plans)

At a glance

What the Government Tenders Scraper does

Sources
SAM.gov public extract, CanadaBuys open data, TED Search API
Filters
Days back (up to 7), open only, keywords, countries, NAICS, UNSPSC and CPV code prefixes, new tenders only
Output
28 fields per tender; JSON, CSV, Excel, API
Automate
Schedules, webhooks, Zapier, Make, n8n, Google Sheets, MCP for AI agents

Who it is for

  • Contractors and suppliers getting a daily list of new tenders in their NAICS, UNSPSC or CPV codes
  • Bid consultants watching US, Canadian and EU tenders for several clients
  • Sales teams finding public-sector buyers for what they sell
  • Analysts tracking public procurement by buyer, category and value

Output

What you get

  • Title, buyer (department or contracting authority), sub-agency/office
  • Country (ISO code) and state, province or buyer city
  • Notice type, category (CanadaBuys: goods, services, construction; TED: supplies, services, works), status (open, closed, awarded)
  • NAICS, UNSPSC and CPV codes where the source publishes them
  • Estimated or awarded value and currency where published
  • Publication date and bid closing time in ISO 8601 UTC (for TED restricted and negotiated procedures, the request-to-participate deadline; the latest lot deadline on multi-lot notices)
  • Solicitation number, the notice description (SAM.gov, CanadaBuys, TED) and the official notice link
  • Point of contact as published: contact_name, contact_title, contact_email, contact_phone, plus every contact (SAM.gov primary and secondary) in a contacts list
  • Stable tender_id for joins and dedupe

Example

Input and output

Input

{
  "sources": [
    "sam.gov",
    "canadabuys",
    "ted"
  ],
  "daysBack": 1,
  "keywords": [
    "software",
    "cloud"
  ],
  "naicsCodes": [
    "5415"
  ],
  "unspscCodes": [
    "4321",
    "8111"
  ],
  "cpvCodes": [
    "72",
    "48"
  ],
  "incremental": true
}

One output record

{
  "tender_id": "sam.gov:45d94c40c8144f0e97b0eb5d724ff5b4",
  "source": "sam.gov",
  "notice_id": "45d94c40c8144f0e97b0eb5d724ff5b4",
  "title": "Canned Tomato Products for use in Domestic Food Assistance Program",
  "buyer": "AGRICULTURE, DEPARTMENT OF",
  "buyer_unit": "AGRICULTURAL MARKETING SERVICE / USDA  AMS  3J14",
  "country": "US",
  "region": "DC",
  "notice_type": "Combined Synopsis/Solicitation",
  "category": null,
  "status": "open",
  "naics": [
    "311421"
  ],
  "unspsc": [],
  "cpv": [],
  "value": null,
  "currency": null,
  "published_date": "2026-11-06",
  "closes_at": "2026-11-18T19:00:00Z",
  "solicitation_number": "123J1427B0069",
  "url": "https://sam.gov/opp/45d94c40c8144f0e97b0eb5d724ff5b4/view",
  "description": "Amendment 1 - 11/6/2026 - This amendment adds a 10% SDVOSB set-aside to the following materials: 100333 (Tomato Sauce Can - 24/300) 100334 (Tomato Sauce Can…",
  "contact_name": "Latoya Gainey",
  "contact_title": null,
  "contact_email": "latoya.gainey@usda.gov",
  "contact_phone": "910-824-3151",
  "contacts": [
    {
      "type": "primary",
      "name": "Latoya Gainey",
      "title": null,
      "email": "latoya.gainey@usda.gov",
      "phone": "910-824-3151"
    },
    {
      "type": "secondary",
      "name": "Leeanna Balsley",
      "title": null,
      "email": "leeanna.balsley@usda.gov",
      "phone": "9133403152"
    }
  ],
  "source_url": "https://sam.gov/opp/45d94c40c8144f0e97b0eb5d724ff5b4/view",
  "scraped_at": "2026-11-07T16:37:37Z"
}

From a real run of this tool; long text and lists shortened here.

How to use it

Three steps

  1. Pick the sources (SAM.gov, CanadaBuys, TED) and how many days back to look; the defaults return open tenders from the last 3 days, newest first, up to 500 per source. TED alone publishes about 3,500 notices a working day, so a default run returns the newest 500 TED notices, not all three days: the run status names every source that hit the cap, and 'Max results per source' (0 = no limit) raises it.
  2. Optionally narrow it: keywords, ISO country codes, NAICS/UNSPSC/CPV code prefixes; turn on 'Only new tenders since last run' for a daily feed.
  3. Click Start, then download JSON, CSV or Excel, or schedule the run and send results to Google Sheets, Slack, Zapier, Make or n8n.

API

Call it from Python

from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("aurelix/government-tenders-scraper").call(run_input={'sources': ['sam.gov', 'canadabuys', 'ted'],
 'daysBack': 1,
 'keywords': ['software', 'cloud'],
 'naicsCodes': ['5415'],
 'unspscCodes': ['4321', '8111'],
 'cpvCodes': ['72', '48'],
 'incremental': True})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

pip install apify-client. The same input works from the Apify console, a schedule, Make, n8n, Zapier or an AI agent through the Apify MCP server.

Pricing

Pay per result

Per 1,000 tenders, free plan$2.00
Per 1,000 tenders, paid plans$1.40
Start fee per run$0.006

Live prices from the Apify Store; no subscription and no platform usage billed on top. See the Store page.

Honest limits

What it does not do

  • Federal level only for the US and Canada: SAM.gov and CanadaBuys. State, provincial and municipal portals are not covered (several forbid automated access).
  • SAM.gov comes from the daily public extract, which runs one to two days behind the live site; attachments and full amendment history are not included, and descriptions longer than 32,000 characters end at 32,000 characters followed by "..." (open the notice link for the full text).
  • CanadaBuys includes currently open notices only, so 'open tenders only' off adds no closed Canadian notices.
  • TED titles are TED's English rendering ('Country - CPV label - original title'); the original title stays in the buyer's language.
  • Look-back is capped at 7 days; use incremental mode on a schedule for a continuous feed.
  • Default cap of 500 per source per run, newest first (stated in the run status when hit); keywords match the title and description.

FAQ

Questions buyers ask

How much does the Government Tenders Scraper cost?

$2.00 per 1,000 tenders ($1.40 on paid Apify plans), billed through your Apify account; you pay only for results. Apify's free plan includes $5 of credit a month, enough for about 2,500 tenders.

Do I need a SAM.gov or TED API key?

No. The Actor reads SAM.gov's public Contract Opportunities data extract, the CanadaBuys open dataset and the TED Search API, none of which needs a key.

Does it return the contracting officer's name, email and phone?

Yes, as each notice publishes them: SAM.gov's primary and secondary points of contact (name, title, email, phone), the CanadaBuys contact (often a role such as Contract Administrator, with email and phone) and the TED buyer contact point, email and phone. The first contact is in contact_name, contact_title, contact_email and contact_phone; all of them are in contacts. Nothing is guessed: a field the notice leaves blank stays empty.

Is this legal?

It reads only public data any logged-out visitor can see: the official open data of SAM.gov, CanadaBuys and TED. It goes at a polite pace, never logs in and never solves CAPTCHAs. It returns tender fields (buyer, codes, value, dates, status, link) and the point of contact the notice publishes for bidders (contracting officer or buyer contact: name, title, email, phone). Data is returned as shown publicly on the source; people can ask for removal by opening an issue on this Actor's Issues tab; if a publisher formally asks us to stop, this Actor will stop. You are responsible for using the data lawfully, incl. anti-spam and privacy laws; this is not legal advice.

How fresh is it?

TED and CanadaBuys update daily. SAM.gov's public extract is refreshed daily and runs one to two days behind the live site, so use 'days back' of 2 or more for SAM.gov.

Why did I get only 500 TED notices?

'Max results per source' defaults to 500, newest first, so a default run is cheap. The run status says 'newest 500 per source only' with the source names whenever the cap cut a source short. Set it higher, or to 0 for everything, and use incremental mode on a daily schedule.

How do code filters work?

Give code prefixes: '5415' matches NAICS 541511, 541512 and so on. A notice passes if it matches any NAICS, UNSPSC or CPV prefix you give. Sources that do not publish any code system you gave are skipped (SAM.gov uses NAICS, CanadaBuys UNSPSC, TED CPV).

How does 'new since last run' work?

The Actor remembers the tender IDs it has returned for the same sources and filters (or for the state name you set) and returns only unseen ones. IDs are forgotten 60 days after they were last seen.

Why is the value empty for many notices?

Value is returned only when the buyer publishes one. SAM.gov publishes values on award notices; CanadaBuys tender notices carry none; many TED notices do. On TED, placeholder values of 0 or 1 are dropped.

Can I use it from an AI assistant?

Yes. The input fields are described for agents: give sources, days back and optional filters. It works through Apify's MCP server and API.

What am I charged when nothing matches?

Only the start fee. You pay per tender written to the dataset, so a source with no matching notices costs nothing, and a run that returns nothing costs the start fee alone.

What happens if one source is down?

The other sources are still read and returned. The run status lists the failed source after 'failed:'. CanadaBuys and TED requests are retried up to four times on connection errors, rate limits and server errors first. The run is marked failed only when every source failed and nothing was returned.

Are duplicates removed?

Yes. Each tender appears once per run, keyed by tender_id (the source plus its notice ID). With 'Only new tenders since last run' on, tenders returned by earlier runs are left out too.

Why does closes_at sometimes have no time?

When the source publishes only a closing date, closes_at stays a plain date (YYYY-MM-DD). Otherwise it is a full ISO 8601 time in UTC; CanadaBuys times are published in Eastern time and converted.

How does the countries filter work for each source?

Give two-letter ISO codes. For TED it is the buyer's country, for SAM.gov the place of performance (US when none is given), and CanadaBuys notices are always CA. A TED run with country codes that are not recognised returns no TED notices.

How long does a run take?

In our cloud test runs, the default input took about 8 seconds, a full week of CanadaBuys and TED with no cap about 72 seconds, and a 7-day run of all three sources where nothing matched about 203 seconds, because every notice in the window has to be read.

How do I keep two new-only feeds apart?

Give each one its own 'Incremental state name'. Without it, the memory is named after the sources and filters (days back excluded), so changing a filter starts a fresh memory and the next run returns every current match again.

What happens if I set a maximum charge for the run?

The run stops writing tenders when the limit is reached. In new-only mode, tenders that were not written are not marked as seen, so they come back on the next run.

How do I export tenders to Google Sheets?

Download the run's results as CSV or Excel and open them in Google Sheets, or add Apify's Google Sheets integration to the run or a schedule so every run's results land in a sheet.

Guides

Tutorials using this tool

Related

Related tools

Try the Government Tenders Scraper

Open it on the Apify Store, paste the example input above and click Start. Results download as CSV, Excel or JSON.