Every Turners listing in New Zealand, with the bid and the buy-now price kept apart
The Turners API turns turners.co.nz, New Zealand's largest used-vehicle network, into clean JSON in four actions.
4 active endpoints, on 1 and 3 credit tiers.
- POST/turners/v1/search
- POST/turners/v1/detail
- POST/turners/v1/auctions
- POST/turners/v1/auction_lots
What Turners endpoints does ReefAPI ship?
4 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Turners API
4 of 4 endpoints, ready to run
Up to 110 live Turners listings a call across six divisions: good number, listing URL, title, make, model, year, odometer, branch, spec, the selling price and the struck pre-discount price separately, and the sale channel with its auction date, closing time or current bid.
// 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 Turners API works
Turners is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 438 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
From the auction diary to one lot's VIN and odometer history
Three calls: what is being sold this week, which cars are in that sale, and the full record of one of them.
{"division": "cars"}Turners' car auction diary — 99 scheduled sales on 2026-10-01 — each with its date, start time, branch, lot count and catalogue id. Take results[].auction_id.
{"auction_id": "<results[0].auction_id>", "max_results": 110}Every lot in that sale with its lot number, the lane it runs in, its good number, title, odometer, branch, spec and, where Turners also offers one, its buy-now price. A catalogue whose lots are not numbered yet says so in Turners' own words rather than returning an empty number. total_available is the real lot count.
{"url": "<results[0].url>"}The lot in full: VIN, the complete odometer history Turners holds (13 readings over 11 years on the car we audited), WOF and registration expiry, features, star ratings, every photo and the branch with its named consultant.
Seven credits for the three calls: auctions 1, auction_lots 3, detail 3. The diary call is the cheap one because the catalogue call depends on it.
curl -X POST https://api.reefapi.com/turners/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"division":"cars","max_results":20}'{
"ok": true,
"data": { … },
"meta": {
"api": "turners",
"endpoint": "search",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}Turners prints more than one number per listing, and the API keeps them apart
A Turners listing can show a selling price, a struck-out was-price, a running online bid, a starting bid nobody has matched yet, and a reserve range. They mean different things, so each has its own field and none is ever written into another.
| What Turners shows (2026-10-01) | Field | What it means |
|---|---|---|
| BUY NOW $10,490, "Was $10,990", "You Save $500" | price_nzd 10490 · was_price_nzd 10990 · savings_nzd 500 | price_nzd is what you pay for the car today; was_price_nzd is the pre-campaign figure and is the larger, louder number on the page. |
| A car in a Live Auction that also prints BUY NOW $19,440 | price_nzd 19440 · sale_method "auction" · auction_date · auction_location | 544 of 2,720 cars are auction lots and nearly all also carry a buy-now offer. The price is an offer to buy it now, not a bid. |
| An Online Auction lot printing "Starting Bid $900" | starting_bid_nzd 900 · current_bid_nzd null | Nobody has bid. 14 of 20 general-goods lots sampled were in this state; publishing 900 as a current bid would be a bid that does not exist. |
| An Online Auction lot printing "Current Bid $2,550 Reserve Met" | current_bid_nzd 2550 · bid_status "Reserve Met" | A real running bid, with Turners' own words about the reserve alongside it. |
| A damaged vehicle printing "Reserve Price Range $500 - $1,500" | reserve_low_nzd 500 · reserve_high_nzd 1500 | Read from the page's own low/high values, not from the dash-separated text. |
| A tender truck printing "Lot No 006", a start and an end date | sale_method "tender" · lot_number "006" · tender_start_date · tender_end_date | Trucks and machinery mostly sell by tender, which has a closing time rather than a live sale. |
Every card also carries a second price in the page's own analytics attribute. The API compares the two on every row, publishes price_conflict when they disagree, and counts the disagreements in meta. Across both live runs, about two thousand rows, there were zero. On detail the state figure and the page's own structured-data figure agreed on 7 of 7 priced listings, and search price matched detail price on 8 of 8 ids.
What the Turners API covers, measured on 2026-10-01
Every figure on this page was read off the live source in the run recorded for it, not estimated.
cars 2,719 · trucks and machinery 374 · damaged and end-of-life 554 · general goods 1,521 · boats and marine 14 · buses, caravans and motorhomes 34. One call shape for all six.
Every filter was measured against the unfiltered total in the same run: query 45, make 494, make+model 46, year band 820, price band 429, odometer band 287, fuel 505, body type 1,123, transmission 119, drive type 899, seats 2,212, branch 180, auction 544, buy-now 2,202, discounted 958, ex-lease 726, CGA 2,640 — against a control of 2,720. Filters Turners accepts and then ignores are deliberately not offered.
Buy-now with its price. In-room auction with its venue and date. Online auction with current_bid_nzd or starting_bid_nzd — never one in place of the other — plus when it closes. Tender with its lot number and window.
price_nzd is today's price; was_price_nzd and savings_nzd are separate. Each row is checked against a second price surface on the same page: zero disagreements across about two thousand rows in two runs. On detail, the record and the page's own structured data agreed on 7 of 7 priced listings.
On 8 audited listings: VIN, odometer history, features, photos, colour, origin, star ratings, branch and consultant all 8 of 8. price_nzd and WOF expiry 7 of 8 (the tender truck has neither). A machinery lot adds about 30 more spec fields.
Two consecutive live runs on 2026-10-01: 52 of 52 cases passed in both, 100 % and 100 %. Median 1.8 s, worst case 3.6 s. An id from search resolved to the same record in detail on 8 of 8.
Turners publishes no paging on its URLs — nine parameter spellings and two path forms all returned page one. One query therefore reaches at most 110 rows, the site's own largest page. total_available and page_ceiling are in every response, and sort plus tighter filters are how you reach the rest.
Damaged vehicles, general goods, boats and motorhomes are still served from an older Turners listing page that publishes no record, so detail answers MARKET_UNAVAILABLE for those four and names them instead of returning a half page. Their search rows already carry the price or current bid, odometer, spec, branch and sale channel.
0 of 20 general-goods lots, 0 of 14 boats and 0 of 20 damaged vehicles sampled carried a fixed price; they carry a bid or a reserve range instead, so price_nzd is null there. Across a deliberately mixed 60-listing sample, price_nzd was filled on 38.
Turners publishes no bid count or bid history anywhere, no reserve amount on an in-room lot (only a range, and only on damaged vehicles), and no plate or registration number — the registration expiry is published and was present on 4 of 8 audited vehicles, missing on the rest. Turners' menu lists motorcycles but publishes no search page for them, so there is no motorcycle division here.
What people build with Turners
The jobs this data is most often used for.
endpoints
credits per call
Price a trade-in or a retail car against New Zealand's largest single inventory: filter to the same make, model, year band and odometer band, read total_available for how thin or deep that segment is, then pull the cheapest and dearest 110 with sort price_asc and price_desc.
Watch the auction diary: list the 99 scheduled car sales, open the catalogues that matter and track each lot's venue, date and — on online auctions — its running bid and closing time.
Monitor discounting: discounted_only returned 958 of 2,720 cars, each with the struck-out price and Turners' own savings figure, so you can see what is being cut, by how much and at which branch.
Source machinery and commercial vehicles: the trucks division returns gross vehicle mass, wheel configuration, axle ratings, body dimensions, engine and transmission makes, tyre sizes and condition grades, with the tender's lot number and closing time.
What Turners 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 →- 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 -X POST https://api.reefapi.com/turners/v1/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"division":"cars","max_results":20}'import requests
r = requests.post(
"https://api.reefapi.com/turners/v1/search",
headers={"x-api-key": REEF_KEY},
json={
"division": "cars",
"max_results": 20
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up Turners.
Get a free key →Which divisions does search cover, and how many listings are in each?▾
Six, all in one call shape via the division parameter. Measured 2026-10-01: cars 2,719 · trucks (trucks and machinery) 374 · damaged (damaged and end-of-life vehicles) 554 · general-goods 1,521 · boats 14 · motorhomes (buses, caravans and motorhomes) 34. That is 5,216 live listings. Turners' site menu also lists motorcycles, but it does not publish a search page for them, so there is no motorcycle division here rather than one that returns nothing.
How deep can one search go?▾
110 rows, and that is a hard ceiling we did not choose. Turners does not page over its URLs: we tried nine parameter spellings and two path forms and every one returned page one. So total_available always tells you the real size of your result set, and you reach the rest by narrowing (make, model, year band, price band) or by flipping sort — price_asc and price_desc on the same query give you both ends of it. page_ceiling is in every response so this is never a surprise.
Which price do I store?▾
price_nzd. It is what the vehicle sells for today. was_price_nzd is the struck-out pre-discount figure and savings_nzd is Turners' own "You Save" number; 958 of 2,720 cars were discounted on 2026-10-01, so a quarter of the catalogue has both. On auction-only divisions there is no fixed price at all and price_nzd is null (0 of 20 general goods, 0 of 14 boats and 0 of 20 damaged vehicles carried one).
Is there a current bid?▾
On online-auction lots, yes: current_bid_nzd when Turners is printing one, with bid_status carrying its own words such as "Reserve Met". When nobody has bid, Turners prints a starting bid instead, and that goes in starting_bid_nzd and never in current_bid_nzd. In-room auction lots do not show a running figure at all: they carry the sale's venue and date, and on damaged vehicles a reserve price range. Nowhere does Turners publish a bid count or a bid history, so neither is offered.
What does detail add over a search row?▾
On the cars and trucks divisions: the VIN, the complete odometer history Turners holds for the vehicle (13 readings over 11 years on the car we audited), WOF, COF and registration expiry dates, origin, colour, the factory feature list, the CO2 and fuel-economy and safety star ratings with Turners' own figures, every photo, the branch with its street address, postcode and coordinates, the named sales consultant with their work email and mobile, the page view and watchlist counts, and the condition-guide and MotorWeb report links. A machinery lot adds about thirty more fields under extra_specs — gross vehicle mass, wheel configuration, axle ratings, body dimensions, engine and transmission makes, tyre sizes and condition grades.
Does detail work for every division?▾
No, and it says so instead of returning half a page. Cars and trucks and machinery are covered. Turners still serves damaged vehicles, general goods, boats and motorhomes from an older listing page that publishes no record at all, so detail answers MARKET_UNAVAILABLE for those four and names them. Their search rows already carry the price or current bid, the odometer, the spec, the branch and the sale channel, which is most of what the detail page would add.
How do I get from a search row to a listing?▾
Pass the row's url to detail and it is one request. Pass listing_id (the eight-digit Turners good number) and Turners resolves it first, which costs one extra request. Both were checked on the same ids: 8 of 8 round-tripped to the same record. A good number that is sold or withdrawn returns NOT_FOUND rather than an empty success — Turners answers a dead listing with a 200 and a "Page Not Found" body, and that is translated.
Can I follow the auction calendar?▾
Yes. auctions returns Turners' diary for a division — 99 scheduled car sales and 10 truck sales on 2026-10-01 — each with its date, start time, name, branch, lot count, live state ("Not Yet Started") and the catalogue id. Feed that id to auction_lots and you get every lot in the sale in the same shape search returns, each with its lot number and the lane it runs in; when a catalogue has not been numbered yet Turners prints "To be confirmed" and that is what you get, rather than a silent blank. Dates and times come back exactly as Turners prints them in New Zealand local time; nothing here converts a timezone or guesses a year that is not on the page.
Which filter values does Turners accept?▾
division, sale_method, sort and max_results are closed lists and a wrong value is rejected with the allowed values. fuel, body_type, transmission, drive_type and branch take Turners' own display strings and are not frozen, because the measured vocabulary came from three divisions and Turners has more. The ones we measured are in each parameter's description. If Turners does not recognise a value it answers with an empty page rather than an error, so a zero-row result from one of those filters comes back as a successful empty answer with a note in meta.warnings telling you to check the spelling.
branch does not accept Auckland. Why?▾
Because Turners filters by branch, not by city or region. Auckland returned nothing; Hornby returned 180. The 21 branch names we measured are listed in the parameter description, among them Avalon Drive, Botany, Manukau, North Shore, Penrose - Great South Road, Moorhouse Ave, Te Rapa Road and Wellington - Porirua. Every row also carries its own branch, so you can group by it after the fact.
Who is the seller?▾
Always Turners. There are no private sellers on this source: every listing belongs to a Turners branch, and detail returns that branch in full — name, street address, locality, postcode, coordinates — plus the named sales consultant for the vehicle with the work email and mobile Turners prints on the page.
What does Turners not publish?▾
A bid count or bid history anywhere. A reserve amount on an in-room auction lot (only a range, and only on damaged vehicles). A plate or registration number — the registration expiry date is published, the plate is not. A fixed price on the auction-only divisions. And registration_expiry is genuinely missing on some vehicles: 4 of the 8 detail records we audited had it. Those fields come back null rather than filled with a guess.
What is the Turners API?▾
Turners API is a ReefAPI endpoint group for new zealand's largest used-vehicle network: cars, trucks and machinery, damaged vehicles, general goods, boats and motorhomes, plus the auction diary. It returns live JSON through POST requests under /turners/v1.
Is the Turners API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. Turners calls use the same shared credit balance as every other ReefAPI engine.
99 Classifieds & Second-hand APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Turners, 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.
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.