Government surplus auctions with the bid count, the reserve and the real end time
GovDeals is where US state and municipal agencies, school districts, police departments, transit authorities and utilities auction their surplus — trucks, excavators, buses, patrol cars, generators, lab equipment, land.
9 active endpoints, on 1 and 2 credit tiers.
- POST/govdeals/v1/search
- POST/govdeals/v1/sold
- POST/govdeals/v1/detail
- POST/govdeals/v1/bids
- POST/govdeals/v1/questions
- POST/govdeals/v1/categories
- POST/govdeals/v1/locations
- +2 more
What GovDeals endpoints does ReefAPI ship?
9 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
GovDeals API
5 of 9 endpoints, ready to run
Live lots, closing first
// Press "Try it" and this pane shows exactly what the // live site returned this second — including an empty // result, if that is the truth. No key, no account.
How the GovDeals API works
GovDeals is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 438 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
Value a surplus truck before you bid on it
Find what is closing, read the reserve and the odometer, then check what the same thing sold for.
Keep one item_id and read ends_at — it is already UTC.
Bid count, buyer premium, reserve state, VIN, odometer, coordinates and the agency's removal deadline.
Recently closed lots with the final hammer price as your comparable set.
A live lot, the exact second it closes, whether a bid can clear the reserve, and recent sold prices for the same thing.
curl -X POST https://api.reefapi.com/govdeals/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"dump truck","sort":"ending_soonest","limit":24}'{
"ok": true,
"data": { … },
"meta": {
"api": "govdeals",
"endpoint": "search",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}What one listing row carries
Measured on 477 rows across twenty keyword, category, state and agency searches in two cohorts.
| Field | Fill | What it is |
|---|---|---|
| current_bid + price_basis | 477/477 | On a live auction the standing high bid (or the opening bid if nobody has bid yet); on a closed one the hammer price. price_basis says which, so you never have to guess. |
| has_reserve + reserve_met | 477/477 | A government lot often carries a floor the agency will not sell below. Both flags ship, plus next_bid_meets_reserve on the 71 of 229 lots that have a reserve. |
| ends_at | 477/477 | ISO-8601 UTC, taken from the source's own UTC field — not from the naive string plus guessed daylight saving. |
| ends_at_local + ends_at_zone_label + ends_at_offset_hours | 477/477 | The untouched source string, the label the source printed, and the offset the two actually imply. On 4 of 477 rows the label said EDT while the real offset was -05:00; this is how you see that rather than inherit it. |
| seconds_remaining + source_time_remaining | 477/477 | Our countdown and the source's own, side by side, so you can check our clock against theirs. |
| seller + seller_id | 477/477 | The selling agency and the id you feed back into search as a filter. 120 distinct agencies in one 229-row sample. |
| city + state + zip | 477/477 | Where the lot physically is, which decides whether you can collect it. 31 states in one sample. |
| bid_increment | 477/477 | The step the next bid has to clear. |
| make / model / model_year | 177 / 154 / 149 of 229 | Published when the agency typed them in — mostly on vehicles and heavy equipment. |
| buy_now_price | 22/229 | Only buy-now and make-offer lots carry one; the source's 0.0 is returned as null, never as a price of zero. |
GovDeals does not put a bid count in its search payload at all (null on 384 of 384 rows), so no dead bid_count column is published here — the detail action returns it from the source's live bid box, and it matched the bid log exactly on 16 of 16 round trips. A lot is identified by a PAIR, asset id plus agency id, because asset ids repeat across agencies; every row ships item_id in the combined form every other action accepts.
Measured coverage
Two live cohorts on 2026-10-06 plus a confirming third: 56 of 56 calls on the expected result, twice.
About 25,000 open lots: 25,003 online auctions, 345 make-offer and 114 buy-now. 14,225 from government sellers, 10,196 commercial, 1,041 non-profit.
59 state and province codes live, 63 location nodes in all. Biggest when measured: Ohio 2,498, Georgia 2,177, California 2,162, Texas 1,721, Virginia 1,440.
124,055 closed lots reachable, with the final hammer price. 13,436 for 'van', 15,999 for 'trailer', 5,007 for 'loader'.
1 to 200 rows per page, honoured exactly. A 6,955-result search gave 48 rows on page 144, 43 on page 145 and zero beyond — last_page, has_more and page_beyond_last are returned.
Public on live and closed lots. The log count matched the auction's own bid count on 16 of 16 lots, 0 to 35 bids. Bidder handles arrive masked by the source.
629 category nodes under 14 segments, each with its live lot count and the code search accepts.
85 selling agencies within 100 miles of 30301, 23 within 25 miles, each with distance and open lot count.
ISO-8601 UTC from the source's own UTC field, with the raw local string, the source's zone label and the implied offset beside it. Cross-checked against GovDeals' own server clock (under 1 s apart) and against its own countdown string (exact to the second on 5 of 5 rows).
No bid count on search rows — the source has none there (null on 384 of 384), so detail returns it instead. No closed-within-N-days window, because the source ignores one (1, 7 and 30 days all returned the same 124,055). No seller rating or feedback score and no condition label, because GovDeals publishes neither.
Placing a bid, watchlist, your own bids and orders, invoices and payment, inspection appointments and restricted-bidder tiers are outside this API — they need a signed-in buyer.
What people build with GovDeals
The jobs this data is most often used for.
endpoints
credits per call
Fleet and equipment buyers tracking municipal surplus by state, agency and category with the real closing second.
Dealer and auctioneer sourcing: search by make, model and year, then pull 124,000 closed lots as sold comparables.
Bid-timing and alerting tools that need a UTC end time and the reserve state, not a naive local string.
Residual-value and depreciation research on public-sector fleet using hammer prices rather than asking prices.
What GovDeals data costs
The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 438 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/govdeals/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"dump truck","sort":"ending_soonest","limit":24}'import requests
r = requests.post(
"https://api.reefapi.com/govdeals/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "dump truck",
"sort": "ending_soonest",
"limit": 24
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up GovDeals.
Get a free key →What timezone are the auction end times in?▾
America/New_York, site-wide — not the seller's local zone. A California agency's lot and a Florida agency's lot carry the same clock. GovDeals publishes the end time three ways and they do not always agree: a naive local string, a UTC field, and a human label naming a zone. On 4 of 477 rows the label said EDT while the true offset was -05:00, because those lots close after the daylight-saving change. ends_at therefore comes from the source's own UTC field, and ends_at_local, ends_at_zone_label and ends_at_offset_hours all ship so you can see the disagreement. We also cross-checked against GovDeals' own server clock (under one second apart) and against its own countdown string, which reproduced our arithmetic to the second on 5 of 5 rows.
Can I get sold prices, not just live asks?▾
Yes. The sold action returns closed auctions where current_bid is the final hammer price and price_basis says final_price — 124,055 closed lots were reachable when measured, 13,436 for 'van' alone. Sort by ending_latest for the most recently closed. On every closed lot checked, the sold row's price, the bid box's current bid and the highest row in the bid log agreed.
How do I know whether a bid can actually win?▾
Read the reserve block, not the price. has_reserve says the agency set a floor, reserve_met says whether the bidding has cleared it, next_bid_meets_reserve says whether one more increment would, and reserve_reduced says the agency has already lowered it. You can also search only the lots with an unmet reserve: on 'truck' that narrowed 6,954 lots to 1,439, and every returned row did have an unmet reserve.
Is the bid log really public?▾
Yes, on live and closed lots alike. Every bid with its amount, the timestamp and a highest-bid flag. Bidder handles arrive masked by GovDeals itself (for example te*****) and we never unmask them; the numeric buyer ids the source also sends are dropped. The log's count matched the auction's own bid count on 16 of 16 lots, from 0 up to 35 bids.
Which filters actually work?▾
Thirteen, each verified against two independent control searches rather than trusted: keyword, category, state or province, ZIP plus radius in miles, agency, seller type, condition code, sale format, currency, make, model, model year, price range, unmet reserve, closing-within-days and listed-within-days. Example on 6,954 'truck' lots: Texas 369, government sellers 3,755, within 50 miles of 30301 918, Ford 661, closing within 3 days 83. Four were also checked against the rows and not only the count — a Texas filter returned 48 of 48 rows in Texas, and a $10,000 floor returned a cheapest row of exactly $10,000.
How deep can I page, and how many rows per page?▾
Up to 200 rows per page, and the page size is honoured exactly — 1, 5, 24, 48, 100 and 200 all returned that many. Paging is honest to the end: a 6,955-result search gave 48 rows on page 144, 43 on page 145 and zero beyond it, with every page a different set. The response returns last_page, has_more and page_beyond_last, so overrunning the end is reported as an overrun and never as zero results.
How do I find auctions near me?▾
Two ways. Search with a ZIP and a radius in miles, or call sellers with a ZIP to get every agency within range, each with its distance and how many lots it has open right now — 100 miles around Atlanta returned 85 agencies, the nearest 3 miles away with 790 open lots. This matters because most GovDeals lots are collect-in-person.
What categories are covered?▾
629 category nodes under 14 top-level segments, every one with its live lot count and the code search accepts. Transportation and heavy equipment dominate, but the tree also covers laboratory equipment, computers and IT, office and furniture, industrial and shop machinery, aircraft and marine, and real estate.
What needs a GovDeals account and is therefore not here?▾
Placing a bid, your watchlist, your own bids and orders, invoices and payment, inspection appointments and restricted-bidder tiers all require a signed-in buyer. Everything this API returns is what a visitor sees without logging in.
Does it cover GovDeals Canada?▾
Not as a separate surface, but Canadian lots cross-listed onto govdeals.com are returned and labelled: country, state or province code and currency all ship, and 846 of the live lots were priced in CAD when measured. You can restrict to one currency.
What is the GovDeals API?▾
GovDeals API is a ReefAPI endpoint group for us government surplus auctions with the bid count, the reserve state and the end time in real utc. It returns live JSON through POST requests under /govdeals/v1.
Is the GovDeals API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. GovDeals calls use the same shared credit balance as every other ReefAPI engine.
Do I need a GovDeals login or account?▾
No login to GovDeals is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the GovDeals data?▾
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
191 E-commerce & Marketplaces APIs on the same key
One key, one credit pool, one response envelope. If you are pulling GovDeals, you are one call away from the rest of the category — no second contract, no second integration.
Need something this API does not do?
Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 437 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-10-06.