US Local Bid Portals Scraper
Open solicitations from US city, county, state and school-district procurement feeds. One row per bid: buyer, title, closing date and link. No key, no login.
How it works
- 1Open it on Apify
Hit Run on Apify — it opens the tool in the cloud, no install.
- 2Set the inputs
Adjust
sources,keywords,states(sensible defaults are pre-filled). - 3Click Run
The tool runs on Apify’s cloud and collects the data for you.
- 4Export the results
Download as JSON, CSV or Excel, or pipe straight into your app, Google Sheets, or an AI agent.
Pricing
$0.016 per solicitation = $16 per 1,000
| You are charged for | When | Price |
|---|---|---|
| Solicitation scraped | One open solicitation from a US state, county, city or school-district portal. Jurisdictions that cannot answer are skipped and never charged. | $0.016 |
Pay-per-event pricing: you are billed per result, not per subscription. Billing is handled by Apify on your own account. These are the live Apify store prices, in effect since 2026-09-20, and they are what you are actually charged.
Inputs
| Field | What it does | Type |
|---|---|---|
sources | Which procurement feeds to read. Leave every box ticked to check all nine. Each one is a single jurisdiction except the school-district feed, which is nationwide. | array |
keywords | Words that must appear in the solicitation title, category or buying department. Each portal does this filtering itself, so a narrow keyword costs less than a broad one. Leave empty for everything that is open. Terms are OR'd: "paving", "asphalt" returns both. | array |
states | Two-letter state codes. A portal that belongs to a state you did not list is not queried at all, and the school-district feed is filtered to the states you name. Leave empty for everywhere. | array |
onlyOpen | On: only solicitations whose closing date is still ahead. Off: the portal's whole list, closed ones included. Leave it on unless you are building a history. | boolean |
maxItems | Hard ceiling on rows for this run, shared across the portals you picked so one big portal cannot use up the whole allowance. Maximum 5000. | integer |
What you get
A structured dataset — each result includes fields like:
jurisdictionjurisdictionLevelstatesolicitationIdtitlesolicitationTypecategorystatuspostedDatedueDatedaysUntilDuebuyerDepartmentestimatedValueurldocumentUrlportalUrlsourceExport every run as JSON, CSV or Excel, or send it to your app, a database, Google Sheets, or an AI agent.
Related tools in Developer & Research Tools
Other ready-to-run tools in the same category — all pay-per-use on the Apify cloud.
GitHub Scraper
Search GitHub repos and users: stars, forks, language, topics, licence, plus user bio, company and followers. No token needed. $0.90 per 1,000 rows.
Stack Overflow / Stack Exchange Scraper
Search Stack Overflow and Stack Exchange by keyword or tag. Score, answer count, views, reputation and body text. $2 per 1,000 questions.
Package Registry Scraper (npm + PyPI)
Get npm and PyPI package metadata as JSON. Version, license, author, repo, keywords and npm monthly downloads. $2 per 1,000 packages.
arXiv Scraper
Search arXiv papers by title, author, abstract or category. Get full abstracts, authors, categories, DOI, dates and PDF links. $2 per 1,000 papers.
OpenAlex Scholarly Works Scraper
Search 250M+ OpenAlex papers with no API key. Get titles, authors, venue, year, citations, DOI, OA links and full abstracts. $2.00 per 1,000 papers.
Crossref Scholarly Works Scraper
Search 150M+ papers on Crossref: DOI, title, authors, journal, publisher, date, citations and abstract. No API key. $1.00 per 1,000 works.
Where this tool sits
- Categories
- Developer & Research Tools
US Local Bid Portals Scraper: open solicitations from city, county and school feeds
Pick the procurement feeds you care about and get the open solicitations back as rows. Buyer, jurisdiction, title, solicitation type, posted and closing dates, days left, and the link to the official listing.
Nine feeds, not fifty states. Eight are single jurisdictions: Los Angeles, New York City, Baton Rouge, Montgomery County MD, Washington DC, Delaware, the Illinois Capital Development Board and the State University Construction Fund in New York. The ninth is nationwide, every US school district, school and library with a live FCC Form 470.
| Input | Which of the nine feeds to read, plus keywords |
| Output | One row per open solicitation |
| Ceiling | 5,000 solicitations per run |
| Account needed | None, no key, no login |
| Price | $0.016 per solicitation, flat on every plan |
🏛️ What US Local Bid Portals Scraper does
Each feed is queried on its own terms. Your keywords and the still-open filter are pushed into the query, so the portal does the filtering and the run only pays for what comes back. A narrow keyword therefore costs less than a broad one, which is the opposite of how most search tools behave.
Then comes the part worth paying for. A procurement portal will happily answer HTTP 200 with something that is not a reply to the question: the whole unfiltered list when you asked for one keyword, a different dataset's columns after a schema change, a login page wearing a JSON content type. Every page is checked against the rows themselves before anything is billed. Ask for still-open solicitations and get back a page where more than a tenth have already closed, and that whole page is dropped with a written reason. Nothing from it is delivered and nothing is charged.
Named contacts are deliberately left out. Several of these datasets carry a buyer's name, direct phone number or email address. Those columns are never requested, so they never reach your dataset. The official portal link is on every row instead, and the contact is published there by the jurisdiction.
📥 What you give it
{
"sources": ["la-city", "nyc", "erate-f470"],
"keywords": ["security", "software"],
"states": ["CA", "NY"],
"onlyOpen": true,
"maxItems": 200
}
| Field | What the run uses if you leave it | What it is |
|---|---|---|
sources | all nine boxes ticked | Which feeds to read: la-city, nyc, baton-rouge, montgomery-county-md, dc-ocp, delaware-state, illinois-cdb, suny-construction, erate-f470. |
keywords | box starts at security and software | Words that must appear in the title, category or buying department. Terms are OR'd. Leave empty for everything open. |
states | box starts empty | Two-letter codes. A feed belonging to a state you did not list is not queried at all, and the school-district feed is narrowed to the states you name. |
onlyOpen | true | On, only solicitations whose closing date is still ahead. Off, the whole list including closed ones. |
maxItems | 200 | Hard ceiling on rows, up to 5,000, shared across the feeds you picked so one big portal cannot use the whole allowance. This is also your spending cap. |
📤 What you get back
A real row from a recent run:
{
"source": "la-city",
"jurisdiction": "City of Los Angeles, CA",
"jurisdictionLevel": "city",
"state": "CA",
"solicitationId": "231996",
"title": "RFB-IS-27200173 - 2708010VAtlassian Software Licenses Renewal-BRAND ONLY - Closing: 9/23/2026 12:00 PM",
"summary": null,
"solicitationType": "RFB - Request For Bid",
"category": "Commodity",
"status": "Open",
"postedDate": "2026-09-15T15:30:09.000Z",
"dueDate": "2026-09-23T19:00:00.000Z",
"buyerDepartment": "Los Angeles County",
"estimatedValue": null,
"url": "https://www.rampla.org/s/opportunity-details?id=006Ql00000lZtjMIAS",
"documentUrl": null,
"daysUntilDue": 3,
"portalUrl": "https://www.rampla.org/",
"scrapedAt": "2026-09-21T02:09:43.620Z"
}
| Field | What it is |
|---|---|
solicitationId | The jurisdiction's own reference. Use it with source as a dedupe key across runs. |
jurisdictionLevel | city, county, state or the school-district feed's own level, so you can sort by who is buying. |
dueDate, daysUntilDue | The closing date as a timestamp, and how many days that is from the run. |
summary, estimatedValue, documentUrl | Present on the feeds that publish them, null on the ones that do not. Most of these portals publish neither a summary nor a value. |
url | The official listing. This is where the documents and the named contact live. |
title | Straight from the portal, formatting and all. Several of them bury the closing date inside it. |
🧾 Reading the output
Three kinds of row can land in your dataset.
| Row | How to spot it | Charged |
|---|---|---|
| A solicitation | no _sample and no _diagnostic key | yes |
| The sample row | _sample: true | no |
| A diagnostic | _diagnostic: true and an errorCode | no |
| Code | What it means |
|---|---|
FILTER_NOT_HONOURED | That portal answered with rows that do not match what was asked. The whole page was dropped rather than billed. |
STATE_FILTER_EXCLUDED | That feed belongs to a state you did not list, so it was not queried. |
NO_RESULTS | The feeds were queried and nothing matched. Try fewer keywords, or turn onlyOpen off. |
SCHEMA_MISMATCH | A portal answered with a shape that is not its dataset. Usually means it changed and we need to look. |
PORTAL_REFUSED | A portal turned the request away. Re-run later. |
PORTAL_MOVED | A portal's address returned a 404. Tell us and we will chase it. |
PORTAL_ERROR | A portal returned an error of its own. |
RATE_LIMITED | A portal asked the run to slow down and it gave up on that one. |
TIME_BUDGET | The run ran out of time before a feed answered. Everything delivered is complete. |
BUDGET_EXHAUSTED | Your run's spending cap was reached before the feeds were finished. |
UNKNOWN_SOURCE | A source key in your input is not one of the nine. |
One bad portal never stops the others, and a diagnostic row never fails the run.
▶️ How to run it
1. Open US Local Bid Portals Scraper and click Try for free. 2. Under Portals to check, untick the feeds you do not want. 3. Put the words you bid on into Keywords, one per line. 4. Add two-letter codes to Limit to these states if you only work in some. 5. Set Maximum solicitations, click Start, then download as JSON, CSV or Excel.
💰 How much does it cost?
$0.016 per solicitation. Flat on every Apify plan, no volume tiers.
You pay per solicitation row delivered. Pages dropped because a portal ignored a filter, feeds skipped by your state list, the sample row and diagnostic rows are all free.
💡 What people use it for
- A standing keyword watch: schedule it daily on the two or three words you actually bid on, dedupe
on source plus solicitationId, and you see new work the day it posts.
- Feeding a bid/no-bid pipeline, using
daysUntilDueto drop anything closing too soon to answer. - Tracking which departments in a jurisdiction buy what you sell, by grouping on
buyerDepartment. - Covering the nationwide school and library feed for education contracts, which is the one feed here
that is not tied to a single city.
- Building a history of what a jurisdiction put out to tender, with
onlyOpenturned off.
🚧 What it does not do
- Nine feeds, not national coverage. Eight jurisdictions plus the school and library feed. It
does not cover federal contracting.
- No named buyer contacts. Those columns are never requested. The portal link on each row is
where they are published.
- No bid documents.
documentUrlis filled in only where a feed publishes one, which is rare. - No award data, no bidder lists, no pricing. These are open solicitations only.
- Fields differ between feeds. A summary or an estimated value that exists in one jurisdiction
will be null in another, because that portal does not publish it.
- Keyword matching is what the portal supports, so it matches on title, category and department
text rather than inside attached documents.
- Rows are a snapshot. A solicitation can be amended, extended or cancelled, and
scrapedAt
records when it was read.
🧭 Which procurement tool do you need?
| If you want | Use |
|---|---|
| Open bids from US local portals | This one |
| Those bids scored against what you can actually win | RFP & Tender Fit Monitor |
| US company filings and financials | SEC EDGAR Scraper |
| Contact details for a list of company websites | Contact Details Scraper |
❓ Questions people ask
Do I need a login for any of these portals? No. All nine publish these feeds openly, and there is no key to apply for.
Why are keywords cheaper than no keywords? The filtering happens at the portal, so a narrow keyword returns fewer rows and you pay per row.
Can I get closed solicitations too? Yes, turn onlyOpen off. Useful for building a picture of what a jurisdiction tenders over a year.
What is the school-district feed? US schools, districts and libraries file an FCC Form 470 when they want bids for telecoms and internet services. It is nationwide, which is why the state filter matters on it.
Can I add my own city? Not through the input, but tell us which portal and we will look at it.
Is scraping these feeds legal? They are public procurement records published by the jurisdictions themselves for exactly this purpose. Named contact columns are left out on purpose. Apify's write-up on scraping and the law is a sensible starting point, and we are not lawyers.
🆘 If something breaks
Open the Issues tab on the actor page. Send the run ID and which feed misbehaved. A SCHEMA_MISMATCH or PORTAL_MOVED row usually means that jurisdiction changed something, and that is worth telling us about.