SAM.gov Contract Opportunities Scraper & Monitor avatar

SAM.gov Contract Opportunities Scraper & Monitor

Pricing

from $3.00 / 1,000 results

Go to Apify Store
SAM.gov Contract Opportunities Scraper & Monitor

SAM.gov Contract Opportunities Scraper & Monitor

SAM.gov scraper and monitor for US federal contract opportunities. Reads GSA’s official daily extract, no API key or login. Filter by NAICS, set-aside, state, agency and notice type; get only notices new since your last run.

Pricing

from $3.00 / 1,000 results

Rating

0.0

(0)

Developer

GovData Tools

GovData Tools

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Get a filtered feed of US federal contract opportunities (solicitations, sources sought, presolicitations, award notices and more) as JSON, CSV or Excel, and receive only the notices that are new since your last run. Built for small GovCon firms, BD and capture consultants, and bid-alert services. No SAM.gov account or API key needed.

Why this Actor

  • Official daily extract. It reads the public Contract Opportunities CSV that GSA publishes for download on SAM.gov (Data Services, updated daily). It does not use the SAM.gov search API and needs no API key and no login.
  • New since last run, per saved task. The Actor remembers which notices it already returned, separately for every distinct filter combination, so each saved task with its own filters (one per client or per NAICS list) keeps its own feed.
  • Filters that match how bids are found. NAICS prefix, set-aside code, state, agency, notice type, title keywords, posted-within-N-days.
  • No contracting-officer contact details. Names, emails and phone numbers from the extract's contact columns are dropped while parsing and never stored or output.

What data you get

One flat item per notice. Dates are ISO 8601 as published (the posted date has no timezone in the source).

FieldMeaningExample (from a real run)
noticeId, urlSAM.gov notice ID and link to the notice30017ddaad2442e788d79c302bd4d239
title, solicitationNumberNotice title and solicitation numberVM Ware VCF Licenses, 12760426Q0213
department, subTier, office, officeCodeIssuing agency hierarchy and contracting officeAGRICULTURE, DEPARTMENT OF, FOREST SERVICE
postedDate, responseDeadline, archiveDateWhen posted, when responses are due, when archived2026-10-21T18:14:06, 2026-10-27T17:00:00-04:00
noticeType, baseTypeCurrent and original notice typeCombined Synopsis/Solicitation
setAsideCode, setAsideSet-aside code and descriptionSBA, Small Business Set Aside - Total
naicsCode, pscCodeNAICS and product/service classification code541519, 7A21
placeOfPerformanceCity/State/Zip/CountryWhere the work is performed (often blank in the source)Albuquerque, NM
officeCity/State/Zip/CountryContracting office locationAlbuquerque, NM, 87102
activeWhether the notice is flagged activetrue
awardNumber, awardDate, awardAmount, awardeeFilled only when the notice carries award details47QTCA27D000X, 2026-10-21, 475000
additionalInfoLinkExtra link from the notice, when givennull
descriptionOptional, only with includeDescription (see Privacy)
sourceUrl, scrapedAtThe extract URL and the run timestamp

Fields the source leaves empty are returned as null.

How to use

  1. Open the Actor and set your filters, for example NAICS 5415 and set-aside SBA. Leave a filter empty to skip it.
  2. Click Start. The first run returns matches posted in the last 3 days (firstRunLookbackDays) and marks all current matches as seen.
  3. Save the input as a task and put it on an Apify Schedule (daily is a natural fit). Each later run returns only notices not seen before. Send results to Google Sheets, your CRM or a webhook with Apify integrations.

Example input:

{
"naicsCodes": ["5415"],
"setAsideCodes": ["SBA", "8A"],
"states": ["VA", "MD"],
"agencies": ["AIR FORCE", "VETERANS"],
"noticeTypes": ["Solicitation", "Combined Synopsis/Solicitation", "Sources Sought"],
"onlyNew": true,
"maxItems": 100
}

Filters

All filters are optional. Between filters it is AND, within one filter it is OR.

InputMeaning
naicsCodesPrefix match: 5415 matches 541511, 541512 and so on
setAsideCodesSet-aside code, case-insensitive. Common: SBA, 8A, HZC (HUBZone), SDVOSBC (service-disabled veteran-owned), WOSB, EDWOSB
statesTwo-letter state of the place of performance (or of the contracting office when none is given)
agenciesCase-insensitive text match on department, sub-tier agency or office, e.g. AIR FORCE
noticeTypesExact notice type, case-insensitive: Solicitation, Combined Synopsis/Solicitation, Sources Sought, Presolicitation, Award Notice, Special Notice, Justification and others present in the extract
keywordsKeeps notices whose title contains any of the given terms
activeOnlySkip inactive notices. Default on
postedWithinDaysOnly notices posted in the last N days
maxItemsCap on results per run (default 100)
includeDescriptionAdd the description text, truncated to 5,000 characters, email addresses removed. Default off

