# Bring a Trailer — US collector-car auctions, live and archived

> Search Bring a Trailer's CLOSED-auction archive — every lot the site has run, 265,000+ of them, with what each one actually made. Read `outcome` on every row before you read the money: 'sold' means the car changed hands at `sold_price`; 'reserve_not_met' means it did NOT sell and the figure is only the high bid (55,000+ lots of the archive). Every filter is optional. For auctions running right now use `live_auctions` instead.
> ReefAPI engine `bringatrailer` · 5 endpoints · clean JSON, no scraping or browsers to manage.

## How to call
- **Endpoint:** `POST https://api.reefapi.com/bringatrailer/v1/<action>` with a JSON body.
- **Auth:** header `x-api-key: <YOUR_REEFAPI_KEY>` — create one free (1,000 credits, no card): https://reefapi.com/signup
- **Response (every call):** `{ ok: boolean, data: ..., meta: { record_count, credits, ... }, error: { code, message } }` — branch on `ok`. Failed calls are free except verified SHEIN NOT_FOUND on product/detail and price (4 credits).
- **One key + one shared credit pool** across every ReefAPI API. Per-call credits are listed on each endpoint below.
- **Use it from an AI agent (MCP):** connect `https://api.reefapi.com/mcp` (remote streamable-http). Send the key as `Authorization: Bearer <key>`, or put it in the URL (`?key=<key>`) when the client has no header field, as ChatGPT does.

## Endpoints

### POST https://api.reefapi.com/bringatrailer/v1/search — 1 credit
Search Bring a Trailer's CLOSED-auction archive — every lot the site has run, 265,000+ of them, with what each one actually made. Read `outcome` on every row before you read the money: 'sold' means the car changed hands at `sold_price`; 'reserve_not_met' means it did NOT sell and the figure is only the high bid (55,000+ lots of the archive). Every filter is optional. For auctions running right now use `live_auctions` instead.

**Parameters:**
- `query` (string, optional) — Free-text search over the make, model, year, origin, country and VIN Bring a Trailer indexes per lot (e.g. 'porsche 911', '1990 miata', 'air-cooled'). Leave it out to browse everything.
- `exclude` (string, optional) — Free-text terms a lot must NOT match, applied on top of `query` (e.g. query='porsche', exclude='911' drops the 911s).
- `outcome` (enum, optional) — Keep only lots that sold, or only lots whose reserve was not met. Left out, you get both and each row says which it was. [one of: sold, reserve_not_met]
- `category_id` (integer, optional) — Restrict to one Bring a Trailer category by id (70 = Motorcycles, 11 = Race Cars, 383 = Boats …). Call the `taxonomies` action for the full list with names. An unknown id is rejected here rather than returning an empty page.
- `origin_id` (integer, optional) — Restrict to one country of ORIGIN of the vehicle by id (7 = German, 9 = Japanese, 3 = American …) — this is where the car was built, not where it sits. Call `taxonomies` for the list.
- `era` (enum, optional) — Restrict to one decade of manufacture, as Bring a Trailer groups them. [one of: 2020, 2010, 2000, 1990, 1980, 1970, 1960, 1950, 1940, 1930, 1920, 1910, 1900, pre-1900]
- `country` (enum, optional) — Restrict to lots physically located in one country. BaT's own region groups (EU, NA) are NOT accepted by the site and return nothing, so only these country codes are published. [one of: US, CA, GB, DE, FR, IT, NL, PT, CH, JP, ZA]
- `max_bid` (integer, optional) — Only lots whose final/current amount is below this figure, in the lot's own currency. Bring a Trailer offers this as a ceiling only; there is no floor.
- `min_year` (integer, optional) — Earliest model year, inclusive.
- `max_year` (integer, optional) — Latest model year, inclusive.
- `closed_within` (enum, optional) — Only auctions that closed inside this window. [one of: 7d, 30d, 1y, 2y, 5y]
- `sort` (enum, optional, default "recently_closed") — Row order. [one of: recently_closed, oldest_first, highest_bid, most_popular]
- `page` (integer, optional, default 1) — 1-based page. Bring a Trailer serves at most 10,000 archive lots per query, so page x max_results must stay at or below 10,000 — narrow the query to go deeper. The live catalogue is not paged at all.
- `max_results` (integer, optional, default 24) — Rows per page, 10-60 (Bring a Trailer rejects anything outside that range). On `live_auctions` it only trims the page; the count in `total_available` is always the whole live catalogue.

