# SAM.gov Contract Opportunities – Federal Bids & RFP Alerts (`gazidev/sam-gov-contract-opportunities`) Actor

Federal contract opportunities from the official SAM.gov public data extract: solicitations, RFPs, sources sought and award notices with NAICS, set-aside, deadline, place of performance and contracting officer email. Filter by keyword, NAICS, state, agency. $2 per 1,000 notices.

- **URL**: https://apify.com/gazidev/sam-gov-contract-opportunities.md
- **Developed by:** [Cemal Atakli](https://apify.com/gazidev) (community)
- **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 – Federal Bids & RFP Alerts

Find US federal contract opportunities (solicitations, RFPs, RFQs, sources sought, presolicitations and award notices) from **SAM.gov**, the official US government system for contract opportunities. Filter by keyword, NAICS code, set-aside, state, agency and deadline, and get the contracting officer's name, email and phone with every notice.

No SAM.gov account or API key needed. Data comes from the **official SAM.gov public data extract** (Contract Opportunities, published daily by GSA as public data). No website scraping.

**$2 per 1,000 notices.** You pay only for notices saved to your dataset.

### What you can do with it

- **Daily bid alerts**: schedule it every morning with your NAICS codes and **Only new notices** on, and get just the notices you have not seen yet.
- **Find open bids** in your trade: janitorial, construction, IT services, security guards, landscaping, medical supplies.
- **Small-business set-asides**: 8(a), HUBZone, SDVOSB, WOSB and total small business set-asides.
- **Competitor and market research**: award notices show who won, the award amount and the award date.
- **Lead lists**: contracting officer contacts by agency and state.

### Input examples

Open janitorial bids from the last 7 days:

```json
{
  "postedWithinDays": 7,
  "keywords": ["janitorial", "custodial"],
  "noticeTypes": ["solicitation", "sources-sought"],
  "openForResponsesOnly": true
}
```

IT services (NAICS 5415xx) set aside for service-disabled veteran-owned businesses in Virginia or Maryland:

```json
{
  "postedWithinDays": 14,
  "naicsCodes": ["5415"],
  "setAsides": ["sdvosb"],
  "states": ["VA", "MD"]
}
```

Awards over $1M in the last 30 days:

```json
{
  "postedWithinDays": 30,
  "noticeTypes": ["award"],
  "minAwardAmount": 1000000
}
```

Keywords match whole words in the title and description. `roof` does not match `proof`; add `*` for prefixes (`clean*` matches cleaning, cleaners). Use **Match keywords in title only** for fewer, more precise results.

### Output

One row per notice:

| Field | Example |
|---|---|
| `title` | JANITORIAL SERVICES AT FWS NATIONAL KEY DEER REFUG (titles are cut at the source) |
| `noticeType` | Solicitation / Combined Synopsis/Solicitation / Sources Sought / Award Notice ... |
| `solicitationNumber` | 140FF027Q0015 |
| `postedDate`, `responseDeadline`, `archiveDate` | 2026-10-16 13:41:15, 2026-10-22T17:00:00-04:00 |
| `agency`, `subTier`, `office`, `officeState` | INTERIOR, DEPARTMENT OF THE ... |
| `naicsCode`, `pscCode` | 561720, S201 |
| `setAside` | Small Business Set Aside - Total |
| `placeOfPerformance` | `{city, state, zip, country}` |
| `primaryContact`, `secondaryContact` | `{name, title, email, phone}` |
| `awardNumber`, `awardDate`, `awardAmount`, `awardee` | award notices only |
| `description` | plain-text notice description (trimmed to 5,000 characters by default) |
| `url` | https://sam.gov/opp/…/view |

Sample (award notice):

```json
{
  "title": "DA10--PUPPET ENTERPRISE SOFTWARE (VA-26-00062749)",
  "noticeType": "Award Notice",
  "agency": "VETERANS AFFAIRS, DEPARTMENT OF",
  "office": "TECHNOLOGY ACQUISITION CENTER NJ (36C10B)",
  "naicsCode": "541519",
  "awardDate": "2026-08-13",
  "awardAmount": 518996,
  "awardee": "V3GATE, LLC COLORADO SPRINGS 80921",
  "primaryContact": {"name": "Jennifer McCloud", "title": "Contract Specialist", "email": "Jennifer.McCloud@va.gov"},
  "url": "https://sam.gov/opp/d3243c010ba340d6ac28389d66fea056/view"
}
```

A run summary (notices scanned, saved, filtered) is stored in the `OUTPUT` record of the key-value store.

### How it works

SAM.gov publishes a daily extract of all contract opportunity notices, newest first. The Actor streams it and stops as soon as it reaches notices older than your date range, so a 1–7 day search takes seconds. About 500 new notices are posted every business day.

- The extract is refreshed once a day (early morning US time). Notices posted after the refresh appear the next day.
- Attachments (SOW, drawings) are not included; open the `url` to download them on SAM.gov.
- Some notices have no description in the extract or point to an attachment instead.

### Pricing

Pay per event: **$0.002 per notice saved** ($2 per 1,000), plus a tiny start fee. Filtered-out notices are free. Set **Max opportunities** or a maximum cost per run to cap spending; the run stops cleanly at that limit.

### Data source and terms

Contract opportunity data is US federal government public data published by the General Services Administration on SAM.gov. This Actor is not affiliated with or endorsed by SAM.gov or GSA. Always confirm deadlines and requirements on the official notice before bidding.

### Related Actors

- [Tenders Scraper & Alerts – EU TED, UK, Canada, SAM.gov](https://apify.com/gazidev/global-tender-alerts)
- [US Business Entity Search & New LLC Leads](https://apify.com/gazidev/us-business-entity-leads)
- [Building Permits Search – US City Construction Leads](https://apify.com/gazidev/building-permits-search)

# Actor input Schema

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

Notices posted in the last N days (about 500 new notices appear per business day). Ignored when *Posted on/after* is set.

## `postedAfter` (type: `string`):

YYYY-MM-DD. Overrides *Posted in the last N days*.

## `postedBefore` (type: `string`):

Optional upper bound, YYYY-MM-DD.

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

Match any of these words or phrases in the title or description (case-insensitive), e.g. `janitorial`, `cybersecurity`, `roofing`.

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

Search only notice titles (fewer, more precise matches).

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

Skip notices whose title or description contains any of these.

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

Empty = all types.

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

E.g. `541512` (computer systems design) or `236` (construction of buildings) for the whole group.

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

Product and service codes, e.g. `S201` (custodial) or `D3` (IT services).

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

Any of the selected set-aside types. Empty = all.

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

2-letter codes, e.g. `TX`, `VA`. Matches the place of performance or the contracting office state.

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

Match department, sub-tier or office names, e.g. `Veterans Affairs`, `Army`, `NASA`.

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

Active notices whose response deadline has not passed.

## `onlyWithContactEmail` (type: `boolean`):

Skip notices without a contracting officer email.

## `minAwardAmount` (type: `integer`):

For award notices: only awards of at least this value. Notices without an amount are skipped when set.

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

Full notice description as plain text.

## `maxDescriptionLength` (type: `integer`):

Trim long descriptions. 0 = no limit.

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

Skip notices returned by earlier runs with the same *State key*. Schedule the Actor daily for a bid alert feed.

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

Separate 'already seen' lists for different searches.

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

Stop after this many notices (0 = no limit). You pay per notice saved.

## Actor input object example

```json
{
  "postedWithinDays": 3,
  "keywordsInTitleOnly": false,
  "openForResponsesOnly": false,
  "onlyWithContactEmail": false,
  "includeDescription": true,
  "maxDescriptionLength": 5000,
  "onlyNew": false,
  "stateKey": "default",
  "maxResults": 20
}
```

# Actor output Schema

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

No description

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

No description

## `summary` (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 = {
    "postedWithinDays": 3,
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("gazidev/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 = {
    "postedWithinDays": 3,
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("gazidev/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 '{
  "postedWithinDays": 3,
  "maxResults": 20
}' |
apify call gazidev/sam-gov-contract-opportunities --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,gazidev/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/2kboRVuRun0LSeoO8/builds/YqJpzVGEROAp1Peiv/openapi.json
