LiveAuctioneers Scraper — Auction Lots & Prices Realized avatar

LiveAuctioneers Scraper — Auction Lots & Prices Realized

Pricing

$3.00 / 1,000 per lot returneds

Go to Apify Store
LiveAuctioneers Scraper — Auction Lots & Prices Realized

LiveAuctioneers Scraper — Auction Lots & Prices Realized

Paste any LiveAuctioneers search, category, catalogue, auctioneer or lot URL — or search by keyword. One row per lot: title, lot number, auction house, category path up to 4 levels, estimates, current bid, price realized, sale date, condition report, images, venue address and buyer premium.

Pricing

$3.00 / 1,000 per lot returneds

Rating

0.0

(0)

Developer

Scrapers Delight

Scrapers Delight

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

3 days ago

Last modified

Share

Fine-art, antique and collectible auction lots from LiveAuctioneers. One row is one lot, carrying lotTitle, lotNumber, auctionHouse, auctionTitle, a categoryPath up to 4 levels deep, creators (artist/maker), estimateLow / estimateHigh, startPrice, currentBid, bidCount, salePrice (the hammer price), buyersPremiumPct, saleStartAt / lotClosesAt, conditionReport, the full description, every image URL, the lot's city/state/country and the sale venueAddress with latitude/longitude.

Paste any LiveAuctioneers URL — a search, a browse category, a sale catalogue, an auctioneer page or a single lot — or build a query from keywords, categories, houses and catalogue ids. One switch flips between upcoming lots you can still bid on and the prices-realized archive.

No login. No browser. No CAPTCHA solving. It reads the site's own public JSON services.

Measured live on 2026-08-12: 977,647 lots currently listed — Jewelry 387,937 · Collectibles 198,363 · Art 128,509 · Home & Décor 105,173 · Fashion 101,757 · Furniture 20,572. The sold archive reaches back to 2009.


Quick start

Click Try for free and hit Start. This is the input the Actor ships with — it needs no edits:

{
"startUrls": ["https://www.liveauctioneers.com/c/art/paintings/"],
"lotStatus": "upcoming",
"sort": "-publishDate",
"maxLots": 50
}

That run, measured twice on 2026-08-12 through the Apify datacenter proxy: 50 lots, 5 HTTP calls, 5/5 first try, 0 duplicates, 5 s and 11 s wall-clock — $0.15 either way.

The way in is a URL you already have

Go to liveauctioneers.com, search or browse until the page shows what you want, copy the URL out of the address bar, paste it into Start URLs. Five shapes are recognised and each is routed to the right walker:

Paste thisWhat you get
https://www.liveauctioneers.com/search/?keyword=tiffany+lamp&status=online&sort=-estimatedPriceThat keyword query. The URL's own keyword, status and sort override the form fields — what you were looking at is what you get.
https://www.liveauctioneers.com/c/art/paintings/ · https://www.liveauctioneers.com/c/jewelry/asian/6/158/That browse category. Slug paths are resolved against the live taxonomy; when the URL already carries the numeric ids, the most specific one is used directly.
https://www.liveauctioneers.com/catalog/424639_splendid-relics-the-art-of-asian-dynasties/That whole sale catalogue, end to end. Zero pagination drift — measured 0.00% duplicates over 12 contiguous pages.
https://www.liveauctioneers.com/auctioneer/197/freemans/Every lot that house currently has listed.
https://www.liveauctioneers.com/item/82260058_tiffany-studios-table-lamp-with-lotus-shade-larchmont-nyJust those lots. Pasted lot URLs are fetched 50 at a time.

Paste as many as you like, mixed freely. Anything that is not one of those five is rejected with a message naming the problem, not silently guessed at — a /price-result/ page carries a slug and no lot id, so the Actor tells you to paste the catalogue instead rather than scraping something you did not ask for.

Measured on 2026-08-12, one run with all five shapes plus two deliberate rejects: 19 lots, 16 HTTP calls, 16/16 first try, 0 interstitials, 0.00% duplicates.

How to use it

  1. Create a free Apify account and open this Actor.
  2. Paste one or more LiveAuctioneers URLs into Start URLs (or clear it and use the keyword/category boxes below).
  3. Choose Upcoming or Sold, and set Max lots — that is your cost cap.
  4. Click Start.
  5. Download the dataset as JSON, CSV, Excel or XML, or pull it from the API.

