# Bring a Trailer Scraper - Car Auction Sold Prices (`jongoose/bring-a-trailer-scraper`) Actor

Scrape Bring a Trailer (BaT) completed collector & enthusiast car auctions - real SOLD prices, final high bid, sold vs reserve-not-met status, end date, year/make/model, mileage, thumbnail and listing URL. Paste a BaT results, make or model URL, or search by keyword.

- **URL**: https://apify.com/jongoose/bring-a-trailer-scraper.md
- **Developed by:** [James Scott](https://apify.com/jongoose) (community)
- **Categories:** E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Bring a Trailer Scraper - Collector Car Auction Results & Sold Prices

Scrape **completed collector & enthusiast car auctions from [Bring a Trailer](https://bringatrailer.com)** (BaT) into clean, structured data - no BaT account or API key required. BaT publishes **real, verified sold prices**, which makes it one of the best free sources of pricing comps for collector, classic and enthusiast vehicles.

### What you get (per auction)

- **auctionId** and the canonical BaT **listing URL**
- **title**, plus parsed **year / make / model** and **mileage** (when present in the title)
- **isSold** and **status** - `sold`, `reserve_not_met`, or `unknown`
- **soldPrice** - the winning bid when the car actually sold (null when the reserve was not met)
- **currentBid** - the final high bid amount (equals the sold price on sold cars)
- **currency**, **soldDate** / **endDate** (ISO-8601 UTC) and **endTimestamp** (epoch)
- **location** / **countryCode**, **noReserve**, **isPremium**
- **excerpt** (BaT's short description) and **thumbnailUrl**
- **numBids** / **numComments** - see the note below

### Input

- **Bring a Trailer URLs** - paste the results feed (`https://bringatrailer.com/auctions/results/`) to scrape everything, or a make/model page (e.g. `https://bringatrailer.com/porsche/911/`) to target one model. Leave empty to scrape the national completed-results feed.
- **Keyword** *(optional)* - narrow by a title keyword (e.g. `911 Turbo`, `Ford Bronco`). Applied on top of any Start URL, or against the whole feed on its own.
- **Max auctions** caps the run.

#### Example input

```json
{
  "startUrls": [{ "url": "https://bringatrailer.com/porsche/911/" }],
  "query": "Turbo",
  "maxItems": 200,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

#### Example output record

```json
{
  "auctionId": 116763574,
  "title": "9k-Mile 2019 Porsche 911 Carrera GTS Coupe",
  "year": 2019,
  "make": "Porsche",
  "model": "911",
  "isSold": true,
  "status": "sold",
  "soldPrice": 125500,
  "currentBid": 125500,
  "currency": "USD",
  "soldDate": "2026-07-08T15:37:57Z",
  "endDate": "2026-07-08T15:37:57Z",
  "mileage": 9000,
  "location": "US",
  "countryCode": "US",
  "noReserve": false,
  "url": "https://bringatrailer.com/listing/2019-porsche-911-carrera-gts-coupe-32/",
  "thumbnailUrl": "https://bringatrailer.com/wp-content/uploads/...jpg"
}
```

### How it works

BaT is a WordPress site. Every results / make / model page embeds its first page of auctions in a `var auctionsCompletedInitialData = {...}` object, and BaT's own "load more" button calls a public REST route to page further:

```
POST https://bringatrailer.com/wp-json/bringatrailer/1.0/data/listings-filter
{ "page": N, "per_page": 36, "get_items": true, "sort": "td", "base_filter": { "keyword_pages": [ ... ] } }
```

The Actor reads the page once to grab its `base_filter` (the make/model `keyword_pages`), then walks that endpoint page-by-page. Every field is read straight from BaT's own JSON, so it is far more durable than CSS scraping and runs on Apify's default datacenter proxy (no residential proxy needed).

### Why this actor

- **Real sold prices.** BaT auctions clear at public, no-haggle hammer prices - unlike dealer *asking* prices, these are what collector cars **actually sold for**. Ideal for pricing intelligence, appraisals and market analysis on classic, exotic and enthusiast vehicles.
- **Sold vs. no-sale is explicit.** Cars whose reserve was not met are labelled `reserve_not_met` with `soldPrice: null`, so you never mistake a high bid for a sale.
- **Fast + cheap.** Data comes from BaT's own load-more endpoint - no per-listing detail requests.
- Export as JSON, CSV, or Excel, or pull via the Apify API.

### Notes

- **numBids / numComments:** BaT serves live bid, comment and view counts over websockets (Pusher). They are **not** included in the completed-results feed, so `numBids` is reported as `null` and `numComments` as `0`. All price, date and status fields are fully populated.
- **year / make / model / mileage** are parsed from the auction title on a best-effort basis and may be `null` for automobilia lots (signs, parts, literature) or unusual titles.

### Legal

This Actor collects **public auction data for research and market-analysis purposes**. It is **not a consumer report**, is **not for FCRA purposes**, and must not be used to make eligibility decisions about any individual. Respect Bring a Trailer's Terms of Service and applicable law.

# Actor input Schema

## `startUrls` (type: `array`):

One or more Bring a Trailer URLs to scrape completed auctions from. Use the results feed (https://bringatrailer.com/auctions/results/) for everything, or a make/model page (e.g. https://bringatrailer.com/porsche/911/) to target one model. If left empty, the national completed-results feed is scraped.

## `query` (type: `string`):

Optional keyword to narrow results (matched against listing titles, e.g. "911 Turbo", "Ford Bronco", "air-cooled"). Applied on top of any Start URL; if no Start URL is given, this searches the whole completed-results feed.

## `maxItems` (type: `integer`):

Stop after collecting this many auctions.

## `proxyConfiguration` (type: `object`):

Bring a Trailer is open and works fine through Apify's default (datacenter) proxy - no residential proxy needed.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://bringatrailer.com/porsche/911/"
    }
  ],
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "startUrls": [
        {
            "url": "https://bringatrailer.com/porsche/911/"
        }
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("jongoose/bring-a-trailer-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "startUrls": [{ "url": "https://bringatrailer.com/porsche/911/" }] }

# Run the Actor and wait for it to finish
run = client.actor("jongoose/bring-a-trailer-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://bringatrailer.com/porsche/911/"
    }
  ]
}' |
apify call jongoose/bring-a-trailer-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=jongoose/bring-a-trailer-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/JxQ2bRnwtM2ER9UWu/builds/9g9mFw9ttudMxRo2Q/openapi.json
