Australian Rego Check API for Developers
Australia has no single national registration lookup API. Each state and territory handles registrations separately. PlateAPI brings them all together in one REST endpoint. This post walks through how to use it: authentication, code examples, response format, and error handling.
What you get back
Send a plate and a state, receive structured vehicle data:
{
"success": true,
"vehicle": {
"year_range": "2003-2006",
"lowest_year": 2003,
"highest_year": 2006,
"make": "TOYOTA",
"model": "COROLLA",
"description": "03~06 TOYOTA COROLLA SPORTIVO 1.8L PETROL",
"body": "HATCHBACK",
"engine": "1.8L",
"vehicle_id": 5152708
},
"source": "plateapi",
"duration_ms": 1509.96,
"request_id": "req_7f3a9c1b4e8d2f6a0c5e3d1b",
"alternatives": [
{
"year_range": "2003-2006",
"lowest_year": 2003,
"highest_year": 2006,
"make": "TOYOTA",
"model": "COROLLA",
"description": "03~06 TOYOTA COROLLA ASCENT 1.8L PETROL",
"body": "SEDAN",
"engine": "1.8L",
"vehicle_id": 1857621
}
],
"match": "multiple"
}A few details worth noting:
- Year ranges, not guesses. Vehicles are identified at the model-generation level, so you get the honest production range ("2003-2006") rather than a single arbitrary year. Models still in production return an open range like "2020-ON".
- Alternatives and match. When a plate maps to several variants (two trims of the same model, as here), the extra matches arrive in the
alternativesarray so your UI can ask the user to pick. Thematchfield says which case you have:exact,multiple(trims of one model) orambiguous(different models or generations). - Vehicle IDs. Every vehicle carries a
vehicle_id, PlateAPI's stable ID for that exact variant. Store it rather than the text, and use it to link your products to vehicles. - Timing data. Every response includes a
duration_msfield so you can monitor lookup performance in your application.
Getting a key
Create a free account -- no credit card -- and your API key works immediately for 20 lookups a month. Pass it in the X-API-Key header on every request.
Code examples
cURL
curl -s "https://api.plateapi.com.au/api/v1/lookup?plate=ABC123&state=VIC" \ -H "X-API-Key: pk_live_YOUR_API_KEY"
Python
Using requests directly is below. There is also an official SDK, pip install plateapi, covered in how to look up Australian number plates in Python.
import requests
resp = requests.get(
"https://api.plateapi.com.au/api/v1/lookup",
params={"plate": "ABC123", "state": "VIC"},
headers={"X-API-Key": "pk_live_YOUR_API_KEY"},
timeout=30,
)
data = resp.json()
if data["success"]:
v = data["vehicle"]
print(f"{v['year_range']} {v['make']} {v['model']} ({v['engine']})")
else:
print(data["code"], data["error"]) # e.g. not_foundJavaScript / Node.js
const res = await fetch(
"https://api.plateapi.com.au/api/v1/lookup?plate=ABC123&state=VIC",
{ headers: { "X-API-Key": "pk_live_YOUR_API_KEY" } }
);
const data = await res.json();
if (data.success) {
const { year_range, make, model, engine } = data.vehicle;
console.log(`${year_range} ${make} ${model} (${engine})`);
}Handling the edge cases
- Plate not found: you still get HTTP 200, with
success: falseandcode: "not_found". Treat it as a normal outcome, not an exception -- typos in plates are common, so give the user a clear retry path. - Invalid state: HTTP 400. Valid values are ACT, NSW, NT, QLD, SA, TAS, VIC, WA.
- Rate limits: HTTP 429 when you exceed your plan's per-minute rate or monthly quota. Successful responses include
X-RateLimit-Remainingso you can track usage without polling. - Multiple matches: check
match-- for parts fitment, showing a "which one is yours?" picker beats guessing. Withambiguous, the vehicle has novehicle_idandalternativeslists every candidate.
The live demo is the fastest way to see the data quality for your own test plates, and the lookup reference covers every field above in more detail.
PlateAPI turns Australian number plates into structured vehicle data -- one REST endpoint, all eight states, free tier included.