Developers
Stock API
Keep a dealership’s Carified Yard in step with its DMS. Send cars as JSON when they arrive, change or leave the yard, and we take care of the rest, photos included.
Overview
The Stock API is for DMS vendors and for dealerships with their own systems. It’s the push version of a stock feed: instead of us reading a feed file on a schedule, your system tells us the moment a car changes.
- Cars you send land in the dealership’s Yard as Getting Ready. They never go on sale on their own: the dealer adds the disclosures buyers see and publishes.
- For cars your feed holds, we keep the price, odometer, stock number, specs and photos in step with what you send.
- Every call is safe to repeat: sending the same car twice changes nothing.
Every path below starts with the base URL:
https://carified.com.au/api/v1Getting a Key
A key belongs to one dealership, and only that dealership’s owner can create one. The dealership must be verified on Carified first.
- The owner signs in and opens Settings → Stock Feed in the dealer dashboard.
- Under Push API, they create a key and name it after the system that will use it.
- The key is shown once. Copy it into your system straight away: we keep only a hash, so we can’t show it again.
Keys can be revoked from the same place at any time, and a revoked key stops working immediately. If you build for many dealerships, ask each one for its own key.
Authentication
Send the key as a bearer token on every request. Keys look like cfd_sk_ followed by 40 letters and digits. Keep them on your server, never in a browser or app.
Authorization: Bearer cfd_sk_YOUR_API_KEY_HERERequests and responses are JSON. An error always comes back as an error in plain English, with the HTTP status telling you what kind it is (see Errors).
{
"error": "Your API key isn’t valid. Create a new one in Settings → Stock Feed."
}Endpoints
4 endpoints cover it. Most systems send single cars as they change and a full update once a day, so anything missed along the way catches up.
Add or Update a Car
PUT/api/v1/stock/{vin}
Adds the car if the yard doesn’t have it, or updates it if it does. The body is one vehicle; its vin is optional, and must match the path if you send it.
curl -X PUT https://carified.com.au/api/v1/stock/JTMBFREV10D123456 \
-H "Authorization: Bearer cfd_sk_YOUR_API_KEY_HERE" \
-H "Content-Type: application/json" \
-d '{"vin":"JTMBFREV10D123456","externalId":"DMS-48213","stockNumber":"S1042","year":2021,"make":"Toyota","model":"RAV4","variant":"GXL Hybrid","odometerKm":45210,"price":38990,"priceType":"drive_away","description":"One owner, full Toyota service history, 2 keys.","bodyType":"SUV","transmission":"CVT auto","fuelType":"Hybrid","driveType":"AWD","colour":"Glacier White","photoUrls":["https://cdn.example-dms.com.au/s1042/1.jpg","https://cdn.example-dms.com.au/s1042/2.jpg"]}'{
"vin": "JTMBFREV10D123456",
"result": "added",
"problems": []
}result is added, updated, unchanged or skipped (the car is sold, off sale or taken down on Carified, and problems says which). problems also lists anything we couldn’t use, such as a placeholder price, while still taking the rest. A car the dealer stopped syncing comes back unchanged.
Remove a Car
DELETE/api/v1/stock/{vin}
Tells us the car has left your stock. A car on sale comes off sale; it’s never marked sold, since the dealer confirms a sale in Carified. A car still getting ready is flagged “Not in your feed” for the dealer.
curl -X DELETE https://carified.com.au/api/v1/stock/JTMBFREV10D123456 \
-H "Authorization: Bearer cfd_sk_YOUR_API_KEY_HERE"{
"vin": "JTMBFREV10D123456",
"result": "left"
}result is left, or not_in_feed when your feed didn’t hold that car.
Send a Full Update
PUT/api/v1/stock
Sends the whole yard at once: up to 2,000 cars and 10 MB. A car the yard holds that’s missing from 2 full updates in a row leaves, just as if you’d removed it. A car we can’t read is reported as a problem rather than failing the update.
curl -X PUT https://carified.com.au/api/v1/stock \
-H "Authorization: Bearer cfd_sk_YOUR_API_KEY_HERE" \
-H "Content-Type: application/json" \
-d '{"vehicles":[{"vin":"JTMBFREV10D123456","externalId":"DMS-48213","stockNumber":"S1042","year":2021,"make":"Toyota","model":"RAV4","variant":"GXL Hybrid","odometerKm":45210,"price":38990,"priceType":"drive_away","description":"One owner, full Toyota service history, 2 keys.","bodyType":"SUV","transmission":"CVT auto","fuelType":"Hybrid","driveType":"AWD","colour":"Glacier White","photoUrls":["https://cdn.example-dms.com.au/s1042/1.jpg","https://cdn.example-dms.com.au/s1042/2.jpg"]},{"vin":"MR0HA3CD100654321","stockNumber":"S1057","year":2019,"make":"Toyota","model":"HiLux","price":"$41,500"}]}'{
"carsRead": 2,
"added": 1,
"updated": 0,
"unchanged": 1,
"left": 0,
"problems": []
}Each problem names its line (the car’s place in vehicles, from 1), its vin when we could read one, and a message.
List Your Stock
GET/api/v1/stock
Lists the cars your feed holds, with where each one is in Carified. Handy for checking your system and ours agree.
curl -X GET https://carified.com.au/api/v1/stock \
-H "Authorization: Bearer cfd_sk_YOUR_API_KEY_HERE"{
"vehicles": [
{
"vin": "JTMBFREV10D123456",
"externalId": "DMS-48213",
"stockNumber": "S1042",
"status": "for_sale",
"syncing": true
},
{
"vin": "MR0HA3CD100654321",
"externalId": "DMS-48377",
"stockNumber": "S1057",
"status": "getting_ready",
"syncing": true
}
]
}status is getting_ready, for_sale, off_sale or sold. syncing is false once the dealer stops syncing a car (or once it has left your feed), after which your changes to it are left alone.
Vehicle Fields
Only vin is required. Loose text is fine: we read values like “6 sp auto”, “45,210 km” or “$38,990” the same way we read a feed file. Fields we don’t know are refused, so a typo shows up straight away.
| Field | Description |
|---|---|
vinRequiredstring | The car’s VIN (10–17 characters). On PUT /stock/{vin} the path gives it; if the body sends one too, they must match. |
externalIdstring | Your system’s own id for the car. |
stockNumberstring | The yard’s stock number, shown to the dealer in Carified. |
yearnumber | string | Build year, e.g. 2021. |
makestring | e.g. “Toyota”. Matched to Carified’s make list. |
modelstring | e.g. “RAV4”. Matched to Carified’s model list. |
variantstring | Badge or trim, e.g. “GXL Hybrid”. |
odometerKmnumber | string | Kilometres. “45,210 km” is read, and miles (“28091 mi”) convert. |
pricenumber | string | Asking price in dollars, e.g. 38990 or “$38,990”. Under $500 reads as “call us”, so the car has no price. |
priceTypestring | “drive_away” or “excl_govt_charges”. Google’s vehicle_price_type values and plain text like “Drive away” are read too. |
descriptionstring | The car’s write-up, as plain text. |
bodyTypestring | e.g. “SUV”, “Ute”, “Sedan”. |
transmissionstring | e.g. “Automatic” or “6 sp auto”. |
fuelTypestring | e.g. “Petrol”, “Diesel”, “Hybrid”. |
driveTypestring | e.g. “AWD”, “4x4”, “FWD”. |
colourstring | e.g. “Glacier White”. |
batteryKwhnumber | string | Electric & plug-in hybrid: usable battery, e.g. 77.4 or “77.4 kWh”. |
rangeKmnumber | string | Electric & plug-in hybrid: the maker’s range (a plug-in hybrid’s electric range), e.g. 507 or “507 km”. |
dcChargeKwnumber | string | Electric & plug-in hybrid: peak DC fast charging, e.g. 235 or “235 kW”. Leave it out when there’s none. |
chargePortstring | Electric & plug-in hybrid: e.g. “CCS2”, “Type 2”, “CHAdeMO”. |
photoUrlsstring[] | Up to 100 http(s) URLs; the first is the hero. Fetched in the background, and a URL is never fetched twice. |
How Syncing Works
- Nothing goes on sale by itself. New cars wait in Getting Ready until the dealer adds disclosures and publishes them.
- Your system owns the details it sends. For cars your feed holds, price, odometer, stock number, specs and photos follow what you send, including on cars already on sale. A dealer who wants to edit a car by hand can Stop Syncing it.
- Leaving a field out never clears it. Send only what you know; what’s already there stays.
- An odometer is never lowered. A lower reading comes back as a problem for the dealer to look at.
- Photos sync in the background. The first URL is the hero. We fetch each URL once, so give a changed photo a new URL.
- One way in per dealership. While a feed URL is connected in Settings → Stock Feed, the API answers 409. Disconnect the feed to use the API instead.
Errors
Every error has an error message that says what to fix. Retry a 409, 429 or 500 later; fix the request for anything else.
| Status | When |
|---|---|
| 400 Bad Request | Bad Request. The body isn’t JSON, the VIN isn’t one, a field isn’t one Carified knows, or a full update has more than 2,000 cars. |
| 401 Unauthorised | Unauthorised. The key is missing, isn’t valid, or was revoked. |
| 403 Forbidden | Forbidden. The key’s dealership isn’t verified. |
| 404 Not Found | Not Found. The path doesn’t exist. |
| 409 Conflict | Conflict. The dealership has a feed URL connected, or a full update is still running. |
| 413 Payload Too Large | Payload Too Large. The body is too big: over 10 MB for a full update, or 256 KB for one car. |
| 429 Too Many Requests | Too Many Requests. Slow down: wait the Retry-After header’s seconds, then try again. |
| 500 Server Error | Server Error. Something went wrong on Carified’s side. Try again. |
Limits
- About 120 single-car calls a minute per key.
- 60 stock lists a minute per key.
- 256 KB per single car.
- 6 full updates per 10 minutes per key, one at a time.
- Full updates up to 2,000 cars and 10 MB.
- Up to 100 photo URLs per car, over http or https.
Over a limit, you’ll get a 429 with a Retry-After header in seconds. Wait that long, then carry on.
Help
The OpenAPI file describes every endpoint and field, ready to load into Postman, Insomnia or a code generator.
Questions, or building for a DMS many dealers use? Sign in to your Carified account and contact us through the Support page, and we’ll help you get set up.