@pipeworx/bonhams
Connect: https://gateway.pipeworx.io/bonhams/mcp · Install: one-click buttons
Tools: 2
Realized auction prices from Bonhams — search past (“sold”) lots by artist or maker and get the hammer price, the hammer price including buyer’s premium (the actual realized/sold price), estimate range, sale date and department; pull full lot detail (description, condition, images) for one lot.
Tools
results_search(query, category?, page?, limit?)— search Bonhams’ sold-lot archive by artist/maker/keyword.categoryis a free-text filter matched against the department name (e.g. “jewellery”, “prints”, “books”).lot_details(auction_id, lot_no, slug?)— full detail for one lot, keyed by theauction_id/lot_noaresults_searchresult carries.
Auth
Keyless. Public pages, no login required.
Data sources
https://www.bonhams.com/search/?chronology=past&query=<q>&page=<n>— the site’s own past-lots search page. It’s a Next.js app that server-renders the FULL result set into a__NEXT_DATA__JSON blob (pageProps.lotData.auctionLots[]) — a plainfetch()gets real data, no separate XHR/API call needed. Each entry carriesprice.hammerPrice(before premium) andprice.hammerPremium(the realized price a buyer actually paid, matching the “Sold for $X inc. premium” text shown on the page) plusestimateLow/estimateHigh,department.name,hammerTime.datetime,auctionId, andlotNo(which is{full, letter, number}—fullis sometimes absent, fall back tonumber).https://www.bonhams.com/auction/<auctionId>/lot/<lotNo>/<slug>/— the lot detail page, same SSR pattern, one"lot":{...}object with richer fields:sDesc/sCatalogDesc(HTML description),dHammerPrice,dHammerPremium,dEstimateLow/dEstimateHigh,images[]. The slug in the URL is not validated — any string works as long asauctionId/lotNomatch, so a caller doesn’t need Bonhams’ exact descriptive slug.- robots.txt (checked 2026-09-05) disallows only
/ldc/,/vms-assets/,*aggregate$,*head_image*— none of which this pack touches. No crawl-delay declared forUser-agent: *.
Survey notes for the other two houses (Sotheby’s, Phillips)
Bonhams was shipped first because its realized prices are plain SSR HTML with no gate — the easiest shape found. Quick probe notes on the other two, recorded for whoever builds their packs next:
- Sotheby’s — robots.txt sets
Crawl-delay: 15forUser-agent: *and disallows/bsp-api/*(their actual API path) plus all PDF exports. Results pages are likely a genuine client-side API call behind/bsp-api/, which robots explicitly blocks — worth checking whether a different, non-disallowed endpoint serves the same data before assuming it’s blocked outright. - Phillips — robots.txt disallows
/Search,/search,/SEARCH,/bin/,/phillips/otis,/*/filter/. The obvious keyword-search path is blocked case-insensitively; a lot-detail page reached some other way (e.g. from a sitemap or a department listing) may still be fair game — not probed in this session. - Christie’s — out of scope per the build plan (closed, internal API).
Bonhams proved the per-house-pack shape works, so follow-on fleet tasks were filed for the other two: #1280 (Sotheby’s) and #1281 (Phillips), each carrying the probe notes above.
Tools
- results_search — Search Bonhams’ past-lot realized-price archive by artist/maker (or any keyword). Returns sold lots with hammer price, hammer price including buyer’s premium (the actual realized price), estimate rang
- lot_details — Full detail for one Bonhams lot: description, condition, images, realized price (hammer + buyer’s premium), estimate range, sale date. Needs the auction_id and lot_no from results_search (slug is opti
Tools
-
lot_details— Full detail for one Bonhams lot: description, condition, images, realized price (hammer + buyer's premium), estimate range, sale date. Needs the auction_id and lot_no from results_search (slug is opti -
results_search— Search Bonhams' past-lot realized-price archive by artist/maker (or any keyword). Returns sold lots with hammer price, hammer price including buyer's premium (the actual realized price), estimate rang