ACI APIonline.aci.it ↗
Calculate Italian vehicle tax (bollo auto) by license plate or technical data. Access ACI's national archive via 3 endpoints returning tax amounts, vehicle details, and province lists.
What is the ACI API?
The ACI Bollo Auto API exposes 3 endpoints that calculate the Italian vehicle ownership tax (bollo auto) using the ACI national vehicle-tax archive. The calculate_bollo_by_plate endpoint accepts an Italian license plate and owner region, returning itemised euro amounts — tax, penalty, interest, rounding, and total — alongside the vehicle's category, validity period, and the full set of technical data labels shown on the ACI result page.
curl -X GET 'https://api.parse.bot/scraper/b40484c5-c64e-4fe5-9a27-566e030165d2/calculate_bollo_by_plate?plate=EX123AB®ion=6' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace online-aci-it-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: ACI Bollo Auto Calculator — bounded, re-runnable."""
from parse_apis.online_aci_it_api import (
AciBollo, Region, Fuel, PlateNotFound,
)
client = AciBollo()
# 1. Calculate bollo by plate from the national archive.
try:
result = client.bollo_calculations.by_plate(
plate="EX123AB", region=Region.LAZIO,
)
print(result.vehicle.plate, result.vehicle.category)
print(f"Tax: {result.amounts.tax} {result.currency}, Total: {result.amounts.total} {result.currency}")
print(f"Validity: {result.vehicle.validity_start} → {result.vehicle.validity_end}")
except PlateNotFound:
print("Plate not found in the ACI archive")
# 2. List provinces for a region, then use one to calculate from vehicle data.
province = client.provinces.list(region=Region.LAZIO, limit=5).first()
if province is not None:
print(f"Using province: {province.code} — {province.name}")
manual = client.bollo_calculations.from_vehicle_data(
plate="FA123BC",
region=Region.LAZIO,
province=province.code,
fuel=Fuel.GASOLIO,
kw=100,
euro_class=6,
registration_date="2016-03-15",
previous_expiry_month=4,
previous_expiry_year=2026,
)
print(f"Manual calc total: {manual.amounts.total} {manual.currency}")
print(f"Source: {manual.source}")
print("exercised: bollo_calculations.by_plate / provinces.list / bollo_calculations.from_vehicle_data")
Calculates the bollo due for a vehicle registered in the ACI national vehicle-tax archive, identified by its license plate and the owner's region of residence. Returns one object with the vehicle block (plate, vehicle/payment type, category, residence, validity period, previous expiry, payment deadline, registration date, ISO dates), a technical_data map of the archive's labelled technical values (labels are the site's Italian labels and vary by vehicle, e.g. 'KW', 'Dispositivo Ecologico'), and the amounts block in euro (tax, penalty, interest, rounding, total; penalties and interest are computed by the site as of the calling day). Each call is a single calculation that costs several seconds. A plate the archive does not know yields a stale_input (input_not_found) error carrying the site's message; a region/plate pair that the site answers with another error yields an upstream error. Verified with region LAZIO, vehicle_type AUTOVEICOLI and payment_type RINNOVO; other members are passed to the site as its own option codes but were not exercised (LOMBARDIA requires an owner tax code on the site and is not supported here).
| Param | Type | Description |
|---|---|---|
| platerequired | string | Italian license plate without spaces, 1-8 letters/digits (e.g. one shape: AA123BB). Upper-cased before use. |
| regionrequired | string | Region (or autonomous province) of residence of the vehicle owner, which determines the tax rules applied. |
| payment_type | string | Kind of payment being calculated. RINNOVO is a renewal of a vehicle already in circulation; PAGAMENTO_ANTICIPATO is an early payment within the expiry month (the site refuses it in December). |
| vehicle_type | string | Vehicle family the plate belongs to. |
{
"type": "object",
"fields": {
"source": "'archive' — amounts computed from the national archive data",
"amounts": "object of euro amounts as numbers: tax, tax_penalty, tax_interest, rounding, total",
"vehicle": "object: plate, vehicle_type, payment_type, category, residence (region and province), validity_start, validity_end, previous_expiry (null when the archive shows none), payment_deadline, registration_date — dates as YYYY-MM-DD",
"currency": "always EUR as shown by the site",
"technical_data": "object mapping the site's Italian technical labels to string values as shown on the result page"
},
"sample": {
"data": {
"source": "archive",
"amounts": {
"tax": 144.84,
"total": 150.21,
"rounding": 0,
"tax_penalty": 4.53,
"tax_interest": 0.84
},
"vehicle": {
"plate": "EX123AB",
"category": "Autovetture",
"residence": "LAZIO (RM)",
"payment_type": "Rinnovo di pagamento",
"validity_end": "2027-04-30",
"vehicle_type": "Autoveicoli",
"validity_start": "2026-05-01",
"previous_expiry": null,
"payment_deadline": "2026-06-01",
"registration_date": "2014-08-29"
},
"currency": "EUR",
"technical_data": {
"KW": "51",
"Uso": "Priv. trasp. persone",
"Alimentazione": "Benzina",
"Inibizione traino": "No",
"HP (Potenza Fiscale)": "14",
"Dispositivo Ecologico": "Euro 6"
}
},
"status": "success"
}
}About the ACI API
What the API Returns
All calculation endpoints return an amounts object with five numeric euro fields: tax, tax_penalty, tax_interest, rounding, and total, plus currency fixed to EUR. The vehicle object includes plate, vehicle_type, payment_type, category, residence (region and province), validity_start, validity_end, and previous_expiry. A technical_data object carries the site's Italian-language labels mapped to their string values exactly as the ACI result page displays them.
Endpoints and Parameters
calculate_bollo_by_plate queries the ACI national archive. Required inputs are plate (1–8 alphanumeric characters, automatically upper-cased) and region (the owner's region of residence). Optional parameters payment_type and vehicle_type let you specify renewal (RINNOVO), anticipated payment, or the vehicle family. The response carries source: 'archive' to distinguish it from user-supplied calculations.
calculate_bollo_from_vehicle_data is for passenger cars (Autovetture, renewal mode) when no archive lookup is desired. Required inputs include kw (integer engine power), fuel, euro_class (0–6), registration_date (ISO date), region, and province (two-letter code). The plate parameter labels the result but is not looked up. This endpoint returns source: 'user_supplied_data'.
Province Reference
list_provinces resolves valid province codes for a given region. It returns an array of {code, name} pairs where code is the two-letter abbreviation expected by calculate_bollo_from_vehicle_data. Call this endpoint first if you are building a form that lets users select their province before submitting a technical-data calculation.
The ACI API is a managed, monitored endpoint for online.aci.it — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when online.aci.it changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official online.aci.it API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Embedding a bollo auto cost estimator in an Italian car dealer or fleet management app using calculate_bollo_by_plate
- Pre-filling tax renewal reminders by retrieving validity_start and validity_end from archive lookups
- Calculating expected bollo for a used vehicle before purchase, supplying kw, euro_class, and registration_date to calculate_bollo_from_vehicle_data
- Building a regional tax comparison tool by running calculate_bollo_by_plate across different region values for the same plate
- Populating province dropdowns in Italian address forms with list_provinces for accurate residence selection
- Auditing fleet tax obligations by batch-querying plates against the ACI archive and summing the returned total fields
- Surfacing penalty and interest breakdowns (tax_penalty, tax_interest) for late-payment scenario modelling
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 200 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
| Team | $300/mo | 20,000 | 300 req/min |
| Company | $1,000/mo | 100,000 | 500 req/min |
Each endpoint has a fixed posted price per successful call — most fall between 1 and 10 credits — shown on this API's page before you run it. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.