New since last run

With onlyNew on (off by default; turn it on in your scheduled task) the Actor stores a compact list of notice IDs in a named key-value store in your account (sam-gov-opportunities-state), one entry per distinct filter combination.

  • First run for a filter combination: returns matches posted in the last firstRunLookbackDays days (default 3) and marks all current matches as seen.
  • Later runs: return only notices not seen before. IDs that are no longer in the extract are dropped from the list.
  • Results cut off by maxItems (or by a spending limit) are not marked as seen, so the next run returns them.
  • resetState forgets the list for the given filters and treats the run as a first run.
  • Leave onlyNew off (the default) to get all current matches on every run.

Changing a filter (for example adding a NAICS code) starts a new, separate list.

Output example

Three real items from a run filtered to NAICS 5415 (sourceUrl is the extract URL):

[
{
"noticeId": "30017ddaad2442e788d79c302bd4d239",
"title": "VM Ware VCF Licenses",
"solicitationNumber": "12760426Q0213",
"department": "AGRICULTURE, DEPARTMENT OF",
"subTier": "FOREST SERVICE",
"office": "USDA FOREST SERVICE",
"officeCode": "127604",
"postedDate": "2026-10-21T18:14:06",
"noticeType": "Combined Synopsis/Solicitation",
"baseType": "Combined Synopsis/Solicitation",
"archiveDate": "2026-11-11",
"setAsideCode": "SBA",
"setAside": "Small Business Set Aside - Total",
"responseDeadline": "2026-10-27T17:00:00-04:00",
"naicsCode": "541519",
"pscCode": "7A21",
"placeOfPerformanceCity": "Albuquerque",
"placeOfPerformanceState": "NM",
"placeOfPerformanceZip": null,
"placeOfPerformanceCountry": "USA",
"active": true,
"awardNumber": null,
"awardDate": null,
"awardAmount": null,
"awardee": null,
"officeState": "NM",
"officeCity": "Albuquerque",
"officeZip": "87102",
"officeCountry": "USA",
"additionalInfoLink": null,
"url": "https://sam.gov/workspace/contract/opp/30017ddaad2442e788d79c302bd4d239/view",
"sourceUrl": "https://sam.gov/api/prod/fileextractservices/v1/api/download/Contract%20Opportunities/datagov/ContractOpportunitiesFullCSV.csv",
"scrapedAt": "2026-10-22T12:30:16.369Z"
},
{
"noticeId": "c80b68ea0a744c1ab71886cdec46739b",
"title": "Cyber Security Engineering and Risk Management Framework Support",
"solicitationNumber": "W91CRB-26-B-A006",
"department": "DEPT OF DEFENSE",
"subTier": "DEPT OF THE ARMY",
"office": "W6QK ACC-APG",
"officeCode": "W91CRB",
"postedDate": "2026-10-21T09:15:28",
"noticeType": "Presolicitation",
"baseType": "Presolicitation",
"archiveDate": "2026-10-22",
"setAsideCode": "8A",
"setAside": "8(a) Set-Aside (FAR 19.8)",
"responseDeadline": "2026-10-22T17:00:00-04:00",
"naicsCode": "541519",
"pscCode": "DJ01",
"placeOfPerformanceCity": "Aberdeen Proving Ground",
"placeOfPerformanceState": "MD",
"placeOfPerformanceZip": "21005",
"placeOfPerformanceCountry": "USA",
"active": true,
"awardNumber": null,
"awardDate": null,
"awardAmount": null,
"awardee": null,
"officeState": "MD",
"officeCity": "ABERDEEN PROVING GROU",
"officeZip": "21005-5001",
"officeCountry": "USA",
"additionalInfoLink": null,
"url": "https://sam.gov/workspace/contract/opp/c80b68ea0a744c1ab71886cdec46739b/view",
"sourceUrl": "https://sam.gov/api/prod/fileextractservices/v1/api/download/Contract%20Opportunities/datagov/ContractOpportunitiesFullCSV.csv",
"scrapedAt": "2026-10-22T12:30:16.369Z"
},
{
"noticeId": "da84d7cf60f24b7695f57e20329102ea",
"title": "Multiple Award Schedule",
"solicitationNumber": "47QSMD20R0001",
"department": "GENERAL SERVICES ADMINISTRATION",
"subTier": "FEDERAL ACQUISITION SERVICE",
"office": "GSA/FAS FURNITURE SYSTEMS MGT DIV",
"officeCode": "47QSMA",
"postedDate": "2026-10-21T15:20:53",
"noticeType": "Award Notice",
"baseType": "Combined Synopsis/Solicitation",
"archiveDate": "2031-10-20",
"setAsideCode": null,
"setAside": null,
"responseDeadline": "2026-10-21T11:12:13-05:00",
"naicsCode": "541519",
"pscCode": "99",
"placeOfPerformanceCity": null,
"placeOfPerformanceState": null,
"placeOfPerformanceZip": null,
"placeOfPerformanceCountry": null,
"active": true,
"awardNumber": "47QTCA27D000X",
"awardDate": "2026-10-21",
"awardAmount": 475000,
"awardee": "CYBERPROS TECHNOLOGY LLC Chantilly VA 20151 USA",
"officeState": "PA",
"officeCity": "PHILADELPHIA",
"officeZip": "19107",
"officeCountry": "USA",
"additionalInfoLink": null,
"url": "https://sam.gov/workspace/contract/opp/da84d7cf60f24b7695f57e20329102ea/view",
"sourceUrl": "https://sam.gov/api/prod/fileextractservices/v1/api/download/Contract%20Opportunities/datagov/ContractOpportunitiesFullCSV.csv",
"scrapedAt": "2026-10-22T12:30:16.369Z"
}
]

