US Local Bid Portals Scraper - State, County, City, Schools avatar

US Local Bid Portals Scraper - State, County, City, Schools

Pricing

from $15.40 / 1,000 solicitations

Go to Apify Store
US Local Bid Portals Scraper - State, County, City, Schools

US Local Bid Portals Scraper - State, County, City, Schools

Open bids from nine US local procurement feeds: Los Angeles, New York City, Baton Rouge, Montgomery County MD, Washington DC, Delaware, Illinois CDB, SUNY Construction, and every school district and library with a live FCC Form 470. $16.00 per 1,000 solicitations.

Pricing

from $15.40 / 1,000 solicitations

Rating

0.0

(0)

Developer

Dami's Studio

Dami's Studio

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

4 days ago

Last modified

Share

Pick the US local 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.

InputWhich of the nine feeds to read, plus keywords and states
OutputOne row per open solicitation: jurisdiction, title, type, category, status, posted and closing dates, days left, buying department, official link
Ceiling5,000 solicitations per run
Account neededNone, no key, no login
Price$16.00 per 1,000 solicitations on the Free plan, a little less on paid plans. The free plan's $5 a month covers about 300

🔍 What US Local Bid Portals Scraper does

Each feed is asked on its own terms. Your keywords and the still-open filter go into the query itself, so the portal does the filtering and you only pay for what comes back. A narrow keyword costs less than a broad one.

Every page is then checked against its own rows before anything is billed. Procurement portals sometimes answer with something that is not a reply to the question: the whole unfiltered list when you asked for one keyword, or another dataset's columns after a change. 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 e-mail address. Those columns are never requested, and e-mail addresses and phone numbers typed into free text are taken out before a row is written. The official portal link is on every row instead, and the jurisdiction publishes the contact there.

📋 What data you get from each solicitation

What you getField
Which feed, and the jurisdiction behind itsource, jurisdiction, jurisdictionLevel, state
The jurisdiction's own reference, the title, and a summary where there is onesolicitationId, title, summary
Type, category and statussolicitationType, category, status
Posted and closing dates, and days leftpostedDate, dueDate, daysUntilDue
The buying department, and the estimated value where it is publishedbuyerDepartment, estimatedValue
The official listing, a documents link where there is one, and the portalurl, documentUrl, portalUrl
When the row was readscrapedAt

▶️ How to scrape US local government bids

  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 the dataset as JSON, CSV or Excel.

💰 How much does it cost to scrape local government bids?

$16.00 per 1,000 solicitations, which is 1.6 cents each on the Free plan. Paid plans pay a little less: $15.80 on Starter, $15.60 on Scale and $15.40 on Business. On the free plan, the $5 Apify gives you each month covers about 300 solicitations.

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. Maximum solicitations doubles as your spending cap.

📥 What you give it

{
"sources": ["la-city", "nyc", "erate-f470"],
"keywords": ["security", "software"],
"states": ["CA", "NY"],
"onlyOpen": true,
"maxItems": 200
}
FieldDefaultWhat it is
sourcesall nine, and the boxes start tickedWhich feeds to read: la-city, nyc, baton-rouge, montgomery-county-md, dc-ocp, delaware-state, illinois-cdb, suny-construction, erate-f470.
keywordsnone, which means everything open; the box starts at security and softwareWords that must appear in the title, category or buying department. Terms are OR'd: paving and asphalt returns both.
statesnone, which means everywhereTwo-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.
onlyOpentrueOn, only solicitations whose closing date is still ahead. Off, the whole list including closed ones.
maxItems200Hard ceiling on rows, up to 5,000, shared across the feeds you picked so one big portal cannot use the whole allowance.

An input with nothing in it, such as {} sent through the API, returns one free sample row.

📤 What you get back

A real row from a run on 21 September 2026:

{
"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"
}
FieldHow to read it
solicitationIdThe jurisdiction's own reference. Use it with source as a dedupe key across runs.
jurisdictionLevelcity, county, state or the school-district feed's own level, so you can sort by who is buying.
dueDate, daysUntilDueThe closing date as a timestamp, and how many days that is from the run.
summary, estimatedValue, documentUrlPresent on the feeds that publish them, null on the ones that do not. Most of these portals publish neither a summary nor a value.
urlThe official listing. This is where the documents and the named contact live.
titleStraight 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.

RowHow to spot itCharged
A solicitationno _sample and no _diagnostic keyyes
The sample row_sample: trueno
A diagnostic_diagnostic: true and an errorCodeno
CodeWhat it means
FILTER_NOT_HONOUREDThat portal answered with rows that do not match what was asked. The whole page was dropped rather than billed.
STATE_FILTER_EXCLUDEDThat feed belongs to a state you did not list, so it was not queried.
NO_RESULTSThe feeds were queried and nothing matched. Try fewer keywords, or turn onlyOpen off.
SCHEMA_MISMATCHA portal answered with a shape that is not its dataset. Usually means it changed and we need to look.
PORTAL_REFUSEDA portal turned the request away. Re-run later.
PORTAL_MOVEDA portal's address no longer exists. Tell us and we will chase it.
PORTAL_ERRORA portal returned an error of its own.
RATE_LIMITEDA portal asked the run to slow down and it gave up on that one.
TIME_BUDGETThe run ran out of time before a feed answered. Everything delivered is complete.
BUDGET_EXHAUSTEDYour run's spending cap was reached before the feeds were finished.
UNKNOWN_SOURCEA 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.

💡 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 daysUntilDue to 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, the one feed here that is not tied to a single city.
  • Building a history of what a jurisdiction put out to tender, with onlyOpen turned 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; SAM.gov notices are in RFP & Tender Monitor.
  • No named buyer contacts. Those columns are never requested. The portal link on each row is where they are published.
  • No bid documents. documentUrl is 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.
  • It is not an official tool of any platform or company named on this page. Dami's Studio is independent and is not affiliated with or endorsed by any of them.

🧭 Which procurement scraper do you need?

If you wantUse
Open bids from nine US city, county, state and school feedsThis one
Federal contract notices from SAM.gov, plus EU and UK tenders, scored against what you doRFP & Tender Monitor
Federal grants you can still apply forUS Federal Grants Scraper
Federal money already paid out, and to whomUSASpending Federal Awards Scraper

❓ Questions people ask

Do I need a login for any of these bid portals?

No. All nine publish these feeds openly, and there is no key to apply for.

Why do keywords make a run cheaper?

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.

Can I call it from code or connect it to an AI assistant?

Yes. The API tab has ready-made code for Python, JavaScript and the command line. For Claude, ChatGPT or another MCP client, connect https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/us-local-bid-portals-scraper. Either way the run happens on your Apify account at the same price.

These are public procurement records the jurisdictions publish themselves. Named contact columns are left out on purpose. Apify's write-up on the legality of web scraping 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.