Sam Gov Opportunities Monitor avatar
Sam Gov Opportunities Monitor

Pricing

from $7.00 / 1,000 results

Go to Apify Store
Sam Gov Opportunities Monitor

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

Mikhail Mamaev

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

10 hours ago

Last modified

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:

  1. It checks SAM.gov using the official API.

  2. Compares results with previous runs.

  3. Detects changes:

    • NEW — a new opportunity appeared
    • UPDATED — an existing opportunity was modified
  4. Saves only those changes.

  5. 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
}

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:

  1. Create a Task for this actor and set a schedule.
  2. Open the actor page and go to Monitoring → Alerts.
  3. Create a new alert with:
    • Metric: Number of results
    • Condition: is greater than 0
  4. Enable Email notifications and enter your email address.
  5. Save and enable the alert.

Monitoring alert example

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 title
  • deadline — response deadline
  • email — official contact email
  • samUrl — direct link to the opportunity on SAM.gov
  • solicitationNumber — solicitation number (when available)
  • opportunityType — notice/opportunity type from SAM.gov
  • setAsideCode — 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 when postedFrom/postedTo are not provided.
  • postedFrom, postedTo — explicit posted date range (MM/dd/yyyy). Overrides daysBack.
  • 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 (modifiedDate or postedDate, asc/desc).

Output control

  • changeTypes — choose which changes to emit: NEW, UPDATED
  • emitEmptyRuns — 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., o solicitation, a award).
  • 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, key STATE.
  • 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