# SAM.gov Contract Opportunities: federal tenders, no API key (`steadydata/sam-gov-contract-opportunities`) Actor

US federal contract opportunities from SAM.gov by keyword: solicitations, sources sought, presolicitations and awards with agency, NAICS, set-aside, deadline, place of performance and award amount. Read from GSA's official daily public extract: no API key, no daily quota. Pay per notice.

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

## Pricing

from $1.30 / 1,000 notice listeds

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 Contract Opportunities: federal tenders, no API key

US federal contract opportunities from SAM.gov by keyword: solicitations, sources sought, presolicitations and awards with agency, NAICS, set-aside, deadline, place of performance and award amount. Read from GSA's official daily public extract: no API key, no daily quota. Pay per notice.

### Why this scraper

- **No API key and no daily quota.** The official SAM.gov API allows a public key about ten calls a day. This actor reads GSA's official public extract instead (the Contract Opportunities dataset on data.gov), so a run over 60 days and fifty searches is one download, not hundreds of API calls.
- **A legal source.** SAM.gov's terms forbid scraping the website and its search; this actor only reads the file GSA publishes for exactly this use.
- **Fast and stable.** Measured on 03-10-2026: a seven-day window held 6,270 notices and was read in 16 seconds. No browser, no login, no proxy.
- **No personal data.** The contact person columns of the extract are never read into a row, and email addresses and phone numbers inside notice texts are masked (1,036 of 6,270 texts carried one).
- **Only delivered notices are charged.** A search without matches comes back as a free error row with the reason.

### Who this is for

- Government contractors and small businesses watching for new solicitations in their NAICS codes, set-asides or states.
- Bid and capture teams, consultants and GovCon newsletters that need the week's opportunities as data.
- Analysts tracking awards: winning company, amount and date on award notices.

### Who this is not for

**Read this before you buy.** This actor covers notices posted in the last 60 days at most; it is not a historical archive. It does not deliver the names, emails or phone numbers of contracting officers: open the notice on SAM.gov through its `url` for those. Attachments (solicitation documents) are not downloaded. The extract is refreshed once a day by GSA, so a notice posted this afternoon appears in tomorrow's runs.

### Input fields

| Field | Type | Required or default | What it does |
|---|---|---|---|
| `searches` | list of text | required | One search per row, up to 50: keywords that must all appear in the title or description (for example 'cybersecurity' or 'roof repair'), or \* for every notice that passes the filters below. |
| `postedWithinDays` | number | 7 | Only notices posted in the last N days, 1 to 60. |
| `noticeTypes` | list of text |  | Only these types, for example Solicitation, Combined Synopsis/Solicitation, Presolicitation, Sources Sought, Award Notice, Special Notice. Empty means all. |
| `naicsCodes` | list of text |  | Only these NAICS codes; a prefix such as 5415 also matches 541512. Empty means all. |
| `setAsideCodes` | list of text |  | Only these set-asides, for example SBA, 8A, WOSB, SDVOSBC, HZC. Empty means all. |
| `agencies` | list of text |  | Only notices whose department, sub-tier or office contains one of these, for example 'army' or 'veterans affairs'. Empty means all. |
| `states` | list of text |  | Two-letter state codes such as TX or VA. Empty means all. |
| `activeOnly` | true/false | true | Skip notices SAM.gov marks as inactive. |
| `openForResponsesOnly` | true/false | false | Only notices whose response deadline is today or later. |
| `includeDescription` | true/false | true | Add the notice text (up to 20,000 characters). |
| `maxNoticesPerSearch` | number | 200 | Cost ceiling per search, newest first. |

### Input example

```json
{
    "searches": ["cybersecurity", "*"],
    "postedWithinDays": 7,
    "naicsCodes": ["5415"],
    "setAsideCodes": ["SBA"],
    "openForResponsesOnly": true,
    "maxNoticesPerSearch": 200
}
```

### Output example

