Cars.co.za API

South Africa's biggest car marketplace as JSON, dealers and all

The Cars.co.za API turns cars.co.za, South Africa's largest car marketplace, into clean JSON in six actions.

no credit card1,000 free credits · instant API key · pay by card or crypto
Missing a Cars.co.za endpoint, or need a source we don't have yet?Contact us real people · same-day reply.
C
/cars-co-za/v1

6 active endpoints, on 1 and 2 credit tiers.

  • POST/cars-co-za/v1/search
  • POST/cars-co-za/v1/detail
  • POST/cars-co-za/v1/dealers
  • POST/cars-co-za/v1/dealer
  • POST/cars-co-za/v1/dealer_stock
  • POST/cars-co-za/v1/filters

What Cars.co.za endpoints does ReefAPI ship?

6 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.

6 endpoints

search

2 cr

Search Cars.co.za's live South African stock.

required
—
optional
query, make, model, variant, condition, seller_kind, price_min, price_max, mileage_min, mileage_max, year_min, year_max, instalment_min, instalment_max, engine_litres_min, engine_litres_max, body_type, province, city, transmission, fuel_type, colour, seats, drivetrain, vehicle_kind, engine_type, deal_tag, dealer_rating_min, featured_dealers_only, bikes, sort, max_results, offset

detail

1 cr

One listing in full, from the source's own listing endpoint.

required
listing_id
optional
—

dealers

2 cr

The Cars.co.za dealer directory.

required
—
optional
query, province, city, featured_only, sort, max_results, offset

dealer

2 cr

One dealership's profile, plus the Google reviews Cars.co.za publishes for it (reviewer name,…

required
dealer_id
optional
include_reviews

dealer_stock

2 cr

Every vehicle one dealership currently lists, in the same row shape as search, dearest first…

required
dealer_id
optional
sort, max_results, offset, bikes

filters

1 cr

The live filter vocabulary straight from the source, with the number of listings behind every…

required
facet
optional
—

Every parameter, every allowed value →

Cars.co.za API

5 of 6 endpoints, ready to run

View docs ↗

Live South African listings with id and URL, make, model, variant and year, asking price in rand plus the pre-cut price and the instalment estimate, odometer as a number and as printed, body type, transmission, fuel, engine size, drivetrain, seats, colour, Cars.co.za's own deal badges, the feature list, every photo URL, and the selling dealership with its suburb, province, coordinates and rating.

2 credits0 required · 11 optional
POST/cars-co-za/v1/search
idle
// Press "Try it" and this pane shows exactly what the
// live site returned this second — including an empty
// result, if that is the truth. No key, no account.

How the Cars.co.za API works

Cars.co.za is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 438 engines.

02
Call
POST /cars-co-za/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
1 or 2 credits per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.

From the whole market to one dealer's forecourt

filters is the cheapest way to see what the market holds before you spend a call on rows; search is the entry point and every row carries both the listing id and the dealer id the other actions need.

01filters { facet: "make" }
POSTfilters { facet: "make" }

All 100 makes with a live listing count each — Toyota 11,519, Volkswagen 9,494, Ford 7,254, Chery 2,096 — in one small call.

02search { make: "Toyota", model: "Hilux", province: "Gauteng", max_results: 120 }
POSTsearch { make: "Toyota", model: "Hilux", province: "Gauteng", max_results: 120 }

Up to 120 rows with price in rand, odometer, spec, deal badge, photos and the selling dealership. total_available tells you how many there really are, so you know whether to page.

03detail { listing_id: "11264546" }
POSTdetail { listing_id: "11264546" }

The full record for one car: the grouped manufacturer spec table, Cars.co.za's own highlight verdicts, the listing date, the dealer's stock reference and the sold flag.

04dealer_stock { dealer_id: "8365" }
POSTdealer_stock { dealer_id: "8365" }

Everything that dealership is listing, dearest first — the same row shape, so one parser handles both.

