PCARMARKET APIpcarmarket.com ↗
Access live PCARMARKET auction listings and full vehicle details via 2 endpoints. Retrieve bids, VINs, gallery images, seller info, and auction end times.
What is the PCARMARKET API?
The PCARMARKET API exposes 2 endpoints covering live Porsche-focused vehicle auctions on pcarmarket.com. list_live_auctions returns paginated summaries of all currently active lots ordered by ending soonest, while get_listing_details delivers the full record for a single listing — including VIN, make, model, year, engine description, seller username, hero image, up to ten gallery images, and auction end time.
curl -X GET 'https://api.parse.bot/scraper/51db8df3-8aae-4da7-9648-d52f42278f47/list_live_auctions?page=2&limit=3' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace pcarmarket-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: PCARMARKET SDK — browse live auctions and drill into details."""
from parse_apis.pcarmarket_com_api import PcarMarket, InputNotFound
client = PcarMarket()
# Browse the first few live auctions ending soonest.
for auction in client.listing_summaries.list(limit=5):
print(auction.title, f"${auction.high_bid or 0:,.0f}", auction.reserve_status)
# Drill down: take the first listing summary and fetch its full detail.
summary = client.listing_summaries.list(limit=1).first()
if summary is not None:
detail = summary.details()
print(detail.title)
print(f" Year/Make/Model: {detail.year} {detail.make} {detail.model}")
print(f" VIN: {detail.vin}")
print(f" Mileage: {detail.mileage} {detail.odometer_unit}")
print(f" Transmission: {detail.transmission_detail}")
print(f" Exterior: {detail.exterior_color} Interior: {detail.interior_color}")
print(f" Seller: {detail.seller} ({detail.seller_type}), {detail.location}")
print(f" Bids: {detail.bid_count} Current: {detail.current_bid}")
print(f" Images: {detail.image_count}")
# Point lookup by slug derived from a previous result.
if summary is not None:
try:
listing = client.listings.get(slug=summary.slug)
print(listing.title, listing.listing_url)
except InputNotFound:
print("Listing no longer available")
print("exercised: listing_summaries.list / details / listings.get")
Returns one page of currently live (active) auctions on PCARMARKET, ordered by ending soonest, together with the total number of live auctions and whether more pages exist. Each item is a listing summary: title, current bid (formatted string and numeric high bid), bid count, hero image URL, listing page URL, year/make/model when the lot is a vehicle (non-vehicle lots such as watches or signs return null for those), mileage, seller ZIP/country and the auction start/end timestamps. Pagination is caller-driven via page and limit: omitting page returns the first page, omitting limit returns 24 items; limit is clamped to 100. Requesting a page past the last one yields a not-found input error. One upstream request per call.
| Param | Type | Description |
|---|---|---|
| page | integer | 1-based page number of the ending-soonest ordering. |
| limit | integer | Number of auctions per page; values above 100 are clamped to 100. |
{
"type": "object",
"fields": {
"page": "page number served",
"limit": "page size applied after clamping",
"total": "total number of live auctions across all pages",
"auctions": "array of listing summaries; each has listing_id, slug (pass to get_listing_details), title, listing_url, hero_image_url, current_bid (formatted, null when no bids), high_bid (number, null when no bids), bid_count, reserve_status, year/make/model (null for non-vehicle lots), mileage, odometer_unit, location_zip, country, status, start_date, end_date (ISO-8601 with offset), time_remaining_seconds",
"has_more": "true when a following page exists"
},
"sample": {
"data": {
"page": 1,
"limit": 3,
"total": 55,
"auctions": [
{
"make": "Porsche",
"slug": "2009-porsche-911-carrera-cabriolet-8",
"year": 2009,
"model": "911 Carrera Cabriolet",
"title": "44k-Mile 2009 Porsche 997.2 Carrera Cabriolet",
"status": "Active",
"country": "United States of America",
"mileage": 44000,
"end_date": "2026-09-08T14:30:00-04:00",
"high_bid": 9002,
"bid_count": 1,
"listing_id": 67463,
"start_date": "2026-08-31T13:39:36-04:00",
"current_bid": "$9,002",
"listing_url": "https://www.pcarmarket.com/auction/2009-porsche-911-carrera-cabriolet-8",
"location_zip": "20109",
"odometer_unit": "mi",
"hero_image_url": "https://d2niwqq19lf86s.cloudfront.net/htwritable/media/.thumbnails/ee0e7b75-a531-4828-9651-faba371e28ae-IMG_0591.webp/ee0e7b75-a531-4828-9651-faba371e28ae-IMG_0591-tiny-810x0.webp",
"reserve_status": "unmet",
"time_remaining_seconds": 177885
}
],
"has_more": true
},
"status": "success"
}
}About the PCARMARKET API
Browsing Live Auctions
list_live_auctions returns a paginated view of every currently active auction on PCARMARKET, sorted by ending soonest. Each page delivers up to 100 items (values above 100 are clamped). The response includes a total count of all live lots across all pages and a has_more flag so you can walk the full set without over-fetching. Each summary item carries a listing_id, a slug (used as the key for detail lookups), a title, a hero_image_url, and the current high bid as both a formatted string and a raw numeric value, along with the bid count.
Fetching Full Listing Details
get_listing_details accepts a slug — the trailing path segment from a listing URL, also present as slug on each summary returned by list_live_auctions — and returns the complete auction record. Vehicle-specific fields include vin, make, model, year, and a best-effort engine description drawn from the listing write-up (may be null if not stated). Non-vehicle lots return null for those fields. The response also includes seller (username), country, status (e.g. "Active"), the listing's opening paragraph, a hero_image_url, and an array of up to ten additional gallery image URLs.
Pagination and Coverage
Pagination is 1-based via the page parameter on list_live_auctions. The total field lets you compute how many pages exist given your chosen limit. The API covers only listings that are currently live; ended or upcoming auctions are not in scope for these endpoints. The slug field is the stable identifier that bridges the two endpoints — collect slugs from the list call, then hydrate individual records with the detail call.
The PCARMARKET API is a managed, monitored endpoint for pcarmarket.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when pcarmarket.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official pcarmarket.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Monitor ending-soon auctions and alert users when a listing's
current_bidcrosses a threshold - Build a Porsche auction aggregator that surfaces
make,model,year, andvinalongside the current high bid - Track bid velocity by polling
list_live_auctionsover time and comparingbid_countchanges per listing - Populate a gallery viewer using the hero image and up to ten additional images from
get_listing_details - Filter live lots by
sellerusername to follow a specific dealer's activity across multiple auctions - Compile a dataset of VINs and engine descriptions from active listings for market research on active Porsche inventory
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does PCARMARKET offer an official developer API?+
What does `list_live_auctions` return for each auction, and how does pagination work?+
list_live_auctions returns one page of live auction summaries ordered by ending soonest. Each item includes listing_id, slug, title, listing_url, hero_image_url, current bid (formatted and numeric), and bid count. The total field gives the full count of live lots; has_more is true when another page follows. Use the page and limit parameters to walk all results, keeping in mind limit is clamped at 100.Can I retrieve ended or upcoming (scheduled) auctions that are not currently live?+
How reliable is the `engine` field in `get_listing_details`?+
engine field is extracted from the listing's write-up text on a best-effort basis and may be null when the seller's description does not include a clear engine specification. Structured fields like vin, make, model, and year come directly from the listing record and are more consistently populated.