Sample row

A real upcoming lot, from the run above:

{
"lotUrl": "https://www.liveauctioneers.com/item/237265777_rolex-submariner-date-watch-beverly-hills-ca",
"itemId": 237265777,
"lotNumber": "0175",
"lotTitle": "ROLEX SUBMARINER DATE WATCH",
"auctionHouse": "NY Elizabeth",
"auctionTitle": "26820 | Crown & Complications",
"categoryPath": "Jewelry > Watches > Wristwatches",
"currency": "USD",
"estimateLow": 97800,
"estimateHigh": 143440,
"startPrice": 25,
"currentBid": 300,
"bidCount": 2,
"salePrice": null, // not sold yet
"isSold": false,
"buyersPremiumPct": 30,
"saleStartAt": "2026-08-16T23:00:00.000Z",
"lotClosesAt": "2026-08-16T23:00:00.000Z",
"lotCity": "Beverly Hills",
"lotState": "CA",
"lotCountry": "US",
"conditionReport": "Pre-Owned",
"imageCount": 4,
"venueAddress": "269 South Beverly Drive Suite 142",
"venueLatitude": 34.0625,
"venueLongitude": -118.399
}

Three things people misread:

  • salePrice is null, never 0, when a lot is unsold or the house withheld the hammer price. 0 never appears in a money column — LiveAuctioneers uses 0 and -1 internally for "no value" and "not disclosed", and both are emitted as null.
  • buyersPremiumPct is a percentage (25, 30), auctionHouseRating is a 0–5 scale (4.59). Different scales, never mixed in one column.
  • currentBid empty is a fact, not a miss — it tracks bidCount, which is on every row.

The wedge: the full category path and the hammer price, as numbers

Two things make a lot row worth money: what the object is, and what it made.

  • categoryPath — 93.3% fill, up to four levels deep: Home & Décor > Lighting > Lamps > Table Lamps, Jewelry > Watches > Wristwatches. The depth is the lot's own, not a promise — that table lamp returns 4 levels, that wristwatch 3, and a lot listed straight under /c/art/paintings/ returns Art > Paintings and stops there. You get every level LiveAuctioneers filed the lot under. Plus creators (39.6%), materials (69.6%), origins (34.2%) and stylePeriods (32.2%). That is LiveAuctioneers' own classification, flattened into readable strings instead of nested API objects, and it is what lets you filter 977,647 lots down to "signed table lamps" rather than grepping titles.
  • salePrice — 100% fill on a 600-lot sold sample, alongside estimateLow (99.0%), bidCount (100%) and isSold / isPassed. That is a comparable-sales archive with the estimate range next to the result, going back to 2009.

Every money field is a number and every date is ISO-8601 UTC. Not "$60", not 1584889200. You can sum a column the moment the CSV lands.


How it compares

Facts checked on the Apify Store and in each Actor's own published README and sample output on 2026-08-12.

This Actorivanvs/liveauctioneers-scraperparseforge/liveauctioneers-scraper
Way inPaste search / browse / catalogue / auctioneer / lot URLs, or build a query from keywords, categories, houses, catalogue idsPaste search / browse URLsNumeric House ID + Auction ID, both required; no URL accepted
Prices realizedsalePrice + isSold + isPassed, 100% fill on a 600-lot sold sampleNo salePrice in its documented outputsalePrice present
Money & datesNumbers and ISO-8601 UTCStrings — its own published sample shows price: '$60' and estimated: {}Raw API shapes — leadingBid, saleStartTs as a Unix integer
CategorycategoryPath up to 4 levels, 93.3% fill, + creators / materials / origins / style periodsNot returnedRaw categories / creators / materialsTechniques objects
VenueStreet address, city, state, postcode, lat/lon — 100% / 99.4%Auction-house location as one string ("Islip, NY, United States")sellerLocation
Condition reportCleaned to text, -- and N/A collapse to null — 60.3% fillPresentPresent
ProxyApify datacenter — measured 100% on every routeIts README states it uses RESIDENTIALNot stated
Price$0.003 per lot, no start fee$0.01 per dataset item$0.005 start + $0.01734/result (FREE tier), $0.01299 (GOLD and above)
Published fill measurementsYes — two samples, 720 + 600 lots, belowNoneNone