One vocabulary call, one search, one detail and one dealer call give you the market mix, the live asking prices for a specific car in a specific province, the full spec behind one of them, and the whole forecourt of the dealer selling it.

request
curl -X POST https://api.reefapi.com/cars-co-za/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"max_results":20}'
response envelope
{
  "ok": true,
  "data": { … },
  "meta": {
    "api": "cars-co-za",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": …,
    "record_count": …
  },
  "error": null
}

The money fields, and why there is no field called price

A Cars.co.za row carries up to three different money figures and they do not mean the same thing, so this API never blends them and never ships a bare price key. Fill rates below are over 120 distinct live listings sampled round-robin across nine surfaces: used cars, new cars, dealer stock, private sellers, double-cab bakkies, buses, panel vans, electric cars and motorcycles.

FieldWhat it isHow often it was filled
price_zarThe asking price today, in South African rand. Verified against the money strings the listing page itself prints on 8 listings: 8 matched, 0 mismatched. A zero is returned as null, never as a price.120 of 120
previous_price_zarThe price before Cars.co.za cut it, on listings carrying the price-drop badge. Returned separately and never used as the price.7 of 120
monthly_instalment_zarNot a price: the monthly finance instalment Cars.co.za estimates on the rate card its own pages publish — 12.75 % a year, 72 months, 10 % deposit. Private listings never carry one.85 of 120
mileage_kmThe odometer reading as a number, parsed from the string the source prints. Agreed with that string on 113 of 113 rows that had one.113 of 120
mileage_textThe odometer exactly as Cars.co.za printed it, e.g. "72 000 Km". Kept because a brand-new car is printed as "-1 Km", which is returned as a null mileage_km rather than as minus one kilometre.120 of 120
deal_tagsCars.co.za's own badges on the listing: great deal, good deal and fair deal are its price verdict against its own guide price; price drop means the advertised price was cut; also fast seller, performance, luxury and classic.62 of 120

Every figure above is the source's own. The instalment is the one number on the page that Cars.co.za computes rather than reports, which is why it is named for what it is and kept out of the price fields. 0 of the 120 rows published a price of zero, because a zero is nulled on the way out.

What Cars.co.za publishes, and where it stops

Measured on 2026-10-01 over two consecutive runs of the same fixed 77-case list, 100 % of cases passing in both. The limits below are the source's, not the API's.

Market

South Africa only, all nine provinces. 76,076 live listings: 65,553 used, 10,523 new, from 1,710 dealerships and 211 private sellers

Rows per call

Exactly what you ask for up to 120. 120 is the source's hard ceiling — 200 and 500 both return 120

Paging

Offset paging reaches the end of the catalogue (measured at offset 76,060); past the end you get 0 rows and no error

Paging overlap

None. Four pages of 20 gave 80 rows and 80 distinct ids, in both runs

Result count

The source's own, not ours. Used plus new equals the unfiltered total exactly, and so does dealer plus private

Filters measured biting

27 on listings and 4 on dealers, each against the unfiltered total in the same run. Nine more that the source accepts and silently ignores were tested and left out

Price verification

The price returned was found in the money strings the listing page itself prints on 8 of 8 listings; search and detail agreed on 7 of 7

Field fill over 120 listings

id, URL, title, make, model, variant, year, price, currency, odometer text, photos, province, transmission, seats and colour: 120 of 120. Odometer as a number 113 of 120. Engine size 114 of 120. Town 107 of 120

Partly filled, by the source

Monthly instalment 85 of 120 (private listings never have one), condition grade 81 of 120, deal badges 62 of 120, induction type 60 of 120, feature list 54 of 120, pre-cut price 7 of 120

Seller block

Name, kind and province 120 of 120; dealer id 114 of 120; coordinates 118 of 120; rating 97 of 120. Phone number 0 of 120 — it is published on the dealer directory (99 of 100) and on single-listing detail, not on search rows

Dealer directory fill over 100 dealerships

id, name, group, address, town, province, coordinates, stock count, top makes and profile URL 100 of 100; phone 99 of 100; rating 86 of 100

