SAM.gov Scraper - Search US Federal Contract Opportunities avatar

SAM.gov Scraper - Search US Federal Contract Opportunities

Pricing

from $1.50 / 1,000 opportunities

Go to Apify Store
SAM.gov Scraper - Search US Federal Contract Opportunities

SAM.gov Scraper - Search US Federal Contract Opportunities

Search US federal contract opportunities, RFPs and awards on SAM.gov (no API key). Input: keywords, notice types, NAICS/PSC codes, set-asides, agencies, states, posted dates. Returns per notice: title, agency, NAICS, set-aside, response deadline, place of performance, URL. Default: 20 notices.

Pricing

from $1.50 / 1,000 opportunities

Rating

0.0

(0)

Developer

Bence Kadi

Bence Kadi

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

18 days ago

Last modified

Share

SAM.gov Scraper: US federal contract opportunities and awards

Export US federal contract opportunities from SAM.gov to JSON, CSV or Excel: solicitations (RFP, RFQ, IFB), sources sought, presolicitations and award notices with awardee and amount. One clean row per notice, with NAICS, PSC, set-aside, agency, deadline and full description. No SAM.gov account and no API key needed.

What is the SAM.gov Scraper?

SAM.gov is the US government's official system for federal contracting, run by the General Services Administration (GSA). This Actor reads SAM.gov's official public daily data extract (all ~75,000 active notices), applies your filters and returns a flat, ready-to-use table. It never scrapes the SAM.gov website or its internal search API.

Who uses it and why:

  • GovCon BD and capture teams get a daily list of new solicitations in their NAICS/PSC codes and set-asides, in Sheets, Slack or their CRM.
  • Small businesses (8(a), SDVOSB, WOSB, HUBZone) find set-aside bids they can still answer.
  • Competitive intelligence analysts see who wins which contracts, from which agency and for how much.
  • Subcontractors find primes that just won work in their niche.
  • Market researchers and consultants measure federal demand by agency, NAICS, PSC and set-aside.
  • Bid-matching platforms and AI agents get a clean, fresh feed of federal opportunities.

Data fields

Examples are from a real run on 2026-10-05; award examples are from a real award notice.

FieldDescriptionExample
noticeIdSAM.gov notice ID (unique)bdbcdd102ebf46f390232d94b7e58e6a
titleNotice titleGAOA Trujillo Meadows Old Toilet Building Replacement RGNF
solicitationNumberSolicitation number used by the agency1240LP26Q0199
noticeTypeNotice type as shown on SAM.govCombined Synopsis/Solicitation
noticeTypeCodeShort SAM.gov type codek
baseTypeType of the original noticeCombined Synopsis/Solicitation
activeWhether the notice is still activetrue
postedDateDate the notice was posted2026-10-02
responseDeadlineDeadline for offers or responses, with time zone2026-10-07T17:00:00-07:00
archiveDateDate SAM.gov archives the notice2026-10-22
departmentDepartment or independent agencyAGRICULTURE, DEPARTMENT OF
subTierAgency below the departmentFOREST SERVICE
officeBuying officeRio Grande National Forest
agencyCodeCGAC agency code012
officeCodeOffice code (AAC)1282AK
naicsCodeNAICS industry code332311
pscCodeProduct / service code (PSC)5410
setAsideCodeSet-aside code (empty = no set-aside)SBA
setAsideSet-aside in plain EnglishTotal Small Business Set-Aside (FAR 19.5)
placeOfPerformancePlace of performance as one lineDel Norte, CO 81132, USA
placeOfPerformanceCityCity where the work is doneDel Norte
placeOfPerformanceStateState where the work is doneCO
placeOfPerformanceZipZIP code where the work is done81132
placeOfPerformanceCountryCountry where the work is doneUSA
officeCityCity of the buying officeMONTE VISTA
officeStateState of the buying officeCO
officeZipZIP code of the buying office81144
officeCountryCountry of the buying officeUSA
awardNumberContract award number (award notices)36C26127P0051
awardDateAward date (award notices)2026-10-02
awardAmountAwarded amount in USD (award notices)39596.7
awardeeWinning company (award notices)DME SERVICES LLC
awardeeOmittedtrue if the awardee was left out (see FAQ)false
descriptionFull description, e-mails and phones removedThis is a combined synopsis/solicitation ...
urlNotice page on sam.govhttps://sam.gov/opp/bdbcdd102ebf46f390232d94b7e58e6a/view
additionalInfoLinkExtra link given by the agency, if anynull
attachmentsAttachment links (API mode only)[]
sourceWhere the item came fromsam.gov daily extract
isNewOnly in monitoring mode: true for notices not seen beforetrue
scrapedAtWhen the Actor saved the item (UTC)2026-10-05T02:08:53Z

