# State & Local Government Bids Feed (Official Open Data) (`novadata/state-local-bids-feed`) Actor

Open bids, RFPs, RFQs and lettings from official state, county, city and E-Rate open-data portals: NYC, LA region, Delaware, Montgomery County MD, TxDOT, Baton Rouge, and E-Rate Form 470s in every state. One schema. Filter by keyword, state, category and dates.

- **URL**: https://apify.com/novadata/state-local-bids-feed.md
- **Developed by:** [novadata](https://apify.com/novadata) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$5.00 / 1,000 bids

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

## State & Local Government Bids Feed (Official Open Data)

Open **bids, RFPs, RFQs, highway lettings and E-Rate Form 470s** from official government open-data portals, in **one clean schema**. You can filter by keyword, state, category group, commodity code, posted date and due date. Duplicates are removed.

There are no logins or API keys, and no commercial bid aggregators. Every record comes from a public open-data API run by the government body itself, and links back to the official notice or dataset.

### Sources and coverage

| Source key | Publisher | Level | State | Open bids on Oct 18 2026\* | Link per bid |
|---|---|---|---|---|---|
| `la_ramp` | RAMP LA (Regional Alliance Marketplace for Procurement): City of LA departments, LA County, LAUSD, Port of LA, LAWA and others. Via data.lacity.org | regional | CA | 238 | ✓ (rampla.org) |
| `nyc_city_record` | NYC City Record Online, procurement solicitations from all city agencies. Via data.cityofnewyork.us | city | NY | 145 | ✓ (City Record notice) |
| `delaware` | State of Delaware MyMarketplace open bids. Via data.delaware.gov | state | DE | 40 | ✓ (mmp.delaware.gov) |
| `montgomery_county_md` | Montgomery County, MD Office of Procurement solicitations. Via data.montgomerycountymd.gov | county | MD | 15 | procurement home page |
| `baton_rouge` | City of Baton Rouge / East Baton Rouge Parish purchasing bid openings. Via data.brla.gov | city | LA | 12 | dataset page |
| `txdot_lettings` | Texas DOT highway & maintenance lettings, statewide and local district lets, one record per project. Via data.texas.gov | state | TX | 449 | dataset page |
| `erate_form470` | USAC E-Rate FCC Form 470s: K-12 schools, school districts and libraries requesting bids for internet, WAN, Wi-Fi and network equipment. Via datahub.usac.org | school/library | 46 states | 825 | ✓ (official Form 470 PDF) |

\*Unique open solicitations (due date on or after Oct 18 2026) returned by a full run (`maxItems` 5000, `maxPerSource` 0) on Oct 18 2026. Counts change daily.

**Not included:** sites that need a login, commercial aggregators, and state portals that offer no open-data feed. Examples are BidNet, Bonfire, PlanetBids, Cal eProcure and Texas ESBD. Also excluded is any portal whose robots.txt or terms forbid automated access. For federal opportunities, see our SAM.gov feed.

### What you get (one item per solicitation)

```json
{
  "source": "delaware",
  "sourceName": "State of Delaware (MyMarketplace open bids)",
  "level": "state",
  "state": "DE",
  "solicitationId": "GSS27080-PEST_CNTRL",
  "title": "Pest Control Services",
  "noticeType": null,
  "category": "UNSPSC 7210",
  "categoryGroup": "services",
  "codes": { "unspsc": "7210" },
  "agency": "GSS",
  "postedDate": "2026-10-12T00:00:00",
  "dueDate": "2026-12-08T00:00:00",
  "dueDateType": "deadline",
  "status": "Open",
  "estimatedValue": null,
  "url": "https://mmp.delaware.gov/Bids/Details/9359",
  "sourcePortal": "https://data.delaware.gov/d/2hnj-zwix",
  "scrapedAt": "2026-10-18T16:14:33+00:00"
}
```

See `sample-output.json` for one record from each source.

| Field | Meaning |
|---|---|
| `solicitationId` / `referenceNumber` | The agency's own ID (RAMP ID, City Record request ID + PIN, contract number, TxDOT project ID, Form 470 number) |
| `title`, `description` | As published. Long text is capped at about 4,000 characters, and **emails and phone numbers are redacted** |
| `noticeType` | Solicitation method or type (IFB, RFP, Competitive Sealed Bids, Local District Let…) |
| `category` / `categoryGroup` | The agency's own category, plus one normalised group: `construction`, `goods`, `services`, `professional services`, `technology`, `other` |
| `codes` | Commodity codes where published (Delaware UNSPSC) |
| `postedDate`, `dueDate` | Local time of the publishing agency. `dueDateType` says what the date is (closing date, bid opening, etc.) |
| `estimatedValue` | Where published (TxDOT engineer's estimate, some NYC notices) |
| `extra` | Source-specific fields, e.g. TxDOT county, highway, CSJ, working days and bid guarantee; E-Rate applicant type, city and funding year; Montgomery local small business reserve flag |
| `sourceLicense` | Licence stated on the portal |

### Filters

- **keywords**: keeps a bid if any keyword appears in the title, description, agency or category.
- **states**: two-letter codes. E-Rate is filtered by the applicant's state.
- **categories**: normalised category groups. The agency's own category is used where it exists (LA RAMP, NYC, Delaware UNSPSC, Montgomery construction flag, TxDOT, E-Rate). Otherwise the group is inferred from the title.
- **codePrefixes**: commodity code prefix (UNSPSC, Delaware only). *None of these sources publish NAICS codes.*
- **postedWithinDays**, **dueAfter** (defaults to today, so only open bids are returned), **dueBefore**.
- **maxItems** (default 200), **maxPerSource** (default 25, so a default run samples every source; set 0 for everything).

Duplicates are removed per source. The NYC City Record reprints a notice on several days, and USAC keeps original and amended versions of a Form 470. In both cases only the newest copy is kept.

### Things to know

- **E-Rate dates:** `dueDate` is the Form 470 *allowable contract date*, the earliest date the applicant can sign a contract (28 days after posting). The real response deadline is in the form or RFP and can be earlier or later. Always check the linked PDF.
- **TxDOT** lists lettings about 42 days ahead. "Unofficial" proposals have no published date yet.
- **Baton Rouge** publishes no posting date, so it is skipped when `postedWithinDays` is set.
- **NYC** notices with a placeholder due date (year 9999, i.e. open-ended or continuous) get `dueDate: null`.
- **Privacy:** contact names, phone numbers and emails held in separate columns are never requested. Inside free-text descriptions, emails and phone numbers are redacted. Some descriptions still name an agency contact person; follow the official link for contact details.
- The data is provided as published by each agency, without warranty. This actor is not affiliated with any of these agencies. Before you bid, check the official notice for addenda.

### Run summary

The `RUN_SUMMARY` key-value record shows, for each source: rows scanned, records returned, duplicates removed, any error, and why the run stopped (`end of data`, `maxItems` or `spending limit`).

# Actor input Schema

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

Official portals to query. Leave empty for all of them.

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

Keep a bid if any keyword appears in its title, description, agency or category (case-insensitive). Leave empty to keep everything.

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

Two-letter state codes, e.g. TX, NY. Statewide/local sources outside these states are skipped; E-Rate Form 470s are filtered by the applicant's state. Leave empty for all.

## `categories` (type: `array`):

Normalised category group. It comes from the agency's own category where one is published (LA RAMP, NYC, Delaware UNSPSC, Montgomery's construction flag, TxDOT, E-Rate); otherwise it is inferred from the title.

## `codePrefixes` (type: `array`):

Keep only bids whose commodity code starts with one of these, e.g. 43 (UNSPSC IT). Only Delaware publishes codes (UNSPSC); none of these sources publish NAICS, so this filter drops every other source.

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

Only bids posted in the last N days. 0 = no limit. Baton Rouge publishes no posting date and is skipped when this is set.

## `dueAfter` (type: `string`):

Only bids whose due/closing date is on or after this date. Defaults to today (open bids only).

## `dueBefore` (type: `string`):

Only bids due on or before this date.

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

Stop after this many bids in total.

## `maxPerSource` (type: `integer`):

Cap per source so one large source (E-Rate, TxDOT) doesn't crowd out the rest. Default 25; set 0 for no cap.

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

Include long descriptions where published (NYC, E-Rate, TxDOT summary, Baton Rouge notes). Emails and phone numbers are redacted.

## `includeRaw` (type: `boolean`):

Add the source row as returned by the portal (only the non-personal columns this actor requests).

## `socrataAppToken` (type: `string`):

Optional free Socrata app token for higher rate limits. Not needed for normal use.

## Actor input object example

```json
{
  "sources": [],
  "maxItems": 50,
  "maxPerSource": 25,
  "includeDescription": true,
  "includeRaw": false
}
```

# Actor output Schema

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

Bid/solicitation records matching your filters (one item per solicitation).

## `allFields` (type: `string`):

Every field of every record, unflattened.

## `runSummary` (type: `string`):

Per-source rows scanned, records returned, duplicates removed, errors, and why the run stopped.

# 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 = {
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("novadata/state-local-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 = { "maxItems": 50 }

# Run the Actor and wait for it to finish
run = client.actor("novadata/state-local-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 '{
  "maxItems": 50
}' |
apify call novadata/state-local-bids-feed --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,novadata/state-local-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/FM7FjIKvJ4SvYr8hR/builds/zpMzSE1zPeik5HTmZ/openapi.json
