SAM.gov Opportunity Monitor — New Bids Daily, No Login
Pricing
from $10.00 / 1,000 opportunities
SAM.gov Opportunity Monitor — New Bids Daily, No Login
Schedule it daily and get only the NEW or UPDATED SAM.gov opportunities matching your keywords, NAICS codes, set-asides, states and agencies. Remembers what it has seen, flags changes, posts to your webhook. No API key. No login or API key. MCP-ready for AI agents. $10 per 1,000 alerts.
Pricing
from $10.00 / 1,000 opportunities
Rating
0.0
(0)
Developer
Khrystyna Skotte
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
SAM.gov Opportunity Monitor — daily new & updated federal contracts
Get a daily feed of only the new or updated SAM.gov opportunities that match your profile — keywords,
NAICS codes, notice types, set-asides, place-of-performance states and agencies. The monitor remembers
every notice it has already reported, so a scheduled run emits just the delta (marked new or updated),
posts a summary to your webhook, and costs you only for what actually changed. No SAM.gov API key needed.
Use it instead of re-scraping the whole search every morning and diffing spreadsheets yourself.
How it works
- Queries SAM.gov's public search for notices modified in the last
lookbackDaysmatching your filters. - Compares each notice against the monitor's saved state (
noticeId → modifiedDate). - Emits a record when the notice is unseen (
changeType: "new") or its modified date advanced (changeType: "updated"), enriched with NAICS, PSC, set-aside, place of performance and a description snippet from the notice detail page. - Saves the updated state, then POSTs a run summary to
webhookUrlif set.
State lives in a named key-value store samgov-monitor-<hash of monitorId> in your Apify account, capped at
50,000 notices (oldest by modified date are dropped). Delete the store to reset a monitor.
Input
| Field | Default | Notes |
|---|---|---|
keywords | ["cybersecurity"] | OR-ed full-text terms. Empty = no keyword restriction |
naicsCodes | [] | e.g. ["541512", "541519"] |
noticeTypes | ["o","p","k"] | Codes or names: o Solicitation, p Presolicitation, k Combined Synopsis/Solicitation, r Sources Sought, s Special Notice, a Award Notice, u Justification, i Intent to Bundle, v Consolidate/Bundle, g Surplus Sale. Empty = all |
setAsides | [] | SBA, 8A, 8AN, HZC, SDVOSBC, WOSB, EDWOSB, VSA, … |
states | [] | Place-of-performance state codes, e.g. ["VA","MD","DC"] |
agencies | [] | Case-insensitive substring match on department / sub-agency / office names |
lookbackDays | 3 | Notices modified within N days. 2–3 gives a safe overlap for a daily schedule |
maxNewOpportunities | 10 | Cap per run; anything beyond stays unseen and comes out next run |
firstRunMode | emitAll | emitAll reports every current match on the first run; baseline records them silently |
webhookUrl | "" | Optional POST target for the run summary |
monitorId | default | One state store per ID — run several watchlists side by side |
Recommended setup for a daily feed
- Create a task with your filters and set
monitorIdto something meaningful (it-services-va). - First run: set
firstRunModetobaselineandlookbackDaysto 30. This records everything currently on SAM.gov that matches, emits nothing, and stops your first day from being a 500-row backlog. - Switch
firstRunModeback toemitAll(it only matters when the state is empty anyway), setlookbackDaysto 3 andmaxNewOpportunitiesto 200+. - Schedule the task daily at 06:00 America/New_York. SAM.gov posts most notices during the East Coast business day, so a 06:00 ET run catches everything from the previous day before your team starts.
- Point
webhookUrlat Slack (incoming webhook), Zapier, Make, or your own endpoint.
The default settings ({}) run in emitAll mode with the cybersecurity keyword so you see real output
on the first try.
Example: NAICS watchlist for an IT services small business
{"keywords": [],"naicsCodes": ["541511", "541512", "541519", "518210"],"noticeTypes": ["o", "p", "k", "r"],"setAsides": ["SBA", "8A", "SDVOSBC"],"states": [],"agencies": ["Veterans Affairs", "Health and Human Services"],"lookbackDays": 3,"maxNewOpportunities": 200,"firstRunMode": "baseline","webhookUrl": "https://hooks.slack.com/services/XXX/YYY/ZZZ","monitorId": "it-smallbiz-va-hhs"}
Other quick profiles:
- Construction in Texas:
naicsCodes: ["236220","237310"],states: ["TX"],noticeTypes: ["o","p","k"] - Award intelligence (who is winning what):
noticeTypes: ["a"],naicsCodes: [...],keywords: [] - Sources Sought only (shape the requirement early):
noticeTypes: ["r"],keywords: ["cloud", "zero trust"]
Output
One record per new or updated notice:
{"noticeId": "45970579afdb4df89b2dd61c5f38e007","title": "Antennas","solicitationNumber": "N6660426Q0264","noticeType": "Combined Synopsis/Solicitation","noticeTypeCode": "k","agency": "DEPT OF DEFENSE","subAgency": "DEPT OF THE NAVY","office": "NUWC DIV NEWPORT","naicsCode": "334419","pscCode": "5985","setAside": "SBA","postedDate": "2026-09-28T18:36:52+00:00","modifiedDate": "2026-09-28T18:36:52+00:00","responseDeadline": "2026-10-28T18:00:00+00:00","placeOfPerformance": { "city": "Newport", "state": "RI", "stateName": "Rhode Island", "zip": "02841", "country": "USA" },"description": "This is an amended combined synopsis and solicitation for commercial items …","samUrl": "https://sam.gov/opp/45970579afdb4df89b2dd61c5f38e007/view","changeType": "new","firstSeenAt": "2026-09-28T19:02:11.412Z","matchedKeywords": ["cybersecurity"],"monitorId": "default"}
firstSeenAt is set on new records; updated records carry null there and the new modifiedDate.
matchedKeywords lists which of your keywords appear in the title, solicitation number or description
snippet (SAM.gov also matches attachments and full text, so an empty list does not mean a false positive).
Webhook payload
POSTed once per run as application/json, also saved as the SUMMARY record in the run's key-value store:
{"monitorId": "it-smallbiz-va-hhs","runAt": "2026-09-29T10:00:03.118Z","newCount": 4,"updatedCount": 1,"scanned": 137,"seenTotal": 812,"baseline": false,"opportunities": [ { "...first 50 records, same shape as the dataset..." } ]}
The full list is always in the run's dataset; use the Apify API or an integration to pull it if a run produces more than 50.
Pricing
Pay per event: a small start fee plus a per-opportunity fee only for records emitted. A daily monitor that finds nothing new costs just the start fee.
Notes
- Only active notices are considered (
is_active=true), which is what a bid team wants; archived notices never appear. - A run scans at most 2,000 notices (sorted newest-modified first). Narrow filters or a shorter lookback if your profile exceeds that.
- SAM.gov's search is public but rate-limited; the actor paces requests and retries transient errors.