SAM.gov Contract Opportunities, Incumbents & Grants avatar

SAM.gov Contract Opportunities, Incumbents & Grants

Pricing

Pay per event

Go to Apify Store
SAM.gov Contract Opportunities, Incumbents & Grants

SAM.gov Contract Opportunities, Incumbents & Grants

New US federal contract notices from SAM.gov filtered by keyword, NAICS, PSC, agency, set-aside and type, with optional USAspending incumbent lookup and Grants.gov opportunities. No API key needed.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Signal Scout

Signal Scout

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Get new US federal contract opportunities from SAM.gov as clean rows, filtered by keyword, NAICS, PSC, agency, set-aside, notice type, state and posting date. Optionally add a USAspending incumbent and competitor lookup for each notice and Grants.gov grant opportunities in the same run. No API key, account or login is needed.

Built by signalscouter. Questions or problems: signalscouter.data@gmail.com, or open an issue on this Actor.

What you get

Row typeWhat's in itEvent
opportunityNotice ID, title, solicitation number, notice type, posted date, response deadline (as published and in UTC), department / sub-tier / office (with CGAC, FPDS and AAC codes), NAICS, PSC, set-aside, place of performance, award details on award notices, description (truncated to your limit), link to SAM.gov, matched keywordsopportunity-result
opportunity.incumbents (optional)Top 5 recipients and 5 largest recent prime contracts from the same awarding agency for the same NAICS / PSC over the last N years, with USAspending linksincumbent-enrichment, only when something was found
grant (optional)Grants.gov posted or forecasted opportunities: number, title, agency, open and close dates, award ceiling and floor, estimated total funding, expected number of awards, cost sharing, funding instruments and categories, eligible applicants, description, linkgrant-result
errorAnything that couldn't be processed (bad input value, source unavailable, a grant whose details failed)never charged

Switch views in the dataset: Opportunities, Incumbents, Award notices, Grants, Contacts (opt-in), Errors. Each run also writes a RUN_SUMMARY record with rows read, how many each filter removed, rows delivered and charged, cache status and request counts.

Typical uses

  • A daily alert for new solicitations in your NAICS codes, with Only new since last run turned on and a schedule.
  • A set-aside pipeline, for example SDVOSB or 8(a) notices for one agency.
  • Capture research: for each notice, which companies already win that agency's work in that code (likely incumbents and competitors).
  • Grants and contracts in one feed for research organisations and small businesses.

Input example

{
"keywords": ["cybersecurity", "zero trust"],
"naicsCodes": ["5415"],
"setAsides": ["SBA", "SDVOSBC"],
"noticeTypes": ["Solicitation", "Combined Synopsis/Solicitation", "Sources Sought"],
"postedSince": "7 days",
"maxResults": 200,
"includeIncumbents": true,
"includeGrants": true,
"maxGrants": 50,
"onlyNew": true,
"monitorId": "cyber-daily"
}

Filters combine with AND. Values inside one filter combine with OR. Keywords match whole words or phrases in the title, solicitation number and description, case-insensitive. NAICS and PSC accept prefixes (54 matches every 54xxxx code). Agencies accept partial names (Veterans Affairs, Army Corps) or CGAC / FPDS / AAC codes. Codes only work for SAM.gov notices, not for grants. The state filter uses the place-of-performance state, and the contracting office's state only when a notice gives no place of performance. Notices past their response deadline are hidden by default. Award notices have no deadline, so they're kept.

Where the data comes from

SourceHow it's usedTerms
SAM.gov Contract Opportunities public data extract (ContractOpportunitiesFullCSV, refreshed once a day)Downloaded once per run as a stream and filtered on the flyPublic data published by GSA for bulk download. No key needed.
USAspending.gov API (spending_by_category/recipient, spending_by_award, agency references)Incumbent lookup, only when enabledPublic API, no key. Requests are rate-limited to 4 per second, and lookups are cached within a run.
Grants.gov API (search2, fetchOpportunity)Grant opportunities, only when enabledPublic API, no key. Requests are rate-limited to 2 per second.

This product uses the Grants.gov API but is not endorsed or certified by the U.S. Department of Health and Human Services.

