For dealers

Dealer API and lead webhook

Dealers on the Pro and Group plans can connect their own system to Caravan Domain: keep ads in step with the yard, send photos, and read leads as they arrive.

Keys

A manager or the owner makes a key under API keys in the dealer console. The key starts with bd_live_ and is shown once: we keep only a fingerprint of it. Send it on every request as Authorization: Bearer followed by the key. A key may do one or both of:

  • listings:write: list, add, change and withdraw your ads, send their photos, and read the result of each change;
  • leads:read: read your leads and their messages.

Each key may make 600 requests an hour; past that the answer is 429 with a Retry-After header. Every call is logged against the key. Revoke a key from the console and it stops at once. Keys stop working while the dealership has no Pro or Group plan, and start again when it does.

Endpoints

All answers are JSON. Times are ISO 8601.

RequestScopeWhat it does
GET /api/v1/listings?limit=50&cursor=listings:writeYour ads, newest first, 100 at most a page. Pass next_cursor back as cursor for the next page; status=active narrows the list.
PUT /api/v1/listings/{stock_no}listings:writeAdds or changes the ad with this stock number, through the same checks as a file import. A new ad starts as a draft and goes to our checks once its photos are in and your page is approved. A live ad takes changes to its price, odometer, colour, registration and description; other changes need a new ad.
DELETE /api/v1/listings/{stock_no}listings:writeWithdraws a live ad.
PUT /api/v1/listings/{stock_no}/photoslistings:write{"photos": [up to 12 https links in order]}, and vin_plate_photo for damaged stock. We fetch them in the background. Photos of a live ad do not change this way (a new photo is checked before it is shown).
GET /api/v1/leads?since=leads:readLeads with activity after since, oldest first, with their messages. Pass next_since back as since, exactly as given, for the next page. has_more is true while another page is waiting; on the last page, keep next_since and send it on your next poll to get only the leads with newer activity. A page with no leads returns a null next_since: keep the since you sent. The buyer's email address is included only when they agreed to share it with you.
GET /api/v1/runs/{id}listings:writeThe result of a change or an import: counts, errors and warnings.

Adding or changing an ad

PUT /api/v1/listings/A1234
Authorization: Bearer bd_live_...
Content-Type: application/json

{
  "make": "Jayco",
  "model": "Journey",
  "year": 2021,
  "price": 58990,
  "condition": "used",
  "category": "caravans",
  "atm_kg": 2900,
  "tare_kg": 2400,
  "length": "19'6"",
  "axle_config": "tandem",
  "berths": 4,
  "ensuite": true,
  "water_l": 190,
  "colour": "White",
  "rego_status": "registered",
  "rego_no": "ABC123",
  "description": "One owner, serviced by us, new tyres. Comes with the spare key and books.",
  "photo": ["https://images.dealer.example/a1234-1.jpg", "https://images.dealer.example/a1234-2.jpg"]
}
201 {"status": "created", "listing_id": 100512, "run_id": 88, "warnings": []}
202 {"status": "invalid", "run_id": 89, "errors": [{"field": "year", "code": "year_out_of_range", "message": "..."}], "warnings": []}

An ad that fails the checks is answered 202 with an errors list, one entry per field, and nothing is saved. The VIN, chassis number and engine number are stored encrypted and never returned by the API. Only a dealer's ad shows one, and only where the dealer's state requires it.

Fields