| Field | Type | What it holds | Example |
|---|---|---|---|
| `search` | text | The search this row was found with: the keywords, or \* for every notice that passed the filters. | `cybersecurity` |
| `noticeId` | text | SAM.gov's own ID of the notice. | `d04fee51de354a87bd48c2404aedc15c` |
| `title` | text | The title of the notice as the agency wrote it. | `Test Evaluation and Technical Support Services (TETSS)` |
| `solicitationNumber` | text | The agency's solicitation number, when it has one. |  |
| `noticeType` | text | Solicitation, Combined Synopsis/Solicitation, Presolicitation, Sources Sought, Award Notice, Special Notice and so on. | `Special Notice` |
| `baseType` | text | The type the notice was first posted as; differs from noticeType after an amendment. |  |
| `postedDate` | text | When the notice was posted, ISO 8601. | `2026-10-02T13:30:22` |
| `responseDeadline` | text | When offers or responses are due, ISO 8601 with the agency's time zone. | `2026-10-14T17:00:00-04:00` |
| `archiveDate` | text | When SAM.gov archives the notice. |  |
| `active` | true/false | Whether SAM.gov lists the notice as active. |  |
| `department` | text | The department or independent agency. | `DEPT OF DEFENSE` |
| `subTier` | text | The sub-tier agency, for example DEPT OF THE ARMY. | `DEPT OF THE ARMY` |
| `office` | text | The contracting office. |  |
| `naicsCode` | text | The NAICS industry code of the requirement. | `541330` |
| `classificationCode` | text | The product or service code (PSC). |  |
| `setAsideCode` | text | Short code of the set-aside, for example SBA or SDVOSBC. |  |
| `setAside` | text | The set-aside in words, for example Total Small Business Set-Aside. | `No Set aside used` |
| `placeOfPerformanceCity` | text | City where the work is performed. |  |
| `placeOfPerformanceState` | text | Two-letter state where the work is performed. | `TX` |
| `placeOfPerformanceZip` | text | ZIP code where the work is performed. |  |
| `placeOfPerformanceCountry` | text | Country where the work is performed. |  |
| `awardNumber` | text | Contract number, on award notices. |  |
| `awardDate` | text | Date of the award, on award notices. |  |
| `awardAmount` | number | Award value in US dollars as a number, on award notices. |  |
| `awardee` | text | The company that won, on award notices. |  |
| `officeCity` | text | City of the contracting office. |  |
| `officeState` | text | State of the contracting office. |  |
| `officeCountry` | text | Country of the contracting office. |  |
| `additionalInfoLink` | text | Extra link the agency added, when there is one. |  |
| `url` | text | The notice on SAM.gov. | `https://sam.gov/workspace/contract/opp/d04fee51de354a87bd...` |
| `description` | text | The notice text, up to 20,000 characters; email addresses and phone numbers are masked. |  |

A real row from a run on 03-10-2026 (description shortened):

```json
{
  "search": "*",
  "noticeId": "d04fee51de354a87bd48c2404aedc15c",
  "title": "Test Evaluation and Technical Support Services (TETSS)",
  "solicitationNumber": null,
  "noticeType": "Special Notice",
  "baseType": "Special Notice",
  "postedDate": "2026-10-02T13:30:22",
  "responseDeadline": "2026-10-14T17:00:00-04:00",
  "archiveDate": "2026-10-29",
  "active": true,
  "department": "DEPT OF DEFENSE",
  "subTier": "DEPT OF THE ARMY",
  "office": "W6QM MICC-FDO FT HOOD",
  "naicsCode": "541330",
  "classificationCode": "R425",
  "setAsideCode": "NONE",
  "setAside": "No Set aside used",
  "placeOfPerformanceCity": "Fort Hood",
  "placeOfPerformanceState": "TX",
  "placeOfPerformanceZip": "76544",
  "placeOfPerformanceCountry": "USA",
  "awardNumber": null,
  "awardDate": null,
  "awardAmount": null,
  "awardee": null,
  "officeCity": "FORT HOOD",
  "officeState": "TX",
  "officeCountry": "USA",
  "additionalInfoLink": null,
  "url": "https://sam.gov/workspace/contract/opp/d04fee51de354a87bd48c2404aedc15c/view",
  "description": "NOTICE OF INTENT TO SOLE SOURCE. This is a Notice of Intent to Sole Source published in ..."
}
```

