PublicSurplus Scraper - Government Surplus Auction Data API
Pricing
from $6.23 / 1,000 results
PublicSurplus Scraper - Government Surplus Auction Data API
Extract open PublicSurplus government surplus auctions: live bid count and price, closing time, selling agency, pick-up address, photos, attached documents, condition and vehicle specs including VIN, mileage and an optional NHTSA VIN decode.
Pricing
from $6.23 / 1,000 results
Rating
0.0
(0)
Developer
Acquisition Automation Co.
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
16 days ago
Last modified
Categories
Share

🏗 PublicSurplus Scraper
Export open government surplus auctions as flat rows: lot title, current price, selling agency, state, condition grade, auction type, start and close times, and a direct link. About 5,700 lots are open site wide at any moment. No API key, no registration, no login.
Cities, counties, school districts and state agencies sell their retired trucks, plant, tools and real estate through PublicSurplus. It is where fleet and equipment go when a public body is done with them, and it is priced by whoever happens to be watching that week. The site shows 25 lots a page behind a search form, closes them on a clock, and offers nothing you can download. This Actor runs the searches, merges them, deduplicates by auction id, and writes each lot as a row you can open in a spreadsheet.
| Who uses it | What they use the auctions for |
|---|---|
| 🚚 Buyers of fleet and equipment heavy businesses | Marking a target's trucks and plant against what the same year and model is closing at, instead of taking the asset schedule at face value |
| 🔧 Contractors and operators | Sourcing replacement units at public auction prices rather than dealer prices |
| 🏷 Dealers and resellers | Watching lots with no bids that are about to close, in a radius they can collect from |
| 📊 Appraisers and lenders | Building a dated price file for a category of equipment in one state |
📋 What it does
💡 Why it matters: in an equipment heavy deal, the fastest way to test a seller's asset values is what a public body just got for the same machine. That number is public and it changes every week.
- 🔎 Searches by keyword, category, region or agency.
keywordmatches the lot title and the full description, sotruckalso finds a cabinet whose description mentions a hand truck. Several keywords, categories or regions in one run are merged and deduplicated by auction id. - 📍 Radius search. Give a five digit ZIP and a mileage step to keep only lots you can collect from.
- ⏰ Time filters. Only lots closing inside 1, 6, 24, 120 or 240 hours, or only lots that opened inside the last 1, 24, 48 or 168 hours, which is the cheapest way to poll for new listings.
- 💵 Price and bid filters sent to the site, so lots outside your range are never downloaded.
- 🎯 Post filters for state, excluded words, lots with photos, lots with a VIN, lots with attached documents, and lots with or without bids.
- 🧩 Ten optional blocks you switch on per run, each billed only when used: bidding state, agency profile, pick-up location, sale terms, item specifications, NHTSA VIN decode, photo URLs, attached documents and the full description.
- 💾 Exports to CSV, Excel, JSON or XML, from the run page or the API.
📊 Output
Every lot is one flat row. With every optional block off, the row carries these 18 fields.
| Field | Type | Description |
|---|---|---|
🆔 auctionId | string | PublicSurplus auction number, the key to deduplicate and rejoin runs |
🔗 url | string | Direct link to the lot page |
🏷 title | string | Lot title as the agency wrote it, for example 2007 Chevy 2500HD 2wd long bed - 40793 |
💵 currentPrice | number | Current price at the moment of the run |
💱 currency | string | Currency of the price, for example USD |
🗺 state | string | Two-letter region code, for example CA |
🏛 agencyName | string | The public body selling the lot, for example City of Modesto |
🛠 condition | string | Condition grade the agency assigned, for example FAIR or SEE DESCRIPTION |
🔨 auctionType | string | Kind of lot, for example bid |
🖼 thumbnailUrl | string | Listing thumbnail image |
🕐 startsAt | string | Start time as an ISO timestamp |
📆 startedAtText | string | Start time as the site prints it, with its own timezone label |
🕔 endsAt | string | Close time as an ISO timestamp |
📅 endsAtText | string | Close time as the site prints it, with its own timezone label |
⏳ timeLeftSeconds | number | Seconds left when the row was written |
🚦 isEnded | boolean | Whether the lot had already closed |
↔️ mightExtend | boolean | Whether a late bid can extend the close time |
🕒 scrapedAt | string | ISO timestamp of collection |
Switching an optional block on adds its own columns to the same row. Each block is described under Optional blocks below, and each is billed as its own event.
Example rows
{"auctionId": "4070292","url": "https://www.publicsurplus.com/sms/auction/view?auc=4070292","title": "2007 Chevy 2500HD 2wd long bed - 40793","scrapedAt": "2026-09-14T14:33:38.886Z","currentPrice": 3650,"state": "CA","thumbnailUrl": "https://d37qv0n5b4mbzm.cloudfront.net/sms/docviewer/cdnmainaucdoc/thumb-b/4070292/71458245","endsAt": "2026-09-14T17:00:00.000Z","timeLeftSeconds": 8781,"isEnded": false,"auctionType": "bid","startedAtText": "Sep 3, 2026 04:25 PM MDT","startsAt": "2026-09-03T22:25:00.000Z","endsAtText": "Sep 14, 2026 11:00 AM MDT","mightExtend": true,"agencyName": "City of Modesto","currency": "USD","condition": "FAIR"}
{"auctionId": "4066985","url": "https://www.publicsurplus.com/sms/auction/view?auc=4066985","title": "Sale of Ford Truck","scrapedAt": "2026-09-14T14:33:38.886Z","currentPrice": 12000,"state": "MA","thumbnailUrl": "https://d37qv0n5b4mbzm.cloudfront.net/sms/docviewer/cdnmainaucdoc/thumb-b/4066985/71414838","endsAt": "2026-09-14T19:00:00.000Z","timeLeftSeconds": 15981,"isEnded": false,"auctionType": "bid","startedAtText": "Aug 17, 2026 07:08 AM MDT","startsAt": "2026-08-17T13:08:00.000Z","endsAtText": "Sep 14, 2026 01:00 PM MDT","mightExtend": true,"agencyName": "Town of Natick Massachusetts","currency": "USD","condition": "SEE DESCRIPTION"}
✨ Why choose this Actor
| What you get | |
|---|---|
| Prices from the seller's own site | Rows come from PublicSurplus, not from a reseller's index of it. |
| You pay for the depth you ask for | The base row is one price. Each optional block is billed only on the runs where you switch it on. |
| Deduplicated across searches | Several keywords, categories and regions merge into one set keyed on auctionId. |
| No credentials and no proxy | The site answers plain requests, so proxy is off by default and costs you nothing. |
| The clock is in the row | endsAt, timeLeftSeconds and mightExtend let you sort by what closes next without reading the page. |
🚀 How to use it
- Create a free Apify account. New accounts start with $5 of credit.
- Open the Actor and select Try for free.
- Put a word in
keyword, or pick acategory, or name aregion. Leave all three empty to take every open auction. - Switch on only the optional blocks you need, and set
maxItemsto cap the run. - Select Start, then export from the Dataset tab as CSV, Excel, JSON or XML.
A first run:
{"keyword": "truck","maxItems": 50}
Trucks in California within 200 miles of a ZIP, closing within a day, with photos:
{"keyword": "truck","region": "CA","zipCode": "95354","milesFromZip": "200","endingWithinHours": "24","onlyWithImages": true,"maxItems": 200}
Poll for lots opened in the last day, with the bidding block and the VIN decode on:
{"category": "motor pool","startedWithinHours": "24","onlyWithVin": true,"includeBidding": true,"includeVinDecode": true,"maxItems": 100}
Every open lot from two agencies you already follow:
{"agencyIds": ["1234", "5678"],"maxItems": 500}
⚙️ Input
What to search
| Field | Required | Description |
|---|---|---|
keyword | No | Word or phrase. PublicSurplus matches it against the lot title and the full description. Empty takes every open auction |
keywords | No | Several keyword searches in one run, merged and deduplicated by auction id |
category | No | One of the site's 28 categories or 204 sub-categories. Accepts a name, a sub-category or the numeric id |
categoryIds | No | Extra categories to sweep, by name or numeric id |
region | No | One region. Accepts the name, the two-letter code, or the site's own form. Covers all 68 regions it lists |
regions | No | Sweep several regions, each as its own search |
agencyIds | No | Pull every open auction from specific agencies. Keyword, category and region filters are not sent when this is used |
auctionUrls | No | Specific auctions by full URL or bare auction number, skipping discovery |
How much to take
| Field | Required | Description |
|---|---|---|
maxItems | No | Maximum auctions written to the dataset. A ceiling, not a target |
maxPages | No | How deep discovery may page into one search. A search page holds 25 rows, an agency page 50 |
sortBy | No | Order the listing comes back in: timeLeft, price, id, title or none |
sortDescending | No | Flip the sort |
Filters
| Field | Required | Description |
|---|---|---|
priceMin / priceMax | No | Price range, sent to the site so cheaper or dearer lots are never downloaded |
endingWithinHours | No | Only lots closing inside 1, 6, 24, 120 or 240 hours |
startedWithinHours | No | Only lots opened inside 1, 24, 48 or 168 hours. Mutually exclusive with the ending window |
zipCode / milesFromZip | No | Radius search around a five digit US ZIP, in the steps the site offers from 20 to 1,000 miles |
auctionTypes | No | Keep only these kinds of lot. Empty keeps all three |
onlyWithBids / onlyWithoutBids | No | Keep only contested lots, or only untouched ones |
minBidCount / maxBidCount | No | Bound the number of bids |
onlyWithImages | No | Drop lots published without a photo |
onlyWithVin | No | Keep only vehicles carrying a valid 17 character VIN |
onlyWithAttachments | No | Keep only lots with an attached document |
states | No | Post-filter on the two-letter region code, cheaper than fanning out into separate searches |
titleExcludes | No | Drop lots whose title or description contains any of these words, case insensitive |
Optional blocks
| Field | Required | What switching it on adds |
|---|---|---|
listingOnly | No | Skips the lot page for a faster, shallower run. Leave it off to also get the condition grade, the agency name and the start date |
includeBidding | No | Bid count, opening price, minimum bid, bid increment, the masked high bidder handle with their years on the platform, reserve status, buy it now price and Dutch quantity |
includeAgencyProfile | No | The agency's numeric id, URL slug, storefront, logo and a link to every other lot it has open. The agency name is in the base row either way |
includePickupLocation | No | Location name, street, city, state and ZIP as separate columns, plus the site's map link |
includeSaleTerms | No | Accepted payment methods, the online card ceiling, the payment caveat, shipping arrangement, bid deposit rule and the agency's terms document |
includeItemSpecs | No | The agency's attribute block as typed columns: vehicle year, make, model, mileage, VIN, engine, transmission, tires and running condition; equipment manufacturer and hours; real estate parcel number, property type, zoning, lot acres and building square feet, plus the raw label and value pairs and the CARFAX link. Around 20% of lots carry one |
includeVinDecode | No | For lots with a 17 character VIN, 16 NHTSA vPIC columns including body class, fuel type, cylinders, displacement, drive type, GVWR class and assembly plant. One extra request per vehicle |
includeImages | No | Every full resolution photo the agency uploaded, in order, plus the count |
includeAttachments | No | Attached documents as name, URL and file type, plus the count. Around 6% of lots carry one |
includeDescription | No | The agency's full lot description. descriptionFormat chooses text or html |
proxyConfiguration | No | Off by default. The site answers plain requests. Turn it on only if runs start getting rate limited |
💰 Pricing
Pay per event. You are billed for the run start, the listing pages discovery actually reads, each row written, and each optional block you switch on. No subscription, and no Apify platform usage on top.
| Event | Free | Bronze | Silver | Gold | Platinum | Diamond |
|---|---|---|---|---|---|---|
| Actor start | $0.02 | $0.01924 | $0.01852 | $0.0178 | $0.0178 | $0.0178 |
| Listing page read | $0.002 | $0.001924 | $0.001852 | $0.00178 | $0.00178 | $0.00178 |
| Result row | $0.007 | $0.006734 | $0.006482 | $0.00623 | $0.00623 | $0.00623 |
| Bidding state | $0.0015 | $0.001443 | $0.001389 | $0.001335 | $0.001335 | $0.001335 |
| NHTSA VIN decode | $0.0015 | $0.001443 | $0.001389 | $0.001335 | $0.001335 | $0.001335 |
| Item specifications | $0.0012 | $0.001154 | $0.001111 | $0.001068 | $0.001068 | $0.001068 |
| Agency profile | $0.0008 | $0.00077 | $0.000741 | $0.000712 | $0.000712 | $0.000712 |
| Pick-up location | $0.0008 | $0.00077 | $0.000741 | $0.000712 | $0.000712 | $0.000712 |
| Photo URLs | $0.0008 | $0.00077 | $0.000741 | $0.000712 | $0.000712 | $0.000712 |
| Description | $0.0008 | $0.00077 | $0.000741 | $0.000712 | $0.000712 | $0.000712 |
| Sale terms | $0.0006 | $0.000577 | $0.000556 | $0.000534 | $0.000534 | $0.000534 |
| Attached documents | $0.0006 | $0.000577 | $0.000556 | $0.000534 | $0.000534 | $0.000534 |
A base run of 100 lots on the Free plan, with four listing pages read and no optional blocks, costs $0.02 for the start, $0.008 for the pages and $0.70 for the rows: $0.728. Switching on bidding and the VIN decode for the same 100 lots adds $0.30.
🔌 Integrate with any app
The dataset is available through the Apify API as soon as the run finishes. Use run-sync-get-dataset-items for a one-shot call, webhooks to trigger what happens next, or the Make, Zapier, Airbyte and LangChain integrations listed on the Actor page. A run every few hours with startedWithinHours set gives you new lots without repaying for the ones you already hold.
🤖 Use with an AI agent
Give an agent live access to the auctions over the Model Context Protocol:
$claude mcp add --transport http apify "https://mcp.apify.com?tools=acquistion-automation/publicsurplus-scraper"
Then ask it in plain language which trucks are closing today near a ZIP and have it read the rows back.
❓ Frequently asked questions
Why does a keyword search return things that are not what I asked for?
PublicSurplus matches the keyword against the full description as well as the title, so truck finds a cabinet whose description mentions a hand truck. Use titleExcludes to drop the words that keep appearing, or search a category instead.
Can I combine an agency with a keyword?
No. PublicSurplus has no agency plus keyword endpoint, so when agencyIds is set the keyword, category and region filters are not sent. Pull the agency's open lots and filter after export.
Why is condition empty or SEE DESCRIPTION?
The grade is whatever the selling agency typed. Many write SEE DESCRIPTION rather than grading the lot. Switch on the description block if you need what they wrote instead.
Does currentPrice mean the lot will sell at that price?
No. It is the price at the moment of the run. A lot with mightExtend set can be pushed past its close time by a late bid, so a lot you sampled an hour ago may have moved.
How many lots are there in total?
About 5,700 are open site wide at any moment. maxItems is a ceiling, so a narrow filter returns fewer than you set and you are billed for what it wrote.
Do I need a proxy? No. The site answers plain requests and proxy is off by default. Turn it on only if your runs start getting rate limited.
🔗 More from Acquisition Automation Co.
- SAM.gov Contract Opportunities Scraper
- BizBuySell Scraper
- USCG PSIX Vessel Registry Scraper
- IRS Exempt Organizations Scraper
- 1stDibs Antiques Scraper
About Acquisition Automation Co.
We build automation for people buying businesses. The repetitive part of an acquisition search, checking listings, pulling public records, tracking owners and assets, is work a machine should do, so the buyer's time goes into judging deals instead of collecting them.
We add new Actors regularly. If there is a source you need and do not see here, tell us.
🆘 Support
Open an issue in the Issues tab of this Actor with your run ID, the input you used, and what you expected to get back.
⚠️ Disclaimer
This Actor is independent and is not affiliated with, endorsed by, or sponsored by PublicSurplus or any government agency. It collects only publicly available data. You are responsible for using that data in compliance with the source's terms of service and applicable law.