TX ESBD Opportunity Search
Pricing
$6.00 / 1,000 solicitation records
TX ESBD Opportunity Search
Find Texas government contracts by keyword, NIGP code, agency or status over 59K+ solicitations. Best starting point for finding bids. AI-agent ready.
Pricing
$6.00 / 1,000 solicitation records
Rating
0.0
(0)
Developer
Wenhao Yang
Maintained by CommunityActor stats
0
Bookmarked
5
Total users
3
Monthly active users
6 hours ago
Last modified
Categories
Share
TX Government Contracts & Bids Search, NIGP (tx-esbd-search)
Search every Texas state & local government solicitation - the official Texas Electronic State Business Daily (ESBD) record - by keyword, NIGP commodity code, agency or status, and get back structured JSON with the NIGP codes already parsed apart.
This is the starting point of the Texas procurement family: you have a category or a set of keywords, and you want to know what the state is buying right now.
Low cost
From $0.006 per record - you are charged per matching record delivered, never for the query itself. A run that matches nothing costs nothing. The scan stops early once it has delivered limit matches, so the cost tracks what you actually receive rather than the depth of the corpus.
What you get
Every match is normalized with structured NIGP codes - not the raw "94828-Dental Services;" string the source emits:
{"platform": "tx-esbd","agency": "Parks & Wildlife Department - 802","agencyNumber": "802","title": "17ft Center Console Mud Boat Packages","bidNumber": "802-27-75102-BR","status": "Awarded","publishedDate": "7/24/2026","closeDate": "8/7/2026 2:00 PM","nigpCodes": [{ "code": "12021", "description": "Boats, 21 Feet And Under" },{ "code": "12063", "description": "Motors, Outboard, Gasoline" },{ "code": "12090", "description": "Trailers, Boat" }],"url": "https://www.txsmartbuy.gov/esbd/802-27-75102-BR","created": "7/24/2026 8:25 am","lastModified": "8/27/2026 4:10 pm"}
Fields: platform, agency, agencyNumber, title, bidNumber, status, publishedDate, closeDate, nigpCodes (structured), url, internalId, created, lastModified.
Statuses: Posted / Awarded / Addendum Posted / Closed / No Award / Posting Cancelled / No Award Reposted
Filters
| Filter | What it does |
|---|---|
keywords | Matches the title and the NIGP descriptions - searching dental also finds solicitations classified under NIGP Dental Services even when the title never says "dental". This is the filter most existing scrapers get wrong. |
nigpCodes | Restrict to one or more NIGP codes. |
agencies | Restrict to one or more agencies. |
statuses | Any of the lifecycle statuses above. |
publishedAfter / publishedBefore | Date window (YYYY-MM-DD) - for chunking the full corpus. |
pages | Scan depth from the newest record (24 records per page). Default 20. |
limit | Stop after this many matches. Default 50. |
Example inputs
What the state is buying in a category - keywords reaches the NIGP descriptions too, so one word finds solicitations whose title never uses it.
{ "keywords": ["dental"], "limit": 50 }
Open bids from one agency:
{ "agencies": ["529"], "statuses": ["Posted"], "limit": 100 }
Everything under one NIGP commodity code:
{ "nigpCodes": ["91054"], "statuses": ["Posted"] }
A date window - pair a scan with publishedAfter / publishedBefore to cover a date range. Set limit too: the scan stops as soon as limit matches are in hand, so the default (50) returns only 50 records even across a wide window (max limit is 500 per run):
{ "pages": 2500, "limit": 500, "publishedAfter": "2026-01-01", "publishedBefore": "2026-03-31" }
Why this is hard
The source is a live JSON service with no server-side search: the lines filter parameter is accepted and then ignored, so every query is a client-side pass over the corpus, and the corpus is ordered by last modified, not posted date. That means a shallow scan can miss an older solicitation that was touched this week - which is why the run reports the date range it actually covered, so you can tell a genuinely empty result from a scan that stopped too early.
Scanning the full corpus
pages is scan depth from the newest record, not a page offset. The source
serves 24 records per page (~60,000 records total), one request per page, and
there is no server-side filter - so a deep scan is a long series of requests and
is bounded by the actor's run time limit, not by pages alone. A scan that
runs out of time stops cleanly and reports how far it got; it does not silently
return a partial answer.
Because of that, a single run is not the way to cover the whole corpus. Chunk it - by date window or NIGP code - and run the chunks (the source's modified-date ordering is the reason date windows beat plain deep scans):
{"pages": 800, "publishedAfter": "2026-01-01", "publishedBefore": "2026-03-31"}{"pages": 800, "nigpCodes": ["90000"]}
A _meta record reports how many records were scanned and the posted/modified
date range that scan covered, so you can confirm a chunk was fully covered
before relying on an empty result.
Per-page latency depends on where the run executes; a few hundred pages per run is a comfortable working size.
Example output
{"keywords": ["painting"]} - one match, with the NIGP codes already parsed apart:
{"platform": "tx-esbd","agency": "Health & Human Services Commission - 529","agencyNumber": "529","title": "Dormitory Interior Painting San Antonio State Supported Living Center Building 674","bidNumber": "HHS0017699","status": "Posted","publishedDate": "9/21/2026","closeDate": "10/6/2026 10:30 AM","nigpCodes": [{"code": "91054","description": "Painting, Maintenance And Repair Services (Including Caulking)"},{"code": "91461","description": "Painting And Wallpapering"}],"url": "https://www.txsmartbuy.gov/esbd/HHS0017699","internalId": "561764","created": "9/21/2026 5:29 pm","lastModified": "9/21/2026 5:32 pm"}
A run also emits a _meta record reporting the date range the scan actually covered, so an empty result can be told apart from a scan that stopped too early.
The rest of the Texas family
One actor, one job - match your goal:
| Your goal | Actor |
|---|---|
| Find bids by keyword, NIGP, agency, status | tx-esbd-search - you are here |
| Check one specific bid by its number | tx-esbd-get |
| Monitor new & changed solicitations on a schedule | tx-esbd-changes |
| Who won state contracts, at what amounts | tx-esbd-awards |
| Find / vet a vendor - HUB, SDV, small business, NIGP capability | tx-cmbl-vendors |
| Find disabled-veteran (DV) HUB vendors | tx-hub-certified |
| Statewide contracts - who's on each SPD/TxSmartBuy contract | tx-smartbuy-contracts |
| Pull the raw full corpus (query + monitor) - power users | sled-tx-procurement |
Notes
- Data source: Texas Comptroller - ESBD. Public state records.
- No login, no anti-bot - uses the official public JSON API.
- Full corpus - ~60,000 solicitations (posted, awarded, closed & historical).
- Also available as a hosted MCP tool (
j0401--tx-esbd-search) for AI assistants.
License
MIT - see ./LICENSE.
Disclaimer
This product is an independent data service and is not affiliated with, endorsed by, or sponsored by the State of Texas or any government agency. All solicitation data is public government information. We recommend verifying any opportunity on the official portal before acting.