Use cases: Generate leads (build B2B prospect lists) · Research markets & competitors (find deals & buy opportunities, build market datasets, track competitors) · Developer tools (extract government & public data, monitor & alert on website changes).

How to use the SAM.gov scraper

  1. Open the Actor and click Try for free (you need a free Apify account).
  2. Pick Notice types: solicitations are open bids, award notices show who won.
  3. Optionally add NAICS codes, PSC codes, Set-aside types, Agencies or Keywords.
  4. Set a date window, for example Posted within the last N days = 7.
  5. Set Max results (prefill: 20, a few seconds) and click Start.
  6. Download the results from the Output tab as CSV, Excel or JSON, or send them to Google Sheets.
  7. For alerts, turn on Only new opportunities and add a daily Schedule (see below).

Input guide

Keywords. Searched in the title, solicitation number and full description. One line = all its words must appear (cloud migration); a line in quotes = exact phrase ("janitorial services"); several lines = any of them. Words match from the start, so cyber also finds "cybersecurity".

  • Good: cybersecurity, "janitorial services", HVAC, a solicitation number.
  • Bad: a sentence like we sell IT services to the Army. Every word must appear, so it rarely matches. Use short terms plus NAICS or PSC codes.

Notice types. Leave empty for all. For bids you can answer now, pick solicitation and combined_synopsis_solicitation; add sources_sought and presolicitation to hear about work before it is posted; award_notice for winners.

NAICS codes. Industry code. Prefixes work: 5415 returns every 5415xx code, 23 all construction.

  • Good: 541511 (custom programming), 5415, 236220 (commercial building construction).
  • Bad: 5 or 5415110. A NAICS code must have 2 to 6 digits; anything else stops the run with a clear error.
  • Tip: run a keyword search first and look at naicsCode and pscCode in the results to find your codes.

PSC codes. Product or service code, 1 to 4 characters. Prefixes work: D3 returns all D3xx codes (IT services), R4 all R4xx codes (professional support).

Set-aside types. SBA (total small business), SBP (partial), 8A, HZC (HUBZone), SDVOSBC, WOSB, EDWOSB, VSA and more, plus NONE for full and open competition. Codes ending in S or SS are sole source. About a third of notices carry a set-aside.

Agencies / offices. Words from the department, agency or office name, or an abbreviation: Veterans Affairs, VA, Navy, USACE, NIH and DHS all work. Several lines = any of them. A single word also matches the agency or office code, such as 036.

Place of performance (US states). 2-letter codes such as VA, MD, DC. Warning: only about 1 in 3 notices lists a place-of-performance state. Turn on Use the contracting office's state to fall back to the buying office's state.

Date window. Posted within the last N days for rolling searches (7 = the last week, 1 = yesterday and today), or Posted from / to for a fixed period. If you set both, the later start date applies. Short windows are faster: the extract is sorted newest first, so the Actor stops reading early.

Response deadline on or after. Only bids you can still answer. Accepts a date, today or +7 days. Notices without a deadline, such as most award notices, are left out.

Min award amount (USD). Only award notices with at least this amount.

Max results. Stop after N opportunities. 0 = no limit. This is also your cost cap: 1,000 opportunities cost $1.50.

Only new opportunities (monitoring mode). The Actor remembers which notices it returned and outputs only new ones on the next run with the same filters. You pay only for new notices. Notices cut off by Max results come in the next run. Use a different Monitor name for each saved search; changing any filter also starts a new list.

