# PCARMARKET Scraper (`normdata/pcarmarket-scraper`) Actor

PCARMARKET auction results and live lots for dealers, appraisers and collectors: 19,000+ Porsches, collector cars, parts and watches with sold price, every bid, VIN, mileage, condition report, Carfax and photos. Filter by make, model, year, mileage, price.

- **URL**: https://apify.com/normdata/pcarmarket-scraper.md
- **Developed by:** [Norm Data](https://apify.com/normdata) (community)
- **Categories:** Automation, E-commerce, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $14.00 / 1,000 lots

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/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

![Norm Data](https://raw.githubusercontent.com/FabriAV/normdata/refs/heads/main/assets/banner_norm2.png)

## 🏁 PCARMARKET Scraper

Extract lots from **PCARMARKET**, the online auction site for Porsches and other collector cars, plus parts, wheels, signs, memorabilia and watches. Get **auction results** (over 19,000 lots, 11,000+ sold, with the final price or the high bid), lots **for sale now** after their auction (buy now or make an offer), or **live auctions**, in one clean table.

Each lot comes with:

- **Final price**, how it sold (auction, buy now or offer), the high bid, reserve met / not met / no reserve, starting bid and buy now price.
- **Every bid**: amount, bidder and time, plus the number of bids, bidders and watchers.
- For vehicles: **VIN**, mileage, transmission, colors, title and **Carfax** status, the Carfax report link, seller type, keys, track use, exterior and interior ratings, and the whole **condition report** (paint work, current issues, service records, modifications, factory options, ownership history, seller notes...).
- For watches: reference, case, bezel, bracelet, crystal, dial, movement, condition and what is included.
- Location, description, every photo, the lot link, and the auction start, end and sale times.

### 🎯 Who uses it?

#### 🚗 Porsche and collector car dealers

Price a car before you buy or consign it, with every PCARMARKET result for the model and how hard it was bid.

#### 📊 Valuation guides and market analysts

Feed a price index with sold prices, high bids, mileage and dates, and see demand in bids, bidders and watchers.

#### 🧾 Appraisers, insurers and lenders

Back a value with comparable sales matched by VIN, model, year and mileage, with the condition report and lot link.

#### 🔍 Buyers and collectors

Track the cars, wheels or watches you want, and catch new lots and post-auction offers with scheduled runs.

### ✨ What it does

- **Results, for sale now, or live auctions.** Results give the final price or the high bid; for sale gives the buy now price and whether offers are accepted; live gives the current bid.
- **Search the way you think:**
  - Search terms ("GT3 RS", "Speedster", "Fuchs wheels", "Rolex"), several per run.
  - Category: vehicles, parts & memorabilia, watches.
  - Make, model and model year range.
- **Or paste pcarmarket.com links** of lots (auction, results or marketplace pages). The filters are ignored with links.
- **Every useful filter:**
  - Sold, not sold, for sale, live, all results or everything.
  - Manual or automatic, max mileage (kilometers converted), clean title, clean Carfax.
  - Seller type (dealer or private), country, No reserve only, minimum bids.
  - **Auction end date range**: exact dates, or periods like "6 months" or "2 years".
  - **Price range** in USD, and words to exclude.
  - 6 sort orders: newest or oldest, ending soonest, most bids, highest or lowest bid.
- **New lots only.** For scheduled runs: saves only lots the same search has not saved before.

### 🏆 Why this scraper

- **The whole PCARMARKET archive.** Every lot the site has, not just the current page of results.
- **The full lot in every row.** Bid history, condition report, VIN and every photo are always included, at no extra cost.
- **Real final prices.** Lots sold after the auction by buy now or offer get the price they actually sold for, not the last bid.
- **Fast.** About 1,000 lots in 15 seconds.
- **No proxy needed.** Nothing extra to set up or pay for.

### 📦 What data you get

| Field | Description |
| --- | --- |
| `image` | Main photo. |
| `title`, `year`, `make`, `model`, `trim` | Lot title, and the model year, make, model and trim of vehicles. |
| `category` | Vehicle, Parts & memorabilia, or Watch. |
| `status` | `sold`, `not sold`, `for sale` (buy now or offers after the auction), `live` or `upcoming`. |
| `price` | Final price for sold lots, buy now price for lots for sale (USD). |
| `highBid`, `currency` | Highest bid, and the currency (USD). |
| `soldVia` | `auction`, `buy now` or `offer`. |
| `reserve` | `met`, `not met` or `no reserve`. |
| `startingBid`, `buyNowPrice` | Starting bid, and the buy now price while it is offered. |
| `bidCount`, `bidderCount`, `watchers` | Bids, different bidders, and people watching the lot. |
| `mileage`, `mileageUnit`, `vin`, `transmission` | Odometer (Miles or Kilometers), VIN and gearbox. |
| `exteriorColor`, `interior` | Paint and interior. |
| `titleStatus`, `carfaxStatus`, `sellerType` | Title (Clean, Salvage...), Carfax result, Dealer or Private Party. |
| `keys`, `trackUse`, `exteriorRating`, `interiorRating` | Keys included, track use, and the seller's 1 to 5 condition ratings. |
| `originalEngineAndTransmission`, `paintWork`, `wheels`, `tires`, `extraWheelsAndTires`, `warningLights`, `electronics`, `currentIssues`, `serviceItems`, `serviceRecords`, `engineWork`, `modifications`, `factoryOptions`, `otherItems`, `ownershipHistory`, `sellerNotes`, `warranty` | The vehicle's condition report, as the seller filled it in. |
| `dealerFee`, `mileageNote`, `titleNote` | Dealer documentation fee, and the explanations for unknown mileage or title issues. |
| `watchReference`, `caseMaterial`, `caseDiameterMm`, `bezelMaterial`, `braceletMaterial`, `crystal`, `dial`, `movement`, `watchCondition`, `watchIncluded` | Watch details (newer watch lots; older ones only have a description). |
| `location`, `zipCode`, `country` | Where the lot is. |
| `description`, `imageCount` | The lot description and number of photos. |
| `lotId`, `searchedFor` | PCARMARKET's lot ID, and which search or link found it. |
| `trueMileageUnknown`, `fiveDigitOdometer`, `accidentHistory`, `originalPaint`, `paintMeterReadings`, `windowSticker`, `hasWarranty`, `sellerHoldsTitle`, `openTitle` | Yes/no answers of the vehicle report. |
| `fullSet` | Watch sold with box and papers. |
| `offersAccepted`, `buyNowAvailable` | Live and for sale lots: open to offers, and buy now offered. |
| `url`, `carfaxUrl` | Lot page and Carfax report. |
| `includedItems` | Items included with the vehicle (manuals, tools, car cover...). |
| `images` | Every photo link. |
| `bids` | Every bid: amount, bidder and time (repeated bids in a row by the same bidder count once, as on the site). |
| `auctionStart`, `auctionEnd`, `soldAt` | Auction start and end, and when the lot sold (UTC). |
| `scrapedAt` | When the row was collected (UTC). |

#### Example row (trimmed)

```json
{
  "image": "https://assets.basta.app/accounts/005fe31d-e133-4f0b-ac58-2c2cd5f3301c/images/0e3a2784-61a2-4e5c-84c0-2f350fb8c862",
  "title": "47k-Mile RoW 1984 Porsche 930 Turbo",
  "year": 1984,
  "make": "Porsche",
  "model": "911 Turbo",
  "category": "Vehicle",
  "status": "sold",
  "price": 175000,
  "highBid": 165000,
  "currency": "USD",
  "soldVia": "buy now",
  "reserve": "met",
  "bidCount": 60,
  "bidderCount": 17,
  "watchers": 115,
  "mileage": 46737,
  "mileageUnit": "Miles",
  "vin": "WP0ZZZ93ZES000628",
  "transmission": "4-Speed Manual",
  "exteriorColor": "Slate Blue Metallic",
  "interior": "Dark Blue",
  "titleStatus": "Clean",
  "carfaxStatus": "Clean",
  "sellerType": "Private Party",
  "exteriorRating": 4,
  "interiorRating": 4,
  "location": "Williston Park, NY",
  "country": "United States",
  "imageCount": 169,
  "accidentHistory": false,
  "originalPaint": true,
  "url": "https://www.pcarmarket.com/results/1984-porsche-row-911-turbo",
  "bids": [
    { "amount": 163500, "bidder": "Peterjr", "date": "2026-10-13T19:00:47.000Z" },
    { "amount": 165000, "bidder": "Seren", "date": "2026-10-13T19:02:34.000Z" }
  ],
  "auctionEnd": "2026-10-13T19:04:34.000Z",
  "soldAt": "2026-10-13T20:51:28.000Z",
  "scrapedAt": "2026-10-14T15:02:05.438Z"
}
```

### 💡 Use cases

#### 📈 Every 964 and 993 sold, with mileage and bids

```json
{ "makes": ["Porsche"], "models": ["911"], "yearFrom": 1989, "yearTo": 1998, "status": "sold", "maxItems": null }
```

#### 🔧 Manual cars under 30,000 miles with a clean Carfax

```json
{ "transmissions": ["manual"], "maxMileage": 30000, "cleanCarfaxOnly": true, "status": "sold", "maxItems": null }
```

#### 🔥 The most contested auctions of the last year

```json
{ "sortBy": "most_bids", "dateFrom": "1 year", "status": "sold", "maxItems": 200 }
```

#### 🛒 Everything for sale now, buy now or offer

```json
{ "status": "for_sale", "maxItems": null }
```

#### 🛞 Fuchs wheels results

```json
{ "searchTerms": ["fuchs"], "categories": ["memorabilia"], "status": "sold", "maxItems": null }
```

#### ⌚ Watch results

```json
{ "categories": ["watches"], "status": "results", "maxItems": null }
```

### ⚙️ How the input is organised

| Section | What it's for |
| --- | --- |
| **Maximum lots**, **What to scrape** | Always first: caps the whole run (empty means no limit), and results, sold, not sold, for sale, live or everything. |
| **What** | Search terms, or links. |
| **Vehicle** | Category, make, model, model year, transmission, mileage, clean title, clean Carfax. |
| **Seller and auction** | Seller type, country, No reserve, minimum bids, auction end date range. |
| **Price** | Price range, words to exclude, sort order. |
| **Monitoring** | New lots only, with an optional monitor name. |

Several values in one field widen the search (a lot matching ANY of your search terms, or ANY of your makes, is kept); different fields narrow it. Vehicle filters (make, model, year, mileage, transmission, title, Carfax) keep only vehicles. With links, the search terms and filters are ignored.

### 💰 Pricing

Pay-per-event: a one-time **$0.003** when the run starts, plus a price per lot saved to your dataset that drops with your Apify plan. The bid history and the condition report are always included.

| Your Apify plan | Per lot | 1,000 lots |
| --- | --- | --- |
| Free | $0.020 | $20.00 |
| Bronze | $0.018 | $18.00 |
| Silver | $0.016 | $16.00 |
| Gold / Platinum / Diamond | $0.014 | $14.00 |

Lots dropped by your filters are not charged. There are no proxy costs. New Apify accounts start with $5 in free credit. On the Free plan a run saves up to 10 lots.

**Speed:** about 1,000 lots in 15 seconds. Filters PCARMARKET's search can't apply itself (model, transmission, mileage, seller type, country, title, Carfax, No reserve, price, words to exclude) are checked lot by lot, so a narrow one over the whole archive takes a little longer.

### 🚀 Run it

1. Create a free Apify account with $5 in credit.
2. Open the PCARMARKET Scraper.
3. Type a search term (or keep the prefilled one), pick what to scrape and your filters, then click **Start**.
4. Export the results as CSV, Excel, JSON, or XML from the Dataset tab.

You can also:

- Run it programmatically through the Apify API (`run-sync-get-dataset-items`) or the ApifyClient for JavaScript and Python.
- Schedule it with Apify's built-in Scheduler, with **New lots only** on, to catch new auctions and post-auction offers as they appear.

### 🤖 Use with AI agents (MCP)

Give an AI agent live access to PCARMARKET results through the Model Context Protocol:

```
claude mcp add --transport http apify "https://mcp.apify.com?tools=normdata/pcarmarket-scraper"
```

Then prompt it in plain language, for example "what did manual 997 GT3s sell for on PCARMARKET this year, and with how many miles?".

### 🔧 Troubleshooting

**A lot sold above its high bid.**
It sold after the auction by buy now or offer. `price` is what it sold for, `highBid` the last bid, and `soldVia` says how.

**A not sold lot has no `price`.**
Lots that did not sell have only a `highBid`. Lots still open to buy now or offers are `for sale`, with the buy now price in `price`.

**"lots match" in the log is higher than what was saved.**
PCARMARKET's search can lag a few hours behind a lot's real status (an offer window that just closed, for example). Every lot is checked again, and those that no longer fit are left out.

**Vehicle fields are empty on a lot.**
Parts, memorabilia and watches have no vehicle report, and older watch lots only have a description.

**A make finds nothing.**
Makes must be spelled as PCARMARKET does ("Mercedes-Benz", "Land Rover"); the log warns when a make matches no lot. Search terms are more forgiving.

**A scheduled "New lots only" run saved nothing.**
Nothing new matched since the last run. Changing terms, links or filters starts a fresh memory; set a **Monitor name** to keep it.

**The log says PCARMARKET refused the server's IP address.**
The run restarts on another Apify server by itself, up to 3 times. If it still fails, run it again.

### ❓ FAQ

| Question | Answer |
| --- | --- |
| Do I need a PCARMARKET account? | No. Only public lot data is read. |
| Are bidder names included? | Yes, the public usernames shown in the bid history. |
| Are memorabilia and watches included? | Yes. Use Category to keep only one kind. |
| Is there a result limit? | No. Leave the maximum empty to get everything that matches. |
| Does it need a proxy? | No. |
| Can I track new lots? | Yes. Turn on **New lots only** and schedule the run. |

### 🛡️ Limits & responsible use

This Actor reads only public lot data shown on pcarmarket.com. It never signs in and never bids. Bidder usernames are public on the site, but use them in line with PCARMARKET's terms and applicable privacy law.

### 📧 Contact

Need a scraper for a different site, or found something wrong with this one? norm.data.scrapers@gmail.com

### 🧪 Local development

```powershell
bun install
bun run typecheck
bun scripts/gen-schemas.mjs
apify run
```

Local results are stored in `storage/datasets/default`.

# Actor input Schema

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

Stop after this many lots in total. Leave empty for no limit (every matching lot). The Apify Free plan is always capped at 10.

## `status` (type: `string`):

Results are every ended PCARMARKET auction (19,000+ lots, 11,103 sold) with the final price or the high bid. For sale now are lots still open to offers or buy now after their auction. Live and upcoming are the auctions running now.

## `searchTerms` (type: `array`):

Words to search lots for, as on pcarmarket.com, e.g. "GT3 RS", "Speedster", "Fuchs wheels", "Rolex". Several terms: a lot matching ANY of them is kept.

## `urls` (type: `array`):

Lot pages: pcarmarket.com/auction/..., /results/... or /marketplace/.... The filters are ignored with links.

## `categories` (type: `array`):

Keep only these kinds of lots. PCARMARKET sells cars, but also parts, wheels, signs, art and other memorabilia, and watches.

## `makes` (type: `array`):

Keep only these makes. Most lots: Porsche (7,551), BMW (779), Mercedes-Benz (774), Ferrari (329), Chevrolet (318), Ford (289), Land Rover (180), Volkswagen (166), Audi (160), Toyota (117), Aston Martin (113), Lamborghini (95). Case doesn't matter; a make PCARMARKET never had shows a warning in the log. Vehicle filters (make, model, year, mileage, transmission, title, Carfax) leave out memorabilia and watches.

## `models` (type: `array`):

Keep only these models, e.g. "911", "Cayman", "M3", "Testarossa". Every word must start a word of the model, so "911" finds "911 Carrera 4S" but not "9110".

## `yearFrom` (type: `integer`):

Keep vehicles from this model year on, e.g. 1989.

## `yearTo` (type: `integer`):

Keep vehicles up to this model year, e.g. 1998.

## `transmissions` (type: `array`):

Manual, or automatic (PDK, Tiptronic, SMG, DCT and other automatics).

## `maxMileage` (type: `integer`):

Keep vehicles with at most this many miles on the odometer (kilometers are converted). Vehicles with no mileage listed are left out.

## `cleanTitleOnly` (type: `boolean`):

Keep only vehicles whose title status is clean.

## `cleanCarfaxOnly` (type: `boolean`):

Keep only vehicles whose Carfax report is clean.

## `sellerTypes` (type: `array`):

Dealer or private party.

## `countries` (type: `array`):

Keep lots located in these countries, e.g. "United States", "Canada", "Germany".

## `noReserveOnly` (type: `boolean`):

Keep only lots offered without reserve (sold to the highest bidder whatever the price).

## `minBids` (type: `integer`):

Keep lots with at least this many bids, e.g. 30 for the most contested auctions.

## `dateFrom` (type: `string`):

Keep auctions that ended on or after this day. A date like "2024-01-01", or a period like "6 months" or "2 years".

## `dateTo` (type: `string`):

Same format as "Auction ended from", e.g. "2024-12-31".

## `minPrice` (type: `integer`):

Price (or high bid) at least this.

## `maxPrice` (type: `integer`):

Price (or high bid) at most this.

## `titleExcludes` (type: `array`):

Drop lots whose title, make, model or trim contain any of these words, e.g. "replica", "wheels", "sign", "project".

## `sortBy` (type: `string`):

Order of the results. Matters most when you set a Maximum.

## `onlyNew` (type: `boolean`):

For scheduled runs: save only lots this same search has not saved before. The first run saves everything; later runs save just what is new. Kept per search (terms, links and filters).

## `monitorName` (type: `string`):

Optional. Give "New lots only" a fixed name to keep its memory even after you change the filters.

## Actor input object example

```json
{
  "maxItems": 10,
  "searchTerms": [
    "gt3"
  ]
}
```

# Actor output Schema

## `lots` (type: `string`):

No description

# 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 = {
    "maxItems": 10,
    "searchTerms": [
        "gt3"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("normdata/pcarmarket-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 = {
    "maxItems": 10,
    "searchTerms": ["gt3"],
}

# Run the Actor and wait for it to finish
run = client.actor("normdata/pcarmarket-scraper").call(run_input=run_input)

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

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

```

## CLI example

```bash
echo '{
  "maxItems": 10,
  "searchTerms": [
    "gt3"
  ]
}' |
apify call normdata/pcarmarket-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,normdata/pcarmarket-scraper"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Rm0cpT62llKrklL37/builds/ppXrDa7rtI8uuJT4J/openapi.json
