Public bid data for AI agents and developers
A free, read-only API and MCP server for aggregate public bid statistics. Every answer comes with its date, where it came from, what it leaves out and an address to cite. No account, no key.
What you can ask
Four questions, each answered from the 2026-11-01-r2 data release. The same four are available over HTTP and to AI agents through the Model Context Protocol (MCP).
| Question | MCP tool | HTTP request |
|---|---|---|
| List public bid portals by stateFor example: Which public bid portals can I check for Colorado? | list_portals_by_state | GET /api/v1/portals?state=COstate (optional): A US state or DC, as a two-letter code (CO) or a name (Colorado). |
| Get public bid statistics for a stateFor example: How many bids does VelocityBids count as due in Florida in the latest release, and what share of open ones have documents? | get_statistics_by_state | GET /api/v1/statistics?state=COstate (required): A US state or DC, as a two-letter code (CO) or a name (Colorado). |
| Get how long buyers give to respond to a bidFor example: How long do I usually have to respond to a public bid in Michigan? | get_response_window | GET /api/v1/response-window?state=COstate (optional): A US state or DC, as a two-letter code (CO) or a name (Colorado). |
| Get the data release behind the answersFor example: What date is this data from, and how accurate is it? | get_release_info | GET /api/v1/release |
Connect an AI agent
The server is at https://www.velocitybids.ai/api/mcp. It uses the Streamable HTTP transport, keeps no session, needs no key and has no sign-in.
Claude Code
claude mcp add --transport http velocitybids https://www.velocitybids.ai/api/mcpAny client that takes a server address
Add a remote MCP server and paste the address above. In clients that read a JSON file, the entry looks like this.
{
"mcpServers": {
"velocitybids": {
"type": "http",
"url": "https://www.velocitybids.ai/api/mcp"
}
}
}Clients that can only start a local command
Use a bridge such as mcp-remote, which turns the remote address into a local command.
npx mcp-remote https://www.velocitybids.ai/api/mcpUse the HTTP API
Every request is a GET with query parameters and returns JSON. A state is a two-letter code or a name, in any case.
curl "https://www.velocitybids.ai/api/v1/response-window?state=MI"That request returns the answer below, as built from the 2026-11-01-r2 release. It is shown in full so you can see everything an answer carries.
{
"release": "2026-11-01-r2",
"asOf": "2026-11-01",
"period": "2026-08-03 to 2026-11-02 (exclusive), by due date",
"provenance": "Aggregates built from a snapshot of the VelocityBids collection taken November 1, 2026, under rule version rules-v1-2026-11-01 (release 2026-11-01-r2, code revision 287d0ca). Bids pass a fixed series of exclusions before they are counted: duplicates, resellers, sources not cleared for public use, robots.txt and unverified country. Of 103,851 bids due in the window, 23,973 remain.",
"limits": [
"Only 54.7% of cleared bids carry a posting date from the source. The rest are in no response-window figure, so these figures describe those bids and not the rest.",
"The bids with a source posting date are not a random draw from the cleared bids. They lean toward portals that publish a posting date, and the platform mix of the two groups differs (distance 0.34 on a 0 to 1 scale). Two checks bear on whether that moves the answer. Bids with and without a posting date stayed open for almost the same time after we first saw them (13.0 and 12.8 days). And five alternative cuts, including re-weighting to the platform mix of all cleared bids, put the median between 23.5 and 26.0 days. We read the window as about 24 days for the cleared sources, and we have not measured it for sources outside the cohort.",
"Counts describe the bids VelocityBids collects from sources cleared for public aggregates. They are a count of our collection, not of the whole market.",
"About 87.2% of a random sample of 400 cleared bids were true solicitations (95% interval 83.6% to 90.2%), judged from the posted title only.",
"US state and local bids only, with the country verified from the source record. 11,687 bids that passed every other test were left out for lacking a verified country, so counts run low rather than high.",
"A state figure is published only when it rests on at least 150 bids. Where it does not, it is left out, not estimated.",
"Only aggregates are available. There is no bid search, no individual bids and no bid documents."
],
"citation": {
"title": "Time to respond to public bids",
"url": "https://www.velocitybids.ai/data/releases/2026-11-01-r2/responseWindow.json",
"citeAs": "VelocityBids, Time to respond to public bids, release 2026-11-01-r2, snapshot 2026-11-01. https://www.velocitybids.ai/data/releases/2026-11-01-r2/responseWindow.json"
},
"methodUrl": "https://www.velocitybids.ai/insights/how-we-count-public-bids",
"dataFiles": [
"https://www.velocitybids.ai/data/releases/2026-11-01-r2/responseWindow.json",
"https://www.velocitybids.ai/data/releases/2026-11-01-r2/biasTests.json"
],
"data": {
"state": {
"code": "MI",
"name": "Michigan"
},
"measures": "Calendar days between the buyer's posting date and the due date, on bids with a source posting date more than a day before our first sighting and a window under 120 days.",
"national": {
"bidsMeasured": 13116,
"p10Days": 9.8,
"p25Days": 15.4,
"medianDays": 23.58,
"p75Days": 32.6,
"p90Days": 42.5,
"percentUnder7Days": 4.8,
"percentUnder14Days": 16.7,
"percentUnder21Days": 39.7,
"percent21DaysOrMore": 60.3,
"percent30DaysOrMore": 32.7,
"percent45DaysOrMore": 7.6
},
"forState": {
"bidsMeasured": 555,
"p10Days": 5.4,
"medianDays": 14.71,
"p90Days": 30.7
},
"datedSharePercent": 54.7
}
}The machine-readable description is an OpenAPI 3.1 document.
What every answer contains
releaseandasOf- The release id and the date of the snapshot it was built from. Quote both with any figure.
period- The dates the figures cover, and whether they are counted by due date or as of one day.
provenance- Where the figures come from and which exclusions were applied before counting.
limits- What the figures do not show. This is the part to read before relying on a number.
citation- A title, a public address and a ready-made citation line for the file the figures were read from.
methodUrlanddataFiles- The page that explains the method, and the release files behind the answer, which anyone can download.
data- The figures. A figure the release does not publish is
null, never an estimate.
What this does not do
- It has no bid search. It returns no individual bid, no buyer, no solicitation number and no bid document.
- It counts the bids VelocityBids collects from sources cleared for public aggregates. That is our collection, not the whole market.
- It covers US state and local bids with a country verified from the source record.
- A state figure rests on at least 150 bids. Below that the release publishes nothing for the state, and the answer says so.
- In a random sample of 400 cleared bids, about 87.2% were true solicitations (95% interval 83.6% to 90.2%), judged from the posted title only.
- The portal list is partial. A portal missing from it may still exist.
The rules every release follows are explained in How we count public bids. The files for this release are public: the manifest lists each one with its SHA-256 hash.
Fair use
- Each address may make 300 calls an hour. Over that, the HTTP API answers 429 with a
Retry-Afterheader and the MCP server returns a tool error that says when to try again. - HTTP answers are cached at the edge for up to an hour, and repeat requests served from the cache do not count. Answers change only when a new release is published.
- Cite the
citation.urland the release date when you use a figure. A new release replaces these figures, so compare release ids before comparing numbers. - We record that a call was made, which tool answered it and whether it succeeded, under an identifier that changes every day. Our call records do not include what you asked. Our hosting provider, Vercel, keeps standard request logs, which include the address and the full request, for a short period. To apply the limit we keep a keyed hash of your address, never the address itself. It is deleted by the first call made after the end of the next clock hour, so while the API is quiet it can stay until then. Call records are kept for up to 400 days.
Questions, corrections or a figure you think is wrong: hello@velocitybids.ai. If you want the open bids that fit your own company, see them free.