The awardee is returned as published, as one text string that can include name and address.

Pricing

Pay per result: you are charged for each notice written to the dataset (Apify pay-per-event, event result). Notices that are filtered out or already seen are not charged. Set maxItems to cap the cost of a run. The current price per 1,000 results is shown on this page.

Use cases

  • Daily bid alerts for a GovCon firm. Filter to your NAICS codes and set-aside status, schedule daily, and get only the notices posted since yesterday into Sheets or your CRM.
  • Capture and BD consultants with several clients. One saved task per client; each keeps its own new-since-last-run list.
  • Bid-alert and lead services. Feed filtered notices into your own email, Slack or webhook pipeline.
  • Early-stage opportunity tracking. Filter noticeTypes to Sources Sought and Presolicitation for specific agencies to see opportunities before the solicitation.
  • Award research. Filter to Award Notice to collect award numbers, dates, amounts and awardees where notices include them.

Privacy

The named contracting-officer contacts (names, emails, phones, fax) in the extract are dropped while parsing and never stored or output. With includeDescription on, email addresses inside description text are replaced with [email removed]. Free-text descriptions can still mention people or phone numbers, which is why descriptions are off by default.

FAQ

Do I need a SAM.gov account or API key? No. The Actor downloads GSA's public Contract Opportunities extract and uses no login or key.

How often is the data updated? The extract is published daily by GSA, so a notice can appear in your results only after it appears in that file. Running more than once a day will not surface newer notices than the latest extract.

Is the data complete? It contains the notices that GSA's extract contains. Attachments and attachment links are not included, and no completeness is guaranteed.

Why did my first run return few results? The first run for a filter combination returns only matches posted in the last firstRunLookbackDays days (default 3) and maxItems caps the count. Increase either to see more, or turn onlyNew off.

What time zone are the dates in? Dates are returned as published. The posted date has no timezone in the source; response deadlines include an offset when SAM.gov provides one.

What if SAM.gov changes the file? If expected columns are missing or most rows look malformed, the run stops with an error instead of returning bad data. Temporary download errors are retried a few times.

Is this legal to use? The Actor reads a publicly available federal data file and does not log in to anything. You are responsible for how you use the data.

Does it read the whole file on every run? Yes when onlyNew is on, so the list of seen notices stays exact. The file is streamed, not loaded into memory. Each run writes a RUN_SUMMARY record with rows read, items emitted, runtime and peak memory.

Limitations

  • Data is as fresh as the official extract (updated once a day).
  • The extract has no timezone on the posted date and no attachment links.
  • Windows-1252 text in the source is converted to normal Unicode.
  • Place-of-performance fields are often empty in the source; the states filter then falls back to the contracting office state.

See also

Want to know who won the work? The companion USAspending Contract Awards Scraper & Monitor returns new federal contract awards from USAspending.gov, with the same kind of daily new-since-last-run feed. It shares NAICS, agency and keyword filters and field names such as naicsCode, pscCode, department, subTier and awardAmount, so opportunities here and awards there line up.

Changelog

  • 0.1: first release.