There is a third one, and on price it beats us: jungle_synthesizer/liveauctioneers-art-prices-realized-scraper charges $0.1 per Actor start (per GB) + $0.0005 per record — about $0.60 per 1,000 rows against our $3.00. What you give up for that: it returns sold art lots only (no upcoming lots, no bid-able inventory), 20 snake_case fields, sale_date as a date with no time, no condition report, no venue address, no buyer's premium, no image list (one thumbnail_url), and no published fill measurements. It does do one thing we do not: it resolves /price-result/<slug> URLs. Checked on the Apify Store 2026-08-12.

The honest one-liner: if you just want a handful of lots off a page you are looking at, any of them will do it. This one is built for the buyer who is going to load 10,000 rows into a spreadsheet and do arithmetic on them — upcoming and sold, with the condition report, the venue and the premium attached.


What you get — one row per lot

GroupFields
IdentitylotUrl, itemId, lotNumber, lotTitle
The auctionauctionHouse, auctionHouseId, auctionHouseRating, auctionHouseReviewCount, auctionHouseIsTopRated, auctionTitle, auctionId, auctionUrl, auctionStatus, auctionLotCount, saleType
TimingsaleStartAt, saleEndAt, lotClosesAt
Classificationcategory, subcategory, categoryPath, categoryId, creators, materials, origins, stylePeriods
Moneycurrency, estimateLow, estimateHigh, startPrice, currentBid, bidCount, buyNowPrice, salePrice, isSold, isPassed, isReserveMet, buyersPremiumPct
Where the lot islotCity, lotState, lotPostalCode, lotCountry
Descriptivedescription, conditionReport, dimensions, weight, shippingDimensions, shippingWeight
MediaimageCount, images
The venuevenueAddress, venueCity, venueState, venuePostalCode, venueCountry, venueLatitude, venueLongitude, auctionPreview
Shipping flagsshipsWithLiveAuctioneers, shipsWithAuctionHouse, freeShipping, freeLocalPickup
ProvenancescrapedAt

Conventions, stated once: all dates are ISO-8601 UTC; all money fields are numbers in the lot's own currency, with no FX conversion; HTML is stripped and entities decoded in description and conditionReport; empty and placeholder values are null, never "", 0 or "N/A".

The Actor also writes RUN_STATS to the key-value store: cards seen, lots emitted, the measured in-run duplicate rate, whether either server ceiling was hit, HTTP call count, first-try success rate, Incapsula interstitials retried, and the per-field fill percentage for your run. It is linked from the run's Output tab.


Read this before you buy rows

1. Two server-side result ceilings that no setting can lift

LiveAuctioneers' search index does not let an unauthenticated client walk a query forever. Both limits were measured, not guessed:

Reachable per queryWhat happens at the wall
Upcoming / live lots~10,000 rowspages start returning empty
Sold lots (prices realized)~1,200 rowsHTTP 403 — page 10 of 120 OK, page 11 forbidden

totalFound will happily tell you a sold query matched 9,000 lots. Only the first ~1,200 are retrievable. The fix is narrower queries, not a bigger maxLots — split by category, by auction house, by a tighter keyword, and run several. The Actor logs a loud warning the moment it touches either ceiling and records hitServerResultCap / hitSoldAuthWall in RUN_STATS.

2. The sort key decides which slice of the archive you get

Because a sold query only returns ~1,200 rows out of a much larger match, the sort order is not cosmetic — it chooses which 1,200. Measured on the sold index for "persian rug" (9,000 matches, first page of 120 each time):

SortSale years returned
Newest listed (-publishDate, default)2026 only
Sale date, soonest first (saleStart)2009 (93) · 2010 (27)
Highest estimate (-estimatedPrice)2009 → 2026, weighted to 2021-2023
Most relevant (-relevance)2016 → 2026, weighted to 2017-2019

Want recent comps? Newest listed. Want the deepest historical comps? Sale date. Want the high-value comps regardless of year? Highest estimate.

3. The sort key also decides the duplicate rate