Error codes: `INVALID_INPUT`, `NO_RESULTS`, `BAD_SOURCE`, `DUPLICATE_INPUT`, `BLOCKED`.

### Related actors from steadydata

- [eu-tenders](https://apify.com/steadydata/eu-tenders): the same for EU-wide notices on TED
- [uk-contracts-finder](https://apify.com/steadydata/uk-contracts-finder): UK public sector tenders and awards
- [sec-edgar-filings](https://apify.com/steadydata/sec-edgar-filings): official filings of a US-listed awardee

### Pricing

Pay per event: one `notice-listed` event per delivered notice. No charge for searches without matches, no separate platform-usage surcharge, and one download of the extract serves every search in the run.

**Free Apify plan:** this actor delivers up to 25 rows per run for accounts on the Apify free plan, and then stops with a message. That limit is set by us, not by Apify. Any paid Apify plan runs it at full size, billed per delivered row.

### FAQ

**Do I need a SAM.gov account or API key?** No. The actor reads the public extract GSA publishes daily.

**How fresh is the data?** GSA refreshes the extract once a day, early in the morning US time. Notices posted after that appear the next day.

**How do keyword searches match?** Every word must appear in the title or the notice text, case-insensitive. Use `*` to take everything that passes the filters.

**Can I get only open solicitations for my NAICS code?** Yes: put the code (or a prefix) in `naicsCodes`, set `noticeTypes` to Solicitation and Combined Synopsis/Solicitation, and switch on `openForResponsesOnly`.

**Is personal data collected?** No. Contact names, emails, phones and faxes of contracting officers are dropped, and email addresses and phone numbers inside notice texts are masked. Awardees are companies.

**What happens when the source changes?** The actor is monitored daily. If GSA changes the file, runs return a clear BAD_SOURCE error row instead of wrong data, and you are not charged.

# Changelog

This Actor's version history is a separate document: https://apify.com/steadydata/sam-gov-contract-opportunities/changelog.md

# Actor input Schema

## `searches` (type: `array`):

One search per row, up to 50: keywords that must all appear in the title or description (for example 'cybersecurity' or 'roof repair'), or \* for every notice that passes the filters below.

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

Only notices posted in the last N days, 1 to 60.

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

Only these types, for example Solicitation, Combined Synopsis/Solicitation, Presolicitation, Sources Sought, Award Notice, Special Notice. Empty means all.

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

Only these NAICS codes; a prefix such as 5415 also matches 541512. Empty means all.

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

Only these set-asides, for example SBA, 8A, WOSB, SDVOSBC, HZC. Empty means all.

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

Only notices whose department, sub-tier or office contains one of these, for example 'army' or 'veterans affairs'. Empty means all.

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

Two-letter state codes such as TX or VA. Empty means all.

## `activeOnly` (type: `boolean`):

Skip notices SAM.gov marks as inactive.

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

Only notices whose response deadline is today or later.

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

Add the notice text (up to 20,000 characters).

## `maxNoticesPerSearch` (type: `integer`):

Cost ceiling per search, newest first.

## Actor input object example

```json
{
  "searches": [
    "cybersecurity",
    "construction"
  ],
  "postedWithinDays": 7,
  "activeOnly": true,
  "openForResponsesOnly": false,
  "includeDescription": true,
  "maxNoticesPerSearch": 200
}
```

# Actor output Schema

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

No description

# 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 = {
    "searches": [
        "cybersecurity",
        "construction"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("steadydata/sam-gov-contract-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 = { "searches": [
        "cybersecurity",
        "construction",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("steadydata/sam-gov-contract-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 '{
  "searches": [
    "cybersecurity",
    "construction"
  ]
}' |
apify call steadydata/sam-gov-contract-opportunities --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,steadydata/sam-gov-contract-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/hH5pw3OskMQHVbm2J/builds/Wn8zcqJm9hbDeDEky/openapi.json
