Israel's open vehicle registers split by vehicle type and status. Designing tiered verification: confidence layers, coverage gaps, and what each tier may decide
Key takeaways
- There is no single register of every vehicle. There are several separate datasets, each with its own declared scope.
- The private-and-commercial dataset covers active private vehicles from model year 1996 and active commercial vehicles up to 3,500 kg from model year 1998. A vehicle outside that cut is not missing; it was never in scope.
- The HTML dataset pages return 404 to a non-browser client. The CKAN API route works and returns 200.
- A plate absent from the active register may sit in the inactive dataset, defined as vehicles with no licence validity for 13 months back.
- Verification should return a confidence layer with a source and a fetch timestamp, and must never block a business action on a non-match.
An open vehicle register is evidence, not a verdict. It is split by vehicle type and status, cut off at particular model years, and refreshed on its own cycle. Verification built on it should return a confidence tier rather than a boolean, and must keep working when the answer is that the vehicle was not found.
This is a technical description of public datasets and verification design, not legal advice about using the data.
What the register actually contains, and what it does not
The dataset private-and-commercial-vehicles on data.gov.il is titled, in Hebrew, the register of licence plate numbers of private and commercial vehicles. Its own description states the scope: active private vehicles from model year 1996 onward, and active commercial vehicles weighing up to 3,500 kg from model year 1998 onward.
Two design conclusions follow from that sentence. First, "not found" is a finding about scope, not about the vehicle. Second, the dataset is published as two separate CSV resources, and one of them alone returned a total of roughly 4.17 million rows. Anyone checking only the first resource will see shortages that do not exist.
The row fields are concrete and checkable: mispar_rechev for the plate, misgeret for the chassis number, tozeret_nm and degem_nm for manufacturer and model, kinuy_mishari for the commercial name, shnat_yitzur for model year, sug_delek_nm for fuel type, baalut for ownership type, plus mivchan_acharon_dt and tokef_dt for the last roadworthiness test and licence validity dates.
Which dataset holds which vehicle?
| Dataset name | What it covers per its own definition |
|---|---|
private-and-commercial-vehicles | Active private from 1996, active commercial up to 3,500 kg from 1998 |
rechev_le_pail_with_degem | Vehicles with a model code, no validity for 13 months back, not stolen, no final cancellation |
rechev_le_pail_without-degem | The same definition, for vehicles with no model code |
motorcycle | Active two-wheeled vehicles |
heavy-truck | Vehicles over 3.5 tons and vehicles with no model code: semi-trailer, tractor, work vehicle, goods, bus |
kli_rechev_ciburiim | Active public vehicles: taxis, service minibuses and buses used for paid transport |
personal_import_vehicles | Active personally imported vehicles |
recall | Manufacturer recall notices |
A motorcycle, a truck or a taxi will not appear in the private-and-commercial dataset, and not because anything failed. A system that checks one dataset and concludes the vehicle does not exist produces a silent error in every one of those categories.
How do you query it without a browser?
Through the CKAN interface, not through the dataset page. These three endpoints were tested and returned 200:
https://data.gov.il/api/3/action/package_search?q=<term>returns matching datasets with the technical name of each.https://data.gov.il/api/3/action/package_show?id=<dataset name>returns the description, the last modification timestamp and the resource ids.https://data.gov.il/api/3/action/datastore_search?resource_id=<id>&limit=1returns the field list and the total row count of that resource.
By contrast, requesting the HTML dataset page returned 404 even with a browser user-agent header, and the datastore_search_sql route returned 404 when tested in September 2026. So the assumption that a page which opens in a browser is also reachable from a server does not hold here, which is exactly why the data.gov.il API guide starts at the interface rather than at the page.
One note on search behaviour: the q parameter is a free-text search across the whole row and returns a rank field, so a numeric value can match a field you did not mean. For exact identification use filters with the explicit field, for example filtering on mispar_rechev.
A confidence tier instead of a boolean
The output of verification is not "exists" or "does not exist". It is a record carrying a tier, a source and a fetch timestamp:
| Tier | What was found | What it may decide | What it may not do |
|---|---|---|---|
| Confirmed | Exact match in the active register, manufacturer and model agreeing | Auto-fill fields | Count as evidence about the vehicle's condition today |
| Partially confirmed | Plate matched, but manufacturer or model differs from what was entered | Show a warning to the user | Overwrite what the user typed |
| Found as inactive | Match only in the inactive dataset | Flag the record for human review | Conclude the vehicle does not exist |
| Out of scope | Vehicle type or model year outside the checked dataset's definition | Continue without verification | Be counted as an error |
| Not found | No match in any dataset checked | Open a review line | Block the rest of the process |
| Source unavailable | The API did not answer or returned an error | Use a cached answer | Show stale data without marking its age |
The last row is what takes systems down. When an external source stops answering, the default must be to continue with a marker, not an error screen that stops a member of staff standing in front of a customer.
Why does a plate come back missing when the car is parked outside?
Four causes explain nearly every case, and each deserves a different response:
- The vehicle is not in the category you checked. A motorcycle, a truck over 3.5 tons or a taxi sits in an entirely different dataset.
- The vehicle left the active register. By the inactive dataset's own definition, a licence out of validity moves the vehicle to that list after 13 months.
- The model year predates the scope. A 1994 private car is not inside the dataset's declared coverage.
- You checked one resource out of two. The private-and-commercial dataset is split across two files, and a partial check skips part of the rows.
There is a fifth, purely technical cause: the plate is stored as a numeric field, so leading zeros disappear on export to a spreadsheet. String comparison between two sources then fails before the answer even comes back.
Staleness, and what you keep on your own side
Every fetch happens at a moment. The difference between a system you can maintain and one that falls apart in six months is what you store next to the answer:
- A fetch timestamp on each field pulled, not only on the record as a whole.
- The resource id the value came from, because resource ids change between dataset versions.
- The dataset's own modification time as returned by
package_show, so you know whether the data was already stale at source. - The raw source response in a separate field, so an old decision can still be explained after the dataset changes.
- A validity policy: how long a cached answer counts as current before it is fetched again.
Public datasets rename fields and rotate resource ids without notice, which is the same family of failure described in why scrapers break and how maintenance works. Anyone verifying vehicle details at a service reception desk sees it quickly, which is why the garage data chain treats the lookup as support rather than as a precondition.
Sources
Frequently asked questions
How many rows are in the private and commercial vehicle register?
When tested against the API, the dataset's main resource returned a total of roughly 4.17 million rows, and a second continuation resource exists alongside it. Read the exact figure from the total field in each `datastore_search` response rather than hard-coding it, because it changes.
Does a plate missing from the register mean the vehicle does not exist?
No. It means the vehicle is outside the declared scope of the dataset you checked. Motorcycles, vehicles over 3.5 tons, public transport vehicles and vehicles whose licence lapsed live in other datasets, each with its own inclusion rule.
How often are the datasets updated?
Several datasets state daily updates in their own description, and every dataset carries a modification timestamp returned by `package_show`. The correct approach is to read and store that field on each fetch rather than assuming a fixed refresh rate.
Why prefer `filters` over a `q` search?
Because `q` is a free-text search across the whole row and returns a relevance rank, so a number can match a field you did not intend. `filters` with an explicit field name returns an exact match, which is the behaviour verification needs.
Keep reading
Related service
Business Automation
I build custom automations that remove repetitive work end to end.
About the author
Yehonatan Saadia
Freelance automation, web & MVP developer
I'm Yehonatan Saadia, a senior developer who builds business automation, custom websites, and MVPs for small and mid-sized companies across the US, Europe, and Israel. These guides come from real client work, not theory.
Work with meHave a project like this?
Tell me what you're trying to automate or build. I reply within 24 business hours with a few targeted questions, then we walk through it on a free 30-minute call, with no commitment. You come away with a scope, a timeline and a fixed price - or a straight answer that it isn't worth building.