The search index is re-ranked between requests, so contiguous pages can overlap. Duplicates are always removed by lot id — but a drifting index also skips rows, so this is a coverage setting. Measured over 12 contiguous pages of 120 lots (live index, keyword "antique"):

SortCardsUniqueDuplicate rate
Highest estimate (-estimatedPrice)1,4401,4400.00%
Newest listed (-publishDate, default)1,3201,2644.24%
Most relevant (-relevance)1,4401,3675.07%
Sale date (saleStart)1,4401,24013.89%

Same test on the sold index (9 × 120, "rolex submariner"): -publishDate 0.00%, -estimatedPrice 0.19%, -relevance 15.74%. Un-keyworded category and auction-house walks on -publishDate measured 0.00–0.21%.

That is why the default is "Newest listed" and not "Most relevant" — relevance is the default on the website and it is the worst one to page through. Use "Highest estimate" for exhaustive sweeps.

Auction catalogues have no drift at all: 12 contiguous pages × 100 lots = 1,200 cards, 1,200 unique, 0.00% duplicates. If you need a complete, exact set of lots, scrape the catalogue.

4. currentBid is empty on most upcoming lots — and that is the truth, not a gap

In a 720-lot sample, 12.1% of upcoming lots carried a current bid, and every one of those lots had bidCount ≥ 1. The other 87.9% genuinely have no bids yet. bidCount and startPrice are on every row, so "no bids" is distinguishable from "we failed to read it." On sold lots currentBid fill is 99.3% and salePrice is 100%.


Field fill — measured on 720 upcoming and 600 sold lots

Sample A — 720 upcoming lots, 12 keywords across every category, 75 auction houses, 253 separate auctions, 10 countries, 3 currencies:

FieldFillNote
lotUrl, itemId, lotNumber, lotTitle100%
auctionHouse, auctionId, auctionTitle, auctionUrl, saleType100%
saleStartAt, lotClosesAt, auctionStatus, auctionLotCount100%ISO 8601, UTC
currency, estimateLow, estimateHigh, startPrice, bidCount100%
buyersPremiumPct100%
lotCity, lotPostalCode, lotCountry · lotState100% · 99.9%
venueAddress, venueCity, venuePostalCode, venueCountry100%the house's own street address
venueLatitude / venueLongitude99.4%
description100%HTML stripped, entities decoded
images / imageCount99.9%6.6 photos per lot on average
auctionHouseRating / auctionHouseReviewCount94.0%
category, categoryPath, categoryId93.3%
subcategory80.7%
materials69.6%
shippingDimensions / shippingWeight60.4%
conditionReport60.3%placeholders like -- and N/A return null, not junk
buyNowPrice47.5%
auctionPreview46.4%viewing arrangements, free text
creators (artist / maker)39.6%
origins · stylePeriods34.2% · 32.2%
currentBid12.1%matches bidCount ≥ 1 exactly — see gotcha 4
dimensions · weight7.2% · 4.4%most houses put sizes in the description instead
salePrice0.0%by definition — nothing is sold yet

Sample B — 600 sold lots, 6 keywords, 138 auction houses, 184 auctions:

FieldFill
salePrice (hammer price)100%
isSold100% (600/600 sold, 0 passed)
bidCount, saleStartAt, venueAddress100%
currentBid99.3%
estimateLow99.0%
description / images99.8%
category97.3%
conditionReport50.7%

The headline that could mislead you: on upcoming lots this is not a current-bid product. currentBid is 12.1% because 87.9% of lots have no bids yet. Plan against estimateLow / estimateHigh (100%) for upcoming work, and against salePrice (100%) for comps.

A single 6-category run drawn from newly published catalogues gives narrower spread — 25 auctions, estimateLow 86%, conditionReport 43% — because a handful of large catalogues dominate the newest listings. Both numbers are real; the spread depends on how you query.

Every run prints its own measured fill in the log and stores it in RUN_STATS.


How to run it

Paste URLs (the default)

{
"startUrls": [
"https://www.liveauctioneers.com/search/?keyword=rolex+submariner&status=online",
"https://www.liveauctioneers.com/auctioneer/197/freemans/",
"https://www.liveauctioneers.com/catalog/424639_splendid-relics-the-art-of-asian-dynasties/"
],
"maxLots": 300
}

