Looking for the overview — what this API returns, what it costs, and a call you can run without a key? See the GovDeals API page →
E-commerce & Marketplaces

GovDeals API & Scraper

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 actionsLive JSON1,000 free credits$0.67–$1.50 / 1,000 creditsMCP-ready
Get a free keyOpen in playground

🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.

This API returns a listing row with the facts an auction actually turns on, not just a price: current bid with an explicit basis, bid increment, whether a reserve exists and whether the bidding has met it, the selling agency, where the lot physically sits, and the end time in real UTC. One lot in full adds VIN or serial, odometer reading, coordinates, every photo and the agency's own removal and inspection terms, plus the live auction state: bid count, buyer premium percentage, watcher and page-view counters. Closed auctions are a separate surface — 124,055 lots with the final hammer price — and the public bid log and question thread are open on live and closed lots alike. End times are the part integrations get wrong: GovDeals publishes a naive local string, and its own human label says EDT even on lots whose real offset is -05:00, so this API derives the UTC time from the source's own UTC field and ships the raw string and the implied offset beside it.

Reference

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.

Live example

Real request and response JSON

Captured from the indexed primary action, search, on .

Captured request
{
  "method": "POST",
  "url": "https://api.reefapi.com/govdeals/v1/search",
  "headers": {
    "x-api-key": "$REEF_KEY",
    "content-type": "application/json"
  },
  "body": {
    "query": "dump truck",
    "sort": "ending_soonest",
    "limit": 24
  }
}
Captured response
{
  "ok": true,
  "meta": {
    "api": "govdeals",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": 3127.5,
    "record_count": 24,
    "bytes": 52134,
    "cache_hit": false,
    "upstream_requests": 1,
    "time_zone": "America/New_York",
    "charged_credits": 1,
    "version": "1.0.0",
    "request_id": "9c556410143f4592",
    "queue_ms": 1.4,
    "fetched_at": "2026-10-06T14:47:20.063Z"
  },
  "data": {
    "total": 221,
    "page": 1,
    "limit": 24,
    "last_page": 10,
    "has_more": true,
    "page_beyond_last": false,
    "query": "dump truck",
    "measured_at_utc": "2026-10-06T14:47:16Z",
    "listings": [
      {
        "item_id": "33632-2",
        "asset_id": 33632,
        "account_id": 2,
        "auction_id": 1,
        "title": "2016 Volvo VHD84B Dump Truck - Light Lot",
        "url": "https://www.govdeals.com/asset/33632/2",
        "lot_number": -1,
        "current_bid": 56500,
        "price_basis": "current_bid",
        "currency": "USD",
        "bid_increment": 1000,
        "buy_now_price": null,
        "has_reserve": false,
        "reserve_met": true,
        "next_bid_meets_reserve": null,
        "reserve_reduced": false,
        "ends_at": "2026-10-06T15:15:00Z",
        "ends_at_local": "2026-10-06T11:15:00",
        "ends_at_zone_label": "EDT",
        "ends_at_offset_hours": -4,
        "starts_at_local": "2026-09-29T11:00:00",
        "seconds_remaining": 1664,
        "ended": false,
        "is_sold": false,
        "source_time_remaining": "0:0:27:40",
        "auction_type": "auction",
        "auction_type_code": 3,
        "sale_event_id": null,
        "seller": "Metropolitan Government of Nashville and Davidson County, TN",
        "seller_id": 2,
        "category_id": "645",
        "category_name": "Dump Trucks",
        "make": "Volvo",
        "model": "VHD",
        "model_year": "2016",
        "city": "Nashville",
        "state": "TN",
        "state_name": "Tennessee",
        "zip": "37217",
        "country": "USA",
        "is_new_listing": false,
        "image_url": "https://files.lqdt1.com/photos/2/2_33632_f65a51f6-6dca-40a2-915a-d53ebc4d12b0.jpg?cb=260921101419"
      },
      {
        "item_id": "33634-2",
        "asset_id": 33634,
        "account_id": 2,
        "auction_id": 1,
        "title": "2016 Mack GU713 Dump Truck - Light Lot",
        "url": "https://www.govdeals.com/asset/33634/2",
        "lot_number": -1,
        "current_bid": 11600,
        "price_basis": "current_bid",
        "currency": "USD",
        "bid_increment": 200,
        "buy_now_price": null,
        "has_reserve": false,
        "reserve_met": true,
        "next_bid_meets_reserve": null,
        "reserve_reduced": false,
        "ends_at": "2026-10-06T15:45:00Z",
        "ends_at_local": "2026-10-06T11:45:00",
        "ends_at_zone_label": "EDT",
        "ends_at_offset_hours": -4,
        "starts_at_local": "2026-09-29T11:00:00",
        "seconds_remaining": 3464,
        "ended": false,
        "is_sold": false,
        "source_time_remaining": "0:0:57:40",
        "auction_type": "auction",
        "auction_type_code": 3,
        "sale_event_id": null,
        "seller": "Metropolitan Government of Nashville and Davidson County, TN",
        "seller_id": 2,
        "category_id": "645",
        "category_name": "Dump Trucks",
        "make": "Mack",
        "model": "GU713",
        "model_year": "2016",
        "city": "Nashville",
        "state": "TN",
        "state_name": "Tennessee",
        "zip": "37217",
        "country": "USA",
        "is_new_listing": false,
        "image_url": "https://files.lqdt1.com/photos/2/2_33634_1fa31cad-57fa-4beb-8c7b-2358aaef3428.jpg?cb=260921113502"
      },
      {
        "item_id": "42959-432",
        "asset_id": 42959,
        "account_id": 432,
        "auction_id": 1,
        "title": "EMERGENCY LIGHTS AND SPEAKERS (22)",
        "url": "https://www.govdeals.com/asset/42959/432",
        "lot_number": -1,
        "current_bid": 450,
        "price_basis": "current_bid",
        "currency": "USD",
        "bid_increment": 10,
        "buy_now_price": null,
        "has_reserve": false,
        "reserve_met": true,
        "next_bid_meets_reserve": null,
        "reserve_reduced": false,
        "ends_at": "2026-10-06T16:39:00Z",
        "ends_at_local": "2026-10-06T12:39:00",
        "ends_at_zone_label": "EDT",
        "ends_at_offset_hours": -4,
        "starts_at_local": "2026-09-29T12:39:00",
        "seconds_remaining": 6704,
        "ended": false,
        "is_sold": false,
        "source_time_remaining": "0:1:51:40",
        "auction_type": "auction",
        "auction_type_code": 3,
        "sale_event_id": null,
        "seller": "State of Maryland",
        "seller_id": 432,
        "category_id": "09",
        "category_name": "Vehicle Equipment and Parts",
        "make": null,
        "model": null,
        "model_year": null,
        "city": "Baltimore",
        "state": "MD",
        "state_name": "Maryland",
        "zip": "21226",
        "country": "USA",
        "is_new_listing": false,
        "image_url": "https://files.lqdt1.com/photos/432/432_42959_b62ea12f-a917-43e8-a90d-6d0dfafa654b.jpg?cb=260924144452"
      }
    ]
  }
}
Actions

