# SAM.gov Contract Opportunities: New Federal Bids & RFPs Feed (`stromation/samgov-bids-feed`) Actor

New federal bids and RFPs from SAM.gov, filtered by keyword, NAICS, set-aside (8(a), HUBZone, SDVOSB, WOSB), state and agency. Amendments folded, only-new monitor mode. Reads the official daily SAM.gov file, so it does not break when the website changes.

- **URL**: https://apify.com/stromation/samgov-bids-feed.md
- **Developed by:** [Stromation LLC](https://apify.com/stromation) (community)
- **Categories:** Lead generation, Business, Automation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 bid delivereds

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: New Federal Bids & RFPs Feed

Get **new federal bids, RFPs, RFQs and sources-sought notices from SAM.gov**, filtered to the work you actually do: keywords, NAICS, PSC, set-aside (small business, 8(a), HUBZone, SDVOSB, WOSB), place-of-performance state and agency. Each row has the response deadline, days left, set-aside, place of performance, the contracting officer's official contact and the SAM.gov link.

**Built not to break.** Most SAM.gov scrapers read the website, and when the site changes their runs fail. This actor reads the **official public SAM.gov daily data file** that the government publishes for download. It does not use a browser, a proxy or a login, and it needs no API key. A run usually finishes in **3 to 10 seconds**.

Try it: press **Try for free**. The prefilled input finds janitorial and custodial bids from the last 3 days.

### Who it is for

- Small businesses and contractors who want a daily list of bids they can win.
- Bid-finding services and consultants who track many clients' NAICS codes.
- Sales teams selling to federal contractors who want to see what agencies are buying.

### What you get per bid

| Field | Meaning |
|---|---|
| `title`, `solicitation_number`, `notice_type` | What is being bought and the notice type (Solicitation, Combined Synopsis/Solicitation, Presolicitation, Sources Sought, Award Notice...) |
| `agency`, `sub_agency`, `office` | Who is buying |
| `posted_at`, `response_deadline`, `days_left` | When it was posted and when offers are due (deadline in UTC ISO format) |
| `naics_code`, `psc_code` | Industry and product/service codes |
| `set_aside`, `set_aside_code`, `set_aside_group` | Who may bid: small business, 8(a), HUBZone, SDVOSB, WOSB, none |
| `place_of_performance` | City, state, ZIP, country. A blank state is filled from the ZIP code |
| `award` | For award notices: number, date, amount and winning company |
| `contacts` | The contracting officer's official name, email and phone as published on SAM.gov |
| `url` | The notice on SAM.gov (attachments live there) |
| `description` | The notice text, trimmed to your chosen length |

**Amendments are folded.** When a solicitation was amended several times in your window, you get one row with the latest version, not five near-duplicates. Turn off **Fold amendments** to see every notice.

### Monitor mode: only new bids

Turn on **Only new bids** and schedule the actor daily with **Posted in the last (days)** set to 2. Each run returns only bids you have not received before with the same filters. Repeats are skipped and free, so a quiet day costs almost nothing.

### Pricing

Pay per event: **$0.003 per bid delivered**, plus Apify's tiny start fee ($0.00005 per run). For example, 100 bids cost $0.30.

- Runs with no matches cost only the start fee.
- Bids skipped as repeats in monitor mode are free.
- Folded older amendments are free.
- Cap your spend with **Max bids** (default 200, up to 10,000) and with the run's maximum cost setting. The actor stops cleanly when either limit is reached.

### Input

```json
{
  "postedWithinDays": 7,
  "keywords": ["janitorial", "custodial"],
  "setAsides": ["small_business"],
  "states": ["TX"],
  "naicsCodes": ["5617"],
  "onlyNew": true,
  "maxItems": 200
}
```

| Field | Meaning |
|---|---|
| `postedWithinDays` | 1 to 30, default 3 |
| `keywords` / `excludeKeywords` | Match the title or the full description, any of the words |
| `naicsCodes`, `pscCodes` | Full codes or prefixes (`2382` matches all `2382xx`) |
| `setAsides` | `small_business`, `8a`, `hubzone`, `sdvosb`, `wosb`, `veteran`, `indian`, `local_area`, `none` |
| `states` | Place-of-performance states, 2-letter codes |
| `agencies` | Part of the agency or office name, e.g. `army`, `veterans affairs` |
| `noticeTypes` | Default: open opportunity types. Add `Award Notice` to see winners |
| `openOnly` | Default on: skip inactive and past-deadline notices |
| `onlyNew` | Monitor mode (see above) |
| `latestVersionOnly` | Default on: fold amendments |
| `descriptionMaxChars` | Default 3,000; 0 = no description |
| `maxItems` | Default 200, maximum 10,000 |
| `samApiKey` | Optional backup: your own SAM.gov API key. It is used only if the daily file is unavailable |

### Output example (real run, 30 October 2026)

Input: last 7 days, keywords janitorial/custodial, small-business set-aside. The run returned 4 solicitations from 6,411 notices scanned; 5 older amendments were folded.

```json
{
  "source": "sam.gov",
  "notice_id": "f1a41de4640645379247d477040a1fb3",
  "title": "Janitorial Contract Eagle Pass, TX",
  "solicitation_number": "W9126G27QA003",
  "notice_type": "Combined Synopsis/Solicitation",
  "agency": "DEPT OF DEFENSE",
  "sub_agency": "DEPT OF THE ARMY",
  "office": "W076 ENDIST FT WORTH",
  "posted_at": "2026-10-30 12:05:06",
  "response_deadline": "2026-11-05T18:00:00.000Z",
  "days_left": 5,
  "naics_code": "561720",
  "psc_code": "S201",
  "set_aside_code": "SBA",
  "set_aside": "Small Business Set Aside - Total",
  "set_aside_group": "small_business",
  "place_of_performance": { "city": null, "state": "TX", "zip": "78852", "country": null },
  "active": true,
  "award": null,
  "contacts": [{ "role": "primary", "title": null, "name": "J. A.", "email": "j...@usace.army.mil", "phone": "(817) 886-...." }],
  "url": "https://sam.gov/workspace/contract/opp/f1a41de4640645379247d477040a1fb3/view",
  "description": "This is a combined synopsis/solicitation for commercial services ... janitorial services to one (1) administrative office located in Eagle Pass, Texas ... set-aside for small business concerns."
}
```

The contact is shortened here; the actor returns the full official contact exactly as SAM.gov publishes it.

### Data source and limits

- **Source:** SAM.gov Contract Opportunities public data extract (U.S. General Services Administration). It is rebuilt about once a day, so a notice posted this morning usually shows up by the next day's file. For minute-by-minute alerts, use SAM.gov's own saved searches.
- **Coverage:** federal opportunities only, not state or city bids.
- **Attachments:** attachments are on SAM.gov; follow the `url`.
- **Contacts:** the actor never adds personal data. Contacts are the government's official points of contact for the notice.

### FAQ

**Do I need a SAM.gov account or API key?** No. The key field is only a backup.

**Why not search the SAM.gov website?** SAM.gov's terms forbid automated gathering from the website, and website scrapers break when the site changes. The daily file is the government's own bulk download, made for this.

**Can I get award notices with winners?** Yes. Add `Award Notice` to **Notice types** and turn off **Only still-open bids**.

**Something looks wrong?** Open an issue on this actor's Issues tab. A daily automatic feed check also runs on the author's side and logs any change SAM.gov makes to the file.

### More from Stromation

- [Company Dossier](https://apify.com/stromation/company-dossier): a business's identity, location and website quality in one row.
- [Bulk Website Audit](https://apify.com/stromation/bulk-website-audit): SSL, email records, tech stack and AI-search readiness for a list of sites.
- [No-Website Local Leads](https://apify.com/stromation/weak-website-local-leads): local businesses with missing or weak websites.

# Actor input Schema

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

1 to 30. For a daily monitor use 2 with "Only new bids" on.

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

A bid matches if its title or description contains any of these words or phrases. Case does not matter.

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

Skip bids whose title or description contains any of these.

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

Full codes or prefixes, e.g. 561720 or 2382 (all specialty trade contractors starting 2382).

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

Full codes or prefixes, e.g. S201 or Z2.

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

Only bids reserved for these groups. Empty = all bids, including unrestricted.

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

2-letter codes such as TX, CA. When SAM.gov leaves the state blank, it is filled from the ZIP code.

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

Part of the department, agency or office name, e.g. army, veterans affairs, NAVFAC.

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

Default: open opportunities (solicitations, combined synopsis, presolicitations, sources sought). Add Award Notice to see who won.

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

Skip notices that are inactive or whose response deadline has passed. Turn off for award notices or research.

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

Remembers what earlier runs with the same filters delivered and returns only bids you have not received yet. Repeats are free. Pair with a daily schedule.

## `latestVersionOnly` (type: `boolean`):

One row per solicitation (its latest amendment). Off = one row per notice.

## `descriptionMaxChars` (type: `integer`):

Characters of the bid description to include. 0 = no description.

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

Hard limit on bids returned (and charged) in this run. Maximum 10,000.

## `samApiKey` (type: `string`):

Only used if the official daily SAM.gov file is unavailable. Your own free key from your SAM.gov account (Account Details > API Key). Stored as a secret and sent only to api.sam.gov.

## `mode` (type: `string`):

Leave on Bids. Feed check tests the data source and returns one row (free).

## Actor input object example

```json
{
  "postedWithinDays": 3,
  "keywords": [
    "janitorial",
    "custodial"
  ],
  "noticeTypes": [
    "Solicitation",
    "Combined Synopsis/Solicitation",
    "Presolicitation",
    "Sources Sought"
  ],
  "openOnly": true,
  "onlyNew": false,
  "latestVersionOnly": true,
  "descriptionMaxChars": 3000,
  "maxItems": 25,
  "mode": "bids"
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `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 = {
    "postedWithinDays": 3,
    "keywords": [
        "janitorial",
        "custodial"
    ],
    "maxItems": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("stromation/samgov-bids-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 = {
    "postedWithinDays": 3,
    "keywords": [
        "janitorial",
        "custodial",
    ],
    "maxItems": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("stromation/samgov-bids-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 '{
  "postedWithinDays": 3,
  "keywords": [
    "janitorial",
    "custodial"
  ],
  "maxItems": 25
}' |
apify call stromation/samgov-bids-feed --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,stromation/samgov-bids-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/sHxbJi4bEzkvO4mpj/builds/ltcwzMPvLJC51Qhiu/openapi.json
