# US Government Bids & RFPs Aggregator (`talcoe/us-government-bids-rfps`) Actor

Open bids, RFPs and RFQs from US state, county and city procurement portals (BidNet Direct, DemandStar, Bonfire, PlanetBids, OpenGov) plus SAM.gov, normalized into one feed: agency, state, due date, category, documents. Filter by keyword and state. Pay per bid.

- **URL**: https://apify.com/talcoe/us-government-bids-rfps.md
- **Developed by:** [M Usama](https://apify.com/talcoe) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $6.00 / 1,000 bid returneds

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?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

### What does US Government Bids & RFPs Aggregator do?

It collects **open government bids, RFPs, RFQs and IFBs** from the procurement portals where US federal, state, county, city and school district agencies actually post them, and returns them as **one normalized feed**: title, agency, state, posted date, due date, notice type, solicitation number, NAICS, set-aside, description, contact and document links.

Sources in this version:

- **[BidNet Direct](https://www.bidnetdirect.com/)**: state and local solicitations across all 50 states (the public listing: title, state, dates, bid page)
- **[SAM.gov](https://sam.gov/)**: every active federal contract opportunity, with place of performance, NAICS, set-aside, point of contact and attachment download links
- **Bonfire agency portals** (`*.bonfirehub.com`): counties, cities, school districts, transit and water authorities that run their own Bonfire portal. The Actor ships with a directory of 68 agencies across 30 states (Harris County, City of Dallas, Cook County, Fairfax County, Broward, Chicago Public Schools, Suffolk County NY and more), so you do not need to know the portal addresses

Filter by **keyword** and **state**, cap the number of results, and run it on a schedule so new bids land in your CRM, Slack, Google Sheets or email every morning through Apify integrations.

### Why use it?

Bid alert subscriptions cost hundreds of dollars a month and each one covers a single portal family. This Actor gives government sales teams, contractors, consultancies, grant writers and market researchers a single API over several portal families, priced **per bid returned**, with no seats and no login to any portal.

Typical uses:

- **B2G lead generation**: janitorial, landscaping, HVAC, paving, IT services, consulting, staffing, security, fleet, software
- **Competitive intelligence**: which agencies are buying what, how often, and with what deadlines
- **Bid pipelines**: schedule a daily run per territory and push new opportunities to Salesforce, HubSpot, Airtable or a spreadsheet
- **Research**: procurement volume by state, agency type or category over time

### How to find government bids and RFPs with this Actor

1. Open the Actor and enter one or more **keywords** (for example `janitorial`, `snow removal`, `cybersecurity`). Leave it empty to get every open bid.
2. Add the **states** you sell in as two letter codes, or leave empty for the whole country.
3. Pick the **sources** you want. Federal only? Choose SAM.gov. Local only? BidNet and Bonfire.
4. Set **Posted within (days)** so you only pay for fresh bids, and **Max results** to cap the run.
5. Click **Start**. Download the results from the Output tab as JSON, CSV, Excel or HTML, or read them through the API.
6. To automate, add a **Schedule** (for example every morning at 7:00) and an **Integration** (Slack, email, Google Sheets, webhook).

### Input

| Field | Description |
|---|---|
| `keywords` | Words or phrases matched against title, description and category. Any match qualifies. |
| `states` | Two letter US state codes. Empty means all. |
| `sources` | `bidnet`, `sam`, `bonfire`. (`demandstar`, `planetbids`, `opengov` are on the roadmap.) |
| `postedWithinDays` | Only bids published in the last N days. 0 disables the cutoff. |
| `includeClosed` | Include bids whose due date has passed. Off by default. |
| `includeDetails` | Open each bid to capture full description, contact and documents (SAM.gov) and exact closing time (BidNet). On by default. |
| `maxResults` | Hard stop for the run. |
| `proxyConfiguration` | Apify proxy is recommended for larger runs. |

Example input:

```json
{
    "keywords": ["janitorial", "custodial"],
    "states": ["NY", "NJ", "CT"],
    "sources": ["bidnet", "sam", "bonfire"],
    "postedWithinDays": 14,
    "maxResults": 300
}
```

### Output

Every record has the same shape regardless of source:

```json
{
    "id": "sam:eeb29ec6ed904338807efd289ffdcb6c",
    "source": "sam",
    "title": "Janitorial Service, Cabo Rojo National Wildlife Refuge",
    "agency": "INTERIOR, DEPARTMENT OF THE / U.S. FISH AND WILDLIFE SERVICE",
    "agencyType": "federal",
    "state": "PR",
    "city": "Cabo Rojo",
    "postedDate": "2026-09-14T13:22:31+00:00",
    "dueDate": "2026-09-18T19:00:00+00:00",
    "status": "open",
    "noticeType": "Solicitation",
    "solicitationNumber": "140FS326Q0154",
    "category": "S201",
    "naics": ["561720"],
    "setAside": "SBA",
    "description": "Janitorial Services, option year contract...",
    "documents": [
        { "name": "Sol_140FS326Q0154.pdf", "url": "https://sam.gov/api/prod/opps/v3/opportunities/resources/files/.../download" }
    ],
    "contact": { "name": "Jane Doe", "email": "jane.doe@fws.gov", "phone": "(555) 555-5555" },
    "url": "https://sam.gov/opp/eeb29ec6ed904338807efd289ffdcb6c/view",
    "scrapedAt": "2026-09-14T22:10:00.000Z"
}
```

| Field | Meaning |
|---|---|
| `id` | Stable key `source:sourceId`, safe for deduplication between runs |
| `title`, `agency`, `agencyType` | Agency type is one of federal, state, county, city, school, authority, other |
| `state`, `city` | Place of performance when the portal publishes it, otherwise the issuing office |
| `postedDate`, `dueDate`, `status` | ISO dates; status is open, closed or unknown |
| `noticeType` | RFP, RFQ, IFB, RFI, Sources Sought, Solicitation and similar |
| `solicitationNumber`, `category`, `naics`, `setAside` | Filled where the source publishes them |
| `description`, `documents`, `contact` | Full text, attachment links and buyer contact where public |
| `url` | The bid page on the source portal |

Field coverage differs by source. SAM.gov records are complete. BidNet Direct shows agency, description and documents only to registered members, so those records carry title, state, dates, purchasing network and the bid page URL. Bonfire portals publish title, reference number, due date and agency on the public list; the detail page (description, documents) sits behind a bot challenge and is on the roadmap.

### How much does it cost to scrape government bids?

Pricing is **pay per event**: a small fee when a run starts, then a fixed price for every bid returned. You only pay for records that pass your keyword, state and date filters. A daily run returning 100 fresh bids costs well under a dollar. Set `maxResults` to cap any run.

### Tips

- Use several short keywords rather than one long phrase; matching is case insensitive substring.
- `postedWithinDays: 1` on a daily schedule gives you only what is new since yesterday.
- Turn `includeDetails` off for the cheapest possible scan of titles and deadlines, then rerun with details for the shortlist.
- Dedupe across runs on the `id` field.

### FAQ and limitations

**Is this legal?** The Actor reads public listings that the portals publish for any visitor without a login. It stores no personal data beyond the buyer contact that agencies publish for that purpose. You are responsible for how you use the data.

**Why is a bid missing?** DemandStar requires a login and is not included. Some Bonfire portals sit behind a bot challenge; the Actor retries with fresh sessions and skips a portal after repeated blocks. OpenGov and PlanetBids portals are on the roadmap.

**Can you add my state portal or another source?** Yes. Open an issue in the Issues tab with the portal URL.

Found a problem or need a custom feed? Use the **Issues** tab; response time is usually under a day.

# Actor input Schema

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

Words or phrases to match in the bid title or description, e.g. "janitorial", "HVAC", "software", "paving". Leave empty to return every open bid in the selected sources and states.

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

Two letter US state codes to include, e.g. NY, NJ, CA. Leave empty for all states.

## `sources` (type: `array`):

Which procurement portals to search. Each source is a different family of state, county and city portals.

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

Only return bids published in the last N days. 0 = no limit (all open bids).

## `includeClosed` (type: `boolean`):

By default only bids whose due date has not passed are returned.

## `includeDetails` (type: `boolean`):

Open each bid page to capture the full description, contact and document links. Slower, but each record is complete.

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

Stop after this many unique bids across all sources. Controls your spend.

## `proxyConfiguration` (type: `object`):

Apify proxy is recommended for BidNet and DemandStar at higher volumes.

## Actor input object example

```json
{
  "keywords": [
    "janitorial",
    "landscaping"
  ],
  "states": [
    "NY",
    "NJ"
  ],
  "sources": [
    "bidnet",
    "sam",
    "bonfire"
  ],
  "postedWithinDays": 30,
  "includeClosed": false,
  "includeDetails": true,
  "maxResults": 500,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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 = {
    "keywords": [
        "janitorial",
        "landscaping"
    ],
    "states": [
        "NY",
        "NJ"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("talcoe/us-government-bids-rfps").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": [
        "janitorial",
        "landscaping",
    ],
    "states": [
        "NY",
        "NJ",
    ],
}

# Run the Actor and wait for it to finish
run = client.actor("talcoe/us-government-bids-rfps").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": [
    "janitorial",
    "landscaping"
  ],
  "states": [
    "NY",
    "NJ"
  ]
}' |
apify call talcoe/us-government-bids-rfps --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,talcoe/us-government-bids-rfps"
        }
    }
}
```

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/S1MobMqH0KLBGrD95/builds/EYsaDRbUW5JTLhGB6/openapi.json