Every request identifies itself as signalscouter-us-federal-contracts/1.0 (+signalscouter.data@gmail.com). The Actor uses no browser and no proxies, and it doesn't work around any access controls. It isn't affiliated with or endorsed by GSA, SAM.gov or the US Treasury (USAspending). Check the official notice on SAM.gov before you bid, because only the official notice and its attachments are authoritative.

Important limits (please read)

  • Freshness. SAM.gov publishes the extract once a day (around 03:30 UTC on recent days), so notices posted later that day appear in the next day's file. This Actor isn't a real-time feed.
  • Active notices only. The extract contains active notices. Archived and cancelled notices drop out of it.
  • Incumbents are an estimate, not a confirmed predecessor contract. The lookup returns recent prime contract awards from the same awarding agency (sub-tier where possible) for the same NAICS and/or 4-character PSC. That is a strong pointer to who currently does this kind of work for the agency, but it isn't proof of who holds the contract being re-competed. The lookback (incumbentLookbackYears, default 3) is capped at 4 years and never reaches awards dated before 4 April 2022, because recipient names on older awards are Dun & Bradstreet-restricted data. incumbents.basis shows exactly what was matched. Army, Navy and Air Force notices are matched under the Department of Defense, as USAspending records them. The enrichment is charged only when status is ok. These statuses aren't charged: noMatches (no past awards found), insufficientCodes (the notice has no NAICS and no 4-character PSC), agencyNotFound (the agency doesn't report contracts to USAspending, for example USPS; we don't fall back to a government-wide guess) and failed (USAspending didn't answer after retries). If USAspending fails 5 lookups in a row, any retries still waiting and the rest of that run's lookups are skipped straight away as failed (USASPENDING_CIRCUIT_OPEN, not charged), so an outage doesn't stall the run. This can happen inside the first batch of lookups. Each request times out after 30 seconds.
  • Attachments aren't downloaded. Use samUrl to open the notice and its documents.
  • Descriptions are cut to descriptionMaxChars (default 1,500). descriptionTruncated tells you when that happened.
  • Contacts are off by default. Contracting officers' and grant officers' names, emails and phones are published by the government for questions about a notice. If you turn on includeContacts, use them for that purpose and follow anti-spam and privacy law.
  • Grants.gov matching. Keywords are sent to the Grants.gov search, and the agency filter is applied to the agency name and the Grants.gov agency code (for example NSF or HHS-NIH11). SAM.gov CGAC, FPDS and AAC codes (such as 097) don't exist in Grants.gov, so a code-only agency filter matches no grants. Use a name such as Defense if you want both. NAICS, PSC, set-aside and state filters don't apply to grants. Grants.gov requests time out after 30 seconds. If 5 grant detail requests in a row fail after retries, the remaining grants are skipped. You get one GRANTS_CIRCUIT_OPEN error row (not charged), and the skipped grants aren't marked as seen, so a later run picks them up.

Cost and speed

The SAM.gov file is about 200 MB and is streamed in a single pass straight from SAM.gov's download service, so memory stays low (under 100 MB in our test runs) however many notices you ask for. Reading and filtering the whole file takes about 3 seconds on Apify. A 1,000-notice run took about 10 seconds in total, and each incumbent lookup adds about 0.3 seconds. The optional Keep a copy of today's SAM.gov file between runs setting is off by default. In our tests, re-downloading was faster and cheaper than reading a stored copy, so turn it on only if you run many times a day and want SAM.gov downloaded at most once per day.

How "Only new since last run" works

  • Delivered notice and grant IDs are remembered for 400 days in a store named us-federal-contracts-signals-state in your own account, with one record per monitorId.
  • Progress is saved during the run, not only at the end. Before each batch is delivered, its IDs are written to a small journal record in the same store. In the last 90 seconds before the run's timeout, the full state is also saved after every batch. If a run times out or crashes, the next run of the same monitor merges those records, so nothing is delivered or charged twice. Each attempt of a run writes its own journal records, so a restarted run can't overwrite them. If Apify restarts or resurrects a run, the run first reads its own dataset and skips everything already in it, so nothing is pushed or charged again. Max opportunities and Max grants count across all attempts of the run. This applies whether or not "Only new since last run" is on. In the worst case, the batch being written at the exact moment of the crash (up to 100 notices, 8 notices with incumbents, or 4 grants) is skipped rather than delivered again.
  • Notices beyond Max opportunities (and grants beyond Max grants) are not marked as seen. They stay eligible, newest first, for the next run. If a monitor regularly finds more new items than your limit, it works through the backlog over several runs. Raise the limit if you want everything in one run.
  • Items skipped because of your maximum charge per run aren't marked as seen either, so the next run delivers them.

Pricing

Pay per event. You only pay for results delivered.

EventPriceWhen
Opportunity result$0.002 ($2.00 per 1,000)Each SAM.gov contract notice saved to the dataset
Incumbent enrichment$0.005 ($5.00 per 1,000)Only when the USAspending lookup found past awards (incumbents.status is ok), at most once per notice
Grant result$0.002 ($2.00 per 1,000)Each Grants.gov opportunity saved to the dataset

Not charged:

  • Error rows.
  • Notices removed by your filters or cut by maxResults / maxGrants.
  • Notices skipped by Only new since last run.
  • Enrichments with status noMatches, insufficientCodes, agencyNotFound or failed.
  • The Actor start. There's no start fee.

If you set a maximum charge per run, the Actor stops cleanly before it would go over that amount. Examples:

  • A daily alert that finds 50 new notices costs $0.10.
  • 200 notices with incumbent lookup cost at most $1.40.
  • 100 grants cost $0.20.

Scheduling tip: once a day is plenty

SAM.gov publishes its public Contract Opportunities file once a day (around 03:30 UTC on recent days), so running more often than daily won't find new notices. They will be in the next day's file. Grants.gov changes during the day, but slowly. For monitoring we suggest:

  • A daily schedule, for example 06:00 UTC, with Only new since last run on and a monitorId for each set of filters.
  • If a run finds nothing new, you pay nothing, because there are no result events and no start fee. Extra runs won't get you more data, though, so daily is the sensible rhythm.

Output example (trimmed)

{
"recordType": "opportunity",
"noticeId": "0b1c…",
"title": "Zero Trust Architecture Support Services",
"noticeType": "Combined Synopsis/Solicitation",
"postedDate": "2026-10-19",
"responseDeadlineUtc": "2026-11-03T21:00:00+00:00",
"department": "DEPT OF DEFENSE",
"subTier": "DEFENSE HEALTH AGENCY (DHA)",
"naicsCode": "541512",
"pscCode": "DA01",
"setAsideCode": "SBA",
"samUrl": "https://sam.gov/opp/0b1c…/view",
"incumbents": {
"status": "ok",
"basis": {"awardingAgency": "Department of Defense", "awardingSubAgency": "Defense Health Agency",
"agencyResolvedBy": "officeCode", "naicsCode": "541512", "pscCode": "DA01",
"from": "2023-10-20", "to": "2026-10-20"},
"topRecipients": [{"name": "…", "uei": "…", "obligatedUsdInWindow": 12345678.9, "usaspendingUrl": "https://www.usaspending.gov/recipient/…/latest"}],
"largestRecentAwards": [{"awardId": "…", "recipientName": "…", "awardAmountUsd": 5000000.0, "endDate": "2027-01-31", "usaspendingUrl": "https://www.usaspending.gov/award/…"}],
"note": "Recent prime contract awards for the same agency and codes (market incumbents), not a confirmed predecessor contract of this notice."
}
}

FAQ

Do I need a SAM.gov API key? No. The Actor reads the public daily extract, not the rate-limited SAM.gov API.

Can I get historical or archived notices? No. Only active notices in today's extract are included. You can use postedSince to go back as far as the active notices go.

Why is responseDeadlineUtc sometimes slightly off? Some notices publish a deadline without a time zone. Those are read as US Eastern (UTC−5), and date-only deadlines are read as 23:59 that day.

Is it legal? All three sources publish public government data for reuse. Respect each site's terms and use contact details responsibly.

More signalscouter Actors

ActorWhat it gives you
SEC Form D Funding Rounds & Startup SignalsDaily SEC Form D filings: who raised money, how much, industry, state and investors
Career Site Jobs ScraperJobs from 12 ATSes (Greenhouse, Lever, Ashby, Workday, Workable and more) in one schema, from company domains
Workday Jobs ScraperJobs from any myworkdayjobs.com career site, including sites with more than 2,000 jobs
UK Public Sector Jobs ScraperNHS Jobs, Teaching Vacancies and DWP Find a Job
Company Tech Stack & Domain SignalsWhat a company's website runs on, plus DNS, email security and domain age