AutoTrader APIautotrader.co.za ↗
Access AutoTrader South Africa vehicle listings via API. Get pricing, specs, mileage, seller info, and location for cars listed on autotrader.co.za.
What is the AutoTrader API?
The AutoTrader South Africa API provides access to vehicle listings from autotrader.co.za across 2 endpoints. The search endpoint returns paginated lists of listings filtered by make or make/model path, while the details endpoint retrieves full data for a single listing URL — including price in ZAR, mileage, variant, seller details, and geographic location broken down to suburb level.
curl -X GET 'https://api.parse.bot/scraper/eafb98aa-144f-46a0-9f37-efce3818015f/search?make=bmw&page=1&limit=2' \ -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 autotrader-co-za-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: AutoTrader South Africa — search listings and fetch details."""
from parse_apis.autotrader_south_africa_scraper_api import AutoTrader, ListingNotFound
client = AutoTrader()
# Search BMW listings, capped at 5 total items.
for listing in client.listings.search(make="bmw", limit=5):
print(listing.title, listing.price, listing.year)
# Drill into the first Toyota result for full details.
first = client.listings.search(make="toyota", limit=1).first()
if first:
print(first.title, first.mileage)
print(first.location.city, first.location.province)
print(first.vehicle_details.fuel_type, first.vehicle_details.gearbox)
print(first.seller.name, first.seller.type)
# Fetch full details by URL (same shape, confirms the listing is live).
try:
detail = client.listings.get(url=first.url)
print(detail.listing_id, detail.variant, detail.price)
except ListingNotFound as exc:
print(f"Listing removed: {exc.url}")
print("exercised: listings.search / listings.get / ListingNotFound")
Search for vehicle listings by make and optionally model. Returns a list of detailed listing information including price, specifications, location, and seller details. Each listing requires a separate page fetch, so larger limits take longer. Paginates by page number; results are ordered by the site's default relevance.
| Param | Type | Description |
|---|---|---|
| makerequired | string | The vehicle make or make/model path (e.g. 'bmw', 'mitsubishi/pajero', 'toyota/hilux'). |
| page | integer | The page number of search results to fetch. |
| limit | integer | Maximum number of listings to return from the current page. |
{
"type": "object",
"fields": {
"make": "string, the make query used",
"page": "integer, current page number",
"listings": "array of listing objects with full vehicle details",
"total_listings_on_page": "integer, number of listing URLs found on the page (before limit applied to detail fetches)"
},
"sample": {
"data": {
"make": "bmw",
"page": 1,
"listings": [
{
"url": "https://www.autotrader.co.za/car-for-sale/bmw/z3/2.8i/28468691",
"make": "BMW",
"year": "1998",
"model": "Z3",
"price": "199995",
"title": "1998 BMW Z3 2.8i Auto",
"seller": {
"id": "21953",
"name": "Autoworld Exotic",
"type": "Trade",
"whatsapp_available": true
},
"mileage": "144000",
"variant": "2.8i Auto",
"location": {
"city": "Goodwood",
"suburb": "Richmond",
"province": "Western Cape"
},
"listing_id": "28468691",
"vehicle_details": {
"colour": "Red",
"gearbox": "Automatic",
"body_type": "Cabriolet",
"fuel_type": "Petrol",
"engine_capacity": "2793"
}
}
],
"total_listings_on_page": 2
},
"status": "success"
}
}About the AutoTrader API
Endpoints
The search endpoint accepts a make parameter (e.g. bmw, toyota/hilux, mitsubishi/pajero) and returns an array of Listing objects from the specified page of results. Each listing in the response includes the full set of vehicle details: price, year, model, variant, mileage, seller information, and location. The optional limit parameter controls how many listings are returned from the current page, and the page parameter navigates through paginated results. The response also reports total_listings_on_page, which reflects how many listing URLs were found before the limit was applied.
Listing Details
The details endpoint takes the full autotrader.co.za listing URL and returns structured data for that specific vehicle. Response fields include make, year, model, variant, title (a formatted string combining those fields), price as a plain ZAR numeric string, mileage in km (or null if not listed), a location object with province, city, and suburb, and a seller object containing name, id, type, and a whatsapp_available boolean. If the listing has been removed, the endpoint returns input_not_found.
Coverage and Limitations
Coverage is specific to South Africa — all listings and pricing are in ZAR and sourced from autotrader.co.za. Direct seller phone numbers are not exposed in the response. Each listing in a search result requires an individual fetch, so setting a high limit value increases response time proportionally. Pagination is by integer page number; there is no cursor-based navigation.
The AutoTrader API is a managed, monitored endpoint for autotrader.co.za — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when autotrader.co.za 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 autotrader.co.za 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?+
- Track asking prices by make and model to build a used-car valuation model for the South African market
- Aggregate mileage and price data across a model range to identify depreciation patterns
- Monitor new listings for a specific make/model path (e.g.
toyota/hilux) to alert buyers when inventory is added - Extract seller type and location data to analyze dealer vs. private seller distribution by province
- Populate a comparison tool that surfaces price, variant, and mileage side-by-side for a given make
- Check whether a specific listing URL is still active before sending it to a prospective buyer
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does AutoTrader South Africa have an official developer API?+
What does the `search` endpoint return for each listing, and how is pagination handled?+
search response includes price, year, make, model, variant, mileage, seller details, and a location object with province, city, and suburb. Pagination is controlled by the integer page parameter. The total_listings_on_page field tells you how many listing URLs existed on that page before the limit was applied, so you can determine whether additional pages exist.Are seller phone numbers available through the API?+
seller object exposes name, id, type, and a whatsapp_available boolean. You can fork this API on Parse and revise it to surface additional contact fields if they become accessible.Does the API cover other vehicle categories like motorcycles, trucks, or boats?+
How fresh is the listing data, and what happens if a listing is removed?+
details endpoint returns input_not_found rather than stale data. There is no built-in historical or archival access.