# Government Bids & RFP Scraper — US Procurement, Grants, E-Rate (`opendatafrontierlab/us-public-bids`) Actor

Open government bids, RFPs, solicitations and grants from official APIs: NYC City Record, LA RAMP, Delaware, Montgomery County MD, Illinois CDB, Baton Rouge, E-Rate Form 470, Grants.gov and optional SAM.gov. One normalized feed with deadlines and links. Daily alerts. $4 per 1,000 notices.

- **URL**: https://apify.com/opendatafrontierlab/us-public-bids.md
- **Developed by:** [OpenDataFrontierLabs](https://apify.com/opendatafrontierlab) (community)
- **Categories:** Lead generation
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $4.00 / 1,000 bid / rfp notices

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

## Government Bids & RFP Scraper: US Public Procurement, Grants.gov, E-Rate, SAM.gov

**Get open government bids, RFPs, RFQs, solicitations, forecasts and grants in one normalized feed.** Every record comes straight from official government open-data APIs: no logins, no browser automation and no personal contact data. Filter by keyword, keep only open bids and schedule daily alerts to Slack, email, Google Sheets or your CRM.

**Price:** $4 per 1,000 notices ($0.004 per notice). There is no monthly rental and you pay only for the notices returned.

**Tutorials & examples:** [Track new public bids and status changes daily](https://github.com/opendatafrontierlab/awesome-public-data-actors/blob/main/tutorials/track-daily-changes.md), plus more guides and runnable Python examples in [awesome-public-data-actors](https://github.com/opendatafrontierlab/awesome-public-data-actors) on GitHub.

### Sources covered

| Source key | What it covers |
|---|---|
| `nyc-city-record` | New York City **City Record Online** procurement notices: solicitations, intents to award, and awards (optional) |
| `los-angeles-ramp` | City of Los Angeles **RAMP** open bids (DWP, LAWA, Port, Public Works, etc.) |
| `delaware-state` | State of **Delaware** open bids, with UNSPSC codes |
| `montgomery-county-md` | **Montgomery County, MD** solicitations |
| `illinois-cdb` | **Illinois Capital Development Board** upcoming construction bids, with cost band and design firm |
| `baton-rouge-la` | **Baton Rouge / East Baton Rouge Parish** bid openings |
| `erate-form-470` | **E-Rate FCC Form 470**: K-12 schools and libraries nationwide requesting internet, Wi-Fi, cabling and firewall bids. Includes links to the RFP documents |
| `grants-gov` | **Grants.gov** federal grant opportunities, posted and forecasted |
| `sam-gov` | **SAM.gov** federal contract opportunities. Optional; requires your own free SAM.gov API key |

### What you get

- **One schema for every source.** Reference number, notice type, title, description, agency, department, category, procurement method, status, posted and due dates, estimated value, awardee business, location, notice URL and documents URL.
- **Official APIs only.** Each record carries its source dataset and license, so the feed is stable and keeps working when a portal changes its HTML.
- **Privacy-safe.** Buyer and contact names, phone numbers and emails are never mapped. Emails and phone numbers that appear in free-text descriptions are redacted automatically.
- **Built for alerts.** Use `keyword`, `openOnly`, `onlyNewSinceLastRun` and Apify Schedules to get each new bid exactly once.
- **Competitive intelligence.** Optionally include award notices (NYC City Record, SAM.gov) with awardee business name and amount.

### Who uses it

| You are… | Use it to… |
|---|---|
| IT, MSP, software or telecom vendor | Catch new RFPs for software, networking, cybersecurity, Wi-Fi and cabling (`keyword: "network"`) |
| E-Rate service provider | Watch new FCC Form 470 filings from K-12 schools and libraries nationwide |
| Construction, facilities or janitorial contractor | Find paving, HVAC, roofing, custodial and capital-project bids (Illinois CDB, LA, NYC) |
| Nonprofit, university or researcher | Track new and forecasted federal grants on Grants.gov |
| Bid-alert newsletter, procurement SaaS or AI agent | Get a structured, de-duplicated opportunity feed with links to the official notice |

### How to use it

1. Click **Try for free** and choose sources (or `all`).
2. Optionally set a `keyword` (e.g. `software`, `HVAC`, `paving`, `fiber`, `janitorial`) and `daysBack`.
3. Click **Start**. Most runs finish in under 30 seconds. Export to **Excel, CSV or JSON**, or connect to your tools.
4. For daily bid alerts, save a **Task** with `onlyNewSinceLastRun: true` and add a **Schedule**.

### Input example

```json
{ "sources": ["nyc-city-record", "los-angeles-ramp", "erate-form-470", "grants-gov"], "daysBack": 7, "keyword": "software", "openOnly": true, "onlyNewSinceLastRun": true }
```

| Field | What it does |
|---|---|
| `sources` | Source keys from the table above, or `all` |
| `daysBack` / `postedSince` | Posting-date window |
| `keyword` | Full-text filter sent to each source's search API (matching is done by the source) |
| `openOnly` | Drops notices whose due date has passed (default on) |
| `includeAwards` | Adds award notices with awardee and amount |
| `maxItemsPerSource`, `maxItems` | Spending caps; you pay only per notice returned |
| `onlyNewSinceLastRun` | Skips notices returned by earlier runs |
| `samGovApiKey` | Your free SAM.gov public API key (only for the `sam-gov` source) |
| `includeDescriptions` | Includes the agency-written notice text (contact details redacted) |

### Output example (real records)

```json
{
  "id": "los-angeles-ramp:232776:Solicitation",
  "sourceKey": "los-angeles-ramp",
  "sourceName": "City of Los Angeles \u2014 RAMP open bids",
  "level": "local",
  "referenceNumber": "232776",
  "noticeType": "Solicitation",
  "title": "90927 Large Power Transformers for Various Substations",
  "description": null,
  "agency": "City of Los Angeles",
  "department": "Water & Power",
  "subDepartment": null,
  "category": "Commodity",
  "procurementMethod": "RFP - Request For Proposal",
  "classificationCodes": null,
  "classificationSystem": null,
  "status": "Open",
  "postedDate": "2026-10-29",
  "dueDate": "2026-12-16T22:00:00",
  "dueTimeLocal": null,
  "estimatedValue": null,
  "estimatedValueText": null,
  "awardeeBusinessName": null,
  "designFirm": null,
  "quantity": null,
  "setAside": null,
  "locationCity": null,
  "locationState": "CA",
  "url": "https://www.rampla.org/s/opportunity-details?id=006Ql00000nmazRIAQ",
  "documentsUrl": null,
  "source": {
    "portal": "data.lacity.org",
    "datasetId": "hf3r-utnq",
    "datasetUrl": "https://data.lacity.org/d/hf3r-utnq",
    "license": "City of Los Angeles Open Data Terms of Use"
  },
  "scrapedAt": "2026-10-29T18:34:12+00:00"
}
```

```json
{
  "id": "erate-form-470:270002130-1:Solicitation",
  "sourceKey": "erate-form-470",
  "sourceName": "E-Rate (USAC/FCC) \u2014 Form 470 school & library tech bids",
  "level": "federal-program",
  "referenceNumber": "270002130-1",
  "noticeType": "Solicitation",
  "title": "tusd_2027_470_c2_new_cabling",
  "description": "Please see attached RFP documents (27-029-TUSD1) for further details and response instructions. Please also reference https://secure.procurenow.com/portal/tusd1.The Applicant selects SPI invoicing mode.",
  "agency": "Tucson Unified School District",
  "department": "School District",
  "subDepartment": null,
  "category": "Category 2 / Internal Connections / Cabling",
  "procurementMethod": "E-Rate Form 470 competitive bidding",
  "classificationCodes": null,
  "classificationSystem": null,
  "status": "Certified",
  "postedDate": "2026-10-28",
  "dueDate": "2026-11-25T00:00:00",
  "dueTimeLocal": null,
  "estimatedValue": null,
  "estimatedValueText": null,
  "awardeeBusinessName": null,
  "designFirm": null,
  "quantity": "53130 Feet",
  "setAside": null,
  "locationCity": "Tucson",
  "locationState": "AZ",
  "url": "https://publicdata.usac.org/EPC/Prd/Form470/270002130/143120/22836057-USAC_FCC_FORM_470_APPLICATION_270002130_CERTIFIED.pdf",
  "documentsUrl": "https://publicdata.usac.org/EPC/Prd/Form470/270002130/143120/22835651-cabling_services_for_e_rate_funding_year_27_28_20261028_215021.pdf",
  "documentUrls": [
    "https://publicdata.usac.org/EPC/Prd/Form470/270002130/143120/22835651-cabling_services_for_e_rate_funding_year_27_28_20261028_215021.pdf",
    "https://publicdata.usac.org/EPC/Prd/Form470/270002130/143120/22835656-Site%20Walk%20Schedule.pdf",
    "https://publicdata.usac.org/EPC/Prd/Form470/270002130/143120/22835657-APPENDIX_A_Pricing_Spreadsheet.xlsx"
  ],
  "source": {
    "portal": "datahub.usac.org",
    "datasetId": "jt8s-3q52",
    "datasetUrl": "https://datahub.usac.org/d/jt8s-3q52",
    "license": "USAC Open Data (public domain U.S. Government work)"
  },
  "scrapedAt": "2026-10-29T18:34:12+00:00"
}
```

### Pricing and cost examples

Pay per event: **$0.004 per notice returned** plus a tiny Actor-start fee ($0.00005). Platform compute is included in the price.

| Scenario | Notices | Cost |
|---|---|---|
| Daily keyword alert across all sources | ~10–50 | ~$0.04–$0.20 per day |
| Full 14-day pull, all no-key sources | ~200–800 | ~$0.80–$3.20 |
| Weekly E-Rate Form 470 scan | ~100–300 | ~$0.40–$1.20 |

Set `maxItems` to cap spending on any run. Apify's free plan includes monthly credit for testing.

### Integrations

- **API and SDKs:** call it from any language with the [Apify API](https://docs.apify.com/api/v2) or the `apify-client` libraries for JavaScript and Python. `run-sync-get-dataset-items` returns notices in a single call.
- **Zapier, Make, n8n:** e.g. "new bids matching 'fiber' → Slack channel + Google Sheet + HubSpot deal".
- **AI agents (MCP):** connect Claude, Cursor or any MCP client through the [Apify MCP server](https://mcp.apify.com) (`opendatafrontierlab/us-public-bids`), so your agent can ask "find open network-cabling RFPs due next month". LangChain, LlamaIndex and CrewAI integrations are also available.
- **Webhooks:** trigger your pipeline when a run finishes.

Python example:

```python
from apify_client import ApifyClient
client = ApifyClient("<YOUR_APIFY_TOKEN>")
run = client.actor("opendatafrontierlab/us-public-bids").call(run_input={"sources": ["all"], "keyword": "cybersecurity", "daysBack": 7})
for bid in client.dataset(run.default_dataset_id).iterate_items():
    print(bid["dueDate"], bid["agency"], bid["title"], bid["url"])
```

### FAQ

**Is this legal to use?** Yes. All records come from official government open-data APIs published for public reuse. Each record cites its dataset and license. Always confirm deadlines and requirements on the official notice page (`url`).

**Does it cover SAM.gov?** Yes, if you add your own free SAM.gov public API key (SAM.gov → Account Details → Public API Key). Federal rate limits apply to your key. Grants.gov needs no key.

**How fresh is it?** Freshness follows each source. Most update daily; NYC City Record and E-Rate update several times a day.

**Why do some notices have no posted date?** Illinois CDB and Baton Rouge don't publish one. For those sources the Actor returns all upcoming items, soonest due date first.

**Will I get the same notice twice?** No, not in one run. E-Rate requests with several RFP documents are returned once, with every document in `documentUrls` (`documentsUrl` keeps the first one). NYC City Record notices are identified by their own request ID, so a solicitation and a later addendum or award for the same PIN are separate notices. With `onlyNewSinceLastRun`, notices you already received are skipped.

**Can I get buyer contact names or emails?** No. Personal contact data is deliberately excluded and redacted. Use the official notice link to respond.

**Can you add my state or city?** Open an issue on the Actor's Issues tab. Any official procurement dataset with an open API can usually be added.

### Related Actors

- [PDF to Markdown & RAG Chunks](https://apify.com/opendatafrontierlab/pdf-to-markdown-rag): turn 200-page RFP packages into searchable sections with page citations.
- [Building Permits Scraper](https://apify.com/opendatafrontierlab/us-building-permits): construction leads from 12 cities' permit data.

*This Actor is not affiliated with any government agency.*

# Changelog

This Actor's version history is a separate document: https://apify.com/opendatafrontierlab/us-public-bids/changelog.md

# Actor input Schema

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

Official sources to query. Use keys like 'nyc-city-record', 'los-angeles-ramp', 'erate-form-470', 'grants-gov', or 'all'. 'sam-gov' runs only when you add a SAM.gov API key.

## `daysBack` (type: `integer`):

Return notices posted in the last N days (e.g. 1 for daily alerts). Ignored when 'Posted since' is set. Sources without a posting date (Illinois CDB, Baton Rouge) return all upcoming items.

## `postedSince` (type: `string`):

Optional absolute start date, format YYYY-MM-DD (e.g. 2026-10-01). Overrides 'Posted in the last N days'.

## `keyword` (type: `string`):

Optional full-text filter sent to each source, e.g. 'software', 'cybersecurity', 'HVAC', 'paving', 'fiber', 'janitorial'. One word or phrase.

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

Drop solicitations whose due date is already past.

## `includeAwards` (type: `boolean`):

Include contract-award notices (NYC City Record, SAM.gov) with awardee business name and amount — useful for competitive intelligence.

## `maxItemsPerSource` (type: `integer`):

Cap per source (newest first).

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

Maximum notices across all sources. You are charged $0.004 per notice returned, so this is your spending cap.

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

Skip notices returned by previous runs — ideal for scheduled daily alerts.

## `samGovApiKey` (type: `string`):

Free key from your SAM.gov account (Account Details → Public API Key). Required only for the sam-gov source.

## `includeDescriptions` (type: `boolean`):

Agency-written notice text. E-mail addresses and phone numbers are automatically redacted; turn off to drop free text entirely.

## Actor input object example

```json
{
  "sources": [
    "los-angeles-ramp",
    "delaware-state",
    "montgomery-county-md",
    "nyc-city-record",
    "illinois-cdb",
    "baton-rouge-la",
    "erate-form-470",
    "grants-gov"
  ],
  "daysBack": 14,
  "openOnly": true,
  "includeAwards": false,
  "maxItemsPerSource": 300,
  "maxItems": 2000,
  "onlyNewSinceLastRun": false,
  "includeDescriptions": true
}
```

# Actor output Schema

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

Normalized bid / RFP / grant notices, one item per notice.

# 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 = {
    "sources": [
        "los-angeles-ramp",
        "delaware-state",
        "montgomery-county-md",
        "nyc-city-record",
        "illinois-cdb",
        "baton-rouge-la",
        "erate-form-470",
        "grants-gov"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("opendatafrontierlab/us-public-bids").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 = { "sources": [
        "los-angeles-ramp",
        "delaware-state",
        "montgomery-county-md",
        "nyc-city-record",
        "illinois-cdb",
        "baton-rouge-la",
        "erate-form-470",
        "grants-gov",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("opendatafrontierlab/us-public-bids").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 '{
  "sources": [
    "los-angeles-ramp",
    "delaware-state",
    "montgomery-county-md",
    "nyc-city-record",
    "illinois-cdb",
    "baton-rouge-la",
    "erate-form-470",
    "grants-gov"
  ]
}' |
apify call opendatafrontierlab/us-public-bids --silent --output-dataset

```

## MCP server setup

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

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/2gaTdgbq0TUEKg5fs/builds/gjEeID0F1e5fPaAUZ/openapi.json