What the GovDeals API does

ActionDescriptionConcrete use caseKey params
searchSearch LIVE GovDeals lots — the auction marketplace US state and city agencies, school districts, police departments, transit authorities and utilities use to sell surplus trucks, heavy equipment, buses, patrol cars, generators, lab gear and land (~25 000 open lots across 59 states and provinces, measured 2026-10-06). Every row carries the auction facts a price alone cannot give you: current bid with its basis, bid increment, reserve state, the resolved end time in UTC, the selling agency and where the lot physically is. Give query, or category_id, or seller_id, or state, or zip (at least one).Pricing teams call search to search LIVE GovDeals lots.query, category_id, state, zip, radius_miles, ...
soldClosed GovDeals auctions — the same rows after the hammer, where current_bid is the FINAL price the lot sold for and price_basis says final_price. A sold-price comparable set for valuing used municipal fleet and equipment: 124 055 closed lots were reachable when measured. Sort ending_latest for the most recently closed first.Marketplace operators call sold to get closed GovDeals auctions.query, category_id, state, zip, radius_miles, ...
detailEverything GovDeals publishes about one lot, including the live auction state its search payload leaves out. Two upstream calls: the lot record (full description, every photo, VIN or serial, odometer, the agency's payment / removal / inspection terms, the physical address with coordinates) and the bid box (bid COUNT, current bid, masked high bidder, buyer premium percentage, watcher and view counters, auto-extension, and the end time in UTC).Catalog enrichment teams call detail to get everything GovDeals publishes about one lot, including the live auction state its search payl….asset_id, account_id
bidsThe public bid log for one lot: every bid with the source-masked bidder handle, the amount and the timestamp, plus the source's own bid count. Works on live auctions as well as closed ones — on a closed lot the highest row IS the hammer price, cross-checked against the sold row and the bid box on three lots.Retail analysts call bids to get the public bid log for one lot.asset_id, account_id, auction_id, all_auctions, page, ...
questionsThe public question-and-answer thread on one lot: what other bidders asked the selling agency and what the agency answered. This is where the facts that are missing from the listing live — capacity, hours, faults, whether it runs.Pricing teams call questions to get the public question-and-answer thread on one lot.asset_id, account_id
categoriesThe GovDeals category tree with the live lot count on every node: 14 top-level segments and 629 nodes in all when measured. The id on each node is exactly what the search action's category_id takes.Marketplace operators call categories to get the GovDeals category tree with the live lot count on every node.top_level_only, flat
locationsWhere the live lots physically are: the source's own region / country / state tree with a live lot count on every node (59 state and province nodes when measured). The state code on each leaf is what the search action's state parameter takes.Catalog enrichment teams call locations to get where the live lots physically are.flat
sellersSelling agencies near a US ZIP code, with how far away each one is and how many lots it currently has open — the way to find every surplus auction within driving distance, which matters because most GovDeals lots are pickup-only. Measured: 100 miles around 30301 returned 85 agencies.Retail analysts call sellers to get selling agencies near a US ZIP code, with how far away each one is and how many lots it curre….zip, radius_miles, min_lots
suggestWhat GovDeals buyers actually search for: the site's own autocomplete, returning trending search phrases and matching lot titles for a prefix. A keyword corpus straight from the source, useful for building the query a search call should run.Pricing teams call suggest to get what GovDeals buyers actually search for.query
Code samples

Call search from your stack

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}'
MCP one-liner
Ask your MCP-connected assistant: call reefapi.govdeals.search with {"query":"dump truck","sort":"ending_soonest","limit":24}.
Use cases