maxLots is split evenly between the three, with any unused share rolling forward, so one busy query cannot eat the whole run.

Keyword search across the whole site

{
"startUrls": [],
"source": "search",
"searchTerms": ["ming vase", "roseville pottery"],
"lotStatus": "upcoming",
"maxLots": 500
}

Comparable sales — the prices-realized archive

{
"startUrls": [],
"source": "search",
"searchTerms": ["tiffany studios lamp"],
"lotStatus": "sold",
"sort": "-estimatedPrice",
"maxLots": 1000
}

-estimatedPrice spans 2009 → 2026 rather than returning only 2026 rows. Remember the ~1,200-row sold ceiling: run several narrow queries rather than one broad one.

A whole sale catalogue, exactly

{
"startUrls": ["https://www.liveauctioneers.com/catalog/424639_splendid-relics-the-art-of-asian-dynasties/"],
"maxLots": 0
}

maxLots: 0 removes the cap. Catalogue walks measured 0.00% duplicates over 1,200 contiguous cards, so this is the way to get a complete, exact set.

The cheap mode

{
"startUrls": ["https://www.liveauctioneers.com/c/jewelry/"],
"includeLotDetails": false,
"includeCategories": false,
"includeAuctionDetails": false,
"maxLots": 2000
}

You keep every field on the listing card — title, lot number, house, auction, estimates, current bid, bid count, sale dates, lot location, images, sale flags — and lose the full description, condition report, dimensions, the category path, creators/materials, and the venue address and buyer's premium. It drops roughly three batched calls per 50 lots. The price per lot is identical either way — you are billed per lot returned, not per request, so this only buys you time.


Input

FieldTypeDefaultWhat it does
startUrlsarray of strings["https://www.liveauctioneers.com/c/art/paintings/"]Any LiveAuctioneers search / browse / catalogue / auctioneer / lot URL. Wins over everything below while it is non-empty. Clear it to build a query by hand.
sourceenumsearchsearch · category · auctionHouse · catalogs. Used only when startUrls is empty. All four produce the same row shape.
searchTermsarray["tiffany lamp"]source=search. Keywords as you would type them: ming vase, rolex submariner, roseville pottery.
categoriesarray["/c/art/paintings/"]source=category. A top-level slug, a browse path, a full browse URL, or a numeric category id.
auctionHousesarraysource=auctionHouse. Numeric house ids or auctioneer URLs.
catalogUrlsarraysource=catalogs. Catalogue URLs or bare ids (424639). Past catalogues work and carry the prices realized.
lotStatusenumupcomingupcoming (bid-able lots) or sold (price-results archive, ~1,200-row ceiling per query). Ignored for catalogs; overridden by status= in a pasted search URL.
sortenum-publishDate-publishDate · -estimatedPrice · -relevance · saleStart · -bidCount. A coverage setting, not a cosmetic one — see gotchas 2 and 3.
includeLotDetailsbooleantrueFull description, condition report, dimensions, shipping weight. One batched call per 50 lots. Same price either way.
includeCategoriesbooleantrueCategory path, artist/maker, material, origin, style period. One batched call per 50 lots. Same price either way.
includeAuctionDetailsbooleantrueVenue street address, lat/lon, buyer's premium, preview times. One cached call per 20 auctions. Same price either way.
maxLotsinteger200 (prefilled 50)Run-wide cap and your cost cap — billing is per lot. Split evenly across targets, unused share rolls forward. 0 = no cap.
proxyConfigurationobjectApify proxy (datacenter)The cheap rung, because the JSON routes measured 100% through it.
requestConcurrencyinteger41–5; values above 5 are clamped. Kept low on purpose.

Category slugs are validated, not guessed

A sub-category slug is resolved against LiveAuctioneers' live taxonomy. If you mistype one you get a warning naming the valid children, and the run falls back to the parent instead of silently returning a category you did not ask for:

WARN category "/c/art/nonexistent-thing/": no sub-category "nonexistent-thing" under "art"
— using "art" instead. Valid children: drawings, graffiti-and-street-art,
indigenous-and-tribal-art, mixed-media-and-collages, paintings, photography,
prints-and-multiples, scrolls-screens-and-fan-paintings, sculptures-and-carvings

