Errors, warnings & changes
Errors
Errors return a JSON body with a machine-readable code and a human-readable message:
{
"code": "bad_request",
"message": "request/body/vehicleGeneric/condition must be equal to one of the allowed values: new, used",
"errors": [
{
"path": "/body/vehicleGeneric/condition",
"message": "must be equal to one of the allowed values: new, used",
"errorCode": "enum.openapi.validation"
}
]
}
| Status | code | Meaning | What to do |
|---|---|---|---|
400 | bad_request | The request doesn't match the schema. errors[].path points at the field. | Fix the request. |
400 | INVALID_SHOWROOM_CODE | showroomCode is missing or blank. | Send your showroom code. |
400 | UNSUPPORTED_FINANCIAL_YEAR | purchaseDate is in a financial year we don't price. | Check the date. |
400 | UNSUPPORTED_REGISTRATION_DATE | registration.startDate is beyond the published rates and you sent taxDatePolicy.outOfRange: "error". | See Tax date policy. |
400 | UNSUPPORTED_REGISTRATION_TYPE | registration.type: "transfer" in a state, or on a date, where its fee isn't modelled. | Use QLD, WA or VIC within the modelled dates, or "new". |
400 | INVALID_VEHICLE_INPUT | An impossible vehicle date, a transfer of a "new" vehicle, or a used car above the LCT threshold missing the dates or lctPreviouslyPaid needed to price LCT. The message names the field. | Send the field. See Used vehicles. |
400 | INVALID_TARGET | Target drive-away input is invalid. | See Target drive-away. |
401 | not-authenticated / UNAUTHENTICATED | Missing, invalid or expired credentials. | Request a new access token. |
403 | SHOWROOM_ACCESS_DENIED | Your client isn't bound to that showroomCode. | Check the code; contact support to add a showroom. |
403 | USER_INACTIVE | Your API client has been revoked. | Contact support. |
422 | TARGET_NOT_ACHIEVABLE | The target drive-away is below the on-road charges alone. | Raise the target. |
500 | error | Something went wrong on our side. | Retry with exponential backoff, then contact support with the time and request. |
4xx errors are deterministic: retrying the same request returns the same error.
Warnings
A 200 response can carry metadata.warnings: plain-language notes about assumptions the engine had to make. The quote is still valid, but a warning tells you which number is an assumption. For example:
| Warning (abridged) | What it means |
|---|---|
AU_WA: Missing tareKg – unable to determine licence fee units. | Registration couldn't be priced. The quote is incomplete. Send tareKg. |
AU_QLD: ICE vehicle without vehicle.cylinders - stamp duty assumes 1-4 cylinders… | Duty may be too low for a 5+ cylinder vehicle. Send cylinders. |
AU_VIC: Postcode missing for TAC risk zone – using default METRO. | TAC assumes Melbourne metro. Send registration.postcode. |
AU_QLD: Using the conservative upper-bound Class 1 CTP default… | CTP is an estimate, not a specific insurer's premium. |
…: vehicleGeneric provided; make/model defaulted to "generic"… | Informational. Make/model-specific rules (e.g. NSW's lower-taxed EV list) can't apply. |
…: PHEV assumed to meet the LCT fuel-efficient test… | Send fuelConsumptionLPer100km to confirm the LCT threshold. |
…: LCT applied to a ute/cab-chassis without seats, gvmKg and kerbMassKg… | Send them: most utes are exempt from LCT as commercial vehicles. |
Recommendations:
- Log every warning with the quote.
- For contract figures, decide which warnings you accept. Missing-input warnings (
tareKg,cylinders,postcode) mean you should fix the input and re-quote. - Don't parse warning text in code; it may be reworded. Act on the inputs you send instead.
How pricing changes reach you
Government charges change, most often on 1 July, with state budgets and regulator updates in between.
- We monitor official sources (state revenue offices, transport departments, insurance regulators and the ATO) for every statutory figure the engine uses. Each rule's sources are listed in
GET /v1/rules. - Changes are effective-dated. A new rate applies to quotes whose
registration.startDateis on or after its effective date, so quotes for earlier dates keep reproducing what applied at the time. - You're notified ahead of time. When a change affects your quotes, we email you before the effective date with the components affected (stamp duty, registration, CTP, LCT, fees), the old and new amounts, and the effective date. Changes are released to Staging before Production.
ruleIds carry the financial year (e.g.AU_QLD_STAMP_DUTY_FY27), so you can see which year's rates priced a stored quote.
API compatibility
- New fields are added, never repurposed. New optional request fields never change the result of a request that doesn't send them.
- New
codevalues, warning texts and line items can appear. Handle unknown values gracefully. - Breaking changes, if ever needed, would be announced in advance with a migration window.
📘 OpenAPI specification
- Every environment serves its live specification at
GET /spec(no authentication), e.g.https://pricing-api.vyro.com.au/spec. - Download the specification (OpenAPI 3.0) to generate a typed client:
npx openapi-typescript https://pricing-api.vyro.com.au/spec --output pricing-api.ts
🛟 Support
- Integration questions, credentials, custom rate cards (insurer CTP, premium plates): support@vyro.co.
- Production issues: email support with the time (UTC), environment,
pricingCode,showroomCodeand, ideally, the request body. Every request is ticketed.