Who uses this API and why

  • 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.
  • Logistics-aware sourcing: find every selling agency inside a driving radius, with its open lot count and coordinates.
  • Due diligence before bidding: VIN or serial, odometer reading, every photo, and the agency's own removal deadline and inspection terms.
FAQ

Questions developers ask before integrating

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.

docs / govdeals

GovDeals

US government surplus auctions with the bid count, the reserve state and the end time in real UTC.

base /govdeals/v19 endpoints
post/govdeals/v1/sold2 credits

Closed GovDeals auctions — the same rows after the hammer, where current_bid is the FINAL price the lot sold for and price_basis says final_price. A sold-price comparable set for valuing used municipal fleet and equipment: 124 055 closed lots were reachable when measured. Sort ending_latest for the most recently closed first.

ParameterAllowed / rangeDescription
queryoptional—Keyword text, 1-200 characters. Use * for everything. At least one of query, category_id, seller_id, state or zip is required.
category_idoptional—GovDeals category code from the categories action.
stateoptional—Two-letter state or province code of the lot's location.
zipoptional—Five-digit US ZIP to search around.
radius_milesoptional1–3000Search radius in miles around zip.
seller_idoptional1–99999999Numeric selling-agency id (the source's accountId).
seller_typeoptionalgovernment · commercial · nonprofitRestrict to one class of seller.
conditionoptionalSD · N · SThe source's own condition code, passed through unchanged.
auction_typeoptionalauction · make_offer · buy_nowSale format.
currencyoptionalusd · cadRestrict to lots priced in one currency.
makeoptional—Manufacturer or brand as the agency typed it.
modeloptional—Model designation as the agency typed it.
model_yearoptional1900–2100Model year.
min_priceoptional0–99999999Lowest final price, inclusive.
max_priceoptional0–99999999Highest final price, inclusive.
sort = ending_latestoptionalending_latest · ending_soonest · price_high · price_low · best_match · newestResult ordering; ending_latest is the useful one for a comparable set.
page = 1optional1–2000One-based result page.
limit = 24optional1–200Rows per page, 1 to 200.
Try in playground →
post/govdeals/v1/detail2 credits

Everything GovDeals publishes about one lot, including the live auction state its search payload leaves out. Two upstream calls: the lot record (full description, every photo, VIN or serial, odometer, the agency's payment / removal / inspection terms, the physical address with coordinates) and the bid box (bid COUNT, current bid, masked high bidder, buyer premium percentage, watcher and view counters, auto-extension, and the end time in UTC).

ParameterAllowed / rangeDescription
asset_idrequired—The lot's asset id. The combined item_id search returns ('276-23609') is also accepted here on its own and fills account_id.
account_idoptional1–99999999The selling agency's numeric id. Required unless asset_id was given in the combined asset-account form; a GovDeals lot is identified by the pair, not by the asset id alone.
Try in playground →
post/govdeals/v1/bids2 credits

The public bid log for one lot: every bid with the source-masked bidder handle, the amount and the timestamp, plus the source's own bid count. Works on live auctions as well as closed ones — on a closed lot the highest row IS the hammer price, cross-checked against the sold row and the bid box on three lots.

ParameterAllowed / rangeDescription
asset_idrequired—The lot's asset id, or the combined item_id search returns ('38552-767').
account_idoptional1–99999999The selling agency's numeric id. Required unless asset_id was given in the combined form.
auction_idoptional0–255Which auction round of this lot to read. Omit and the engine reads it off the lot record first, so the count matches the auction currently shown on the site; relisted lots have more than one round.
all_auctions = falseoptional—Return every bid the lot ever received across all of its auction rounds instead of just the current one. Measured on one relisted lot: 1 bid in the current round, 7 across all rounds.
page = 1optional1–2000One-based page of the bid log.
limit = 100optional1–200Bid rows per page, 1 to 200.
Try in playground →
post/govdeals/v1/questions1 credit

The public question-and-answer thread on one lot: what other bidders asked the selling agency and what the agency answered. This is where the facts that are missing from the listing live — capacity, hours, faults, whether it runs.

ParameterAllowed / rangeDescription
asset_idrequired—The lot's asset id, or the combined item_id search returns ('276-23609').
account_idoptional1–99999999The selling agency's numeric id. Required unless asset_id was given in the combined form.
Try in playground →
post/govdeals/v1/categories2 credits

The GovDeals category tree with the live lot count on every node: 14 top-level segments and 629 nodes in all when measured. The id on each node is exactly what the search action's category_id takes.

ParameterAllowed / rangeDescription
top_level_only = falseoptional—Return only the 14 top-level segments without their children.
flat = falseoptional—Return every node in one flat list (each with its parent_id and level) instead of nested.
Try in playground →
post/govdeals/v1/locations1 credit

Where the live lots physically are: the source's own region / country / state tree with a live lot count on every node (59 state and province nodes when measured). The state code on each leaf is what the search action's state parameter takes.

ParameterAllowed / rangeDescription
flat = falseoptional—Return every node in one flat list instead of nested.
Try in playground →
post/govdeals/v1/sellers1 credit

Selling agencies near a US ZIP code, with how far away each one is and how many lots it currently has open — the way to find every surplus auction within driving distance, which matters because most GovDeals lots are pickup-only. Measured: 100 miles around 30301 returned 85 agencies.

ParameterAllowed / rangeDescription
ziprequired—Five-digit US ZIP to search around.
radius_miles = 100optional1–3000Radius in miles. Measured to bite: 25 miles 23 agencies, 100 miles 85.
min_lotsoptional0–1000000Drop agencies with fewer than this many open lots.
Try in playground →
post/govdeals/v1/suggest1 credit

What GovDeals buyers actually search for: the site's own autocomplete, returning trending search phrases and matching lot titles for a prefix. A keyword corpus straight from the source, useful for building the query a search call should run.

ParameterAllowed / rangeDescription
queryrequired—Partial keyword, 1-100 characters.
Try in playground →
Built for volume
5M+ requests a day

Measured at 60 requests a second across the fleet, with no central bottleneck. Volume pricing is on request, and per-key limits are raised for high-volume accounts.

Missing a source?
We build it

Tell us a site we do not cover yet and it becomes an engine. A customer asked for bestprice.gr on a Sunday and it was in the catalog the next day.

Support
2 minute median reply

Median time from a question in the live chat to the first answer, measured across every answered conversation. Setup help included, no support tier to buy.

One key, one balance
Every API included

No per-site plans and no separate subscriptions. One key and one credit pool across the whole catalog, so adding a source costs nothing up front.

Planning something large? Tell us the volume and the sources and we will come back with what it costs and what we would have to build.