Top-level slugs: art · collectibles · fashion · furniture · home-and-decor · jewelry.


Pricing

$0.003 per lot returned — $3 per 1,000 lots. Charged on the lot-scraped event. No start fee, no monthly platform fee from this Actor.

RunLotsCost
The prefilled smoke test50$0.15
A whole mid-size sale catalogue570$1.71
A full sold-archive query at the server ceiling1,200$3.60
A deep upcoming sweep at the server ceiling10,000$30.00

You are charged for lots delivered to your dataset, and nothing else:

  • Never for a duplicate. Rows are de-duplicated on itemId before anything is enriched or pushed, so the dataset — and your bill — never holds the same lot twice.
  • Never for the enrichment requests. Detail, category and venue lookups are batched (50, 50 and 20 ids per call) and cached; a 570-lot catalogue costs the same whether those three toggles are on or off.
  • Never for a retried Incapsula interstitial, and never for the proxy.
  • Rows are charged as they are pushed (Actor.pushData(items, 'lot-scraped')), so if you hit a budget cap you get whole rows and stop — not a half-billed dataset.

maxLots is your hard cost cap. Default 200, prefilled 50, 0 for no cap.


Honest limits

  • ~10,000 rows per upcoming query and ~1,200 per sold query. Server-side, unliftable. A totalFound of 9,000 on a sold query does not mean 9,000 reachable rows. Narrow and repeat — by category, by house, by tighter keyword.
  • On upcoming lots, currentBid is 12.1%. That is the site telling you 87.9% of lots have no bids yet, not a scraping failure — every row with a bid has bidCount ≥ 1. Use estimateLow/estimateHigh (100%) to plan upcoming work.
  • conditionReport is 60.3% on upcoming lots and 50.7% on sold ones. Many houses never write one, and the ones who type -- or N/A into the box are reported as null rather than as junk text. If your workflow needs condition on every row, this source cannot supply it.
  • dimensions is 7.2% and weight 4.4%. Most houses put sizes inside the description prose instead. description is 100%, so that is where to parse them from.
  • Bidder-only data is not here. Bidder names, bid histories and reserve amounts sit behind a login and this Actor never authenticates. There is no workaround that does not involve logging in, which it does not do.
  • salePrice is what LiveAuctioneers publishes. Houses that withhold the hammer price are reported as null, never as 0. If a sold run comes back with under 50% salePrice fill, the Actor says so in the log instead of leaving you to find it on the bill.
  • Estimates and prices are in the lot's own currency (currency column). No FX conversion is applied — 3 currencies appeared in the 720-lot sample.
  • Photo URLs are links, not files. They point at the auction house's originals on LiveAuctioneers' CDN; nothing is downloaded or re-hosted.
  • categoryPath is as deep as LiveAuctioneers filed the lot, not always four levels. A table lamp comes back Home & Décor > Lighting > Lamps > Table Lamps; a lot listed straight under /c/art/paintings/ comes back Art > Paintings and stops. 93.3% of rows carry a path at all.
  • A /price-result/ URL is rejected today, not resolved. Those pages carry a slug and no lot id, and this Actor does not look the slug up — paste the sale catalogue, or run a Sold search, instead. (It is resolvable: jungle_synthesizer's Actor does it via a summary endpoint. We have not built it yet, and the page says so rather than pretending the URL is impossible.)
  • One site, one schema. This Actor does not also scrape Invaluable. Invaluable's record shape is materially different — opaque ref ids instead of numeric lot ids, house photo filenames instead of derivable image URLs, HTML descriptions with the estimate baked in, a catalogView object instead of flat auction fields — and folding it into these columns would produce one half-empty dataset instead of two clean ones. It belongs in its own Actor with its own columns.

How it works

Every www.liveauctioneers.com HTML page sits behind Imperva Incapsula and is unreadable from a datacenter IP. The JSON services behind the single-page app are not, and this Actor only ever touches those:

PurposeEndpoint
Keyword / house / status discoverysearch-party-prod…/search/v4/web?parameters=<json>
Category discoverysearch-party-prod…/search/v4/categoryweb?ids=[id]&parameters=<json>
Whole-catalogue walkwww.liveauctioneers.com/content/catalog/<id>?page&pageSize
Pasted lot URLswww.liveauctioneers.com/content/items?lotIds=<csv>
Lot description + conditionitem-api-prod…/spa/small/item-detail?itemIds=<csv>
Category path + maker + mediumitem-api-prod…/spa/small/item-facets?ids=<csv>
Venue address + buyer's premiumitem-api-prod…/spa/small/catalogs?ids=<csv>
Category taxonomycategory-api-prod…/category-api/subcategory?categoryId=

No login, no cookies to mint, no API key, no browser, no CAPTCHA-solving service. It does not touch any path www.liveauctioneers.com/robots.txt disallows — including /search/?, /user/, /login/, /dashboard/ and /item-api/ on that host — and the three API hosts it reads (search-party-prod, item-api-prod, category-api-prod) publish no robots.txt at all (HTTP 404, checked 2026-08-12).

Transport ladder, measured through the Apify datacenter proxy

No residential, no session pinning, no browser:

RungResult
Apify datacenter proxy — 10 contiguous search pages + hydrate + detail + facets + catalogue walk14/14 returned rows (100%)
Apify datacenter proxy — 20 concurrent search-party requests20/20 (100%)
Apify datacenter proxy — 20 concurrent /content/items requests20/20 (100%)
Apify datacenter proxy — 20 concurrent item-api requests20/20 (100%)
Same, re-run 2026-08-12 across the five start-URL shapes21/21 calls, 0 interstitials

That is why the proxy default is the cheap datacenter rung and not residential: paying for residential bandwidth here buys nothing measurable.

Incapsula does occasionally answer a /content/* call with an HTTP 200 carrying a block page instead of JSON (~1 in 30 observed). "Did the body parse as JSON" is therefore the only honest success test; a failed parse burns the proxy session and retries on a fresh one. Across the production runs used to write this page the interstitial rate was 0.0–1.3%, all recovered.

Uniqueness and dedupe

Every lot is de-duplicated on itemId before it is enriched, pushed or billed, so a drifting index costs you time, never money. All duplicate rates on this page were measured on contiguous page walks, never sparse offsets — sparse sampling would have shown 0% for every sort key and hidden the 13.89% that saleStart really produces. The mechanism is real and identifiable: the search index re-ranks between requests, which is why catalogue walks (a fixed, ordered list) measure 0.00% and keyword walks do not.

Across runs, there is no cross-run dedupe: two runs of the same query return the same lots. Use sort and narrower scopes to partition the archive, or de-duplicate on itemId at your end.

When a run fails

  • Zero rows throws. A run that returns no lots ends in an error naming the scope and the HTTP call counts, rather than finishing green and empty. There is no "successful empty run" here.
  • A bad category slug warns and names the valid children, then falls back to the parent instead of silently scraping a category you did not ask for.
  • A rejected start URL is named in the log with the reason. If every URL is rejected, the run errors with the five accepted URL shapes spelled out.
  • Both server ceilings warn loudly and set hitServerResultCap / hitSoldAuthWall in RUN_STATS, so a truncated sweep is visible in the output, not just in the row count.
  • A thin sold run warns: under 50% salePrice fill logs a warning explaining that houses withhold hammer prices.

Who buys these rows

BuyerThe field they monetize
Antiques and collectibles resellersestimateLow / estimateHigh against salePrice — spot under-estimated lots before the sale, and price your own inventory against what the archive actually made.
Appraisers and insurerssalePrice + categoryPath + creators + conditionReport + images — comparable sales filtered to one maker, medium or period, with the estimate range next to the result.
Auction aggregators and marketplaceslotClosesAt, saleStartAt, venueLatitude/venueLongitude, images — a normalised, geocoded lot feed with closing times.
Auction-house sales and BD teamsauctionHouse, venueAddress, buyersPremiumPct, auctionHouseRating, auctionHouseReviewCount — every competitor running a sale in your category, with their premium and their public rating.
Art-market analysts and data vendorssalePrice + saleStartAt + categoryPath back to 2009 — a price series per category, per maker, per house.

Sibling Actors

ActorWhat it isWhy you would use it instead
HiBid Auction ScraperLots, bids and prices across HiBid (USA & Canada)The general-estate and farm/equipment end of the market
Proxibid ScraperAuction lots, prices and new-lot alertsFirearms, coins, heavy equipment and collector vehicles
AuctionNinja Estate Sale ScraperEstate-sale lots, bids and new-lot alertsEstate-sale inventory rather than catalogued fine art
GSA Auctions ScraperUS federal surplus lots, bids and alertsGovernment surplus, not fine art
PublicSurplus ScraperGovernment auctions and lotsMunicipal and school-district surplus
K-BID Scraper · Equip-Bid Scraper · Municibid ScraperRegional online auction platformsMidwest estate, industrial and municipal lots
Multi Auction SearchOne keyword across storage, surplus and estate sitesYou do not know yet which platform has the item

LiveAuctioneers is where you go for catalogued fine art, antiques and jewellery with a prices-realized archive. The siblings are where you go for everything sold out of a warehouse.


FAQ

Does this need a LiveAuctioneers account or login? No. It never authenticates and collects nothing behind a login. That is also why bidder identities and bid histories are not in the output — those require an account.

Can I just paste a URL from my browser? Yes, that is the primary input. Search pages, browse categories, sale catalogues, auctioneer pages and individual lot pages all work, mixed freely in one run.

Can I get the whole catalogue of the site in one run? No. A single query is walkable to about 10,000 upcoming rows or about 1,200 sold rows — a server-side limit, not a setting. Split by category, house or keyword and run several.

Do I get charged for rows that get de-duplicated? No. De-duplication happens on itemId before enrichment and before push, so a duplicate never reaches the dataset or the bill.

Two runs of the same query — will I get duplicates? Yes. There is no cross-run memory; a query returns the same lots each time. De-duplicate on itemId at your end, or partition the archive with different sort keys and narrower scopes.

Why is currentBid empty on so many lots? Because 87.9% of upcoming lots have no bids yet — measured on 720 lots. Every row with a bid has bidCount ≥ 1, so an empty currentBid is a fact about the lot, not a missed field.

How far back does the prices-realized archive go? To 2009, measured. Which years you actually receive depends on the sort key — see gotcha 2.

Does it need a proxy? Do I need residential? It defaults to the Apify datacenter proxy, and that measured 100% on every route (14/14, and three separate 20/20 concurrent bursts). Residential buys nothing here.

What does a run cost? $0.003 per lot returned — $3 per 1,000. The prefilled 50-lot run is $0.15. maxLots is your cap.

Can I schedule it? Yes — use Apify Schedules to re-run any input on a cadence. Note there is no built-in new-lot alerting in this Actor; it returns the current state each run.

Will a run ever succeed with zero rows? No. Zero rows throws with the scope and HTTP counts, so a broken query cannot look like an empty market.

Something looks wrong — how do I debug it? Open RUN_STATS in the run's key-value store. It carries the cards seen, lots emitted, measured duplicate rate, whether either server ceiling was hit, HTTP counts, first-try success rate, interstitials retried, and the per-field fill percentage for that exact run.

Can I export to CSV or Excel? Yes — the dataset exports as JSON, CSV, Excel, XML, HTML or RSS, and the dataset view ships a pre-configured lot table.


This Actor reads publicly available auction listings from LiveAuctioneers' own public JSON services. It does not log in, does not solve CAPTCHAs, does not use a CAPTCHA-solving service, and does not touch any path disallowed by www.liveauctioneers.com/robots.txt. Images are referenced by URL and never downloaded or re-hosted.

Rows describe lots and businesses, but auction-house names, addresses and preview arrangements can identify individuals in the case of sole traders. You are responsible for complying with LiveAuctioneers' Terms of Service and with how you use the data, including GDPR/UK GDPR, CCPA and any marketing regime that applies to your outreach (CAN-SPAM, PECR).

LiveAuctioneers® is a trademark of its owner. This Actor is an independent tool and is not affiliated with, endorsed by or sponsored by LiveAuctioneers, and all trademarks are the property of their respective owners.


Feedback

Missing a field, or want a filter that is not here? Open an issue on the Issues tab — new fields get added when the source publishes them.