**Returns:** {query, outcome, total_available, page, page_count, currencies, results[]} — each result has listing_id, url, title, excerpt, currency, final_amount, sold_price, outcome, is_sold, closed_at, ends_at, country_code, country, no_reserve, premium, bat_alumni, comment_count, image, price_conflict.

**Example request body:**
```json
{
  "query": "porsche 911",
  "max_results": 12
}
```

### POST https://api.reefapi.com/bringatrailer/v1/live_auctions — 1 credit
Every Bring a Trailer auction open for bidding right now — the site publishes the whole live catalogue in one payload, so `total_available` is an exact count, not an estimate. A lot nobody has bid on yet has `current_bid` null and `has_bids` false: BaT prints 0 there, and 0 is not a price. `ends_at` is the site's own absolute closing stamp.

**Parameters:**
- `query` (string, optional) — Free-text search over the make, model, year, origin, country and VIN Bring a Trailer indexes per lot (e.g. 'porsche 911', '1990 miata', 'air-cooled'). Leave it out to browse everything.
- `category_id` (integer, optional) — Restrict to one Bring a Trailer category by id (70 = Motorcycles, 11 = Race Cars, 383 = Boats …). Call the `taxonomies` action for the full list with names. An unknown id is rejected here rather than returning an empty page.
- `origin_id` (integer, optional) — Restrict to one country of ORIGIN of the vehicle by id (7 = German, 9 = Japanese, 3 = American …) — this is where the car was built, not where it sits. Call `taxonomies` for the list.
- `era` (enum, optional) — Restrict to one decade of manufacture, as Bring a Trailer groups them. [one of: 2020, 2010, 2000, 1990, 1980, 1970, 1960, 1950, 1940, 1930, 1920, 1910, 1900, pre-1900]
- `country` (enum, optional) — Restrict to lots physically located in one country. BaT's own region groups (EU, NA) are NOT accepted by the site and return nothing, so only these country codes are published. [one of: US, CA, GB, DE, FR, IT, NL, PT, CH, JP, ZA]
- `max_bid` (integer, optional) — Only lots whose final/current amount is below this figure, in the lot's own currency. Bring a Trailer offers this as a ceiling only; there is no floor.
- `min_year` (integer, optional) — Earliest model year, inclusive.
- `max_year` (integer, optional) — Latest model year, inclusive.
- `no_reserve` (boolean, optional) — true = only no-reserve lots (they always sell). Left out, you get both kinds.
- `ending_within_hours` (integer, optional) — Only lots closing inside this many hours, measured against the site's own closing stamp.
- `sort` (enum, optional, default "ending_soonest") — Row order. [one of: ending_soonest, ending_latest, bid_high_first, bid_low_first, newest_listed]
- `page` (integer, optional, default 1) — 1-based page. Bring a Trailer serves at most 10,000 archive lots per query, so page x max_results must stay at or below 10,000 — narrow the query to go deeper. The live catalogue is not paged at all.
- `max_results` (integer, optional, default 24) — Rows per page, 10-60 (Bring a Trailer rejects anything outside that range). On `live_auctions` it only trims the page; the count in `total_available` is always the whole live catalogue.

**Returns:** {query, total_available, page, page_count, currencies, results[]} — each result has listing_id, url, title, year, excerpt, currency, current_bid, has_bids, bid_status, ends_at, seconds_remaining, country, country_code, latitude, longitude, category_ids, era, no_reserve, premium, bat_alumni, image, price_conflict.

**Example request body:**
```json
{
  "max_results": 12
}
```

### POST https://api.reefapi.com/bringatrailer/v1/detail — 1 credit
One Bring a Trailer lot in full, live or closed: the outcome in the site's own words, the amount, the closing stamp, the seller's BaT handle, where the car is, the chassis/VIN, the whole BaT Essentials spec list, the lot number, and the view/watcher/comment counts the lot page publishes. Takes the numeric listing id, the listing slug, or any bringatrailer.com listing URL.

