API documentation
One call returns a vehicle's tax value from the Spanish BOE tables and the transfer tax payable in any of the 17 common-regime communities, with the applicable order cited in the response itself.
Base: https://valorvenal.dr-techsolutions.com/api/v1 · All responses are UTF-8 JSON.
Authentication
Send your key in the Authorization header (or in X-Api-Key if that suits you better). Keys start with vv_live_ and are shown only once when issued.
Authorization: Bearer vv_live_xxxxxxxxxxxxxxxxxxxxxxxx
First call
curl "https://valorvenal.dr-techsolutions.com/api/v1/valuate\ ?brand=SEAT&model=IBIZA%201.0%20Eco%20TSI%20S%26S%20FR%20DSG\ &first_registration_date=2016-06-15&ccaa=andalucia" \ -H "Authorization: Bearer vv_live_..."
{
"fiscalValue": {
"basis": "exact_model",
"baseFirstYearEur": 15400,
"depreciation": { "completedYears": 10, "pct": 17,
"bracket": "Mas de 10 años hasta 11 años",
"method": "exact_dates" },
"valueEur": 2618
},
"itp": {
"ccaaName": "Andalucía", "method": "rate", "rate": 0.04,
"taxableBaseEur": 2618, "itpEur": 104.72, "ruleId": "default"
},
"boe": { "order": "HAC/1501/2025", "reference": "BOE-A-2025-26357" }
}GET /valuate
Tax value and ITP in a single call. Also accepts POST with a JSON body using the same field names.
| Parameter | Type | Description |
|---|---|---|
brand | string, required | Make, e.g. VOLKSWAGEN |
model | string, required | Model. Send the exact Annex I string to value that line; send just «GOLF» and you get the model average |
first_registration_date | date | Recommended. Date of first registration (YYYY-MM-DD or DD/MM/YYYY). With it, year is optional |
transfer_date | date | Date of the taxable event. Defaults to today |
year | int | Year of registration (1980–2027). Required if you do not send the date |
fuel | string | gasolina · diesel · electrico · hibrido · phev · glp (synonyms accepted) |
version | string | Trim (GTI, AMG…): adds a trim-matching pass |
ccaa | string | Community slug (madrid, catalunya…) or all for all 17 |
price_eur | number | Agreed price: if it exceeds the table value, it becomes the taxable base |
GET /brands · GET /models?brand=
Autocomplete catalogue: 174 makes and the model prefixes for each.
GET /itp/rates?ccaa=
The ITP rate and fixed-amount table per community, with the legislation and verification date for every rule. With no parameter it returns all 17.
GET /usage
Current-month consumption for the calling key.
The response
- fiscalValue — the value the tax authority applies. basis says what it was computed on: exact_model, version or model. depreciation returns the Annex IV bracket, the percentage, and whether it came from real dates or was estimated.
- itp — method (rate or fixed amount), taxable base, amount due and the regional legislation cited.
- summary — min/average/max across the matching variants, already depreciated.
- comparables — up to 20 variants with their values.
- actualYear and yearsDriftFromRequested — if no rows exist for the requested year, the nearest available one is used.
- warnings and warningCodes — non-blocking notices, e.g. that depreciation is a calendar-year estimate.
- boe — the order and value year applied: traceability in every response.
Calculation accuracy
The tax authority counts years of use from date to date, from first registration to the taxable event, not by calendar year. The same car transferred in March or in September of the same year can fall into different Annex IV brackets. That makes first_registration_date the parameter that changes the result most.
Our results are verified to the cent against the official simulator of the Andalusian tax agency. The chartered territories (Navarre and the Basque Country) are not supported: they apply their own tables, so we return an explicit 422 rather than a wrong number.
Errors
{ "error": { "code": "quota_exceeded", "message": "...", "docs": "..." } }| HTTP | code | When |
|---|---|---|
| 400 | invalid_params | Missing or invalid parameters |
| 401 | unauthorized | Missing or invalid key |
| 402 | quota_exceeded | Monthly plan quota exhausted |
| 404 | not_found | Unknown make (on /models) |
| 422 | region_not_supported | Chartered territory: uses its own tables |
| 429 | rate_limited | More than 5 sustained requests per second |
Limits and attribution
5 sustained requests per second per key. The monthly quota depends on your plan. The free plan requires a visible «Datos: ValorVenal» link next to the results; paid plans require no attribution.
See plans and pricing →