# SAM.gov Contract Opportunities Monitor (`avisommer/gov-contracts-monitor`) Actor

Find and monitor new U.S. federal contract opportunities from SAM.gov: filter by keyword, NAICS, PSC, set-aside (8(a), SDVOSB, WOSB, HUBZone), agency, state and notice type. Daily new-only alerts. No API key needed.

- **URL**: https://apify.com/avisommer/gov-contracts-monitor.md
- **Developed by:** [Avi Som](https://apify.com/avisommer) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 opportunities

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## SAM.gov Contract Opportunities Monitor

Find **new U.S. federal government contract opportunities** from SAM.gov, the official source for federal contracting, and get **only the ones that fit your business**. Filter by keyword, NAICS code, PSC code, set-aside (small business, 8(a), SDVOSB, WOSB, HUBZone), agency, state and notice type. Schedule it daily to get only new notices.

**No SAM.gov API key, account or rate limits.** It reads SAM.gov's official public daily data extract, so a filtered daily check finishes in seconds.

### Why use it

- **Win more bids:** see every new Solicitation, Sources Sought and Presolicitation in your NAICS codes the day it's posted, with response deadlines.
- **Set-aside hunting:** surface notices reserved for your certification (SBA, 8(a), SDVOSB, WOSB, HUBZone).
- **Daily alerts:** turn on **Only new since last run**, schedule it daily, and send results to email, Slack, Google Sheets or your CRM. You only pay for new notices.
- **Contracting officer contacts and links** to the full notice on SAM.gov.
- **Market research:** include **award notices** to see who won, the award amount and the agency.

### Who it's for

Government contractors, small businesses and 8(a)/SDVOSB/WOSB firms, BD and capture teams, proposal writers, GovCon consultants and lead-gen agencies.

### Input example

```json
{
  "naicsCodes": ["541511", "541512", "5415"],
  "keywords": ["software", "cloud", "cybersecurity"],
  "setAsides": ["SBA", "SDVOSB"],
  "noticeTypes": ["Solicitation", "Combined Synopsis/Solicitation", "Sources Sought"],
  "postedWithinDays": 1,
  "onlyNew": true,
  "stateKey": "daily-it-bids"
}
```

| Filter | How it matches |
|---|---|
| `keywords` | Any word in title or description (`keywordsInTitleOnly` for title only) |
| `naicsCodes`, `pscCodes` | Prefix match (`5415` matches `541511`, `541512`, …) |
| `setAsides` | Set-aside name or code (`SBA`, `8(a)`, `SDVOSB`, `WOSB`, `HUBZone`) |
| `agencies` | Department, sub-tier or office contains text (`Veterans Affairs`, `Air Force`) |
| `states` | Place-of-performance state code |
| `noticeTypes` | Solicitation, Combined Synopsis/Solicitation, Presolicitation, Sources Sought, Special Notice, Award Notice… |
| `onlyOpen` | Skip notices past their response deadline (default on) |
| `postedWithinDays` | Only notices posted in the last N days (default 7; 0 = all active) |

### Output example (real notice)

```json
{
  "noticeId": "464aa4b0ed124ebe93a66c57863796ba",
  "title": "SILVAH software coding",
  "solicitationNumber": "12760426Q0195",
  "agency": "AGRICULTURE, DEPARTMENT OF",
  "subTier": "FOREST SERVICE",
  "office": "USDA FOREST SERVICE",
  "noticeType": "Sources Sought",
  "baseType": "Sources Sought",
  "postedDate": "2026-11-04T22:33:11.000Z",
  "responseDeadline": "2026-11-11T20:00:00.000Z",
  "archiveDate": "2026-11-26T00:00:00.000Z",
  "setAside": "Small Business Set Aside - Total",
  "setAsideCode": "SBA",
  "naicsCode": "541511",
  "pscCode": "DA01",
  "placeOfPerformance": {
    "city": "Parsons",
    "state": "WV",
    "zip": null,
    "country": "USA"
  },
  "award": null,
  "primaryContact": {
    "name": "Brandon Newland",
    "title": null,
    "email": "brandon.newland@usda.gov",
    "phone": null
  },
  "secondaryContact": null,
  "officeLocation": {
    "city": "Albuquerque",
    "state": "NM",
    "zip": "87102",
    "country": "USA"
  },
  "active": true,
  "url": "https://sam.gov/workspace/contract/opp/464aa4b0ed124ebe93a66c57863796ba/view",
  "additionalInfoLink": null,
  "description": "The United States Department of Agriculture (USDA) Forest Service (FS) is conducting market research to identify capable sources to repair SILVAH version 8 in C…",
  "scrapedAt": "2026-11-05T15:46:49.509Z"
}
```

### Pricing

Pay per result: you pay only for opportunities that match your filters. With **Only new since last run**, repeat runs charge only for new notices. Set a maximum cost per run and it stops cleanly.

### FAQ

**How fresh is the data?** SAM.gov republishes its public extract every day (early morning ET), so a daily schedule after 8 AM ET catches everything posted the previous day.

**Do I need a SAM.gov account or API key?** No.

**Is this official?** The data comes from SAM.gov's public data extract. This tool is not affiliated with the U.S. government.

**Something wrong?** Open an issue and it will be fixed quickly.

# Actor input Schema

## `keywords` (type: `array`):

Match any of these in the title or description (case-insensitive). Leave empty for all.

## `keywordsInTitleOnly` (type: `boolean`):

Ignore descriptions when matching keywords.

## `excludeKeywords` (type: `array`):

Drop opportunities whose title contains any of these.

## `naicsCodes` (type: `array`):

Prefix match, e.g. 5415 (computer systems design) or 541511. Leave empty for all industries.

## `pscCodes` (type: `array`):

Prefix match, e.g. D (IT services), R4, Z2.

## `setAsides` (type: `array`):

Match set-aside name or code, e.g. SBA, 8(a), SDVOSB, WOSB, HUBZone, Veteran.

## `agencies` (type: `array`):

Match department, sub-tier or office, e.g. Veterans Affairs, Air Force, NASA.

## `states` (type: `array`):

Two-letter state codes, e.g. VA, MD, TX.

## `noticeTypes` (type: `array`):

Leave empty for all except award notices.

## `includeAwards` (type: `boolean`):

Also return award notices (who won, how much).

## `onlyOpen` (type: `boolean`):

Skip notices whose response deadline has passed.

## `postedWithinDays` (type: `integer`):

Only notices posted in the last N days. 0 = all active notices.

## `onlyNew` (type: `boolean`):

Return only notices not returned before (per monitor name). Ideal for daily schedules; you only pay for new ones.

## `stateKey` (type: `string`):

Separate "only new" memory per monitor.

## `includeDescription` (type: `boolean`):

Include the notice description (first 4,000 characters).

## `includeContacts` (type: `boolean`):

Include the official government points of contact listed on the notice.

## `maxResults` (type: `integer`):

Stop after this many opportunities.

## Actor input object example

```json
{
  "keywords": [
    "software",
    "cybersecurity",
    "cloud"
  ],
  "keywordsInTitleOnly": false,
  "includeAwards": false,
  "onlyOpen": true,
  "postedWithinDays": 7,
  "onlyNew": false,
  "stateKey": "default",
  "includeDescription": true,
  "includeContacts": true,
  "maxResults": 1000
}
```

# Actor output Schema

## `opportunities` (type: `string`):

Matching notices (overview).

## `opportunitiesFull` (type: `string`):

Every field including description and contacts.

## `summary` (type: `string`):

Notices scanned, matched and saved.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "keywords": [
        "software",
        "cybersecurity",
        "cloud"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("avisommer/gov-contracts-monitor").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "keywords": [
        "software",
        "cybersecurity",
        "cloud",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("avisommer/gov-contracts-monitor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "keywords": [
    "software",
    "cybersecurity",
    "cloud"
  ]
}' |
apify call avisommer/gov-contracts-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,avisommer/gov-contracts-monitor"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/MG9gyhKSV3TOJJbws/builds/H9bPjI7tNWT3JSbcz/openapi.json
