SAM.gov Opportunity Monitor avatar

SAM.gov Opportunity Monitor

Pricing

Pay per event

Go to Apify Store
SAM.gov Opportunity Monitor

SAM.gov Opportunity Monitor

Monitors SAM.gov federal contract opportunities by NAICS, keyword, notice type and set-aside. Delta mode emits only new/modified notices (incl. deadline changes and cancellations) since your last run.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Vic

Vic

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

2 days ago

Last modified

Share

Monitors SAM.gov — the U.S. government's single publication point for federal contract opportunities — by NAICS code, keyword, notice type and set-aside. Delta mode (the default) remembers what it has already shown you and emits only notices that are new or changed since your last run, including deadline moves and cancellations. Award notices are covered too, so you can watch who won.

Quickstart

  1. Set naicsCodes (e.g. ["541511"]) and/or keywords, keep deltaMode: true.
  2. Run once to seed the baseline (first run emits everything matching as "new").
  3. Schedule it daily — every later run emits only what changed, with deltaType, prevModifiedDate and deadlineChanged.

Why delta mode

Capture/BD teams do not need 600 unchanged rows every morning; they need the 12 that are new, amended, extended, or canceled. Delta state is kept per filter-combination in a named key-value store (sam-gov-monitor-state) in your Apify account, so runs are small, fast and cheap. Turn deltaMode off to get a full snapshot instead.

What it does NOT do

  • No login-gated data, no entity registrations or exclusions, no bid submission.
  • No consumer PII. Contracting-officer point-of-contact fields (official business contacts published by the government) are off by default; set includePointOfContact: true to include them.
  • naicsDescription is currently always null — the SAM.gov search/detail responses don't carry it. The field is kept for forward compatibility.

Input example

{
"naicsCodes": ["541511"],
"noticeTypes": ["Solicitation", "Combined Synopsis/Solicitation", "Award Notice"],
"modifiedSinceDays": 2,
"deltaMode": true,
"maxResults": 1000
}

Recipes:

  • Daily NAICS watch: naicsCodes: ["541511"], deltaMode: true, schedule daily.
  • Keyword watch: keywords: ["zero trust", "SIEM"] — each keyword is queried separately and results are deduplicated before you are charged.
  • Award-notice feed: noticeTypes: ["Award Notice"], activeOnly: false, modifiedSinceDays: 1.
  • Set-aside filter: setAsideCodes: ["SBA", "SDVOSBC", "WOSB", "8A"].

Notice types accept either full names (Solicitation, Presolicitation, Award Notice, Sources Sought, Special Notice, Combined Synopsis/Solicitation, Justification, Sale of Surplus Property) or SAM one-letter codes (o, p, a, r, s, k, u, g, i).

Output example (real row from a test run, 2026-08-29)

{
"noticeId": "ff5d8bbd2fdf4b6490b25bfb23e18a67",
"solicitationNumber": "HC101926R0005",
"title": "Virtual Reality Training System for Gas Turbine Generator - Pearl Harbor, HI",
"noticeType": "Solicitation",
"noticeTypeCode": "o",
"department": "DEPT OF DEFENSE",
"subTier": "DEFENSE INFORMATION SYSTEMS AGENCY (DISA)",
"office": "DITCO-PAC",
"naicsCode": "541511",
"naicsDescription": null,
"pscCode": "DA01",
"setAside": "SDVOSBC",
"placeOfPerformance": { "city": "JBPHH", "state": "HI", "zip": "96860", "country": "USA" },
"postedDate": "2026-08-29T00:48:37.000Z",
"modifiedDate": "2026-08-29T00:48:37.000Z",
"responseDeadline": "2026-09-10T19:00:00.000Z",
"isActive": true,
"isCanceled": false,
"url": "https://sam.gov/opp/ff5d8bbd2fdf4b6490b25bfb23e18a67/view",
"descriptionSnippet": "The Defense Information Systems Agency - Pacific (DISA - PAC) is seeking a qualified contractor to develop a Virtual Reality Training System for a Gas Turbine Generator ... (truncated here; the actor emits up to 2,000 characters)",
"award": null,
"enriched": true,
"deltaType": "new",
"prevModifiedDate": null,
"deadlineChanged": false,
"scrapedAt": "2026-08-29T14:29:31.011Z"
}

Award notices additionally carry award: { "awardeeName": "...", "awardeeUeiSAM": "..." } when SAM.gov publishes it.

By default each emitted row is enriched with one extra detail request to fill naicsCode, pscCode, setAside, placeOfPerformance and the full description snippet (SAM.gov's list API does not include those). Set enrichDetails: false for faster, lighter rows with those fields null.

Pricing (pay-per-event)

EventPriceWhen
Run start$0.005once per run
Opportunity row$0.003per row, when deltaMode is off
Delta row$0.004per row, when deltaMode is on (charged instead of, never on top of, the opportunity-row price)

You are only charged for rows actually written to the dataset — duplicates are removed first, unchanged notices in delta mode cost nothing, and an empty day costs just the run start. Worked examples: a full daily pull of ~500 notices ≈ $45/month; a delta watch that surfaces ~100 changes/day ≈ $12/month.

Measured on the Apify platform (4 GB, default build). The cost driver is per-notice detail enrichment (enrichDetails: true, ~1 request/s to stay polite):

run shapeduration (measured 2026-09-03)recommended timeout
Delta run, few changes (typical nightly)~30-60 sdefault 3600s
~150 notices with enrichDetails: true~2 mindefault 3600s
~1000 notices with enrichDetails: true~15-20 min3600s
Same but enrichDetails: false~2-3 mindefault 3600s

Bound time and cost with maxResults, tighter naicsCodes/keywords, or modifiedSinceDays. enrichDetails: false is 5-10x faster if you only need list-level fields.

Timeouts, partial runs, and resurrection (no double billing)

The Actor watches its own run timeout and stops gracefully ~20-30s before the platform would kill it: it flushes a delivery checkpoint into the run's key-value store, finishes as SUCCEEDED, and sets a status message like Partial: N of ~M rows delivered....

  • Resurrect the same run (Runs > resurrect, pick a longer timeout) and it continues where it left off - already-delivered rows are never re-pushed and never re-charged. The flat run-start fee is charged at most once per run.
  • Rows are charged strictly after they are written to the dataset: a row that never reached your dataset is never billed.
  • In delta mode, even a fresh follow-up run continues cleanly: delivered notices are recorded in your delta state, so they are not billed again unless they change.

Data source & respect

Data comes from SAM.gov's public search API — U.S.-government public-domain data, readable without login or API key. The actor is deliberately polite: sequential requests with a fixed delay (under 2 requests/second), a descriptive User-Agent, and exponential backoff on 429/5xx responses. The endpoints used are not disallowed by SAM.gov's robots.txt. POC fields are official business contacts published by the government and are opt-in.

Limitations

  • SAM.gov caps any single query's pagination at 10,000 records; the actor scans the most-recently-modified records first and auto-slices large date windows per day, logging coverage warnings when a query exceeds the cap. Use modifiedSinceDays and filters to stay well under it.
  • The primary endpoint is SAM.gov's internal site API and can change without notice. Every run starts with a contract test; on drift or hardening the actor falls back to the official Get Opportunities API if you supply a free api.data.gov key in apiDataGovKey (the fallback has coarser filtering — posted-date windows, no modified-date filter — and lower daily quotas). Report breakage in the Issues tab; the goal is a response within 24 hours and a fix well inside 14 days.
  • modifiedSinceDays windows are anchored to US-Eastern dates (as SAM.gov's API expects); all output timestamps are normalized to UTC ISO 8601.