PublicSurplus Scraper - Government Surplus Auction Data API avatar

PublicSurplus Scraper - Government Surplus Auction Data API

Pricing

from $6.23 / 1,000 results

Go to Apify Store
PublicSurplus Scraper - Government Surplus Auction Data API

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.

Acquisition Automation Co.

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

16 days ago

Last modified

Share

Acquisition Automation Co. Search less. Close more.

🏗 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 itWhat they use the auctions for
🚚 Buyers of fleet and equipment heavy businessesMarking 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 operatorsSourcing replacement units at public auction prices rather than dealer prices
🏷 Dealers and resellersWatching lots with no bids that are about to close, in a radius they can collect from
📊 Appraisers and lendersBuilding 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. keyword matches the lot title and the full description, so truck also 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.

FieldTypeDescription
🆔 auctionIdstringPublicSurplus auction number, the key to deduplicate and rejoin runs
🔗 urlstringDirect link to the lot page
🏷 titlestringLot title as the agency wrote it, for example 2007 Chevy 2500HD 2wd long bed - 40793
💵 currentPricenumberCurrent price at the moment of the run
💱 currencystringCurrency of the price, for example USD
🗺 statestringTwo-letter region code, for example CA
🏛 agencyNamestringThe public body selling the lot, for example City of Modesto
🛠 conditionstringCondition grade the agency assigned, for example FAIR or SEE DESCRIPTION
🔨 auctionTypestringKind of lot, for example bid
🖼 thumbnailUrlstringListing thumbnail image
🕐 startsAtstringStart time as an ISO timestamp
📆 startedAtTextstringStart time as the site prints it, with its own timezone label
🕔 endsAtstringClose time as an ISO timestamp
📅 endsAtTextstringClose time as the site prints it, with its own timezone label
⏳ timeLeftSecondsnumberSeconds left when the row was written
🚦 isEndedbooleanWhether the lot had already closed
↔️ mightExtendbooleanWhether a late bid can extend the close time
🕒 scrapedAtstringISO 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 siteRows come from PublicSurplus, not from a reseller's index of it.
You pay for the depth you ask forThe base row is one price. Each optional block is billed only on the runs where you switch it on.
Deduplicated across searchesSeveral keywords, categories and regions merge into one set keyed on auctionId.
No credentials and no proxyThe site answers plain requests, so proxy is off by default and costs you nothing.
The clock is in the rowendsAt, timeLeftSeconds and mightExtend let you sort by what closes next without reading the page.

🚀 How to use it

  1. Create a free Apify account. New accounts start with $5 of credit.
  2. Open the Actor and select Try for free.
  3. Put a word in keyword, or pick a category, or name a region. Leave all three empty to take every open auction.
  4. Switch on only the optional blocks you need, and set maxItems to cap the run.
  5. 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

FieldRequiredDescription
keywordNoWord or phrase. PublicSurplus matches it against the lot title and the full description. Empty takes every open auction
keywordsNoSeveral keyword searches in one run, merged and deduplicated by auction id
categoryNoOne of the site's 28 categories or 204 sub-categories. Accepts a name, a sub-category or the numeric id
categoryIdsNoExtra categories to sweep, by name or numeric id
regionNoOne region. Accepts the name, the two-letter code, or the site's own form. Covers all 68 regions it lists
regionsNoSweep several regions, each as its own search
agencyIdsNoPull every open auction from specific agencies. Keyword, category and region filters are not sent when this is used
auctionUrlsNoSpecific auctions by full URL or bare auction number, skipping discovery

How much to take

FieldRequiredDescription
maxItemsNoMaximum auctions written to the dataset. A ceiling, not a target
maxPagesNoHow deep discovery may page into one search. A search page holds 25 rows, an agency page 50
sortByNoOrder the listing comes back in: timeLeft, price, id, title or none
sortDescendingNoFlip the sort

Filters

FieldRequiredDescription
priceMin / priceMaxNoPrice range, sent to the site so cheaper or dearer lots are never downloaded
endingWithinHoursNoOnly lots closing inside 1, 6, 24, 120 or 240 hours
startedWithinHoursNoOnly lots opened inside 1, 24, 48 or 168 hours. Mutually exclusive with the ending window
zipCode / milesFromZipNoRadius search around a five digit US ZIP, in the steps the site offers from 20 to 1,000 miles
auctionTypesNoKeep only these kinds of lot. Empty keeps all three
onlyWithBids / onlyWithoutBidsNoKeep only contested lots, or only untouched ones
minBidCount / maxBidCountNoBound the number of bids
onlyWithImagesNoDrop lots published without a photo
onlyWithVinNoKeep only vehicles carrying a valid 17 character VIN
onlyWithAttachmentsNoKeep only lots with an attached document
statesNoPost-filter on the two-letter region code, cheaper than fanning out into separate searches
titleExcludesNoDrop lots whose title or description contains any of these words, case insensitive

Optional blocks

FieldRequiredWhat switching it on adds
listingOnlyNoSkips the lot page for a faster, shallower run. Leave it off to also get the condition grade, the agency name and the start date
includeBiddingNoBid 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
includeAgencyProfileNoThe 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
includePickupLocationNoLocation name, street, city, state and ZIP as separate columns, plus the site's map link
includeSaleTermsNoAccepted payment methods, the online card ceiling, the payment caveat, shipping arrangement, bid deposit rule and the agency's terms document
includeItemSpecsNoThe 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
includeVinDecodeNoFor 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
includeImagesNoEvery full resolution photo the agency uploaded, in order, plus the count
includeAttachmentsNoAttached documents as name, URL and file type, plus the count. Around 6% of lots carry one
includeDescriptionNoThe agency's full lot description. descriptionFormat chooses text or html
proxyConfigurationNoOff 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.

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

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.