Advanced: API key, data source, attachments. Your own free SAM.gov key unlocks archived notices (activeOnly: false) and attachment links (includeAttachments: true) through the official API; with Data source = auto, the API is used only for those. In API mode, each description costs one request of your key's quota. No proxy is needed.

Input example: small-business IT bids you can still answer

{
"noticeTypes": ["solicitation", "combined_synopsis_solicitation", "sources_sought"],
"naicsCodes": ["5415", "518210"],
"setAsideTypes": ["SBA", "8A", "SDVOSBC", "WOSB"],
"postedWithinDays": 7,
"responseDeadlineAfter": "today",
"maxResults": 500,
"onlyNewOpportunities": true
}

Output

Each notice is one item in the run's dataset. This is a real combined synopsis/solicitation from a run on 2026-10-05 (the description is shortened here; the dataset holds the full text):

{
"noticeId": "bdbcdd102ebf46f390232d94b7e58e6a",
"title": "GAOA Trujillo Meadows Old Toilet Building Replacement RGNF",
"solicitationNumber": "1240LP26Q0199",
"noticeType": "Combined Synopsis/Solicitation",
"noticeTypeCode": "k",
"baseType": "Combined Synopsis/Solicitation",
"active": true,
"postedDate": "2026-10-02",
"responseDeadline": "2026-10-07T17:00:00-07:00",
"archiveDate": "2026-10-22",
"department": "AGRICULTURE, DEPARTMENT OF",
"subTier": "FOREST SERVICE",
"office": "Rio Grande National Forest",
"agencyCode": "012",
"officeCode": "1282AK",
"naicsCode": "332311",
"pscCode": "5410",
"setAsideCode": "SBA",
"setAside": "Total Small Business Set-Aside (FAR 19.5)",
"placeOfPerformance": "Del Norte, CO 81132, USA",
"placeOfPerformanceCity": "Del Norte",
"placeOfPerformanceState": "CO",
"placeOfPerformanceZip": "81132",
"placeOfPerformanceCountry": "USA",
"officeCity": "MONTE VISTA",
"officeState": "CO",
"officeZip": "81144",
"officeCountry": "USA",
"awardNumber": null,
"awardDate": null,
"awardAmount": null,
"awardee": null,
"awardeeOmitted": false,
"description": "This RFQ is herein cancelled and is being reissued. ... Solicitation number 1240LP26Q0199 is issued as a Request for Quotation (RFQ) for vaulted toilets placed in a remote outdoor setting ... This acquisition is a Total Small Business Set-Aside. ...",
"url": "https://sam.gov/opp/bdbcdd102ebf46f390232d94b7e58e6a/view",
"additionalInfoLink": null,
"attachments": [],
"source": "sam.gov daily extract",
"scrapedAt": "2026-10-05T02:08:53Z"
}

Award notices also fill awardee, awardAmount, awardDate and awardNumber (see the field table). Items from API mode have source: "api.sam.gov" and can include attachments links.

Fill rates in a live sample of 2,000 recent notices: title and agency 100%, NAICS 95%, PSC 96%, office state 99%; deadline and description 100% for open bids; award amount 99% and awardee 98% for awards; place of performance only 46%.

Dataset views. The Output tab shows three tables:

  • Opportunities: date, title, type, agency, NAICS, PSC, set-aside, deadline, place, link. Best for daily review.
  • Awards: award date, title, agency, awardee, amount, award number, NAICS, link. Best for competitor analysis.
  • Full details: IDs, title, description, office, archive date, links, attachments.

Every run also saves a Run summary (RUN_SUMMARY in the key-value store): source used, rows scanned, matches, opportunities saved, notices skipped in monitoring mode, MB downloaded, the extract's timestamp and any error.

Export. Download any view as JSON, CSV, Excel, XML, HTML or RSS from the Output tab or the API. You can also send results straight to Google Sheets with the Google Sheets integration.

Pricing

This Actor uses pay per event: $1.50 per 1,000 opportunities saved ($0.0015 per opportunity). Apify also charges a start fee of $0.00005 per run. Platform compute is included in the price.

