# SAM.gov Scraper: Federal Contract Opportunities (No API Key) (`delgadolegacy/samgov-opportunities`) Actor

Scrape US federal contract opportunities from SAM.gov: RFPs, RFQs, solicitations, sources sought and awards, from the official public data extract. No API key, no login. Filter by keyword, NAICS, PSC, set-aside, agency, state and dates. Daily bid alerts via monitor mode. From $0.80 per 1k results.

- **URL**: https://apify.com/delgadolegacy/samgov-opportunities.md
- **Developed by:** [Delgado Legacy Partners](https://apify.com/delgadolegacy) (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 $0.80 / 1,000 opportunity results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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 Scraper: Federal Contract Opportunities, RFPs & Bids (No API Key)

**SAM.gov Contract Opportunities Scraper** gets **US federal government contract opportunities** from SAM.gov as clean JSON, CSV or Excel: solicitations, RFPs, RFQs, combined synopses, presolicitations, sources sought / RFIs, special notices and award notices. Filter by **keyword, NAICS code, PSC code, set-aside (SBA, 8(a), HUBZone, SDVOSB, WOSB), agency, state, posted date and response deadline**, and turn on monitor mode for daily bid alerts. **No SAM.gov API key, no login.gov account, no proxies. Pay per result from $0.80 per 1,000 opportunities.**

It reads SAM.gov's **official public Contract Opportunities data extract**, which GSA publishes on SAM.gov Data Services and refreshes every night. That means no API rate limits and no scraping of the SAM.gov website.

### Why use this SAM.gov scraper

- ✅ **No API key needed** — no SAM.gov registration, no login.gov account, no personal API key to paste or rotate.
- ✅ **Fast** — a typical "last 7 days" search finishes in a few seconds; a full pull of all ~70,000 active notices takes under a minute.
- ✅ **Real filters** — keywords (title + description), NAICS (prefix), PSC codes, set-aside type (SBA, 8(a), HUBZone, SDVOSB, WOSB, EDWOSB, VOSB…), notice type, agency / office, state, posted date range, open-for-bids only, and "due within N days".
- ✅ **Clean, normalized fields** — ISO dates with time zones, `daysUntilDeadline`, decoded set-aside names, nested place of performance and award info, numeric award amounts, public SAM.gov link.
- ✅ **Monitor mode** — turn on *Only new since last run*, schedule it daily, and get **only the fresh bids** you haven't seen (great for Slack / email / CRM alerts via Apify integrations).
- ✅ **Pay only for results**: $1.20 per 1,000 opportunities on the Free plan, down to $0.80 on Gold+. No start fee.

### Use cases

- **Daily bid alerts:** new RFPs and solicitations for your NAICS codes and set-aside status, sent to Slack, email or a CRM.
- **GovCon business development and capture:** feed a pipeline in Google Sheets, Airtable, HubSpot or Salesforce.
- **Market research:** see who is buying what, where, and through which set-asides.
- **Award tracking:** award notices include the award number, date, amount and awardee.
- **Newsletters, dashboards and AI agents** built on federal procurement data.

### How to search SAM.gov contract opportunities

1. Add keywords and/or NAICS, PSC or set-aside filters. All filters are optional.
2. Pick a date window (default: posted in the last 7 days, still open for bids).
3. Click **Start**, then export the results as JSON, CSV or Excel, or use the Apify API.
4. For alerts, tick **Only new since last run** and add a daily **Schedule**.

The prefilled input (keyword `cybersecurity`, last 7 days, open only, 100 results) returns results in one click.

### Input example

```json
{
  "keywords": ["cybersecurity", "zero trust"],
  "naicsCodes": ["5415"],
  "setAsides": ["SBA", "SDVOSBC"],
  "states": ["VA", "MD", "DC"],
  "postedWithinDays": 7,
  "openOnly": true,
  "maxResults": 500
}
```

All filters are optional and combine with AND. Inside a filter, values combine with OR (unless *Require ALL keywords* is on).

| Filter | What it does |
|---|---|
| `keywords` | Whole-word match in title, solicitation number and (optionally) description |
| `excludeKeywords` | Drop notices whose title contains these words |
| `naicsCodes` | NAICS prefix match (`5415` = all computer systems design) |
| `pscCodes` | Product Service Code prefix (`D3`, `R4`, `Y1`…) |
| `setAsides` / `smallBusinessOnly` | Specific set-aside codes, or any set-aside |
| `noticeTypes` | Solicitation, Combined Synopsis/Solicitation, Presolicitation, Sources Sought, Special Notice, Award Notice… |
| `agencies` | Text match on department, sub-tier agency or office (`NAVY`, `VETERANS AFFAIRS`, `DLA`…) |
| `states` | Place-of-performance state (falls back to contracting office state) |
| `postedWithinDays` / `postedFrom` / `postedTo` | Posted date window |
| `openOnly` / `deadlineWithinDays` | Only notices still open, or due soon |
| `onlyNewSinceLastRun` + `monitorName` | Skip notices delivered in earlier runs |

### Sample results (real rows from our test run of the Oct 23, 2026 extract)

| Notice type | Title | Agency | NAICS | Set-aside | Due | State |
|---|---|---|---|---|---|---|
| Combined Synopsis/Solicitation | Southern Research Station - Bent Creek Janitorial Services | Agriculture | 561720 | Small Business Set Aside - Total | 2026-10-26 | NC |
| Combined Synopsis/Solicitation | 13--140D0426Q0641 IDIQ for Law Enforcement Equipment | Interior | 332994 | 8(a) Set-Aside (FAR 19.8) | 2026-10-29 | n/a |
| Solicitation | 7A--Smartsheet Licenses for OTS | Interior | 513210 | Indian Small Business Economic Enterprise | 2026-10-29 | n/a |
| Combined Synopsis/Solicitation | HVAC Unit Replacement | Commerce | 238220 | Small Business Set Aside - Total | 2026-11-20 | n/a |
| Sources Sought | S--AMARILLO FIELD OFFICE JANITORIAL SERVICES | Interior | 561720 | Small Business Set Aside - Total | 2026-10-28 | TX |

### Output example

```json
{
  "noticeId": "650978c0876c4ea994b6976213322974",
  "title": "DA01--RFI Action Only Healthcare Data Auditing Billing and Coding Optimization Software",
  "solicitationNumber": "36C10B27Q0073",
  "noticeType": "Sources Sought",
  "department": "VETERANS AFFAIRS, DEPARTMENT OF",
  "subTier": "VETERANS AFFAIRS, DEPARTMENT OF",
  "office": "TECHNOLOGY ACQUISITION CENTER NJ (36C10B)",
  "postedDate": "2026-10-23T13:24:13",
  "responseDeadline": "2026-11-06T15:00:00-05:00",
  "daysUntilDeadline": 13.4,
  "naicsCode": "541519",
  "pscCode": "DA01",
  "setAsideCode": null,
  "setAside": null,
  "placeOfPerformance": {"street": null, "city": null, "state": null, "zip": null, "country": null},
  "officeLocation": {"city": "EATONTOWN", "state": "NJ", "zip": "07724", "country": "USA"},
  "award": null,
  "active": true,
  "url": "https://sam.gov/opp/650978c0876c4ea994b6976213322974/view",
  "description": "Request for Information (RFI) Healthcare Data Auditing Billing and Coding Optimization Software - ..."
}
```

Award notices also include `award.number`, `award.date`, `award.amount` (number) and `award.awardee`.
No personal contact data: points of contact are not included, and email addresses and phone numbers inside descriptions are replaced with `[contact removed]`. Use the `url` link to reach the notice on SAM.gov.

A `RUN_SUMMARY` record in the key-value store shows the source file, how many notices were scanned, the date window and the filters used.

### Data source and freshness

- Source: SAM.gov Data Services → Contract Opportunities → `ContractOpportunitiesFullCSV.csv` (public, maintained by the U.S. General Services Administration).
- GSA refreshes the file **nightly**, so notices posted today usually appear the next morning (Eastern Time).
- The extract contains **active** notices. Archived/inactive notices and attachment files are not included.
- The Actor downloads the official public file once per run; it does not crawl or scrape the SAM.gov website.
- This Actor is not affiliated with or endorsed by SAM.gov or GSA. Always confirm details on the official notice before bidding.
- Award notices with an award date before 2022-04-04 may contain Dun & Bradstreet data; per SAM.gov's terms, the awardee name is omitted for those records.

### Pricing

**Pay per result**, live since Oct 24, 2026: you pay only for opportunities saved to the dataset. No start fee, no monthly rental.

| Apify plan | Price per 1,000 opportunities |
|---|---|
| Free | $1.20 |
| Bronze | $1.00 |
| Silver | $0.90 |
| Gold, Platinum, Diamond | $0.80 |

Apify platform usage is included. Set *Maximum cost per run* in the run options to cap spend; the run stops charging at your limit.

### FAQ

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

**How often should I run it?** Once a day (after ~6 AM ET) is ideal, with *Only new since last run* turned on.

**Can I get every active opportunity?** Yes: set `postedWithinDays` to 0, `openOnly` to false and `maxResults` to 0.

**Is this legal?** Contract opportunity data is published by the U.S. federal government for public use. The Actor downloads GSA's official public extract. No personal contact data is collected: points of contact are left out and emails/phones in descriptions are removed.

**How is this different from the official SAM.gov API?** The official API needs a personal API key and has daily rate limits. This Actor needs neither, and it adds monitor mode and normalized fields. The trade-off is that the extract is refreshed nightly rather than in real time, and it has no attachment files.

**Found a bug or need a field?** Open an issue on the Issues tab.

### More free tools from the same developer

- [Career Page Jobs Scraper](https://apify.com/delgadolegacy/career-page-jobs-scraper): every open job from company career pages on Greenhouse, Lever, Ashby and Workable in one dataset.
- [Remote Jobs Aggregator](https://apify.com/delgadolegacy/remote-jobs-aggregator): remote jobs from We Work Remotely and Remote OK, deduplicated, with salary and a new-jobs monitor.
- [PDF Text Extractor](https://apify.com/delgadolegacy/pdf-text-extractor): text, per-page text, keyword hits and metadata from PDF URLs in bulk, no start fee.
- [Sitemap URL Extractor](https://apify.com/delgadolegacy/sitemap-url-extractor): every URL from a website's sitemap.xml with lastmod, hreflang and regex/date filters.

# Actor input Schema

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

Keep notices whose title, solicitation number or description contains these words or phrases (whole-word, case-insensitive). Leave empty for all.

## `keywordsMatchAll` (type: `boolean`):

Off = any keyword matches. On = every keyword must appear.

## `searchDescription` (type: `boolean`):

Match keywords in the full notice description, not only the title and solicitation number.

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

Drop notices whose title contains any of these words, e.g. 'NSN', 'repair'.

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

Prefix match, e.g. '541512' (exact) or '5415' (all computer systems design). Leave empty for all.

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

Product Service Codes, prefix match, e.g. 'D3' (IT services), 'R4' (professional services), 'Y1' (construction).

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

Keep only notices with these set-aside codes. Leave empty for all.

## `smallBusinessOnly` (type: `boolean`):

Keep only notices with any small-business / socio-economic set-aside.

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

Leave empty for all types.

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

Text match on department, sub-tier agency or office, e.g. 'VETERANS AFFAIRS', 'NAVY', 'GSA', 'DLA'.

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

2-letter state codes, e.g. 'VA', 'TX', 'DC'. Uses place of performance, or the contracting office state when no place of performance is listed.

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

Ignored when 'Posted from' is set. 0 = all active notices.

## `postedFrom` (type: `string`):

YYYY-MM-DD. Overrides 'Posted within last N days'.

## `postedTo` (type: `string`):

YYYY-MM-DD (inclusive).

## `openOnly` (type: `boolean`):

Drop notices whose response deadline has already passed. Notices without a deadline (e.g. awards, special notices) are kept.

## `deadlineWithinDays` (type: `integer`):

Only notices due in the next N days (0 = no limit). Notices without a deadline are dropped when set.

## `onlyNewSinceLastRun` (type: `boolean`):

Skip notices this Actor already delivered in earlier runs with the same monitor name. Schedule it daily to get just the fresh bids.

## `monitorName` (type: `string`):

Use a different name for each saved search you monitor.

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

Add the notice description text.

## `descriptionMaxLength` (type: `integer`):

Truncate descriptions to this many characters (0 = full text).

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

Stop after this many opportunities (0 = no limit).

## Actor input object example

```json
{
  "keywords": [
    "cybersecurity"
  ],
  "keywordsMatchAll": false,
  "searchDescription": true,
  "smallBusinessOnly": false,
  "postedWithinDays": 7,
  "openOnly": true,
  "deadlineWithinDays": 0,
  "onlyNewSinceLastRun": false,
  "monitorName": "default",
  "includeDescription": true,
  "descriptionMaxLength": 5000,
  "maxResults": 100
}
```

# Actor output Schema

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

One item per contract opportunity notice (title, agency, NAICS, PSC, set-aside, posted date, response deadline, place of performance, award info, SAM.gov link, description).

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

Source file, notices scanned, date window, number saved and the filters used.

# 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": [
        "cybersecurity"
    ],
    "maxResults": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("delgadolegacy/samgov-opportunities").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": ["cybersecurity"],
    "maxResults": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("delgadolegacy/samgov-opportunities").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": [
    "cybersecurity"
  ],
  "maxResults": 100
}' |
apify call delgadolegacy/samgov-opportunities --silent --output-dataset

```

## MCP server setup

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

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/hdW40SiqhP7ifQmdv/builds/RT8m1P90bXTpgvuXv/openapi.json
