Sam Gov Opportunities Monitor
Pricing
from $7.00 / 1,000 results
Sam Gov Opportunities Monitor
Stateful monitor for SAM.gov that emits only NEW and UPDATED opportunities — no duplicates, no noise. Ideal for alerts and automations.
Pricing
from $7.00 / 1,000 results
Rating
5.0
(1)
Developer

Mikhail Mamaev
Actor stats
0
Bookmarked
3
Total users
2
Monthly active users
10 hours ago
Last modified
Categories
Share
SAM.gov Opportunities Monitor (NEW / UPDATED)
Automated monitor for SAM.gov opportunities.
Find out only when something actually changes — new opportunities or meaningful updates — and get notified automatically.
Designed for contractors, bid & capture teams, consultants, and anyone tracking federal opportunities on a regular basis.
What problem this actor solves
SAM.gov updates constantly.
Manually checking it means:
- missing opportunities
- wasting time on unchanged listings
- information overload
This actor solves that by:
- running on a schedule
- remembering what it has already seen
- notifying you only when there is a NEW or UPDATED opportunity
No duplicates. No noise. Only signals.
How it works
Each time the actor runs:
-
It checks SAM.gov using the official API.
-
Compares results with previous runs.
-
Detects changes:
- NEW — a new opportunity appeared
- UPDATED — an existing opportunity was modified
-
Saves only those changes.
-
Sends notifications (optional).
That’s it.
Quick setup
Step 1. Get a SAM.gov API key (required)
This actor uses the official SAM.gov API.
You need your own (free) API key.
On SAM.gov:
- Sign in or create an account
- Generate an API key in your account settings
Step 2. Add the API key to the actor
In the actor input form, paste your SAM.gov API key into the field “SAM.gov API key”.
The value is stored encrypted and is never visible to anyone, including the actor author.
Where is my API key stored?
Your API key is stored as an encrypted secret input. It can only be decrypted during the actor run and is never visible to the actor author or other users.
Step 3. Create a Task
This actor is meant to run automatically, not manually.
In Apify Console:
- Open the actor
- Click Create task
- Configure input (see example below)
- Save the task
Step 4. Set a Schedule
Inside the task:
- Set a schedule (recommended: every 6–12 hours)
- Enable the task
Now the monitoring runs automatically.
Example task input
{"samApiKey": "YOUR_SAM_API_KEY","daysBack": 3,"maxPages": 5,"changeTypes": ["NEW", "UPDATED"],"states": ["CA", "TX"],"naicsCodes": ["236220"],"webhookUrl": "","emitEmptyRuns": false}
Recommended schedule
Run every 6–12 hours for stable monitoring and to stay within API limits.
⚠️ First run note: On the first run, the actor may emit many NEW events. If you use a webhook, make sure your endpoint can handle bursts or start with a small daysBack (e.g. 1–2 days).
Email notifications
You can receive email notifications using Apify Monitoring → Alerts.
This is the simplest and recommended way to get notified when new or updated opportunities are detected.
How it works:
- Create a Task for this actor and set a schedule.
- Open the actor page and go to Monitoring → Alerts.
- Create a new alert with:
- Metric: Number of results
- Condition: is greater than
0
- Enable Email notifications and enter your email address.
- Save and enable the alert.

You will now receive an email only when the actor finds NEW or UPDATED opportunities. If no changes are detected, no email is sent.
Webhooks
What is a webhook?
A webhook is simply a URL (an endpoint) that can receive HTTP requests.
If you set webhookUrl, the actor will POST each detected change to that URL as JSON:
- One request per change
- Header:
Content-Type: application/json
What can I put into webhookUrl?
Any endpoint that accepts a POST request, for example:
- Zapier “Catch Hook”
- Make.com “Custom webhook”
- n8n webhook trigger
- Your own server (Express/Fastify/Django/etc.)
- Slack/Discord via automation tools
Example: detected NEW opportunity
This is what you receive when a new opportunity is detected:
{"event": "NEW","noticeId": "cabc8bd735e7491c88b29a7f2f5a2f84","title": "10--BAG,CARTRIDGE CLIP","changeType": "NEW","changeDetectedAt": "2026-01-01T14:05:17.567Z","postedDate": "2026-01-01","deadline": "2026-01-16","naics": ["332991"],"email": "DibbsBSM@dla.mil","samUrl": "https://sam.gov/workspace/contract/opp/cabc8bd735e7491c88b29a7f2f5a2f84/view"}
This object is:
- sent to your webhook (if configured)
- written to the default dataset
- used to trigger email or Slack notifications via Apify Automations
Field highlights:
event— what happened (NEW or UPDATED)title— opportunity titledeadline— response deadlineemail— official contact emailsamUrl— direct link to the opportunity on SAM.govsolicitationNumber— solicitation number (when available)opportunityType— notice/opportunity type from SAM.govsetAsideCode— set-aside code (e.g., SBA, 8A)
Output: dataset contains only changes
The actor pushes only NEW/UPDATED events to the default dataset. This is ideal for:
- alerts (email / Slack / Teams)
- CRM ingestion
- change-based automation
- pay-per-change usage
noticeId is unique per opportunity and can be treated as a primary-like key.
You pay only for emitted change events, not for how many pages the actor scans.
Settings reference
Cost & performance
daysBack— how many days back to scan. Used only whenpostedFrom/postedToare not provided.postedFrom,postedTo— explicit posted date range (MM/dd/yyyy). OverridesdaysBack.responseDeadlineFrom,responseDeadlineTo— optional response deadline range (MM/dd/yyyy).limit— records per page (1–1000). Higher = fewer pages but larger responses.maxPages— pagination safety cap. If too low, some opportunities may be skipped. Increasing it affects API usage and coverage, not pay-per-event cost.sortBy,sortOrder— control sorting (modifiedDateorpostedDate, asc/desc).
Output control
changeTypes— choose which changes to emit:NEW,UPDATEDemitEmptyRuns— debug-only: push a record when no changes were detected
Filters
keywords/keyword— server-side keyword search on SAM.gov.procurementTypes— filter by procurement type (e.g.,osolicitation,aaward).noticeId,solicitationNumber,title— direct identifier/title filters.states— list of US state codes. Single value is sent to the API, multiple values are post-filtered.naicsCodes— list of NAICS codes. Single value is sent to the API, multiple values are post-filtered.zip,classificationCode— place of performance and classification filters.organizationName,organizationCode— filter by agency/organization.typeOfSetAside,typeOfSetAsideDescription— socio-economic set-aside filters.status— opportunity status (active, inactive, archived, cancelled, deleted).
Webhook
webhookUrl— your endpoint to receive events via POST (leave empty to disable)
API endpoint
apiBaseUrl— override the base URL (e.g., production vs alpha).
Notes & caveats
- The actor stores its state in key-value store
sam-monitor-state, keySTATE. - STATE is pruned every 10 runs (entries not seen in ~180 days are removed).
API availability & rate limits
This actor relies on the public SAM.gov API, which may occasionally be unavailable or rate limited. During such periods, the actor will log that the API is unavailable and exit gracefully.
Tips for stable monitoring:
- Use smaller
daysBack - Run every 6–12 hours (not every minute)
- Avoid overly broad filters on a single key