Collector-car auction results as JSON, where the sold price comes from the sentence BaT prints, not the number that contradicts it
Bring a Trailer API returns live Bring a Trailer data as clean JSON for bring a trailer The primary endpoint, search, returns {query, outcome, total_available, page, page_count, currencies, results[]} — each result has listing_id, url, title, excerpt, currency, f….
5 active endpoints. Every call is 1 credit.
- POST/bringatrailer/v1/search
- POST/bringatrailer/v1/live_auctions
- POST/bringatrailer/v1/detail
- POST/bringatrailer/v1/market_stats
- POST/bringatrailer/v1/taxonomies
What Bring a Trailer endpoints does ReefAPI ship?
5 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Bring a Trailer API
5 of 5 endpoints, ready to run
Search BaT's archive of finished auctions plus its live ones: free text, category, origin, era, country, and the outcome itself (sold, bid-to, withdrawn). Every row carries the result, the amount, the closing time and the comment count. Paging is capped by BaT at 10,000 rows per query and the engine enforces that rather than serving a fabricated empty page.
{ "ok": true, "data": { "query": "porsche 911", "outcome": "sold", "total_available": 14882, "page": 1, "page_count": 621, "currencies": [ "USD" ], "results": [ { "listing_id": 122527336, "url": "https://bringatrailer.com/listing/1996-porsche-911-carrera-coupe-105/", "title": "1996 Porsche 911 Carrera Coupe 6-Speed", "year": null, "excerpt": "This 1996 Porsche 911 Carrera coupe is powered by a rebuilt 3.6-liter flat-six paired with a six-speed manual transaxle and a Wavetrac limited-slip differential. Finished in Grand Prix White over modified black upholstery, the car features a RUF CTR2-style front bumper, an RS-style ducktail spoiler, 18\" RUF wheels, KW V3 coilovers, and a Fabspeed…", "currency": "USD", "outcome": "sold", "is_sold": true, "sold_price": 145000, "final_amount": 145000, "final_amount_printed": "Sold for USD $145,000 on 9/30/2026", "has_bids": true, "closed_at": "2026-09-30T22:10:41Z", "closed_on_site_date": "9/30/2026", "ends_at": "2026-09-30T22:10:41Z", "country": null, "country_code": "US", "no_reserve": false, "premium": false, "bat_alumni": false, "comment_count": 0, "views": null, "watchers": null, "image": "https://bringatrailer.com/wp-content/uploads/2026/09/Group_C_Curation_-_Porsche_993_Coupe-16-scaled-copy-2026-09-22-18u-07437.jpg?w=470&h=318&crop=1", "is_live": false, "price_conflict": false }, { "listing_id": 119460360, "url": "https://bringatrailer.com/listing/1990-porsche-911-carrera-2-coupe-75/", "title": "1990 Porsche 911 Carrera 2 Coupe 5-Speed", "year": null, "excerpt": "This 1990 Porsche 911 Carrera 2 spent nearly three decades registered in California before the current owner's 2018 acquisition, and it is modified with Bilstein PSS10 suspension, an FD Motorsports RS-style shift rod, a MOMO Prototipo steering wheel, xenon headlights, and a Cup 1-style exhaust and 17\" wheels.", "currency": "USD", "outcome": "sold", "is_sold": true, "sold_price": 111000, "final_amount": 111000, "final_amount_printed": "Sold for USD $111,000 on 9/30/2026", "has_bids": true, "closed_at": "2026-09-30T21:57:06Z", "closed_on_site_date": "9/30/2026", "ends_at": "2026-09-30T21:57:06Z", "country": null, "country_code": "US", "no_reserve": false, "premium": false, "bat_alumni": false, "comment_count": 0, "views": null, "watchers": null, "image": "https://bringatrailer.com/wp-content/uploads/2026/07/1990_porsche_911-carrera-2-coupe_1990_porsche_911-carrera-2-coupe_72bd70eb-7c7e-4e97-a490-ace49a45b118-Yx8acy-45739-45740-scaled.jpg?w=470&h=318&crop=1", "is_live": false, "price_conflict": false }, { "listing_id": 122118575, "url": "https://bringatrailer.com/listing/1995-porsche-911-carrera-4-cabriolet-41/", "title": "3.8L-Powered 1995 Porsche 911 Carrera 4 Cabriolet 6-Speed", "year": null, "excerpt": "This 1995 black-over-black Porsche 911 Carrera 4 cabriolet was registered in Texas, Florida, and California before it was listed on BaT in August 2017, and its air-cooled flat-six was overhauled to displace 3.8 liters under previous ownership. The car has been retrofitted with a VarioRam intake system, a Motor Sound Package airbox, coilover…", "currency": "USD", "outcome": "sold", "is_sold": true, "sold_price": 62000, "final_amount": 62000, "final_amount_printed": "Sold for USD $62,000 on 9/30/2026", "has_bids": true, "closed_at": "2026-09-30T21:28:00Z", "closed_on_site_date": "9/30/2026", "ends_at": "2026-09-30T21:28:00Z", "country": null, "country_code": "US", "no_reserve": false, "premium": false, "bat_alumni": true, "comment_count": 0, "views": null, "watchers": null, "image": "https://bringatrailer.com/wp-content/uploads/2026/09/Alex_Goldstein_-_Porsche_993_Cab_3.8L-144-scaled-copy-2026-09-09-57q-72173.jpg?w=470&h=318&crop=1", "is_live": false, "price_conflict": false } ] } }
How the Bring a Trailer API works
Bring a Trailer is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 321 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
The sold price comes from BaT's sentence, because its own integer disagrees on about one sold car in forty
BaT publishes the result twice: as a clean integer and inside a sentence like "Sold for USD $382,500". They do not always agree. On 5 of 200 closed rows the integer was LOWER than the sentence (380,000 against 382,500), and a third surface, the listing page itself, agreed with the sentence 5 times out of 5 and with the integer 0 times out of 5. Taking the tidy integer is the obvious move and it would publish a price nobody paid.
{}Categories, origins and eras with their ids. Cache it; the search filters take these.
{"query": "porsche 911", "outcome": "sold"}Finished auctions with a result. sold_price is set only when the outcome really is sold, on 50 of 50 sampled rows; a no-bid row carries null, never zero.
{"query": "porsche 911"}The ones still running. Any disagreement between the two price witnesses stays visible as price_conflict instead of being silently resolved.
{"listing": 122896532}One car in full, including BaT's own result sentence next to the parsed amount.
Collector-car auctions with the outcome and the amount people actually paid, the closing time taken from BaT's own timestamp rather than a clock reading, and a visible flag wherever BaT's two price surfaces disagree.
curl -X POST https://api.reefapi.com/bringatrailer/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"porsche 911","max_results":12}'{
"ok": true,
"data": { … },
"meta": {
"api": "bringatrailer",
"endpoint": "search",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}United States, in dollars, and BaT publishes no starting price, no reserve and no bid count
Measured 2026-10-01 against the live gateway: 48 fixed cases run twice (48/48 and 47/48), 50 distinct lots for the field counts, identical in both runs. Three of these lines go against us.
Bring a Trailer, prices in USD. Cars are located worldwide and country is published per row, but the auction itself is BaT's.
listing_id, url, title, excerpt, currency, ends_at and image on 50 of 50 rows. ends_at comes from BaT's own timestamp field, never from reading a countdown.
year, era, latitude, longitude, categories and country come back null on archived rows because BaT's archive payload nulls them, measured 12 of 12 and 51 of 51. outcome and closed_at only exist once a listing has closed.
The bid history arrives over a websocket into the comment stream, not on any listed surface. Rather than ship a broken handle, bid count is not offered at all.
So neither is invented. A lot labelled Bidding Open rather than Bid has no bid yet and returns null instead of the zero BaT prints.
The parsed amount is compared with BaT's own result sentence; on 5 of 200 closed rows they disagreed and the sentence won, confirmed against the listing page 5 of 5. The clash is published as price_conflict rather than hidden.
A sentence like Withdrawn by BaT on 8/7/2026 has no price in it. An earlier first-digits parse read that as 8 and would have published a 300SL Roadster at 8 EUR; the parser now only accepts a figure that follows a currency code or symbol.
BaT starts refusing after roughly 90 dense sequential calls from one exit. The engine retries once on a fresh exit; ordinary customer traffic is nowhere near that rate.
What people build with Bring a Trailer
The jobs this data is most often used for.
endpoints
credit per call
Pricing and assortment teams use Bring a Trailer to search Bring a Trailer's CLOSED-auction archive.
Brand-protection teams use Bring a Trailer to get every Bring a Trailer auction open for bidding right now.
Retail analysts use Bring a Trailer to get one Bring a Trailer lot in full, live or closed.
Catalog enrichment teams use Bring a Trailer to get what a car actually makes on Bring a Trailer.
What Bring a Trailer data costs
The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 321 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/bringatrailer/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"porsche 911","max_results":12}'import requests
r = requests.post(
"https://api.reefapi.com/bringatrailer/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "porsche 911",
"max_results": 12
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up Bring a Trailer.
Get a free key →What is the Bring a Trailer API?▾
Bring a Trailer API is a ReefAPI endpoint group for bring a trailer It returns live JSON through POST requests under /bringatrailer/v1.
Is the Bring a Trailer API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. Bring a Trailer calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Bring a Trailer login or account?▾
No login to Bring a Trailer 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 Bring a Trailer data?▾
The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Bring a Trailer API use?▾
Bring a Trailer actions currently cost 1 credit per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.
Can I call Bring a Trailer from an AI assistant or MCP client?▾
Yes. Connect ReefAPI once through MCP and your assistant can call bringatrailer actions with the same key, credit pool and JSON envelope used by normal REST requests.
Is the Bring a Trailer API a Bring a Trailer scraper?▾
It is the managed alternative to a DIY Bring a Trailer scraper. Instead of building and maintaining your own scraper — proxies, headless browsers, captcha and constant breakage — you call one ReefAPI endpoint and get the same bring a trailer back as clean JSON.
Why does my Bring a Trailer scraper keep getting blocked?▾
Most Bring a Trailer scrapers break on anti-bot defenses, rate limits and IP bans that need rotating residential proxies and browser fingerprinting to clear. ReefAPI handles all of that for you — no proxies, no captchas, no maintenance — and returns live JSON. Blocked calls are free.
26 More APIs APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Bring a Trailer, you are one call away from the rest of the category — no second contract, no second integration.
Need something this API does not do?
Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 320 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-10-01.