Target drive-away
POST /v1/quote/target-drive-away
Works back from a drive-away price. You advertise a car at $54,990 drive-away. This endpoint tells you the vehicle price that produces that figure, with the full statutory breakdown for the contract.
It takes a normal quote request plus a target. The engine finds the highest value for one dutiable line whose drive-away does not exceed the target, and returns the full quote at that value. Every charge is recalculated at the solved price. Duty steps, LCT and registration bands are computed exactly, not estimated.
📥 Request body
Everything from POST /v1/quote, plus:
| Field | Type | Required | Description |
|---|---|---|---|
target.driveAway | integer | ✅ | The drive-away you want, in cents. |
target.adjustLineIndex | integer | Which pricingInputs.dutiable line to solve, by position. Default 0 (the first line, normally the vehicle price). | |
target.increment | integer | Solve to the nearest multiple of this, in cents. Default 100 (whole dollars). Use 1 to solve to the cent. |
The solved line can be a price (solving down or up), or a discount line (solving to a negative value). Every other line is left exactly as you sent it.
curl -s -X POST "https://pricing-api.vyro.com.au/v1/quote/target-drive-away" \
-H "Authorization: Bearer your-access-token" \
-H 'Content-Type: application/json' \
-d '{
"pricingCode": "AU_QLD",
"showroomCode": "your-showroom-code",
"purchaseDate": "2026-10-01",
"vehicleGeneric": {
"bodyType": "ute",
"fuelType": "ICE",
"cylinders": 6,
"tareKg": 2150,
"year": 2021,
"condition": "used",
"manufactureDate": "2021-03-31"
},
"pricingInputs": {
"dutiable": [{ "description": "Vehicle price", "value": 5499000 }]
},
"registration": { "termMonths": 12, "startDate": "2026-10-01", "type": "transfer" },
"customer": { "customerType": "consumer", "usageType": "consumer" },
"target": { "driveAway": 5499000 }
}'
📤 Response
200 OK (quote.metadata and the per-line tax/amounts objects omitted)
{
"target": { "driveAway": 5499000, "adjustLineIndex": 0, "increment": 100 },
"solution": {
"lineDescription": "Vehicle price",
"originalValue": 5499000,
"solvedValue": 5309700,
"adjustment": -189300,
"driveAway": 5498915,
"shortfall": 85,
"exact": false,
"iterations": 18
},
"quote": {
"categories": {
"dutiable": [
{ "description": "Vehicle price", "value": 5309700, "ruleId": "AU_QLD_DUTIABLE_VALUE_FY27" }
],
"onRoad": [
{ "description": "Stamp Duty", "value": 185850, "ruleId": "AU_QLD_STAMP_DUTY_FY27" },
{ "description": "Vehicle registration transfer fee", "value": 3365, "ruleId": "AU_QLD_REGISTRATION_TRANSFER_FY27" }
],
"additional": []
},
"totals": {
"dutiable": 5309700,
"onRoad": 189215,
"additional": 0,
"driveAway": 5498915,
"tax": { "dutiable": 482700, "onRoad": 0, "additional": 0, "overall": 482700 }
}
}
}
To advertise this ute at $54,990 drive-away, price the vehicle at $53,097. Duty is $1,858.50 and the transfer fee $33.65, a total of $54,989.15.
| Field | Description |
|---|---|
solution.solvedValue | The value for the solved line. |
solution.adjustment | solvedValue - originalValue. Negative means the price has to come down; this is the discount to apply. |
solution.driveAway | The drive-away actually achieved. |
solution.shortfall | target - driveAway. Never negative: the quote never exceeds your target. |
solution.exact | true when shortfall is 0. |
solution.iterations | Engine evaluations used, typically 15–35. |
quote | The complete quote at the solved value, identical to calling POST /v1/quote with it. Store this with the deal. |
Why isn't it always exact?
Duty is charged in steps: per $100 or part of $100 in QLD, and per $200 or part of $200 in VIC. So not every drive-away figure is reachable to the cent. The solver returns the closest drive-away at or below your target, on your increment. Here that leaves $0.85. You can absorb it in the price, add it as a separate line, or leave it.
🚫 Errors
| Status | code | Meaning |
|---|---|---|
400 | INVALID_TARGET | target.adjustLineIndex doesn't match a dutiable line, target values are invalid (driveAway is at most $100m), or the request produces an empty quote (check the date against the supported range). |
422 | TARGET_NOT_ACHIEVABLE | The target is below the drive-away even with the solved line at its lowest value (on-road charges and your other lines already exceed it), or the drive-away doesn't respond to that line. |
400 | INVALID_VEHICLE_INPUT | The solved price is above the LCT threshold for a used car, and the dates or lctPreviouslyPaid needed to price LCT are missing. See Used vehicles. |
Plus every error POST /v1/quote can return. See Errors, warnings & changes.