# Government Bids Scraper: RFPs from 500+ City Portals (`chimey_forearm/opengov-bids-scraper`) Actor

Government bids scraper and RFP scraper for 500+ US city, county, school and utility portals on OpenGov Procurement. Open bids, RFQs, deadlines, buyer contacts, only-new bid alerts. No login. Export data, run via API, schedule and monitor runs, or integrate with other tools.

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

## Pricing

from $2.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

### What does Government Bids & RFP Scraper do?

> **Government bids scraper and RFP scraper for 500+ US city, county and school procurement portals.** Scan a whole state at once, get buyer contacts and deadlines, and receive only new bid opportunities on scheduled runs.

![Government Bids Scraper output table: open bids with agency, title, type, reference number, due date and buyer contact](https://api.apify.com/v2/key-value-stores/ZA74NSNlX7nM76ZW5/records/opengov-output.png)

| What you can extract | Features & integrations |
|---|---|
| 📄 **Bid basics**: title, solicitation type, reference number, status | **Whole-state scan**: type a state and every OpenGov agency is checked |
| 🏛️ **Agency & department**: who is buying, with city and state | **Filters**: keywords, solicitation type, due within, posted within |
| ⏰ **Deadlines**: due date, Q\&A deadline, pre-bid meeting | **Only new bids**: plus new-addendum alerts |
| 👤 **Buyer contact**: name, email and phone as the agency publishes them | **Scheduling**: run it hourly, daily or weekly with Apify schedules |
| 🏷️ **Category codes**: UNSPSC and NIGP | **Export anywhere**: JSON, CSV, Excel, XML or HTML from the dataset |
| 📎 **Addenda & attachments**: addenda and attachment names | **API & SDKs**: Apify REST API plus JavaScript and Python clients |
| 📋 **Timeline & evaluation criteria**: when listed on the bid | **Webhooks & integrations**: Zapier, Make, Slack, Google Drive and more |
| 🔒 **Sealed-bid flag**: shown per bid | **AI agents (MCP)**: call it from Claude or other agents via Apify's MCP server |

**Free sample:** [53 open Massachusetts government bids (+ a few CT/NY) for HVAC, roofing, janitorial, IT and landscaping](https://mohabaha0.gumroad.com/l/open-gov-bids-sample), pulled with this Actor and the companion State Bids Scraper. Run it yourself for your own states and get new bids on a schedule.

**Try it free in 1 click:** open this [ready-made example](https://apify.com/chimey_forearm/opengov-bids-scraper/examples/find-software-and-it-bids-in-florida-government-portals) and press Start. Apify's free plan includes $5 of usage every month, no credit card needed. The Input example below returned 4 records and costs about $0.008 at list price.

**Government bids scraper** for **OpenGov Procurement**, the e-procurement portal used by **500+ US cities, counties, school districts, transit agencies, airports and utilities** (Pittsburgh, Tampa, Orange County CA, Ocean County NJ, Las Cruces and hundreds more). It pulls **open bids, RFPs, RFQs and invitations to bid** with deadline, solicitation type, reference number, department, **buyer contact**, pre-bid meeting, questions deadline, UNSPSC/NIGP category codes, addenda and attachment names, in one clean table. No login, no browser, no proxies.

- **Government bids scraper** and **RFP scraper** for **OpenGov Procurement** portals: open **bids, RFPs, RFQs and invitations to bid** from **500+ US city, county, school district, transit, airport and utility** agencies.
- **Scan a whole state**: type `FL`, `CA` or any 2-letter code and every active OpenGov agency there is checked, or pick agencies by portal code, URL or name.
- **Bid search filters**: keywords, excluded words, solicitation type, bid status, posted within and due within N days.
- **Buyer contacts and deadlines**: buyer name, title, work email and phone as the agency publishes them, due date, Q\&A deadline and pre-bid meeting.
- **Bid alerts**: with **only new bids** on a schedule you get just what is new since the last run, plus **new-addendum alerts**.
- **No login, no browser, no proxies**: it reads the same public pages anyone can open.
- **An alternative to a paid bid-subscription service** for these portals: the notices are public, so you can monitor them yourself and pay per bid delivered.

#### What makes it different

- **Scan a whole state in one run.** Type `FL` or `CA` and every active OpenGov agency there is checked (93 in Florida, 127 in California in our tests), using OpenGov's own agency directory, so there is no list of portal slugs to maintain. The other OpenGov scraper on the Store takes portal slugs only, and a regional one covers 11 Dallas-Fort Worth portals.
- **Bid alert feed: only new bids, plus new-addendum alerts.** With `onlyNew` on, each run returns only bids you have not received yet. If an agency posts an addendum to a bid you already have, it comes back once with `changeType: "new_addendum"`, so you never miss a change to specs or deadlines.
- **The details bidders need, at list price.** Buyer name, title, work email and phone (as published by the agency), pre-bid meeting, Q\&A deadline, sealed-bid flag, category codes, addenda, attachment names, timeline and evaluation criteria. **$2.00 per 1,000 bids**, details included. Comparable bid scrapers on the Store charge $3 to $20 per 1,000.

### Fields you get

| | Field | What it is |
|---|---|---|
| 📄 | `title`, `referenceNumber` | Bid title and the agency's solicitation number |
| 🏷️ | `solicitationType`, `procurementClassification` | Agency label (e.g. "Invitation for Bid", "Request for Proposal") and OpenGov's class |
| 🚦 | `status`, `comingSoon` | open, pending, evaluation, awardPending or closed |
| 🏛️ | `agency`, `agencyCode`, `agencyCity`, `agencyState`, `department` | Who is buying |
| ⏰ | `postedAt`, `dueAt`, `daysUntilDue`, `timezone` | Release date and response deadline (ISO 8601, UTC) and the agency's time zone |
| 📝 | `summary`, `background` | Scope text, HTML stripped |
| 🔗 | `url`, `agencyPortalUrl` | Link to the bid and the agency portal on OpenGov |
| 👤 | `procurementContact`, `contact` | Buyer / project contact as the agency published it: name, title, work email, phone, address. `null` when the agency hides it |
| 🤝 | `preProposalMeeting`, `questionsDeadline`, `questionsEnabled` | Pre-bid meeting (date, type such as "Non-Mandatory", location) and Q\&A cut-off |
| 🔒 | `sealedBid`, `isEmergency` | Flags from the solicitation |
| 🗂️ | `categories` | UNSPSC or NIGP category codes and titles chosen by the agency |
| 📢 | `addendaCount`, `addenda` | Number and list of addenda and notices with release dates |
| 📎 | `attachments` | Attachment titles and file types (download them from the bid page) |
| 📅 | `timeline` | Key dates such as bid opening, contract period |
| 📊 | `evaluationCriteria` | Scoring criteria with max score and weight for RFPs, when published |
| 🕒 | `lastUpdatedAt`, `scrapedAt` | When the agency last updated the bid and when it was read |
| 🆕 | `changeType` | `new` or `new_addendum` in only-new mode, otherwise `null` |
| 🧾 | `type` | `bid`, `agency` (directory mode) or `error` |

Fields from `contact` to `lastUpdatedAt` need **Include bid details** (on by default). In directory mode (**List agencies only**) each `agency` record has `agencyCode`, `agency`, `agencyCity`, `agencyState`, `website`, `timezone`, `bidsInSelectedStatuses`, `note` and `agencyPortalUrl`.

### How to use Government Bids & RFP Scraper in 5 steps

1. Create a free [Apify account](https://console.apify.com/sign-up).
2. Open [Government Bids & RFP Scraper](https://apify.com/chimey_forearm/opengov-bids-scraper) and click **Try for free**.
3. Add your input: agency portal codes or URLs (the part after `procurement.opengov.com/portal/`) or **US states** to scan every OpenGov agency there, then narrow it with **keywords**, **solicitation type**, **posted within** or **due within** days. For an alert feed, turn on **Only new bids**.
4. Click **Start**. To get new bids automatically, add a daily run on the **Schedules** tab.
5. Download the results as JSON, CSV or Excel from the dataset, or fetch them through the Apify API.

Not sure which agencies are on OpenGov? Turn on **List agencies only** with a state: you get each agency's portal code and how many open bids it has right now (Texas: 44 agencies in our test).

### Input

Copy-paste input from a real run (City of Pittsburgh, Oct 19 2026, 4 matching bids):

```json
{
  "agencies": ["pittsburghpa"],
  "keywords": ["software", "equipment"],
  "maxBidsPerAgency": 5,
  "includeDetails": true
}
```

Single bids work too: `https://procurement.opengov.com/portal/pittsburghpa/projects/285142` returns just that bid with full details.

Public example tasks you can open and run:

- [Software and IT bids in Florida](https://apify.com/chimey_forearm/opengov-bids-scraper/examples/find-software-and-it-bids-in-florida-government-portals)
- [Daily alert for new California construction bids](https://apify.com/chimey_forearm/opengov-bids-scraper/examples/daily-alert-for-new-california-construction-bids)
- [Bids due in the next 14 days, with buyer contacts](https://apify.com/chimey_forearm/opengov-bids-scraper/examples/government-bids-due-in-the-next-14-days-with-buyer-contacts)

### Output

A real record from the run above (buyer contact shortened, `categories` and `evaluationCriteria` cut to 2 items):

```json
{
  "type": "bid",
  "id": 315505,
  "title": "Firefighter Personal Escape Safety System & Training Services",
  "referenceNumber": "2026-RFP-228",
  "solicitationType": "Request for Proposal",
  "status": "open",
  "comingSoon": false,
  "agency": "City of Pittsburgh",
  "agencyCode": "pittsburghpa",
  "agencyCity": "Pittsburgh",
  "agencyState": "PA",
  "department": "Bureau of Fire",
  "postedAt": "2026-10-19T04:00:00.000Z",
  "dueAt": "2026-12-01T19:00:00.000Z",
  "daysUntilDue": 42,
  "timezone": "America/New_York",
  "addendaCount": 0,
  "summary": "The City of Pittsburgh Office of Management and Budget, on behalf of the Bureau of Fire, is soliciting proposals from qualified firms for Firefighter Personal Escape Safety Systems & Training Services. The City is seeking responsible proposals to provide both equipment and training in the use of Firefighter Personal Escape Systems.",
  "url": "https://procurement.opengov.com/portal/pittsburghpa/projects/315505",
  "agencyPortalUrl": "https://procurement.opengov.com/portal/pittsburghpa",
  "contact": null,
  "procurementContact": {
    "name": "J. G.",
    "title": "Sourcing Specialist",
    "email": "j…@pittsburghpa.gov",
    "phone": "(412) 255-…",
    "address": "414 Grant Street, Room 502, Pittsburgh, PA, 15219"
  },
  "preProposalMeeting": {
    "date": "2026-11-03T15:00:00.000Z",
    "type": "Non-Mandatory",
    "location": "Virtual via Microsoft Teams - Please RSVP using the RSVP manager and a link will be sent to you prior to the meeting."
  },
  "questionsDeadline": "2026-11-17T22:00:00.000Z",
  "questionsEnabled": true,
  "sealedBid": true,
  "isEmergency": false,
  "procurementClassification": "Request for Proposal",
  "categories": [
    {
      "code": "46000000",
      "title": "Defense and Law Enforcement and Security and Safety Equipment and Supplies",
      "categorySetId": 300
    },
    {
      "code": "46190000",
      "title": "Fire protection",
      "categorySetId": 300
    }
  ],
  "background": null,
  "timeline": [
    {
      "title": "Proposal Review and Supplier Scoring",
      "date": "December 2026",
      "location": null
    },
    {
      "title": "Contract Award",
      "date": "December 2026",
      "location": null
    }
  ],
  "addenda": [],
  "attachments": [],
  "evaluationCriteria": [
    {
      "title": "Firm’s Qualifications, Experience and References",
      "maxScore": 15,
      "weight": 15
    },
    {
      "title": "Qualifications of Project Team",
      "maxScore": 15,
      "weight": 15
    }
  ],
  "lastUpdatedAt": "2026-10-19T13:10:00.850Z",
  "changeType": null,
  "scrapedAt": "2026-10-20T01:41:20.711Z"
}
```

### How can I use the data?

- **Win more public contracts**: contractors, IT firms and consultants find bids in their trade and states before the deadline.
- **Daily bid alert feed**: schedule only-new runs and send new bids to Slack, email or Google Sheets.
- **Sales prospecting**: reach the buyer contact each agency published on the bid, within the rules that apply to you.
- **Market research**: use `statuses: ["all"]` to see what an agency buys, how often and with which solicitation types.
- **Bid-matching and procurement tools**: feed clean JSON into your own app, CRM or AI agent.

### Example use cases

#### 1. Find software and IT bids from every OpenGov agency in Florida

Example task: [Software and IT bids in Florida](https://apify.com/chimey_forearm/opengov-bids-scraper/examples/find-software-and-it-bids-in-florida-government-portals)

```json
{
  "states": ["FL"],
  "keywords": ["software", "technology", "cybersecurity", "cloud", "IT services"],
  "keywordsInTitleOnly": true
}
```

Tested Oct 18 2026: 93 Florida agencies and 323 open bids scanned in under 5 seconds, 3 matches:

| Agency | Bid | Type | Due |
|---|---|---|---|
| City of Clermont | Cloud Based Location Intelligence Foot Traffic Data Platform | Request for Proposal | 2026-11-12 |
| Putnam County School District | K-12 Master Scheduling Software, Implementation, and Support Services | Request for Proposal | 2026-10-30 |
| Jacksonville Transportation Authority | Public Engagement Web Based Software Platform | Solicitation (Attach a Document) | 2026-10-22 |

#### 2. Daily alert: new construction bids in California

Example task: [Daily alert for new California construction bids](https://apify.com/chimey_forearm/opengov-bids-scraper/examples/daily-alert-for-new-california-construction-bids)

```json
{
  "states": ["CA"],
  "keywords": ["construction", "paving", "roof", "hvac", "concrete"],
  "keywordsInTitleOnly": true,
  "postedWithinDays": 14,
  "onlyNew": true
}
```

Schedule it daily. Tested Oct 18 2026: 127 California agencies, 378 open bids scanned, 7 new matches on the first run (first 4 shown). The next run returns only bids posted since.

| Agency | Bid | Posted | Due | changeType |
|---|---|---|---|---|
| Alameda Municipal Power | Request for Information (RFI) for On-Call Civil Service Construction IFB | 2026-10-16 | 2026-10-30 | new |
| City of Napa | Paving for Water Facilities and Leak Repairs 2026-1 | 2026-10-13 | 2026-11-12 | new |
| County of Alameda, CA | ON CALL AS NEEDED ROOF MAINTENANCE, INSPECTION, DIAGNOSTIC, TROUBLESHOOTING AND  | 2026-10-13 | 2026-11-17 | new |
| City of Pasadena | Construction Management for Holly Street Bridge Seismic Retrofit & Rehabilitatio | 2026-10-08 | 2026-10-29 | new |

#### 3. Bids due in the next 14 days at chosen agencies, with buyer contacts

Example task: [Bids due in the next 14 days, with buyer contacts](https://apify.com/chimey_forearm/opengov-bids-scraper/examples/government-bids-due-in-the-next-14-days-with-buyer-contacts)

```json
{
  "agencies": ["pittsburghpa", "https://procurement.opengov.com/portal/oceancounty"],
  "dueWithinDays": 14
}
```

Tested Oct 18 2026: 29 bids due within 14 days (first 5 shown), each with the buyer's contact.

| Agency | Bid | Ref # | Due | Buyer title |
|---|---|---|---|---|
| City of Pittsburgh | PS, Fire, Hazmat Pickup Truck | 2026-ECOOP-218 | 2026-10-28 | Senior Sourcing Specialist |
| City of Pittsburgh | PS, Fire, Command SUV | 2026-ECOOP-219 | 2026-10-28 | Senior Sourcing Specialist |
| City of Pittsburgh | City Channel Pittsburgh End-of-Life Replacements | 2026-IFB-200 | 2026-10-26 | Sourcing Specialist |
| City of Pittsburgh | Traffic Calming | 2026-IFB-186 | 2026-10-21 | Sourcing Specialist |
| City of Pittsburgh | Recycling Engagement and Analytics Application | 2026-RFP-168 | 2026-10-20 | Sustainable Procurement Specialist |

### Tips

- Keywords match the start of words, so `roof` finds "roofing" and `it` does not match "permit". Turn on **Match keywords in the title only** for stricter results.
- `statuses: ["all"]` includes past and awarded bids, useful for researching what an agency buys and how often.
- The only-new memory is kept per input automatically. Use **Only-new memory name** to share it across tasks or start fresh.

### Limitations

- Covers agencies that publish on **OpenGov Procurement** only (not Bonfire, BidNet, PlanetBids, DemandStar or SAM.gov).
- Attachment files themselves are not downloaded; you get their names and the bid link.
- Only public bids are returned. Invitation-only and private projects are not visible.
- Buyer contacts are what the agency published on the bid; some agencies hide them.

### More Actors from the same developer

| Actor | What it does |
|---|---|
| [Telegram Channel Scraper](https://apify.com/chimey_forearm/telegram-channel-scraper) | Public Telegram channel posts with a keyword monitor and only-new mode |
| [Substack Scraper](https://apify.com/chimey_forearm/substack-to-markdown) | Substack newsletters to clean Markdown, plus podcast transcripts |
| [Greenhouse & Workday Jobs Scraper](https://apify.com/chimey_forearm/ats-jobs-scraper) | Jobs from 8 career-site platforms with visa sponsorship and clearance flags |
| [App Store & Google Play Reviews Scraper](https://apify.com/chimey_forearm/app-reviews-scraper) | Reviews from both stores in one run, only new reviews on schedules |
| [Website to Markdown Crawler](https://apify.com/chimey_forearm/sitemap-to-markdown) | Any website to Markdown for RAG, with incremental sync and llms.txt |
| [State Bids Scraper](https://apify.com/chimey_forearm/state-bids-scraper) | Open bids from COMMBUYS, BidBuy, NJSTART, OregonBuys and NevadaEPro |
| [PERM Green Card Sponsors](https://apify.com/chimey_forearm/perm-green-card-sponsors) | Companies that sponsor green cards, from official DOL PERM data |

### Error items

Bad inputs never fail the whole run. Each input that cannot be scraped gives one record with `type: "error"` and these fields: `input` (what you entered), `error` (a code below), `errorMessage` (a plain-English reason), `scrapedAt`, plus `agencyCode` for agency errors and `suggestions` for `AGENCY_NOT_FOUND`.

| `error` | When |
|---|---|
| `AGENCY_NOT_FOUND` | No OpenGov portal with that code. `suggestions` lists close matches, e.g. `pitsburghpa` → "Did you mean: pittsburghpa (City of Pittsburgh, PA)?" |
| `INVALID_INPUT` | Not a portal code/URL, or a state that is not a 2-letter code |
| `NO_AGENCIES_IN_STATE` / `NO_AGENCIES_MATCH` | No active OpenGov agency in that state, or none whose name contains your words |
| `BID_NOT_FOUND` | A single-bid URL that is not found or not public |
| `FETCH_FAILED` | Network or OpenGov error after 3 attempts (bids list, agency directory or single bid). Usually temporary; run again |

If a bid is listed but its details cannot be loaded, the bid record is still delivered with a `detailError` field instead of the detail fields. Error records are charged like a bid. Agencies with no matching bids are not charged and produce no record; counts are in the `RUN_SUMMARY` record of the run's key-value store.

Two inputs end the run right away with a clear status message and an empty dataset instead (the run still shows Succeeded and only the start fee applies): no agencies, states or agency names at all, and a `statuses` list with no valid status.

### FAQ

**How much does it cost?** Pay per event, $2.00 per 1,000 bids. See the [Pricing tab](https://apify.com/chimey_forearm/opengov-bids-scraper/pricing).

Pay per result: **$0.002 per bid** (or per agency record in directory mode, or per error record), plus $0.00005 per run. Details are included at no extra cost. Platform usage is not passed on to you.

- Florida software scan above (93 agencies, 3 bids): about **$0.006**
- Pittsburgh + Ocean County, 29 bids with details: about **$0.06**
- A daily California construction alert that finds about 5 new bids a day: about **$0.30 a month**

Set **Maximum cost per run** in the run options to cap spend; the Actor stops cleanly at the limit.

**Does it work with Make, Zapier, Google Sheets or Slack?** Yes. Use Apify integrations for Make, Zapier, Google Sheets, Slack and Google Drive, or a webhook that fires when a run finishes.

**Can I run it through the API?** Yes. With the [apify-client](https://docs.apify.com/api/client/js/) for Node.js:

```js
import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });
const run = await client.actor('chimey_forearm/opengov-bids-scraper').call({ states: ['FL'], keywords: ['software'] });
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

Or Python:

```python
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("chimey_forearm/opengov-bids-scraper").call(run_input={"states": ["FL"], "keywords": ["software"]})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)
```

**Can AI agents use it (MCP)?** Yes. Add it to the [Apify MCP server](https://mcp.apify.com) and call it from Claude or other MCP clients.

**Do I need an OpenGov account?** No. The Actor reads the same public information anyone sees on an agency's portal without logging in.

**How fresh is the data?** Live. Each run reads the agency portals at run time.

**Can I submit bids with it?** No. It finds and tracks opportunities; you respond on the agency's portal.

**Is it legal?** It reads public bid notices only. Buyer contacts are the work contacts as published by the agency on the bid. If you store or use personal data such as names and emails, GDPR and similar laws may apply to you. More below.

**Found a bug or need a field?** Open an issue on the **Issues** tab. Requests from users are prioritized.

### Is it legal to scrape OpenGov Procurement?

The Actor only reads public solicitation notices that government agencies publish to attract vendors, without logging in, at a gentle request rate, and links every record back to the agency's official page. It does not download documents or access vendor accounts. Contact details are the work contacts agencies publish on their bids; handle them according to the laws that apply to you (for example CAN-SPAM for outreach). Check OpenGov's terms and your own legal requirements for how you reuse the data. This Actor is independent and not affiliated with OpenGov or any agency.

If it saved you time, a quick review on the Store helps a solo developer keep improving it. Bugs or ideas? Open an Issue.

# Actor input Schema

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

One per line. The OpenGov portal code or URL, e.g. <code>pittsburghpa</code> or <code>https://procurement.opengov.com/portal/oceancounty</code>. A single bid URL (<code>.../portal/pittsburghpa/projects/285142</code>) returns just that bid with full details. Leave empty and use <b>States</b> to scan every OpenGov agency in a state.

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

2-letter state codes, e.g. <code>FL</code>, <code>CA</code>, <code>TX</code>. Every active OpenGov Procurement agency in those states is scanned (California has 130+, Florida 95+). Combine with keywords to keep it focused.

## `agencyNameContains` (type: `array`):

Keep only agencies whose name contains ANY of these, e.g. "county", "school", "water", "airport". Used with States, or alone to search all 550+ agencies by name.

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

Which stages to return. <b>open</b> = accepting responses (default). <b>pending</b> = deadline passed, responses not opened yet. <b>evaluation</b>, <b>awardPending</b>, <b>closed</b>. Use <b>all</b> for everything, including past bids.

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

Keep bids whose title, summary or reference number contains ANY of these (case-insensitive), e.g. "roof", "software", "janitorial", "paving". Empty = all bids.

## `keywordsInTitleOnly` (type: `boolean`):

By default keywords also match the bid summary and reference number. Turn on for stricter matches (e.g. so "cloud" doesn't match "St. Cloud" in a summary).

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

Drop bids whose title contains any of these, e.g. "pre-qualified", "PQ List".

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

Keep only these types, matched against the agency's label, e.g. "Invitation for Bid", "Request for Proposal", "Request for Quote", "Qualifications".

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

Keep only bids released in the last N days. 0 = any.

## `dueWithinDays` (type: `integer`):

Keep only bids whose deadline is in the next N days. 0 = any.

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

Adds the buyer contact (name, title, work email, phone), pre-bid meeting, questions deadline, sealed-bid flag, UNSPSC/NIGP category codes, addenda list, attachment names, timeline and evaluation criteria. One extra request per bid. Same price either way.

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

Remembers bids already delivered for this same input and returns only new ones. Schedule it daily to get a bid alert feed. Each record gets <code>changeType</code>.

## `alertOnNewAddenda` (type: `boolean`):

With only-new on: a bid you already got comes back once with <code>changeType: "new_addendum"</code> when the agency posts an addendum or notice.

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

Name for the only-new memory. Leave empty to use one automatically per input (same agencies + states = same memory). Set it to share memory across tasks or to start fresh.

## `maxBidsPerAgency` (type: `integer`):

Newest first. 0 = no limit.

## `listAgenciesOnly` (type: `boolean`):

Instead of bids, return the agencies matching your states / names / codes with how many bids each has in the selected statuses. Useful to see which portals are active.

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

1–8. Default 4 keeps the load on OpenGov light.

## Actor input object example

```json
{
  "agencies": [
    "pittsburghpa",
    "oceancounty"
  ],
  "statuses": [
    "open"
  ],
  "keywordsInTitleOnly": false,
  "postedWithinDays": 0,
  "dueWithinDays": 0,
  "includeDetails": true,
  "onlyNew": false,
  "alertOnNewAddenda": true,
  "maxBidsPerAgency": 0,
  "listAgenciesOnly": false,
  "maxConcurrency": 4
}
```

# Actor output Schema

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

No description

## `summary` (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 = {
    "agencies": [
        "pittsburghpa",
        "oceancounty"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("chimey_forearm/opengov-bids-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 = { "agencies": [
        "pittsburghpa",
        "oceancounty",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("chimey_forearm/opengov-bids-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 '{
  "agencies": [
    "pittsburghpa",
    "oceancounty"
  ]
}' |
apify call chimey_forearm/opengov-bids-scraper --silent --output-dataset

```

## MCP server setup

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