GovDeals API

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.

no credit card1,000 free credits · instant API key · pay by card or crypto
Missing a GovDeals endpoint, or need a source we don't have yet?Contact us real people · same-day reply.
G
/govdeals/v1

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.

9 endpoints

search

2 cr

Search LIVE GovDeals lots.

required
—
optional
query, category_id, state, zip, radius_miles, seller_id, seller_type, condition, auction_type, currency, make, model, model_year, min_price, max_price, reserve_not_met, closing_within_days, listed_within_days, sort, page, limit

sold

2 cr

Closed GovDeals auctions.

required
—
optional
query, category_id, state, zip, radius_miles, seller_id, seller_type, condition, auction_type, currency, make, model, model_year, min_price, max_price, sort, page, limit

detail

2 cr

Everything GovDeals publishes about one lot, including the live auction state its search payl…

required
asset_id, account_id
optional
—

bids

2 cr

The public bid log for one lot.

required
asset_id, account_id
optional
auction_id, all_auctions, page, limit

questions

1 cr

The public question-and-answer thread on one lot.

required
asset_id, account_id
optional
—

categories

2 cr

The GovDeals category tree with the live lot count on every node.

required
—
optional
top_level_only, flat

locations

1 cr

Where the live lots physically are.

required
—
optional
flat

sellers

1 cr

Selling agencies near a US ZIP code, with how far away each one is and how many lots it curre…

required
zip
optional
radius_miles, min_lots

suggest

1 cr

What GovDeals buyers actually search for.

required
query
optional
—

Every parameter, every allowed value →

GovDeals API

5 of 9 endpoints, ready to run

View docs ↗

Live lots, closing first

2 credits1 required · 3 optional
POST/govdeals/v1/search
idle
// 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.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 438 engines.

02
Call
POST /govdeals/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
1 or 2 credits per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

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.

01search?query=dump%20truck&state=TX&sort=ending_soonest
POSTsearch?query=dump%20truck&state=TX&sort=ending_soonest

Keep one item_id and read ends_at — it is already UTC.

02detail?asset_id=276-23609
POSTdetail?asset_id=276-23609

Bid count, buyer premium, reserve state, VIN, odometer, coordinates and the agency's removal deadline.

03sold?query=dump%20truck&sort=ending_latest
POSTsold?query=dump%20truck&sort=ending_latest

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.

request
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}'
response envelope
{
  "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.

FieldFillWhat it is
current_bid + price_basis477/477On 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_met477/477A 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_at477/477ISO-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_hours477/477The 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_remaining477/477Our countdown and the source's own, side by side, so you can check our clock against theirs.
seller + seller_id477/477The selling agency and the id you feed back into search as a filter. 120 distinct agencies in one 229-row sample.
city + state + zip477/477Where the lot physically is, which decides whether you can collect it. 31 states in one sample.
bid_increment477/477The step the next bid has to clear.
make / model / model_year177 / 154 / 149 of 229Published when the agency typed them in — mostly on vehicles and heavy equipment.
buy_now_price22/229Only 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.

Live lots

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.

Geography

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.

Sold comparables

124,055 closed lots reachable, with the final hammer price. 13,436 for 'van', 15,999 for 'trailer', 5,007 for 'loader'.

Page shape

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.

Bid log

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.

Taxonomy

629 category nodes under 14 segments, each with its live lot count and the code search accepts.

Agencies by ZIP

85 selling agencies within 100 miles of 30301, 23 within 25 miles, each with distance and open lot count.

Timestamps

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).

Not published

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.

Account-only

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.

9

endpoints

1/2

credits per call

01

Fleet and equipment buyers tracking municipal surplus by state, agency and category with the real closing second.

02

Dealer and auctioneer sourcing: search by make, model and year, then pull 124,000 closed lots as sold comparables.

03

Bid-timing and alerting tools that need a UTC end time and the reserve state, not a naive local string.

04

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 →
$0.67–$1.50 / 1,000 credits
  • 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
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}'
python
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"])
FAQ

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.

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.

0/4000

No account needed · we reply from [email protected]

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.