**Parameters:**
- `listing` (string, required) — The numeric listing id (as `listing_id` in search results), the listing slug, or a full URL such as https://bringatrailer.com/listing/1991-dodge-stealth-65/

**Returns:** One lot object — the list-row fields plus seller, seller_url, location, chassis, specs[], seller_type, lot_number, views, watchers, comment_count, description and images.

**Example request body:**
```json
{
  "listing": "122896532"
}
```

### POST https://api.reefapi.com/bringatrailer/v1/market_stats — 1 credit
What a car actually makes on Bring a Trailer. Runs an archive query and returns the site's own sold and unsold amount series collapsed into figures: how many sold, how many missed reserve, the sell-through rate, and the low / median / mean / high of the SOLD lots only. Unsold lots are counted but never mixed into the price figures — their number is a high bid, not a sale. Bring a Trailer caps the series it ships, which `series_capped` reports.

**Parameters:**
- `query` (string, optional) — Free-text search over the make, model, year, origin, country and VIN Bring a Trailer indexes per lot (e.g. 'porsche 911', '1990 miata', 'air-cooled'). Leave it out to browse everything.
- `exclude` (string, optional) — Free-text terms a lot must NOT match, applied on top of `query` (e.g. query='porsche', exclude='911' drops the 911s).
- `category_id` (integer, optional) — Restrict to one Bring a Trailer category by id (70 = Motorcycles, 11 = Race Cars, 383 = Boats …). Call the `taxonomies` action for the full list with names. An unknown id is rejected here rather than returning an empty page.
- `origin_id` (integer, optional) — Restrict to one country of ORIGIN of the vehicle by id (7 = German, 9 = Japanese, 3 = American …) — this is where the car was built, not where it sits. Call `taxonomies` for the list.
- `era` (enum, optional) — Restrict to one decade of manufacture, as Bring a Trailer groups them. [one of: 2020, 2010, 2000, 1990, 1980, 1970, 1960, 1950, 1940, 1930, 1920, 1910, 1900, pre-1900]
- `country` (enum, optional) — Restrict to lots physically located in one country. BaT's own region groups (EU, NA) are NOT accepted by the site and return nothing, so only these country codes are published. [one of: US, CA, GB, DE, FR, IT, NL, PT, CH, JP, ZA]
- `min_year` (integer, optional) — Earliest model year, inclusive.
- `max_year` (integer, optional) — Latest model year, inclusive.
- `closed_within` (enum, optional) — Only auctions that closed inside this window. [one of: 7d, 30d, 1y, 2y, 5y]

**Returns:** {query, total_matched, sold_count, unsold_count, sell_through_pct, sold_price_min, sold_price_median, sold_price_mean, sold_price_max, first_closed_at, last_closed_at, series_capped, top_sales[]} — amounts are mixed-currency exactly as Bring a Trailer publishes them.

**Example request body:**
```json
{
  "query": "porsche 911",
  "closed_within": "1y"
}
```

### POST https://api.reefapi.com/bringatrailer/v1/taxonomies — 1 credit
The ids the `category_id`, `origin_id`, `era` and `country` filters take, with the names Bring a Trailer shows for them. Read straight off the site's own filter toolbar, so it never drifts from what the filters accept.

**Parameters:** none

**Returns:** {categories[], origins[], eras[], countries[]} with {id, name} per entry.

## At scale
- **Volume:** 5M+ requests a day, measured at 60 requests a second across the fleet with no
  central bottleneck. Per-key limits are raised for high-volume accounts; volume pricing on request.
- **Missing a source:** tell us a site we do not cover and it becomes an engine. A customer asked
  for bestprice.gr on 21 Sep 2026 and it was in the catalog on 22 Sep.
- **Support:** 2 minute median time from a question in the live chat to the first answer. Setup
  help included, no support tier to buy.
- **One key, one credit pool** across every API. No per-site plans, no separate subscriptions.

## More
- Try it live, no code: https://reefapi.com/playground?engine=bringatrailer
- Human docs page: https://reefapi.com/docs/bringatrailer
- Overview page: https://reefapi.com/bringatrailer-api
- Every ReefAPI API in one file (for your AI): https://reefapi.com/llms-full.txt
