PlanetBids Open Bids Scraper: Cities and School Districts
Pricing
from $5.00 / 1,000 results
PlanetBids Open Bids Scraper: Cities and School Districts
Open bids, RFPs and RFQs from PlanetBids agency portals (California cities, school districts, ports) filtered by status, keyword and due date, priced per result.
What does PlanetBids Open Bids Scraper do?
It collects bids, RFPs, RFQs and other solicitations from PlanetBids agency portals, which many California cities, school districts, colleges and ports use to publish procurement. Each record has the title, agency, solicitation number, bid type, status, due date, posted date, category names and codes, and a direct link to the bid. Filters for status, keyword and due date keep runs small, and pricing is per result.
Data source
The Actor reads the public JSON API behind each agency's PlanetBids vendor portal (vendors.planetbids.com/portal/<id>/bo/bo-search), which any visitor can use without logging in. Data is live at the time of the run.
Why use it?
- Find new public works, services and supply bids in one feed instead of checking each portal by hand.
- Monitor a trade (paving, roofing, IT, janitorial) by keyword and get only matching bids.
- Track due dates and build a pipeline for contractors and suppliers.
- Research which agencies buy what, using closed bids.
How to use it
- Open the Actor and set the filters.
- Click Start. Download results as JSON, CSV or Excel, or read them through the API.
- Add a Schedule and an Integration (Slack, Google Sheets, webhook) to get new bids automatically.
Input
| Field | Description |
|---|---|
stage | open (accepting bids, default), closed, or all. |
keywords | Keep bids whose title, solicitation number or category names contain any of these words. |
dueDateFrom | Earliest due date, YYYY-MM-DD. |
dueDateTo | Latest due date, YYYY-MM-DD. |
portalIds | Extra agency IDs to include. The ID is the number in the portal URL. |
maxResults | Hard stop for the run. You are billed per result, so this caps the cost. |
proxyConfiguration | Apify proxy is recommended for larger runs. |
Example input:
{"stage": "open","keywords": ["roof", "paving"],"dueDateFrom": "2026-11-01","maxResults": 100}
Output
Every record has the same shape:
{"id": "planetbids:17950:146737","title": "San Diego Convention Center West Roof Replacement","agency": "City of San Diego","solicitationNumber": "K-27-2513-DB2-3","bidType": "RFQual","status": "Bidding","dueDate": "2026-11-04T14:00:00","postedDate": "2026-09-30T12:00:10","categories": ["Roofing Contractors", "Engineering Services"],"categoryCodes": ["238160", "541330"],"submissionFormat": "Electronic","byInvitation": false,"portalId": 17950,"bidId": 146737,"url": "https://vendors.planetbids.com/portal/17950/bo/bo-detail/146737"}
| Field | Meaning |
|---|---|
id | Stable key, safe for deduplication between runs |
title, agency, solicitationNumber | What is being bid, who issued it, and the agency's bid number |
bidType | Bid, RFP, RFQ, RFQual, RFI or IPWB |
status | Bidding, Closed, Canceled and similar |
dueDate, postedDate | Agency local time (Pacific for the built in portals), no timezone suffix |
categories, categoryCodes | Category names and codes the agency assigned |
url | Link to the bid on the agency's portal |
Pricing
Pay per event: a fixed price per result returned. You only pay for records that pass your filters. Set maxResults to cap any run.
Limitations
- Covers a built in list of agency portals (California cities, school districts, colleges and a port). PlanetBids has no public agency directory, so add other agencies with
portalIds. - Bid documents, addenda and bidder lists need a vendor login and are not included.
- The default run takes a few seconds. The API throttles fast clients, so the Actor runs slowly on purpose.
FAQ
Is this legal? The Actor reads listings the site publishes for any visitor without a login and stores only business information published for that purpose. You are responsible for how you use the data.
Something is missing or broken? Open an issue in the Issues tab; response time is usually under a day.