Single-listing detail

id, URL, title, price, odometer, listing date, sold flag, photos and seller 7 of 7; grouped spec table and highlight verdicts 6 of 7 — the one without is a motorcycle, for which the source publishes no spec table

Motorcycles

Thin: switching them on moves the total from 76,076 to 76,125, so there are 49 on the site

Not published by Cars.co.za

VIN, registration or plate number, service-history document, any bidding or auction surface, a days-on-market figure, and a phone number on a search row

Reliability measured

Two consecutive runs of 77 cases: 62 live calls across six actions and 15 intended negatives landing on the right error codes, both times. Median response 0.9 s, slowest 3.7 s

What people build with Cars.co.za

The jobs this data is most often used for.

6

endpoints

1/2

credits per call

01

South African used-car pricing and valuation: pull a make, model and variant with a model-year and odometer band and read the asking-price distribution, then narrow by province to see how the same car is priced in Gauteng against the Western Cape.

02

Dealer intelligence: the full 1,710-dealership directory with coordinates, group, rating, rating count and live stock count, plus every car a named dealership is listing, so you can size a competitor's forecourt or map coverage by town.

03

Market-share and mix tracking: the filters action returns a listing count on every make, model, variant, body type, fuel, province, colour and seat count, so a single cheap call gives the whole market mix — for example Toyota 11,519 listings against Volkswagen 9,494, or SUVs 33,823 against double-cab bakkies 9,071.

04

Lead sourcing and classified aggregation: new-versus-used and dealer-versus-private are separate, measured filters, so you can pull only the 211 private listings or only the 75,865 dealer listings, with the canonical listing URL on every row.

What Cars.co.za data costs

The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.

Full pricing →
$0.67–$1.50 / 1,000 credits
  • 1,000 free credits on signup, no card
  • One key, all 438 APIs, one credit pool
  • Failed and blocked calls are never charged
  • Credits roll over and never expire

Call it in two lines

Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.

curl
curl -X POST https://api.reefapi.com/cars-co-za/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"max_results":20}'
python
import requests

r = requests.post(
    "https://api.reefapi.com/cars-co-za/v1/search",
    headers={"x-api-key": REEF_KEY},
    json={
  "max_results": 20
},
)
print(r.json()["data"])
FAQ

Have a question? We got answers.

The questions people actually ask before wiring up Cars.co.za.

Get a free key →
How many listings are there, and does the count come from you or from Cars.co.za?▾

From Cars.co.za. Every search returns total_available, which is the source's own count for your exact query. On 2026-10-01 the unfiltered figure was 76,076, the identical number cars.co.za printed on its own used-car page in the same minute, and it was still 76,076 when re-measured minutes later. Used and new split it exactly: 65,553 plus 10,523 is 76,076. Dealer and private split it exactly too: 75,865 plus 211.

How many rows can one call return?▾

Up to 120, and that is the source's ceiling rather than ours: asking for 200 or 500 still returns exactly 120. Below that you get exactly what you ask for — 20 gives 20, 50 gives 50, 100 gives 100. Use offset to page past it. Offset paging was measured working all the way to the end of the catalogue at offset 76,060, and past the end it returns zero rows with no error.

Do pages overlap when I page through results?▾

No. Four pages of 20 rows at offsets 0, 20, 40 and 60 under the same sort returned 80 rows and 80 distinct listing ids, in both measurement runs. This API also does not ask Cars.co.za to inject promoted listings into the page, which its own website does, so sponsored stock never arrives in your results unannounced.

Do the filters actually narrow the result, or are some of them decoration?▾

