# SLED Government Bids Scraper — Bonfire & OpenGov RFPs (`spotless_studios/sled-procurement-scraper`) Actor

Scrape open US state & local government bids and RFPs from Bonfire and OpenGov Procurement (570+ agencies). Filter by state, keyword, type, deadline. Daily new-bid alerts.

- **URL**: https://apify.com/spotless_studios/sled-procurement-scraper.md
- **Developed by:** [Spotless Studios](https://apify.com/spotless_studios) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $8.00 / 1,000 bid scrapeds

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

## SLED Government Bids Scraper — Bonfire & OpenGov RFPs

Scrape **open US state and local government bids, RFPs, RFQs, and ITBs** from **Bonfire (Euna)** and **OpenGov Procurement** — 570+ cities, counties, school districts, transit authorities, and utilities. Filter by state, keyword, solicitation type, department, and deadline, then schedule it as a **daily new-bid alert** that only charges you for bids you haven't seen.

Built for government sales / BD teams, contractors, bid-writing agencies, and GovTech market researchers who don't want to pay $5–10k/year for GovSpend-style databases.

> **Trial cost:** 25 bids ≈ **$0.20** · **Daily monitor:** often **$0.04–$0.24/day** with `onlyNewItems` (you pay only for new bids).

### What you get

| Field | Example |
|-------|---------|
| `title` | 27-01 Traffic Signal Detection Loop Assembly Installation |
| `solicitationType` / `solicitationTypeLabel` | RFP / Request for Proposal |
| `status` | open, pending, evaluation, awardPending, closed |
| `closingDate` (UTC) + `daysUntilClose` | 2026-10-20T19:00:00Z · 25 |
| `postedDate` | 2026-09-10T05:00:00Z |
| `organizationName`, `city`, `state` | Bay County, FL · Panama City · FL |
| `department` | Traffic Engineering |
| `agencyWebsite`, `agencyPhone` | http://www.co.bay.fl.us/ · (850) 248-8140 |
| `description` | Full solicitation summary (plain text) |
| `referenceId`, `addendaCount` | 27-01 · 0 |
| `portalUrl` | Direct link to the bid |
| `platform`, `uid` | opengov · opengov:baycountyfl:300165 |

### Why this scraper

- 🏛️ **Two platforms in one run** — Bonfire portals + the entire OpenGov directory.
- 🗺️ **State-wide or nationwide coverage** — "every OpenGov agency in TX and FL" is one checkbox.
- 🔔 **Monitoring mode** — remembers what it saw; scheduled runs return only new bids.
- 🎯 **Serious filters** — keywords with `/regex/`, exclude words, types, departments, days until deadline, posted within N days, statuses.
- ⚡ **Fast and cheap** — uses public JSON endpoints, no browser. 95 portals scanned in ~2 seconds in our tests.
- 🧾 **Run summary** — every run writes `RUN_SUMMARY` (saved, filtered, already seen, failed portals).

### Quick start

**Every open IT bid in Texas and Florida, closing in 5+ days**

```json
{
  "platforms": ["opengov"],
  "openGovStates": ["TX", "FL"],
  "includeKeywords": ["software", "IT services", "/cyber ?security/", "network"],
  "minDaysUntilClose": 5
}
```

**Daily construction bid alert (schedule this every morning)**

```json
{
  "platforms": ["bonfire", "opengov"],
  "bonfirePortals": ["https://harriscountytx.bonfirehub.com", "https://wake.bonfirehub.com"],
  "openGovAllAgencies": true,
  "solicitationTypes": ["ITB", "IFB", "Construction"],
  "excludeKeywords": ["sole source"],
  "onlyNewItems": true,
  "stateKey": "construction-alert"
}
```

**Everything currently under evaluation (competitive intelligence)**

```json
{ "platforms": ["opengov"], "openGovAllAgencies": true, "statuses": ["evaluation", "awardPending"] }
```

### Input reference

| Parameter | Default | What it does |
|-----------|---------|--------------|
| `platforms` | both | `bonfire`, `opengov` |
| `bonfirePortals` | 3 samples | Bonfire portal URLs (`https://<agency>.bonfirehub.com`) |
| `openGovAgencies` | 2 samples | OpenGov codes or portal URLs |
| `openGovStates` | — | Add every OpenGov agency in these states |
| `openGovAllAgencies` | false | Scan all 570+ OpenGov agencies |
| `statuses` | `["open"]` | open, pending, evaluation, awardPending, closed, or `all` |
| `solicitationTypes` | — | RFP, RFQ, RFI, ITB, IFB, RFB, CSP, RFQU, SOQ… |
| `departments` | — | Department contains any of these |
| `minDaysUntilClose` / `maxDaysUntilClose` | — | Deadline window |
| `postedWithinDays` | — | Only recently released bids |
| `excludeExpired` | true | Drop "open" bids past their deadline |
| `includeKeywords` / `excludeKeywords` | — | Words or `/regex/` over title, description, department, agency |
| `keywordMatch` | any | `any` or `all` include keywords |
| `onlyNewItems` + `stateKey` | false / default | Monitoring memory, one per saved search |
| `maxResults` | 200 | Hard cap on saved bids |
| `includeDescriptions` / `descriptionMaxLength` | true / 0 | Description text and truncation |
| `outputFields` | all | Keep only listed fields, in order |
| `maxConcurrency`, `maxRequestRetries`, `requestTimeoutSecs` | 5 / 4 / 45 | Performance tuning |
| `proxyConfiguration` | off | Optional Apify or custom proxy |

### Pricing

Pay per result — no subscription, no compute surprises.

| Event | Price |
|-------|-------|
| Bid saved (`bid-scraped`) | **$0.008** ($8 per 1,000 bids) |

Examples: 200 bids ≈ **$1.60**. A daily Texas IT alert typically finds 5–30 new bids ≈ **$0.04–$0.24 per day**. Set "Maximum cost per run" in the run options and the actor stops cleanly at your limit.

### Export formats & integrations

#### Export formats

Export your dataset with zero code in whichever format fits your workflow:

- **Excel (.xlsx) & CSV:** Clean tabular sheets formatted for Microsoft Excel, Google Sheets, LibreOffice, and CRM imports.
- **JSON & JSONL:** Structured records for developers, backend pipelines, and AI agent prompt context.
- **XML & HTML:** Formatted for web dashboards, feed syndication, and reporting.

#### No-code automations & integrations

- **Google Sheets & Airtable:** Automatically push new scraped rows into live tracking spreadsheets.
- **Make, Zapier & n8n:** Trigger instant Slack alerts, email digests, or create deals in HubSpot, Salesforce, and Pipedrive.
- **Webhooks & REST API:** Programmatically trigger runs and retrieve results via Apify's REST API, Python SDK, or JavaScript/TypeScript SDK.

### FAQ

**How do I export this data to Excel or CSV?** After the run finishes, click the **Export** button in the Dataset tab to download the complete file in Excel (.xlsx), CSV, JSON, or XML. You can also automate exports directly to Google Sheets via the Integrations tab.
**Which agencies are covered?** Any Bonfire portal you list, plus every active agency in the OpenGov Procurement public directory (570+ across 42 states).

**Do I need a proxy?** No. Both platforms serve public JSON. Enable a proxy only for very large scheduled scans.

**Is this legal?** The actor reads the same public solicitation listings any vendor can open without logging in. It doesn't access private bid documents or vendor accounts.

## **Something broke / you want another platform?** Open an issue on the actor page — PlanetBids, BidNet, and state portals are on the roadmap.

### More from Spotless Studios

**[All actors on Apify](https://apify.com/spotless_studios)** · Support: spotless.studios.info@gmail.com

| Actor | Best for |
|-------|----------|
| [SLED Government Bids](https://apify.com/spotless_studios/sled-procurement-scraper) | Daily US gov RFP / bid alerts |
| [Webflow Experts](https://apify.com/spotless_studios/webflow-experts-scraper) | Webflow agency & freelancer leads |
| [Stripe Partners](https://apify.com/spotless_studios/stripe-partners-scraper) | Stripe implementation partner lists |
| [UK Planning Applications](https://apify.com/spotless_studios/uk-planning-applications-scraper) | UK planning leads + agent contacts |
| [Product Hunt](https://apify.com/spotless_studios/product-hunt-scraper) | Every PH launch + makers / websites |
| [Duunitori Jobs](https://apify.com/spotless_studios/duunitori-jobs-scraper) | Finland job listings |
| [Clutch Agencies](https://apify.com/spotless_studios/clutch-agencies-scraper) | Clutch agency prospecting |
| [Skool Communities](https://apify.com/spotless_studios/skool-communities-scraper) | Skool community & creator leads |

# Actor input Schema

## `platforms` (type: `array`):

Which procurement platforms to scrape. Bonfire (Euna) and OpenGov Procurement together host thousands of US city, county, school district, and special district portals.

## `bonfirePortals` (type: `array`):

Bonfire portals, e.g. https://harriscountytx.bonfirehub.com. Find more by searching Google for site:bonfirehub.com.

## `openGovAgencies` (type: `array`):

Agency codes (e.g. alachuacounty) or portal URLs like https://procurement.opengov.com/portal/alachuacounty.

## `openGovStates` (type: `array`):

Two-letter US state codes (e.g. TX, CA, FL). Adds every active OpenGov agency in those states from the public directory (570+ agencies nationwide).

## `openGovAllAgencies` (type: `boolean`):

Scan all 570+ active OpenGov agencies. Combine with keyword filters and 'Only new bids' for a nationwide bid alert.

## `statuses` (type: `array`):

OpenGov statuses to include: open, pending, evaluation, awardPending, closed — or 'all'. Bonfire always returns open bids.

## `solicitationTypes` (type: `array`):

Keep only these types, by code or name: RFP, RFQ, RFI, ITB, IFB, RFB, CSP, RFQU, SOQ, 'Construction'…

## `departments` (type: `array`):

Keep bids whose department contains any of these words (e.g. Public Works, IT, Parks).

## `minDaysUntilClose` (type: `integer`):

Skip bids closing sooner than this — leaves time to prepare a response.

## `maxDaysUntilClose` (type: `integer`):

Skip bids closing later than this.

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

Keep bids released in the last N days. Bids without a posting date are kept.

## `excludeExpired` (type: `boolean`):

Some portals keep bids marked open after the deadline. Turn off to keep them.

## `portalUrls` (type: `array`):

Paste any mix of Bonfire or OpenGov portal URLs; the scraper automatically detects the platform for each URL.

## `includeKeywords` (type: `array`):

Keep bids whose title, description, reference, department, or agency contains these words. Wrap in slashes for regex, e.g. /hvac|roofing/.

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

Drop bids containing any of these words or /regex/.

## `keywordMatch` (type: `string`):

Require any or all include keywords.

## `onlyNewItems` (type: `boolean`):

Remember bids from previous runs and save only new ones. Schedule daily for a bid alert feed — you pay only for new bids.

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

Separate memory per saved search, e.g. 'texas-it'. Runs with the same name share history.

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

Stop after saving this many bids.

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

Add solicitation descriptions (Bonfire RSS feed, OpenGov summary).

## `descriptionMaxLength` (type: `integer`):

Truncate descriptions to this many characters. 0 keeps full text.

## `outputPreset` (type: `string`):

Quickly choose how much data to save per record: full record, lean summary, or contact & social links only.

## `outputFields` (type: `array`):

Save only these fields, in this order (e.g. title, closingDate, organizationName, portalUrl). Supports nested dot-paths (e.g. makers.username). Empty keeps all fields from the selected preset.

## `excludeFields` (type: `array`):

Remove specific fields (or nested dot-paths) from each saved record to keep datasets compact.

## `includeEmptyFields` (type: `boolean`):

When turned off, strips null, empty strings, empty arrays, and empty objects from every saved record.

## `requiredFields` (type: `array`):

Only save (and only pay for) records where every listed field or dot-path has a non-empty value (e.g. website, inquiryEmail).

## `maxConcurrency` (type: `integer`):

Portals fetched in parallel.

## `maxRequestRetries` (type: `integer`):

Retries with exponential backoff on timeouts, 429, and 5xx responses.

## `requestTimeoutSecs` (type: `integer`):

Abort a request that takes longer than this.

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

Both platforms work without a proxy. Enable one if you scan hundreds of agencies on a schedule.

## `proxyEscalation` (type: `boolean`):

If the site blocks the run, automatically step up from a direct connection to Apify datacenter proxy, then residential proxy, only for the blocked site. Turn off to use exactly the proxy above.

## Actor input object example

```json
{
  "platforms": [
    "bonfire",
    "opengov"
  ],
  "bonfirePortals": [
    "https://harriscountytx.bonfirehub.com",
    "https://fairfaxcounty.bonfirehub.com",
    "https://wake.bonfirehub.com"
  ],
  "openGovAgencies": [
    "alachuacounty",
    "1gpa"
  ],
  "openGovAllAgencies": false,
  "statuses": [
    "open"
  ],
  "excludeExpired": true,
  "keywordMatch": "any",
  "onlyNewItems": false,
  "stateKey": "default",
  "maxResults": 25,
  "includeDescriptions": true,
  "descriptionMaxLength": 0,
  "outputPreset": "full",
  "includeEmptyFields": true,
  "maxConcurrency": 5,
  "maxRequestRetries": 4,
  "requestTimeoutSecs": 45,
  "proxyConfiguration": {
    "useApifyProxy": false
  },
  "proxyEscalation": true
}
```

# Actor output Schema

## `bids` (type: `string`):

Scraped government solicitations

# 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 = {
    "platforms": [
        "bonfire",
        "opengov"
    ],
    "bonfirePortals": [
        "https://harriscountytx.bonfirehub.com",
        "https://fairfaxcounty.bonfirehub.com",
        "https://wake.bonfirehub.com"
    ],
    "openGovAgencies": [
        "alachuacounty",
        "1gpa"
    ],
    "statuses": [
        "open"
    ],
    "maxResults": 25,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("spotless_studios/sled-procurement-scraper").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 = {
    "platforms": [
        "bonfire",
        "opengov",
    ],
    "bonfirePortals": [
        "https://harriscountytx.bonfirehub.com",
        "https://fairfaxcounty.bonfirehub.com",
        "https://wake.bonfirehub.com",
    ],
    "openGovAgencies": [
        "alachuacounty",
        "1gpa",
    ],
    "statuses": ["open"],
    "maxResults": 25,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("spotless_studios/sled-procurement-scraper").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 '{
  "platforms": [
    "bonfire",
    "opengov"
  ],
  "bonfirePortals": [
    "https://harriscountytx.bonfirehub.com",
    "https://fairfaxcounty.bonfirehub.com",
    "https://wake.bonfirehub.com"
  ],
  "openGovAgencies": [
    "alachuacounty",
    "1gpa"
  ],
  "statuses": [
    "open"
  ],
  "maxResults": 25,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call spotless_studios/sled-procurement-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,spotless_studios/sled-procurement-scraper"
        }
    }
}
```

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/dOrhuIeDJ2K5p9jjy/builds/mtSvj8izdU7f9xgpy/openapi.json
