# SAM.gov Contract Opportunities Feed (Official Daily Extract) (`novadata/sam-gov-opportunities-feed`) Actor

Federal contract opportunities (RFPs, RFQs, sources sought, presolicitations, award notices) from SAM.gov's official daily public data.gov extract. Filter by NAICS, PSC, set-aside, state, agency, keyword and posted date. No API key, no login.

- **URL**: https://apify.com/novadata/sam-gov-opportunities-feed.md
- **Developed by:** [novadata](https://apify.com/novadata) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.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 Feed (Official Daily Extract)

Get every new federal contract opportunity from **SAM.gov** (RFPs, RFQs, combined synopses, sources sought, presolicitations, special notices and award notices) as clean JSON, CSV or Excel, filtered to what you actually bid on.

This Actor reads the **official public Contract Opportunities extract** that SAM.gov publishes every day under [Data Services](https://sam.gov/data-services) and on data.gov. It does **not** scrape the SAM.gov website or call its internal search API, so it doesn't break when the website changes and doesn't depend on anyone's SAM.gov login or API key.

### Who it's for

- **Small and mid-size government contractors** who want a daily list of new solicitations in their NAICS codes and set-asides
- **GovCon BD and capture teams** feeding a CRM, Slack channel or spreadsheet
- **Proposal consultants and bid-matching services** that watch opportunities for many clients
- **Market researchers** tracking which agencies are buying what

### What you can filter on

| Input | Example | Notes |
|---|---|---|
| `postedWithinDays` | `1`, `7`, `30` | 0 = every active notice (about 70,000). Small windows finish in seconds. |
| `naicsCodes` | `["541512", "5415", "2362"]` | Prefix match, so `5415` covers 541511 to 541519 |
| `pscCodes` | `["D3", "R425"]` | Prefix match |
| `setAsideCodes` | `["SBA", "8A", "SDVOSBC", "WOSB"]` | Exact SAM.gov codes |
| `noticeTypes` | `["Solicitation", "Combined Synopsis/Solicitation", "Sources Sought"]` | |
| `states` | `["VA", "MD"]` | Place of performance |
| `agencyKeywords` | `["ARMY", "VETERANS AFFAIRS"]` | Matches department, sub-tier or office |
| `keywords` | `["cybersecurity", "janitorial"]` | Title and description |
| `openForResponsesOnly` | `true` | Drops notices whose response deadline has passed |
| `maxDescriptionChars` | `5000` | 0 = full text |
| `maxItems` | `1000` | Also caps your cost |

#### Example input: small-business IT solicitations still open, posted in the last 3 days

```json
{
  "postedWithinDays": 3,
  "naicsCodes": ["5415"],
  "noticeTypes": ["Solicitation", "Combined Synopsis/Solicitation"],
  "setAsideCodes": ["SBA", "SBP"],
  "openForResponsesOnly": true,
  "maxItems": 500
}
```

### Output

One record per notice. Example (real record from a test run, description shortened):

```json
{
  "noticeId": "57659a9c0f784b7586319003cdd087cc",
  "title": "W9124G26CBARRACKS",
  "solicitationNumber": "052917",
  "noticeType": "Combined Synopsis/Solicitation",
  "baseNoticeType": "Combined Synopsis/Solicitation",
  "postedDate": "2026-10-16T11:50:02",
  "responseDeadline": "2026-11-17T12:00:00-06:00",
  "archiveDate": "2026-12-02T00:00:00",
  "archiveType": "auto15",
  "active": true,
  "department": "DEPT OF DEFENSE",
  "subTier": "DEPT OF THE ARMY",
  "office": "W6QM MICC-FT RUCKER",
  "cgac": "021",
  "fpdsCode": "2100",
  "aacCode": "W9124G",
  "setAsideCode": "SBA",
  "setAside": "Small Business Set Aside - Total",
  "naicsCode": "561621",
  "pscCode": "S211",
  "placeOfPerformance": {
    "streetAddress": null,
    "city": "Fort Rucker",
    "state": "AL",
    "zip": "36362",
    "country": "USA"
  },
  "contractingOffice": {
    "city": "FORT RUCKER",
    "state": "AL",
    "zip": "36362",
    "country": "USA",
    "organizationType": "OFFICE"
  },
  "primaryContact": {
    "title": null,
    "name": "Jolene A. Granger",
    "email": "jolene.a.granger.civ@army.mil",
    "phone": null,
    "fax": null
  },
  "secondaryContact": {
    "title": null,
    "name": "Erin Duncan",
    "email": "erin.s.duncan2.civ@army.mil",
    "phone": null,
    "fax": null
  },
  "award": null,
  "samUrl": "https://sam.gov/workspace/contract/opp/57659a9c0f784b7586319003cdd087cc/view",
  "additionalInfoLink": null,
  "description": "The Government is requesting the purchase of security camera maintenance services for barracks located at Fort Rucker, Alabama. This firm-fixed price (FFP) contract is being competed under NAICS code 561621 with a size standard of $25 milli...",
  "descriptionTruncated": true,
  "source": "SAM.gov Contract Opportunities public extract (data.gov)",
  "sourceFileLastModified": "Sat, 17 Oct 2026 03:30:44 GMT",
  "scrapedAt": "2026-10-17T12:51:22+00:00"
}
```

The run also saves a `RUN_SUMMARY` record in the key-value store with rows scanned, records returned, why it stopped, and the source file's `Last-Modified` timestamp.

### Pricing (suggested)

Pay per result: **$2.00 per 1,000 opportunities**, plus a token **$0.005 per run**. A daily run that returns 50 matching notices costs about $0.11.

### How fresh is the data?

SAM.gov regenerates the extract once a day (the test run on 2026-10-17 saw a file last modified 03:30 UTC that day). Notices posted after that appear in the next day's file. If you need minute-by-minute alerts, this isn't the right tool. For a daily digest it's the most reliable source available.

### Limits and honest caveats

- The extract has **currently active notices only**. Archived notices aren't included.
- **Award notices dated before 2022-04-04 are skipped by default.** SAM.gov's terms say those records may contain Dun & Bradstreet data that can't be redistributed in bulk or used commercially. Turn on `includePre2022AwardNotices` only if your use is allowed.
- Attachments (SOWs, RFQ PDFs) aren't in the extract. Each record links to the notice on SAM.gov, where you can download them.
- Contracting officer names, emails and phone numbers are published by the government for questions about each solicitation. Use them for that purpose. Bulk marketing to federal employees is a bad idea and may break agency rules.
- This Actor isn't affiliated with or endorsed by GSA or SAM.gov. Always confirm details on the official notice before you bid.

### Schedule it

Create an Apify Schedule (for example, daily at 07:00) with `postedWithinDays: 1` and connect the dataset to Google Sheets, Slack, Zapier, Make or a webhook.

# Actor input Schema

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

Only notices posted in the last N days. 0 = every active notice in the extract (about 70,000). Smaller windows run faster because the extract is sorted newest-first.

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

e.g. 541512, 236220, or a prefix like 5415 to match the whole group. Any of them matches.

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

Product Service Codes, e.g. D3, R4, Z1. Any of them matches.

## `setAsideCodes` (type: `array`):

Exact codes as SAM.gov publishes them, e.g. SBA (Total Small Business), SBP (Partial SB), 8A, 8AN, HZC, SDVOSBC, WOSB, EDWOSB, VSA. Leave empty for all.

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

Exact type names, e.g. Solicitation, Combined Synopsis/Solicitation, Presolicitation, Sources Sought, Special Notice, Award Notice. Leave empty for all.

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

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

## `agencyKeywords` (type: `array`):

Matched (case-insensitive substring) against department, sub-tier and office, e.g. ARMY, VETERANS AFFAIRS, NAVSUP.

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

Case-insensitive substring match against title and description. Any keyword matches.

## `openForResponsesOnly` (type: `boolean`):

Drop notices whose response deadline is missing or already passed.

## `maxDescriptionChars` (type: `integer`):

Truncate long descriptions to keep datasets small. 0 = no limit.

## `includePre2022AwardNotices` (type: `boolean`):

Off by default. SAM.gov's terms say award notices with an award date before April 4, 2022 may contain Dun & Bradstreet data that may not be redistributed in bulk or used for commercial/marketing purposes. Only turn this on if your use is permitted.

## `maxItems` (type: `integer`):

Stop after this many matching notices. You are charged per result, so this also caps cost.

## Actor input object example

```json
{
  "postedWithinDays": 7,
  "naicsCodes": [
    "541512"
  ],
  "openForResponsesOnly": false,
  "maxDescriptionChars": 5000,
  "includePre2022AwardNotices": false,
  "maxItems": 1000
}
```

# Actor output Schema

## `results` (type: `string`):

Contract opportunity records matching your filters (one item per notice).

## `allFields` (type: `string`):

Every field of every record, unflattened.

## `runSummary` (type: `string`):

Rows scanned, records returned, why the run stopped, and source freshness.

# 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 = {
    "naicsCodes": [
        "541512"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("novadata/sam-gov-opportunities-feed").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 = { "naicsCodes": ["541512"] }

# Run the Actor and wait for it to finish
run = client.actor("novadata/sam-gov-opportunities-feed").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 '{
  "naicsCodes": [
    "541512"
  ]
}' |
apify call novadata/sam-gov-opportunities-feed --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,novadata/sam-gov-opportunities-feed"
        }
    }
}
```

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/raT2slqyFMdVOkAx7/builds/xmvfTHurBWtSG1Fxi/openapi.json