Every filter in this API was measured against the unfiltered total of 76,076 in the same run, and only the ones that moved it are exposed. Measured: keyword Hilux 2,642, make Toyota 11,519, Toyota Starlet 1,056, price 100,000 to 200,000 13,566, odometer under 50,000 40,453, years 2023 to 2026 43,911, body type SUV 33,823, province Gauteng 42,243, town Sandton 2,881, automatic 48,673, diesel 24,743, white 36,379, seven seats 7,152, four-wheel drive 16,921, commercial 16,886, turbocharged 46,242, the price-drop badge 4,845, dealerships rated four and up 57,941. Nine parameters that Cars.co.za accepts with a 200 and then ignores — including a roadworthy flag, a finance flag, a condition grade and a sold flag — were tested, found to return the full 76,076 unchanged, and left out, because a filter that does not bite is worse than no filter at all.

What happens if nothing matches my filters?▾

You get a successful response with an empty results array, the source's own total of 0, and a note in meta saying this is Cars.co.za's empty answer rather than a failure. An unmatchable make was tested for exactly this. The opposite case is also handled: if Cars.co.za reports listings and none can be read, you get an explicit schema error instead of a quiet empty success.

Is the seller included, and does it include a phone number?▾

The seller is on every row: 120 of 120 carried a seller name, kind and province, and 114 of 120 a dealer id you can pass to dealer and dealer_stock. Coordinates were on 118 of 120 and a star rating on 97 of 120. A phone number, however, is NOT on a search row — measured 0 of 120. Cars.co.za publishes the dealership's number on the dealer directory, where 99 of 100 dealerships had one, and on the single-listing detail record. Private listings are published as the source publishes them, as Private Seller with a suburb and province and no contact route.

Why is the odometer empty on some new cars?▾

Because a brand-new car has no reading and Cars.co.za prints minus one kilometre for it. That is returned as a null odometer with the source's own string kept beside it, rather than as a mileage of minus one. On the new-car surface this is half the rows — 10 of 20 — and on the used surface it was 20 of 20 filled. Cars.co.za's own count says 76,060 of 76,076 listings publish an odometer at all.

Does this cover motorcycles and commercial vehicles?▾

Commercial vehicles yes, properly: 16,886 of the listings are commercial, including 9,071 double-cab bakkies, 4,306 single-cab bakkies, 1,474 buses and minibuses, 755 panel vans and 351 dropsides, and each of those body types was measured returning full rows separately. Motorcycles are a thin surface on this site and the number is honest: switching bikes on moves the total from 76,076 to 76,125, so Cars.co.za is listing 49 bikes. They parse fine, but a motorcycle's detail record comes back with an empty manufacturer spec table, because Cars.co.za publishes none for them, and the response says so.

What does Cars.co.za not publish?▾

No VIN, no registration or plate number and no service-history document anywhere on these surfaces. No bidding or auction surface, because it is a fixed-price marketplace. No days-on-market figure, though the single-listing record does carry the date the car was listed. No phone number on a search row, as above. None of those are returned as empty handles — the fields simply do not exist in the response.

What is the Cars.co.za API?▾

Cars.co.za API is a ReefAPI endpoint group for south african car marketplace: 76,076 new and used listings from 1,710 dealerships and 211 private sellers, with price in rand, odometer, full spec table, deal grade and the selling dealer's address, geo and rating. It returns live JSON through POST requests under /cars-co-za/v1.

Is the Cars.co.za API free to try?▾

Yes. ReefAPI starts with 1,000 free credits, no card required. Cars.co.za calls use the same shared credit balance as every other ReefAPI engine.

Do I need a Cars.co.za login or account?▾

No login to Cars.co.za is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.

How fresh is the Cars.co.za data?▾

The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.

How many credits does the Cars.co.za API use?▾

Cars.co.za actions currently cost 1-2 credits per successful call. Failed or blocked calls are free. All APIs draw from one credit pool.

99 Classifieds & Second-hand APIs on the same key

One key, one credit pool, one response envelope. If you are pulling Cars.co.za, you are one call away from the rest of the category — no second contract, no second integration.

Need something this API does not do?

Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.

0/4000

No account needed · we reply from [email protected]

Try it on your own data before you pay anything

The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 437 APIs, and the same envelope everywhere.

Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-10-01.