# Bring a Trailer Scraper (`silentflow/bringatrailer-scraper`) Actor

Extract auction data from Bring a Trailer (BaT). Get sold prices, vehicle specs, VIN, mileage, seller info, and photos from 230,000+ completed vehicle auctions. Perfect for car market analysis, dealer intelligence, insurance valuations, and investment research.

- **URL**: https://apify.com/silentflow/bringatrailer-scraper.md
- **Developed by:** [SilentFlow](https://apify.com/silentflow) (community)
- **Categories:** E-commerce
- **Stats:** 30 total users, 4 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

from $5.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.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

**230,000+ completed vehicle auctions with sold prices, specs, and VINs.** Search by make, model, or year. Get structured data from the largest enthusiast car auction platform in seconds.

### How it works

![How Bring a Trailer Scraper works, from search to structured auction data](https://api.apify.com/v2/key-value-stores/MsMzmoOCXqCV23iH2/records/how-it-works-v2.png)

### ✨ Why teams use this scraper

Building a car valuation model but can't get historical auction data? Copy-pasting sold prices from BaT listings one by one? Trying to track what a specific model sells for over time?

- 🚗 **230,000+ completed auctions.** Every sold vehicle on Bring a Trailer with final prices, bid counts, and auction dates. The largest structured dataset of enthusiast car sales available.
- 💰 **Sold prices you can't get anywhere else.** BaT doesn't have a public API. This scraper gives you structured access to every completed auction result.
- 📋 **Full vehicle specs per listing.** VIN, mileage, engine, transmission, exterior color, interior color, and all listed essentials. No manual data entry.
- 📸 **Gallery photos included.** Every listing comes with all gallery image URLs, typically 30-60 photos per vehicle.
- 🔍 **Search by anything.** "Porsche 911", "BMW E30 M3", "1967 Mustang", or browse by model page URL. Get exactly the vehicles you're looking for.
- 👤 **Seller and location data.** Know who sold it and where the vehicle is located.

### 🎯 What you can do with BaT auction data

| Team | What they build |
|------|----------------|
| **Car Dealers** | Price inventory accurately using real auction comps for any make and model |
| **Investors** | Track which models are appreciating and identify undervalued vehicles |
| **Insurance** | Get accurate market values for specialty and collector vehicles |
| **Appraisers** | Support valuations with actual transaction data, not estimates |
| **Data Journalists** | Analyze collector car market trends with structured, exportable data |
| **Enthusiasts** | Track dream car prices and set alerts when deals appear |

### 📥 Input parameters

| Parameter | Type | Description |
|-----------|------|-------------|
| `searches` | string\[] | Keywords to search (e.g., "Porsche 911", "BMW M3 E30") |
| `startUrls` | URL\[] | Direct BaT listing or browse page URLs |
| `maxItems` | integer | Maximum results to return (default: 50) |
| `includeDetails` | boolean | Fetch full specs, VIN, and photos from each listing (default: true) |

### 📊 Output data

```json
{
  "title": "1989 Porsche 911 Carrera 4 Coupe",
  "price": 72500,
  "priceFormatted": "USD $72,500",
  "currency": "USD",
  "status": "sold",
  "auctionEndDate": "2026-03-15T22:00:00Z",
  "totalBids": 38,
  "noReserve": true,
  "vin": "WP0AB0969KS450123",
  "mileage": "64,200",
  "engine": "3.6L Flat-6",
  "transmission": "5-Speed Manual",
  "exteriorColor": "Guards Red",
  "interiorColor": "Black Leather",
  "essentials": ["Clean Title", "Service Records", "Recent Service"],
  "seller": "bringthetrailer",
  "location": "San Francisco, CA",
  "imageUrl": "https://bringatrailer.com/wp-content/uploads/...",
  "imageUrls": ["https://...", "https://...", "... 45 photos"],
  "excerpt": "This 1989 Porsche 911 Carrera 4 is finished in Guards Red...",
  "url": "https://bringatrailer.com/listing/1989-porsche-911-carrera-4-38/"
}
```

### 🗂️ Data fields

| Category | Fields |
|----------|--------|
| **Vehicle** | `title`, `vin`, `mileage`, `engine`, `transmission`, `exteriorColor`, `interiorColor`, `essentials` |
| **Auction** | `price`, `priceFormatted`, `currency`, `status`, `auctionEndDate`, `totalBids`, `noReserve` |
| **Seller** | `seller`, `location` |
| **Media** | `imageUrl`, `imageUrls`, `excerpt` |
| **Link** | `url` |

### 🚀 Examples

#### Search for Porsche 911 auctions

```json
{
  "searches": ["Porsche 911"],
  "maxItems": 100
}
```

#### Get data from a specific listing

```json
{
  "startUrls": [
    {"url": "https://bringatrailer.com/listing/2007-porsche-boxster-s-24/"}
  ]
}
```

#### Browse all BMW E30 M3 results

```json
{
  "startUrls": [
    {"url": "https://bringatrailer.com/bmw/e30-m3/"}
  ],
  "maxItems": 50
}
```

#### Fast mode without detail pages

```json
{
  "searches": ["Ferrari"],
  "maxItems": 200,
  "includeDetails": false
}
```

### 💻 Integrations

#### Python

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run = client.actor("silentflow/bringatrailer-scraper").call(run_input={
    "searches": ["Porsche 911"],
    "maxItems": 100,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(f"{item['title']}: {item['priceFormatted']} ({item['totalBids']} bids)")
    print(f"  VIN: {item.get('vin', 'N/A')} | {item.get('mileage', 'N/A')} miles")
```

#### JavaScript

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

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });

const run = await client.actor('silentflow/bringatrailer-scraper').call({
    searches: ['Porsche 911'],
    maxItems: 100,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach(item => {
    console.log(`${item.title}: ${item.priceFormatted} (${item.totalBids} bids)`);
});
```

### 📈 Performance

| Metric | Value |
|--------|-------|
| Search results | ~24 per page from BaT browse |
| Detail enrichment | ~2-3 seconds per listing |
| Fast mode (no details) | Instant for search results |
| Data freshness | Real-time from BaT |

### 💡 Tips for best results

1. **Be specific with keywords.** "BMW E30 M3" returns exactly what you want. "BMW" returns everything.
2. **Browse page URLs for model tracking.** `/porsche/911/` gives you the most recent completed auctions for that model, perfect for price tracking.
3. **Disable detail enrichment for speed.** Set `includeDetails: false` to skip VIN/specs and get just prices and titles. 10x faster for large searches.
4. **Direct listing URLs for full data.** Paste a specific BaT listing URL to get complete specs, all photos, and the full description.

### ❓ FAQ

**Q: Can I get active/ongoing auctions?**
A: Active auctions require a BaT account. This scraper focuses on completed auctions, which are publicly accessible and include final sold prices.

**Q: How far back does the data go?**
A: BaT has auction results going back to their early years. Browse pages show the most recent results first.

**Q: Why are some fields missing (VIN, mileage)?**
A: Not all listings include every field. VIN and mileage depend on what the seller provided. The scraper returns everything available.

**Q: Is the price the final sold price?**
A: Yes. `price` is the hammer price (final bid). For reserve-not-met auctions, `status` will indicate that.

### 📬 Support

Need something this scraper doesn't do yet? We ship features fast.

- 💡 **Feature requests** go straight to our backlog
- ⚙️ **Enterprise needs?** We do custom integrations and high-volume setups

Response time: usually under 24 hours.

Check out our other scrapers: [SilentFlow on Apify](https://apify.com/silentflow)

# Actor input Schema

## `searches` (type: `array`):

Keywords to search for. Each keyword finds matching completed auctions.

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

BaT listing URLs (e.g. https://bringatrailer.com/listing/2007-porsche-boxster-s-24/) or browse pages (e.g. https://bringatrailer.com/porsche/911/).

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

Maximum number of auction results to return.

## `includeDetails` (type: `boolean`):

Fetch each listing page for full specs (VIN, mileage, colors, engine, seller, photos). Disable for faster results with basic data only.

## Actor input object example

```json
{
  "searches": [
    "Porsche 911"
  ],
  "startUrls": [
    {
      "url": "https://bringatrailer.com/porsche/911/"
    }
  ],
  "maxItems": 50,
  "includeDetails": true
}
```

# Actor output Schema

## `results` (type: `string`):

Complete auction data in JSON format.

## `resultsCSV` (type: `string`):

CSV format for spreadsheet analysis.

## `resultsExcel` (type: `string`):

Excel format export.

# 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 = {
    "searches": [
        "Porsche 911"
    ],
    "startUrls": [
        {
            "url": "https://bringatrailer.com/porsche/911/"
        }
    ],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("silentflow/bringatrailer-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 = {
    "searches": ["Porsche 911"],
    "startUrls": [{ "url": "https://bringatrailer.com/porsche/911/" }],
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("silentflow/bringatrailer-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 '{
  "searches": [
    "Porsche 911"
  ],
  "startUrls": [
    {
      "url": "https://bringatrailer.com/porsche/911/"
    }
  ],
  "maxItems": 50
}' |
apify call silentflow/bringatrailer-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/e6ep7rXdChT8aamvM/builds/qIuXhkZ7XA3s65L7Y/openapi.json
