TX ESBD Opportunity Search avatar

TX ESBD Opportunity Search

Pricing

$6.00 / 1,000 solicitation records

Go to Apify Store
TX ESBD Opportunity Search

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

Wenhao Yang

Maintained by Community

Actor 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

FilterWhat it does
keywordsMatches 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.
nigpCodesRestrict to one or more NIGP codes.
agenciesRestrict to one or more agencies.
statusesAny of the lifecycle statuses above.
publishedAfter / publishedBeforeDate window (YYYY-MM-DD) - for chunking the full corpus.
pagesScan depth from the newest record (24 records per page). Default 20.
limitStop 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 goalActor
Find bids by keyword, NIGP, agency, statustx-esbd-search - you are here
Check one specific bid by its numbertx-esbd-get
Monitor new & changed solicitations on a scheduletx-esbd-changes
Who won state contracts, at what amountstx-esbd-awards
Find / vet a vendor - HUB, SDV, small business, NIGP capabilitytx-cmbl-vendors
Find disabled-veteran (DV) HUB vendorstx-hub-certified
Statewide contracts - who's on each SPD/TxSmartBuy contracttx-smartbuy-contracts
Pull the raw full corpus (query + monitor) - power userssled-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.