FieldRequiredNotes
stock_no
Stock number
YesUnique for each vehicle in your yard. It is how we match a row to its ad next time.
make
Make
YesFor example Jayco, Avida, Lotus Caravans.
model
Model
YesFor example Journey.
year
Year
YesThe model year, four digits.
price
Drive-away price
YesOne all-inclusive price in dollars (dealer ads must show the drive-away price).
condition
Condition
YesNew, demo, used, damaged (repairable write-off), statutory write-off or parts only.
variant
Variant
NoFor example Outback.
odometer_km
Odometer (km)
NoWhole kilometres. Needed for motorhomes, campervans and buses; left out for anything towed.
atm_kg
ATM (kg)
NoAggregate trailer mass in kg, from the compliance plate. Needed for caravans, pop tops, hybrids, camper trailers and toy haulers.
tare_kg
Tare (kg)
NoIn kg, from the compliance plate.
ball_weight_kg
Ball weight (kg)
NoIn kg.
gtm_kg
GTM (kg)
NoGross trailer mass in kg, from the compliance plate, 1 to 10,000 kg. Caravans, pop tops, hybrids, camper trailers and toy haulers only.
axle_config
Axles
NoSingle axle, Tandem axle or Tri-axle. Caravans, pop tops, hybrids, camper trailers and toy haulers only.
terrain_rating
Built for
NoOn-road, Semi off-road or Off-road. Caravans, pop tops, hybrids, camper trailers and toy haulers only.
annexe
Annexe
NoYes or no. Caravans, pop tops, hybrids, camper trailers and toy haulers only.
gvm_kg
GVM (kg)
NoGross vehicle mass in kg (motorhomes, campervans and buses).
licence_class
Licence needed
NoCar licence, Light rigid (LR), Medium rigid (MR) or Heavy rigid (HR). A GVM of 4,500 kg or less is a car licence. Motorhomes, campervans and buses only.
fuel
Fuel
NoDiesel, Petrol, LPG or Electric. Motorhomes, campervans and buses only.
transmission
Transmission
NoManual, Semi-automatic or Automatic. Motorhomes, campervans and buses only.
engine_l
Engine (litres)
NoThe engine size in litres with at most one decimal place, for example 2.3. Motorhomes, campervans and buses only.
chassis_make
Base vehicle
NoThe make the motorhome, campervan or bus is built on: Fiat, Ford, Hino, Hyundai, Isuzu, Iveco, LDV, Mercedes-Benz, Mitsubishi, Nissan, Renault, Toyota, Volkswagen. Motorhomes, campervans and buses only.
chassis_model
Base vehicle model
NoFor example Ducato or Sprinter, up to 100 characters. Shown in the ad. Motorhomes, campervans and buses only.
length
Length
NoBody length in feet (21 or 21'6"), or with a unit (6550 mm, 6.55 m).
berths
Sleeps
NoHow many it sleeps, 1 to 12.
bunks
Bunks
NoHow many bunks, 0 to 6.
ensuite
Ensuite
NoYes or no.
aircon
Air conditioning
NoYes or no.
solar
Solar
NoYes or no. The panels' watts go in "Solar panels (watts)".
water_l
Fresh water (litres)
NoWhole litres, 0 to 5,000 L.
battery_ah
Battery (Ah)
NoWhole amp hours, 0 to 10,000 Ah.
solar_w
Solar panels (watts)
NoWhole watts, 0 to 20,000 W.
fridge
Fridge
NoAs you would describe it, up to 100 characters. Shown in the ad.
hot_water
Hot water
NoAs you would describe it, up to 100 characters. Shown in the ad.
island_bed
Island bed
NoYes or no.
colour
Colour
No
category
Category
NoCaravans, pop tops, hybrids, camper trailers, motorhomes, campervans and so on. Taken from the model when left out.
description
Description
NoPlain text. Leave the VIN out: it goes in the VIN column. Only a dealer's ad shows a VIN, and only where the dealer's state requires it.
photo
Photo URLs
NoUp to 12 https:// links, in order: one per column, or several in one cell separated by | , or spaces.
rego_no
Registration number
NoThe plate number. Shown on the ad where the state requires it.
rego_status
Registered?
NoRegistered, unregistered, recreational or cannot be registered. Taken as registered when a plate is given.
vin
VIN
NoStored encrypted and never shown in a report or a download. Only a dealer's ad shows it, and only where the dealer's state requires it.
chassis_no
Chassis number
NoWhere there is no VIN. Stored encrypted and never shown in a report or a download. Only a dealer's ad shows it, and only where the dealer's state requires it.
engine_no
Engine number
NoStored encrypted and never shown in a report or a download. Only a dealer's ad shows it, and only where the dealer's state requires it.
suburb
Suburb
NoWhere the vehicle is. Your dealership's suburb when left out.
postcode
Postcode
No
price_type
Price basis
NoLeave out, or "drive away". Prices plus government charges are not accepted.
writeoff_status
Written-off status (WOVR)
NoNot recorded, repairable, statutory or unknown. Needed for damaged stock.
writeoff_state
Written off in (state)
NoNSW, VIC, QLD, WA, SA, TAS, ACT or NT.
sold_as
Sold as
NoWhole, parts only, or not for use on public roads. Needed for damaged stock.
runs_tows
Runs and tows?
NoRuns and drives or can be towed, cannot be driven or towed, does not run (a motorhome, campervan or bus), or unknown. Needed for damaged stock.
damage_types
Damage
NoAny of: cosmetic, crash, chassis, engine, mechanical, flood, fire, hail, stolen recovered, missing parts, project.
damage_description
Damage report
NoWhat is damaged, in plain words.
vin_plate_photo
VIN or compliance plate photo URL
NoNeeded for damaged stock. Never shown in the ad.
has_spare_key
Keys present
NoYes or no.

Answers you may get

  • 400 a request we cannot read; 401 a missing, unknown or revoked key; 403 a key without the scope, or a dealership that is not verified or has no Pro or Group plan; 404 not one of your ads or runs; 409 an ad in a state that does not allow it; 413 a body over 64 KB; 429 too many requests; 503 Caravan Domain is read-only for a moment (try again later).

Lead webhook

On the Pro and Group plans you can give us an https address under your dealership profile. We post each new lead there as JSON. If your address does not answer with a 2xx status we try again three times, after 1, 5 and 25 minutes. We never follow a redirect, and addresses on private or internal networks are refused.

POST (your address)
Content-Type: application/json
X-CaravanDomain-Event: lead.created
X-CaravanDomain-Delivery: 5521
X-CaravanDomain-Signature: t=1790000000,v1=5f0c...

{
  "event": "lead.created",
  "id": "8d5e...",
  "created_at": "2026-10-01T09:30:00.000Z",
  "listing": {"id": 100512, "stock_no": "A1234", "title": "2021 Jayco Journey", "year": 2021,
              "make": "Jayco", "model": "Journey", "price_cents": 5899000, "url": "https://caravandomain.com.au/caravan/..."},
  "customer": {"name": "Sam", "phone": "+61400000000"},
  "message": "Hi, is this van still available?"
}

Each post is signed with your webhook secret (shown once when you set the address; make a new one from your profile at any time). Check the X-CaravanDomain-Signature header before you trust the body, and refuse one older than five minutes:

import { createHmac, timingSafeEqual } from 'node:crypto';

// header: the X-CaravanDomain-Signature value, body: the raw request body as received
export function verify(secret, body, header, nowSeconds) {
  const m = /^t=(\d+),v1=([0-9a-f]{64})$/.exec(header);
  if (!m || Math.abs(nowSeconds - Number(m[1])) > 300) return false;
  const want = createHmac('sha256', secret).update(m[1] + '.' + body).digest();
  const got = Buffer.from(m[2], 'hex');
  return got.length === want.length && timingSafeEqual(got, want);
}

ADF lead emails

Any dealer can also have each new lead emailed to their dealer system in the ADF 1.0 format, one lead per email. Set the address under your dealership profile and send a test lead from there. The buyer's email address is in it only when they agreed to share it.