Typical runOpportunitiesCost
First test with the prefilled input20about $0.03
Weekly export for one NAICS area500about $0.75
Daily alert, about 40 new notices a day, for 30 days1,200about $1.80 per month
Every active notice on SAM.gov, no filtersabout 75,000about $112

What is free:

  • In monitoring mode, notices that were already returned in earlier runs are skipped and not charged.
  • A search with no matches costs only the $0.00005 start fee, even when it scans the whole extract.
  • Apify's free plan gives you monthly platform credit (see apify.com/pricing), enough for a few thousand opportunities each month.

You can cap spending with Max results or with Max charge per run in the run options. When the cap is reached, the Actor stops cleanly and keeps what it already saved.

Use it via API

Replace MY_APIFY_TOKEN with your token from Apify Console > Settings > API & Integrations.

JavaScript / Node.js (npm install apify-client):

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'MY_APIFY_TOKEN' });
const run = await client.actor('kadi_bence/sam-gov-scraper').call({
noticeTypes: ['solicitation', 'combined_synopsis_solicitation'],
naicsCodes: ['5415'],
setAsideTypes: ['SBA', 'SDVOSBC'],
postedWithinDays: 7,
responseDeadlineAfter: 'today',
maxResults: 500,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items.length, items[0]?.title);

Python (pip install apify-client):

from apify_client import ApifyClient
client = ApifyClient("MY_APIFY_TOKEN")
run = client.actor("kadi_bence/sam-gov-scraper").call(run_input={
"noticeTypes": ["award_notice"],
"agencies": ["Veterans Affairs"],
"postedWithinDays": 30,
"maxResults": 1000,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["awardee"], item["awardAmount"], item["subTier"], item["title"])

cURL (runs the Actor and returns the items in one call):

curl -X POST "https://api.apify.com/v2/acts/kadi_bence~sam-gov-scraper/run-sync-get-dataset-items?token=MY_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"pscCodes": ["D3"], "noticeTypes": ["solicitation", "sources_sought"], "postedWithinDays": 1, "maxResults": 100}'

Apify CLI:

$apify call kadi_bence/sam-gov-scraper --input '{"keywords": ["\"janitorial services\""], "placeOfPerformanceStates": ["VA", "MD", "DC"], "stateFallbackToOffice": true, "postedWithinDays": 14, "maxResults": 50}' --output-dataset

MCP (AI agents such as Claude, Cursor or VS Code). Add this to your MCP client config. The client will ask you to sign in to Apify (or send your token as an Authorization: Bearer header):

{"mcpServers":{"apify":{"url":"https://mcp.apify.com/?actors=kadi_bence/sam-gov-scraper"}}}

Then ask your agent things like "Find open SDVOSB set-aside solicitations for IT services posted this week".

Integrations and scheduling

  • Schedules. In Apify Console go to Schedules > Create new, pick this Actor (or a saved task) and set a time after 03:30 UTC, when SAM.gov rebuilds the extract.
  • Webhooks. Call your own URL when a run succeeds or fails, and fetch the new items from the dataset.
  • Zapier, Make and n8n. Use the Apify app or node: "Run Actor" as an action, or "Actor run finished" as a trigger, then send rows to your CRM, Slack, Teams or e-mail.
  • Google Sheets. Use the Google Sheets integration on the Actor's Integrations tab to append each run's results to a sheet.

Recipe: new set-aside bids in my codes every morning

  1. Set NAICS or PSC codes, Set-aside types (for example SDVOSBC), Notice types = Solicitation + Combined synopsis/solicitation, Posted within the last N days = 2, Response deadline on or after = +7 days.
  2. Turn on Only new opportunities with a monitor name such as it-sdvosb.
  3. Save as a new task and schedule it every day at 07:00.
  4. Connect it to Google Sheets, or to Slack through Make, Zapier or n8n. Each morning you get only unseen notices.

Recipe: weekly competitor wins. Notice types = Award notice, your NAICS codes and agencies, Min award amount = 100000, Posted within the last N days = 7, weekly schedule, export the Awards view to a sheet.

FAQ

How does it work, and where does the data come from? By default the Actor streams SAM.gov's Contract Opportunities public data extract (SAM.gov Data Services), filters each row and stops early once your date window is passed. Optionally it uses the official Get Opportunities API with your own key. SAM.gov's Terms of Use name these APIs and extracts as the way to access data automatically and prohibit scraping the website, so this Actor never touches the website or its internal search API. Notices are US federal government information and generally public domain; the extract comes as is. When you publish the data, we suggest citing "Source: SAM.gov, U.S. General Services Administration". This Actor is not affiliated with or endorsed by GSA or SAM.gov.

Do I need a SAM.gov API key? No, not for active notices. A key is only needed for archived notices and attachment links. Get one on SAM.gov under Account Details > Public API Key. A personal key allows 10 requests per day (1,000 notices each), or 1,000 with a SAM.gov role, and expires every 90 days. It is stored encrypted and never written to logs, the dataset or RUN_SUMMARY.

Are there limits? There is no 10,000-result cap: every active notice (about 75,000) is in the extract. In API mode, your key's daily quota is the limit; the Actor stops cleanly when it is used up and tells you so. API searches without dates cover the last 365 days.

How fast is it? In our tests the prefilled run (20 results) took about 3 seconds, and 2,000 notices took 6 to 10 seconds. A search with no date filter reads the whole 210 MB file: about 1.5 minutes from Europe, faster on Apify's US servers.

How fresh is the data? SAM.gov rebuilds the extract every night (around 03:30 UTC). Notices posted today appear in tomorrow's extract, so a daily schedule catches everything. RUN_SUMMARY.extractLastModified shows the extract's timestamp.

Why are my results different from the SAM.gov website? Common reasons: NAICS and PSC codes match as prefixes here; the extract holds only active notices; today's notices reach the extract the next night; and the state filter uses the place of performance, which agencies often leave empty (turn on stateFallbackToOffice). The Actor never invents values. Check RUN_SUMMARY for rows scanned and matches.

Is it legal? What about personal data? Yes, the data is official public information, read through official channels. Contracting officers' names, e-mails and phone numbers are never output; e-mails and phone numbers inside descriptions become [email removed] and [phone removed]. Awardees that look like private persons are left out (awardeeOmitted: true, about 2% of awards), as are awardees on awards dated before April 4, 2022, which may contain Dun & Bradstreet data that SAM.gov's terms do not allow to share in bulk. Descriptions can still name people, so handle the data in line with the privacy laws that apply to you (for example GDPR).

Can I use it from Python or another program? Yes. See Use it via API above for JavaScript, Python, cURL, the Apify CLI and MCP for AI agents.

Can I connect it to Google Sheets, Slack or my CRM? Yes, through the Google Sheets integration, webhooks, or the Apify apps for Zapier, Make and n8n. See Integrations and scheduling.

How does "Only new opportunities" work? The Actor stores delivered notice IDs in a named key-value store (sam-gov-monitor) in your account. The next run with the same filters and monitor name outputs only notices not in that list, marked isNew: true, and you pay only for those.

What if a run fails or something looks wrong? Invalid input (for example a 7-digit NAICS code) fails the run at once with a clear message. If SAM.gov is down, the Actor retries several times; it then keeps what it saved and says why it stopped (or fails if nothing was saved). RUN_SUMMARY holds the details. Please open an issue on the Issues tab with the run link. Fixes usually land within 24 to 48 hours.

What changed recently? See the changelog below.

Need a custom version?

I build custom scrapers, scheduled data feeds and integrations (CSV, Excel, Google Sheets, API, MCP for AI agents). Tell me the sites and fields you need:

More low-cost Actors by the same developer, built on official APIs and public data:

All my Actors: apify.com/kadi_bence

Changelog

  • 1.0 (2026-10-05): First release.
    • Keyless official SAM.gov daily extract, with an optional official API for archived notices and attachment links.
    • NAICS and PSC prefixes, agency aliases, set-aside, state and deadline filters.
    • Award fields and monitoring mode.
    • No contact personal data.