vehicles 0.6.1 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.rubocop_todo.yml +164 -0
- data/CHANGELOG.md +274 -0
- data/README.md +55 -10
- data/data/PROVENANCE-vehicles.md +12 -0
- data/data/plates/PROVENANCE.md +5 -4
- data/data/plates/_decode/at-districts.yml +287 -0
- data/data/plates/_decode/ch-cantons.yml +110 -0
- data/data/plates/_decode/cn-issuing-offices.yml +463 -0
- data/data/plates/_decode/cn-provinces.yml +614 -0
- data/data/plates/_decode/cz-kraj.yml +159 -0
- data/data/plates/_decode/dk-serial-blocks.yml +327 -0
- data/data/plates/_decode/fr-departements.yml +191 -0
- data/data/plates/_decode/gb-age-identifiers.yml +170 -0
- data/data/plates/_decode/gb-memory-tags.yml +202 -0
- data/data/plates/_decode/gr-prefectures.yml +1408 -0
- data/data/plates/_decode/hr-cities.yml +315 -0
- data/data/plates/_decode/ie-counties.yml +227 -0
- data/data/plates/_decode/in-state-codes.yml +169 -0
- data/data/plates/_decode/is-districts-1938.yml +116 -0
- data/data/plates/_decode/it-provinces.yml +348 -0
- data/data/plates/_decode/jp-office-marks.yml +960 -0
- data/data/plates/_decode/jp-use-marks.yml +205 -0
- data/data/plates/_decode/kr-authority-marks.yml +146 -0
- data/data/plates/_decode/kr-use-syllables.yml +194 -0
- data/data/plates/_decode/lu-series-order.yml +638 -0
- data/data/plates/_decode/mx-entity-series.yml +380 -0
- data/data/plates/_decode/my-index-marks.yml +271 -0
- data/data/plates/_decode/no-counties-1913.yml +148 -0
- data/data/plates/_decode/no-districts.yml +901 -0
- data/data/plates/_decode/pl-powiats.yml +567 -0
- data/data/plates/_decode/pt-trailer-services.yml +96 -0
- data/data/plates/_decode/ro-counties.yml +213 -0
- data/data/plates/_decode/se-diplomatic.yml +220 -0
- data/data/plates/_decode/si-regions.yml +123 -0
- data/data/plates/_decode/sk-districts.yml +314 -0
- data/data/plates/_decode/th-registration-elements.yml +208 -0
- data/data/plates/_decode/ua-regions.yml +393 -0
- data/data/plates/_decode/za-licence-marks.yml +215 -0
- data/data/plates/_meta/classes.yml +1 -0
- data/data/plates/_meta/separators.yml +102 -0
- data/data/plates/ad.yml +961 -0
- data/data/plates/ar.yml +762 -0
- data/data/plates/at.yml +1424 -0
- data/data/plates/au-act.yml +472 -0
- data/data/plates/au-nsw.yml +282 -0
- data/data/plates/au-nt.yml +431 -0
- data/data/plates/au-qld.yml +272 -0
- data/data/plates/au-sa.yml +248 -0
- data/data/plates/au-tas.yml +302 -0
- data/data/plates/au-vic.yml +215 -0
- data/data/plates/au-wa.yml +309 -0
- data/data/plates/be.yml +1840 -0
- data/data/plates/br.yml +1152 -0
- data/data/plates/ca-ab.yml +430 -0
- data/data/plates/ca-bc.yml +697 -0
- data/data/plates/ca-mb.yml +499 -0
- data/data/plates/ca-nb.yml +537 -0
- data/data/plates/ca-nl.yml +743 -0
- data/data/plates/ca-ns.yml +808 -0
- data/data/plates/ca-nt.yml +610 -0
- data/data/plates/ca-nu.yml +280 -0
- data/data/plates/ca-on.yml +881 -0
- data/data/plates/ca-pe.yml +592 -0
- data/data/plates/ca-qc.yml +1036 -0
- data/data/plates/ca-sk.yml +256 -0
- data/data/plates/ca-yt.yml +656 -0
- data/data/plates/ch.yml +1273 -0
- data/data/plates/cn.yml +1431 -0
- data/data/plates/cy.yml +688 -0
- data/data/plates/cz.yml +1179 -0
- data/data/plates/de.yml +553 -118
- data/data/plates/dk.yml +1647 -0
- data/data/plates/ee.yml +1275 -0
- data/data/plates/es.yml +228 -32
- data/data/plates/fi.yml +1271 -0
- data/data/plates/fr.yml +1265 -0
- data/data/plates/gb.yml +1188 -0
- data/data/plates/gr.yml +721 -0
- data/data/plates/hr.yml +860 -0
- data/data/plates/hu.yml +959 -0
- data/data/plates/ie.yml +775 -0
- data/data/plates/in.yml +1172 -0
- data/data/plates/is.yml +667 -0
- data/data/plates/it.yml +1317 -0
- data/data/plates/jp.yml +3650 -0
- data/data/plates/kr.yml +1375 -0
- data/data/plates/li.yml +1010 -0
- data/data/plates/lt.yml +879 -0
- data/data/plates/lu.yml +842 -0
- data/data/plates/lv.yml +924 -0
- data/data/plates/mc.yml +1024 -0
- data/data/plates/mt.yml +854 -0
- data/data/plates/mx.yml +1372 -0
- data/data/plates/my.yml +685 -0
- data/data/plates/nl.yml +44 -0
- data/data/plates/no.yml +1018 -0
- data/data/plates/nz.yml +1699 -0
- data/data/plates/pl.yml +1296 -0
- data/data/plates/pt.yml +847 -0
- data/data/plates/ro.yml +785 -0
- data/data/plates/se.yml +1091 -0
- data/data/plates/si.yml +1105 -0
- data/data/plates/sk.yml +1439 -0
- data/data/plates/sm.yml +1119 -0
- data/data/plates/th.yml +1150 -0
- data/data/plates/ua.yml +1672 -0
- data/data/plates/us-ak.yml +763 -0
- data/data/plates/us-al.yml +457 -0
- data/data/plates/us-ar.yml +427 -0
- data/data/plates/us-as.yml +454 -0
- data/data/plates/us-az.yml +430 -0
- data/data/plates/us-ca.yml +892 -0
- data/data/plates/us-co.yml +452 -0
- data/data/plates/us-ct.yml +427 -0
- data/data/plates/us-dc.yml +614 -0
- data/data/plates/us-de.yml +551 -0
- data/data/plates/us-fl.yml +319 -96
- data/data/plates/us-ga.yml +644 -0
- data/data/plates/us-gu.yml +658 -0
- data/data/plates/us-hi.yml +585 -0
- data/data/plates/us-ia.yml +438 -0
- data/data/plates/us-id.yml +531 -0
- data/data/plates/us-il.yml +516 -0
- data/data/plates/us-in.yml +324 -0
- data/data/plates/us-ks.yml +351 -0
- data/data/plates/us-ky.yml +770 -0
- data/data/plates/us-la.yml +568 -0
- data/data/plates/us-ma.yml +379 -0
- data/data/plates/us-md.yml +536 -0
- data/data/plates/us-me.yml +445 -0
- data/data/plates/us-mi.yml +408 -0
- data/data/plates/us-mn.yml +411 -0
- data/data/plates/us-mo.yml +356 -0
- data/data/plates/us-mp.yml +402 -0
- data/data/plates/us-ms.yml +432 -0
- data/data/plates/us-mt.yml +619 -0
- data/data/plates/us-nc.yml +602 -0
- data/data/plates/us-nd.yml +419 -0
- data/data/plates/us-ne.yml +483 -0
- data/data/plates/us-nh.yml +394 -0
- data/data/plates/us-nj.yml +547 -0
- data/data/plates/us-nm.yml +574 -0
- data/data/plates/us-nv.yml +655 -0
- data/data/plates/us-ny.yml +592 -0
- data/data/plates/us-oh.yml +404 -0
- data/data/plates/us-ok.yml +513 -0
- data/data/plates/us-or.yml +392 -0
- data/data/plates/us-pa.yml +506 -0
- data/data/plates/us-pr.yml +507 -0
- data/data/plates/us-ri.yml +445 -0
- data/data/plates/us-sc.yml +605 -0
- data/data/plates/us-sd.yml +428 -0
- data/data/plates/us-tn.yml +471 -0
- data/data/plates/us-tx.yml +535 -0
- data/data/plates/us-ut.yml +384 -0
- data/data/plates/us-va.yml +567 -0
- data/data/plates/us-vi.yml +489 -0
- data/data/plates/us-vt.yml +458 -0
- data/data/plates/us-wa.yml +484 -0
- data/data/plates/us-wi.yml +509 -0
- data/data/plates/us-wv.yml +446 -0
- data/data/plates/us-wy.yml +523 -0
- data/data/plates/va.yml +604 -0
- data/data/plates/za.yml +1141 -0
- data/data/vehicles.json +160653 -105090
- data/lib/vehicles/configuration.rb +17 -3
- data/lib/vehicles/dataset.rb +73 -18
- data/lib/vehicles/fuzzy.rb +115 -0
- data/lib/vehicles/http.rb +48 -0
- data/lib/vehicles/make.rb +36 -6
- data/lib/vehicles/mcp_server.rb +5 -5
- data/lib/vehicles/model.rb +21 -2
- data/lib/vehicles/plates/series.rb +172 -18
- data/lib/vehicles/plates/template_fill.rb +188 -0
- data/lib/vehicles/plates/templates.rb +162 -0
- data/lib/vehicles/plates.rb +12 -0
- data/lib/vehicles/providers/hosted_provider.rb +28 -55
- data/lib/vehicles/validators/vehicle_make_validator.rb +3 -1
- data/lib/vehicles/validators/vehicle_model_validator.rb +1 -1
- data/lib/vehicles/version.rb +1 -1
- data/lib/vehicles.rb +32 -16
- data/rakelib/data_refresh.rake +109 -0
- data/rakelib/plates_refresh.rake +29 -0
- data/sig/vehicles.rbs +18 -0
- metadata +164 -2
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
# plates/_decode/my-index-marks.yml — the decodable elements of a Malaysian
|
|
2
|
+
# registration number. DRAFT for verification.
|
|
3
|
+
#
|
|
4
|
+
# ===========================================================================
|
|
5
|
+
# THE SOURCE FINDING, AND IT IS THE GERMAN RESULT RATHER THAN THE IRISH ONE
|
|
6
|
+
# ===========================================================================
|
|
7
|
+
# The Road Transport Act 1987 (Act 333) s. 11(1)(a) requires the Director to
|
|
8
|
+
# assign "THE PRESCRIBED INDEX MARK indicating the registration area in which
|
|
9
|
+
# the vehicle is registered or the status of the owner of the motor vehicle and
|
|
10
|
+
# a separate number". The Act therefore guarantees that this table EXISTS and
|
|
11
|
+
# that it means what it means — area, or owner status — and says nothing about
|
|
12
|
+
# its contents. "Prescribed" points at the Motor Vehicles (Registration and
|
|
13
|
+
# Licensing) Rules 1959, and THAT INSTRUMENT IS NOT ONLINE: the Attorney
|
|
14
|
+
# General's Chambers federal-legislation portal carries 727 subsidiary
|
|
15
|
+
# instruments under Act 333, the oldest from 2000, and the Registration and
|
|
16
|
+
# Licensing Rules appear only as amendments (P.U. (A) 79/2012, 94/2012,
|
|
17
|
+
# 100/2018, 98/2019, 177/2019, 36/2023, 177/2024, 464/2025). No located
|
|
18
|
+
# instrument prescribes an index mark.
|
|
19
|
+
#
|
|
20
|
+
# So every row in section 1 below is sourced to THE AUTHORITY'S OWN LIVE
|
|
21
|
+
# SYSTEM, not to the instrument that legally prescribes it, and carries
|
|
22
|
+
# `evidence: agency-api`. This is precisely the posture plates/_decode/ takes
|
|
23
|
+
# for German district codes, and it is recorded rather than papered over.
|
|
24
|
+
#
|
|
25
|
+
# HOW SECTION 1 WAS OBTAINED — mechanically, from two JPJ endpoints:
|
|
26
|
+
# * GET https://portal-api.jpj.gov.my/api/locations
|
|
27
|
+
# -> the closed list of registration areas and their codes (32 rows,
|
|
28
|
+
# 2026-08-03). This is the list JPJ's own public enquiry form is
|
|
29
|
+
# built from.
|
|
30
|
+
# * POST https://portal-api.jpj.gov.my/api/semak-no-pendaftaran-terkini
|
|
31
|
+
# -> for a given area code, THE REGISTRATION NUMBER CURRENTLY BEING
|
|
32
|
+
# ISSUED in that area, with the authority's own server timestamp.
|
|
33
|
+
# Called once per code, 2026-08-03 00:47:43 to 00:49:21 (+08).
|
|
34
|
+
# 28 of 32 returned a reading.
|
|
35
|
+
# The second endpoint is the closest thing Malaysia has to the registry
|
|
36
|
+
# corpora PRD-PLATES §5.2 uses elsewhere: it is the authority stating, on the
|
|
37
|
+
# record and to the minute, what it is issuing. Those readings are the evidence
|
|
38
|
+
# behind BOTH standard series in plates/my.yml and are reproduced per row as
|
|
39
|
+
# `observed_2026_08_03`.
|
|
40
|
+
#
|
|
41
|
+
# ===========================================================================
|
|
42
|
+
# THE DISAGREEMENT BETWEEN JPJ'S OWN TWO PUBLICATIONS — RECORDED, NOT AVERAGED
|
|
43
|
+
# ===========================================================================
|
|
44
|
+
# The JPJ portal page captured 2025-04-13 renders the SAME selector as a plain
|
|
45
|
+
# HTML <select> with THIRTY-SIX options, four of which duplicate a code that is
|
|
46
|
+
# already present with a different office name:
|
|
47
|
+
# QS = Sibu AND QS = Mukah
|
|
48
|
+
# QB = Sri Aman AND QB = Betong
|
|
49
|
+
# QL = Limbang AND QL = Lawas
|
|
50
|
+
# SS = Sandakan AND SM = Sandakan (two codes, one town)
|
|
51
|
+
# The 2026 JSON API returns THIRTY-TWO rows, keeping only the LATER member of
|
|
52
|
+
# each colliding pair — so Sibu, Sri Aman and Limbang, which are real Sarawak
|
|
53
|
+
# divisions with real plates on the road, have no row in the live list at all.
|
|
54
|
+
# Both captures are recorded below and neither is silently preferred
|
|
55
|
+
# (PRD-PLATES §5.3: record disagreements, never average them). The practical
|
|
56
|
+
# reading is that the JPJ code is a QUERY KEY for a counter, not a bijection
|
|
57
|
+
# with a place, and a decode consumer must treat the mapping as MANY-TO-ONE in
|
|
58
|
+
# both directions.
|
|
59
|
+
#
|
|
60
|
+
# ===========================================================================
|
|
61
|
+
# WHAT THE CODE IS *NOT* — the trap that would make a parse API lie
|
|
62
|
+
# ===========================================================================
|
|
63
|
+
# THE JPJ AREA CODE IS NOT ALWAYS THE PRINTED PREFIX. Three of the live
|
|
64
|
+
# readings prove it outright: querying ST (Tawau) returns SWR 9584; querying SD
|
|
65
|
+
# (Lahad Datu) returns SPA 3076; querying SA (Kota Kinabalu) returns SJT 4199.
|
|
66
|
+
# The printed prefix in East Malaysia is S or Q plus a running letter pair that
|
|
67
|
+
# has drifted well past the two-letter division code. A decoder must therefore
|
|
68
|
+
# read only the FIRST letter as jurisdiction-bearing (S = Sabah, Q = Sarawak,
|
|
69
|
+
# and the single peninsular letters), and must NOT assume the first two letters
|
|
70
|
+
# name a division. In peninsular Malaysia the first letter alone is the mark and
|
|
71
|
+
# the rest is sequence: APK is Perak's A, not a code "AP".
|
|
72
|
+
#
|
|
73
|
+
# Referenced by plates/my.yml from every series' `region_encoding`.
|
|
74
|
+
jurisdiction: my
|
|
75
|
+
topic: index-marks
|
|
76
|
+
authority:
|
|
77
|
+
name: Jabatan Pengangkutan Jalan Malaysia (JPJ) — Road Transport Department Malaysia
|
|
78
|
+
url: "https://www.jpj.gov.my/"
|
|
79
|
+
sources:
|
|
80
|
+
- "https://portal-api.jpj.gov.my/api/locations # JPJ portal location API — the closed list of 32 registration areas and their codes, as served to the public 'Semakan Nombor Pendaftaran Terkini' form. Queried 2026-08-03"
|
|
81
|
+
- "https://portal-api.jpj.gov.my/api/semak-no-pendaftaran-terkini # JPJ 'latest registration number' API — the number currently being issued per area, with the authority's own timestamp. Queried per code 2026-08-03 00:47:43-00:49:21 (+08); 28 of 32 codes returned a reading"
|
|
82
|
+
- "https://web.archive.org/web/20250413135106/https://www.jpj.gov.my/en/web/main-site/semakan-nombor-pendaftaran-terkini # the same selector as a 36-option HTML <select>, capturing the four colliding codes the 2026 API drops. Accessed 2026-08-02"
|
|
83
|
+
- "https://lom.agc.gov.my/ilims/upload/portal/akta/outputaktap/1871744_BI/Act%20333_Final_15%20Oct%202023%20(25.3.24).pdf # Road Transport Act 1987 s. 11(1)(a) — the statutory existence and meaning of the index mark, and the delegation that makes this table an agency artefact rather than a statutory one. Accessed 2026-08-02"
|
|
84
|
+
- "https://web.archive.org/web/20140714163606/http://www.kln.gov.my/web/guest/diplomat # Ministry of Foreign Affairs Malaysia (Wisma Putra), Protocol > Foreign Missions > Diplomat, 'MOTOR VEHICLES' paras 6.4-6.11 — the complete DC, CC and UN allocation tables in sections 2-4 below. Accessed 2026-08-02"
|
|
85
|
+
accessed: "2026-08-03"
|
|
86
|
+
period: { start: 1987 }
|
|
87
|
+
period_evidence: instrument-in-force
|
|
88
|
+
period_note: >-
|
|
89
|
+
1987 is the Road Transport Act now in force, NOT the date these marks were
|
|
90
|
+
allotted. The peninsular single letters are conventionally traced to a 1948
|
|
91
|
+
rationalisation of the pre-war two-letter marks (PK -> A for Perak, JB -> J
|
|
92
|
+
for Johor and so on) and the Sabah/Sarawak Q and S systems to 1963-1991
|
|
93
|
+
reorganisations; none of those dates is sourced to an instrument here and
|
|
94
|
+
none is asserted. Rows added later carry their own `since:` where a date was
|
|
95
|
+
found; where none was, the row carries no date rather than a guessed one.
|
|
96
|
+
|
|
97
|
+
# ---------------------------------------------------------------------------
|
|
98
|
+
# 1. REGISTRATION AREAS AND THEIR INDEX MARKS
|
|
99
|
+
# `code` is JPJ's own key. `printed_prefix_first_letter` is the part a
|
|
100
|
+
# decoder may rely on. `observed_2026_08_03` is the authority's live counter
|
|
101
|
+
# at the moment of capture and is EVIDENCE, not a format claim.
|
|
102
|
+
# ---------------------------------------------------------------------------
|
|
103
|
+
areas:
|
|
104
|
+
peninsular:
|
|
105
|
+
note: >-
|
|
106
|
+
Peninsular states and the three federal territories. The INDEX MARK IS
|
|
107
|
+
THE FIRST LETTER ONLY; the second and third letters are sequence. Note
|
|
108
|
+
that E, G, H, U, X and Y open no peninsular registration (H is the hire
|
|
109
|
+
prefix, see plates/my.yml my-taxi), and that I, O and Z are never issued
|
|
110
|
+
at all.
|
|
111
|
+
codes:
|
|
112
|
+
- { code: A, area: Perak, printed_prefix_first_letter: A, observed_2026_08_03: "APK 4191", form: prefix, evidence: agency-api }
|
|
113
|
+
- { code: B, area: Selangor, printed_prefix_first_letter: B, observed_2026_08_03: "BSS 3435", form: prefix, evidence: agency-api }
|
|
114
|
+
- { code: C, area: Pahang, printed_prefix_first_letter: C, observed_2026_08_03: "CFH 3542", form: prefix, evidence: agency-api }
|
|
115
|
+
- { code: D, area: Kelantan, printed_prefix_first_letter: D, observed_2026_08_03: "DFQ 9814", form: prefix, evidence: agency-api }
|
|
116
|
+
- { code: F, area: "Wilayah Persekutuan Putrajaya", printed_prefix_first_letter: F, observed_2026_08_03: null, form: prefix, evidence: agency-api, note: "listed by the API; the live counter did not return a reading in this pass. Putrajaya's F series is issued in short lettered runs (FA, FB, FC …) rather than continuously, which is consistent with a null reading but does not explain it — recorded as observed, not interpreted." }
|
|
117
|
+
- { code: J, area: Johor, printed_prefix_first_letter: J, observed_2026_08_03: "JB 6419 J", form: suffix, evidence: agency-api, note: "Johor runs the SUFFIX form: the trailing J is a series letter, not part of the index mark" }
|
|
118
|
+
- { code: K, area: Kedah, printed_prefix_first_letter: K, observed_2026_08_03: "KGH 3943", form: prefix, evidence: agency-api }
|
|
119
|
+
- { code: KV, area: Langkawi, printed_prefix: KV, observed_2026_08_03: "KV 859 F", form: suffix, evidence: agency-api, note: "the one peninsular area whose printed prefix is genuinely two letters, and it sits INSIDE Kedah — Langkawi is a duty-free island district with its own mark and its own suffix arrangement" }
|
|
120
|
+
- { code: L, area: "Wilayah Persekutuan Labuan", printed_prefix_first_letter: L, observed_2026_08_03: "LH 6757", form: prefix, evidence: agency-api, note: "Labuan is geographically off Sabah but registers under a peninsular-style single letter, having been reinstated as a federal territory" }
|
|
121
|
+
- { code: M, area: Melaka, printed_prefix_first_letter: M, observed_2026_08_03: "MEG 6121", form: prefix, evidence: agency-api }
|
|
122
|
+
- { code: N, area: "Negeri Sembilan", printed_prefix_first_letter: N, observed_2026_08_03: "NEL 2986", form: prefix, evidence: agency-api }
|
|
123
|
+
- { code: P, area: "Pulau Pinang", printed_prefix_first_letter: P, observed_2026_08_03: "PSE 4213", form: prefix, evidence: agency-api }
|
|
124
|
+
- { code: R, area: Perlis, printed_prefix_first_letter: R, observed_2026_08_03: null, form: prefix, evidence: agency-api, note: "present in the API's location list; the counter returned no reading in this pass. Perlis is Malaysia's smallest state by registrations." }
|
|
125
|
+
- { code: T, area: Terengganu, printed_prefix_first_letter: T, observed_2026_08_03: "TDH 3264", form: prefix, evidence: agency-api }
|
|
126
|
+
- { code: W, area: "Wilayah Persekutuan Kuala Lumpur", printed_prefix_first_letter: "W or V", observed_2026_08_03: "VRJ 7380", form: prefix, evidence: agency-api, note: "THE MOST VALUABLE SINGLE DATUM IN THIS TABLE. JPJ keys Kuala Lumpur as area code W and its live counter returns a V number. That is the authority's own statement that V IS THE CONTINUATION OF THE W REGISTRATION AREA — one area, two index marks, W exhausted and V in issue. Every secondary account asserts this; this is the primary that carries it. A decoder must map BOTH W and V to Kuala Lumpur." }
|
|
127
|
+
sabah:
|
|
128
|
+
note: >-
|
|
129
|
+
Sabah registrations all begin S. The second letter historically named the
|
|
130
|
+
division, and the live readings show the running sequence has drifted past
|
|
131
|
+
it — querying the division code returns a number whose second letter is
|
|
132
|
+
something else entirely. Read only the leading S as jurisdiction-bearing.
|
|
133
|
+
codes:
|
|
134
|
+
- { code: SA, area: "Kota Kinabalu (West Coast)", observed_2026_08_03: "SJT 4199", form: prefix, evidence: agency-api, note: "queried as SA, issuing SJ-series — the drift is explicit here" }
|
|
135
|
+
- { code: SB, area: Beaufort, observed_2026_08_03: "SB 1644 L", form: suffix, evidence: agency-api }
|
|
136
|
+
- { code: SD, area: "Lahat Datu", observed_2026_08_03: "SPA 3076", form: prefix, evidence: agency-api, note: "JPJ spells it 'Lahat Datu'; the town is conventionally Lahad Datu. The authority's spelling is kept, per PRD-PLATES §5.3." }
|
|
137
|
+
- { code: SK, area: Kudat, observed_2026_08_03: "SK 4097 H", form: suffix, evidence: agency-api }
|
|
138
|
+
- { code: SM, area: Sandakan, observed_2026_08_03: null, form: unknown, evidence: agency-api, note: "one of TWO codes JPJ maps to Sandakan; see the disagreement note in the header" }
|
|
139
|
+
- { code: SS, area: Sandakan, observed_2026_08_03: "SMW 5063", form: prefix, evidence: agency-api, note: "queried as SS, issuing SM-series" }
|
|
140
|
+
- { code: ST, area: Tawau, observed_2026_08_03: "SWR 9584", form: prefix, evidence: agency-api, note: "queried as ST, issuing SW-series" }
|
|
141
|
+
- { code: SU, area: Keningau, observed_2026_08_03: "SU 7665 Q", form: suffix, evidence: agency-api, note: "a Q SUFFIX, which contradicts the secondary claim that Q and S are avoided as East Malaysian suffixes — recorded as counter-evidence in plates/my.yml my-standard-suffix" }
|
|
142
|
+
sarawak:
|
|
143
|
+
note: >-
|
|
144
|
+
Sarawak registrations all begin Q. Same drift and same reading rule as
|
|
145
|
+
Sabah. Sarawak moved to the Q system in the early 1990s; the date is not
|
|
146
|
+
sourced here.
|
|
147
|
+
codes:
|
|
148
|
+
- { code: QA, area: Kuching, observed_2026_08_03: "QAB 3426 P", form: suffix, evidence: agency-api, note: "three-letter prefix AND a suffix — the fullest Malaysian mark shape in the live sample" }
|
|
149
|
+
- { code: QB, area: Betong, observed_2026_08_03: "QBH 8695", form: prefix, evidence: agency-api, note: "the 2025 HTML selector maps QB to BOTH Sri Aman and Betong; the 2026 API keeps only Betong" }
|
|
150
|
+
- { code: QC, area: "Kota Samarahan", observed_2026_08_03: "QCW 4437", form: prefix, evidence: agency-api }
|
|
151
|
+
- { code: QL, area: Lawas, observed_2026_08_03: "QLG 4546", form: prefix, evidence: agency-api, note: "the 2025 selector maps QL to BOTH Limbang and Lawas; the 2026 API keeps only Lawas" }
|
|
152
|
+
- { code: QM, area: Miri, observed_2026_08_03: "QM 5771 U", form: suffix, evidence: agency-api }
|
|
153
|
+
- { code: QP, area: Kapit, observed_2026_08_03: "QPD 9177", form: prefix, evidence: agency-api }
|
|
154
|
+
- { code: QR, area: Sarikei, observed_2026_08_03: "QRY 2592", form: prefix, evidence: agency-api }
|
|
155
|
+
- { code: QS, area: Mukah, observed_2026_08_03: "QS 5608 Y", form: suffix, evidence: agency-api, note: "the 2025 selector maps QS to BOTH Sibu and Mukah; the 2026 API keeps only Mukah" }
|
|
156
|
+
- { code: QT, area: Bintulu, observed_2026_08_03: null, form: unknown, evidence: agency-api }
|
|
157
|
+
dropped_by_the_live_api:
|
|
158
|
+
note: >-
|
|
159
|
+
Present in JPJ's 2025 HTML selector, ABSENT from its 2026 JSON API because
|
|
160
|
+
each collides with a code the API resolves to another office. They are
|
|
161
|
+
real Sarawak divisions with plates on the road and are recorded here so
|
|
162
|
+
that a decoder does not conclude the codes are unallocated.
|
|
163
|
+
codes:
|
|
164
|
+
- { code: QS, area: Sibu, evidence: agency-page-2025, collides_with: "QS = Mukah in the 2026 API" }
|
|
165
|
+
- { code: QB, area: "Sri Aman", evidence: agency-page-2025, collides_with: "QB = Betong in the 2026 API" }
|
|
166
|
+
- { code: QL, area: Limbang, evidence: agency-page-2025, collides_with: "QL = Lawas in the 2026 API" }
|
|
167
|
+
never_issued:
|
|
168
|
+
letters: [I, O, Z]
|
|
169
|
+
note: >-
|
|
170
|
+
I and O are never issued anywhere in the system (confusable with 1 and 0);
|
|
171
|
+
Z is reserved for the Malaysian Armed Forces. Consistent with all 28 live
|
|
172
|
+
readings and with the absence of any I/O/Z code from JPJ's area list.
|
|
173
|
+
Sourced to the Malay and English Wikipedia articles — `secondary-wikipedia`
|
|
174
|
+
— and NOT to any instrument. THERE IS NO MALAYSIAN "NO VOWELS" RULE: A is
|
|
175
|
+
Perak's mark, and the live sample contains APK, SPA, QAB, SU…U and QM…U.
|
|
176
|
+
|
|
177
|
+
# ---------------------------------------------------------------------------
|
|
178
|
+
# 2. DIPLOMATIC CORPS ("DC") — allocation by rank.
|
|
179
|
+
# PRIMARY, from the Ministry of Foreign Affairs, and closed.
|
|
180
|
+
# ---------------------------------------------------------------------------
|
|
181
|
+
diplomatic_dc:
|
|
182
|
+
authority: "Ministry of Foreign Affairs, Malaysia (Wisma Putra), Protocol Department — 'MOTOR VEHICLES', paras 6.4-6.9"
|
|
183
|
+
marking: DC
|
|
184
|
+
colour_rule: >-
|
|
185
|
+
Para 6.9, verbatim: "All motor vehicles for diplomats and the Chief
|
|
186
|
+
Representative from the Regional Office of the United Nations will bear
|
|
187
|
+
white numbers on red field with the markings of 'DC' or 'UN' respectively."
|
|
188
|
+
/ "All motor vehicles for the foreign mission including the consular corps
|
|
189
|
+
and Offices of the United Nations will bear white numbers on black field
|
|
190
|
+
with the markings of 'DC', 'CC' or 'UN' respectively." RED = an accredited
|
|
191
|
+
PERSON. BLACK = an INSTITUTION.
|
|
192
|
+
retention_rule: >-
|
|
193
|
+
Para 6.5: "A diplomat serving in Malaysia will be given one 'DC' number
|
|
194
|
+
according to his ranking. Hence he is required to retain the number plate
|
|
195
|
+
even when he disposes after 18 months or more as the same number will be
|
|
196
|
+
given to his new car upon approval from the Ministry of Foreign Affairs."
|
|
197
|
+
ranks:
|
|
198
|
+
- { number: "01", holder: "Head of Mission's official car" }
|
|
199
|
+
- { number: "02, 03", holder: "Head of Mission's personal car" }
|
|
200
|
+
- { number: "04", holder: "Deputy Chief of Mission / Deputy High Commissioner / Minister" }
|
|
201
|
+
- { number: "05", holder: "Minister Counsellor" }
|
|
202
|
+
- { number: "06-09", holder: "Counsellor" }
|
|
203
|
+
- { number: "10-19", holder: "First Secretary" }
|
|
204
|
+
- { number: "20-29", holder: "Second Secretary" }
|
|
205
|
+
- { number: "30-39", holder: "Third Secretary" }
|
|
206
|
+
- { number: "40-59", holder: "Attaché, including Military Advisers, Trade Representatives, Defence Advisers and other similar ranks" }
|
|
207
|
+
- { number: "60-99", holder: "the SECOND duty-free car of a diplomat entitled to two (para 6.6)" }
|
|
208
|
+
- { number: "101 and above", holder: "vehicles registered in the name of the foreign mission (para 6.8)" }
|
|
209
|
+
chargé_note: "Para 6.7: 'Personal cars of Charge d' Affaires will be numbered according to their respective ranks.'"
|
|
210
|
+
gap: >-
|
|
211
|
+
THE COUNTRY-CODE TABLE IS NOT ON THIS PAGE and was not located anywhere.
|
|
212
|
+
The number group above is the RANK group; the sending state's code is a
|
|
213
|
+
separate printed group whose allocation is unsourced. PRD-PLATES puts
|
|
214
|
+
diplomatic decode tables at L4 and this one is deliberately left there
|
|
215
|
+
rather than guessed.
|
|
216
|
+
|
|
217
|
+
# ---------------------------------------------------------------------------
|
|
218
|
+
# 3. CONSULAR CORPS ("CC") — allocation by CONSULAR DISTRICT, which makes this
|
|
219
|
+
# a genuine geographic decode dimension. PRIMARY and closed.
|
|
220
|
+
# ---------------------------------------------------------------------------
|
|
221
|
+
consular_cc:
|
|
222
|
+
authority: "Wisma Putra, 'MOTOR VEHICLES', para 6.10"
|
|
223
|
+
marking: CC
|
|
224
|
+
colour: "white numbers on black field (para 6.9)"
|
|
225
|
+
columns: ["head of consular mission", "heads of consular offices", "vehicles registered in the name of the consular mission"]
|
|
226
|
+
districts:
|
|
227
|
+
- { district: "Kuala Lumpur", head_of_mission: "01", office_heads: "10-19", mission_registered: "100-199" }
|
|
228
|
+
- { district: "Penang", head_of_mission: "02", office_heads: "20-29", mission_registered: "200-299" }
|
|
229
|
+
- { district: "Kota Bharu", head_of_mission: "03", office_heads: "30-39", mission_registered: "300-399" }
|
|
230
|
+
- { district: "Kota Kinabalu", head_of_mission: "04", office_heads: "40-49", mission_registered: "400-499" }
|
|
231
|
+
- { district: "Kuching", head_of_mission: "05", office_heads: "50-59", mission_registered: "500-599" }
|
|
232
|
+
- { district: "for other missions established hereafter", head_of_mission: "06, 07, 08, 09", office_heads: "60-69, 70-79, 80-89, 90-99", mission_registered: "600-699, 700-799, 800-899, 900-999" }
|
|
233
|
+
honorary_consuls: >-
|
|
234
|
+
Same page, verbatim: "Honorary Consuls are only issued with ID cards." There
|
|
235
|
+
is NO Malaysian honorary-consul plate — a clean negative fact, and the exact
|
|
236
|
+
opposite of Thailand, which gives honorary consuls their own grey plate.
|
|
237
|
+
decode_rule: >-
|
|
238
|
+
The LEADING DIGIT of a Malaysian CC number is the consular district
|
|
239
|
+
(1 = Kuala Lumpur, 2 = Penang, 3 = Kota Bharu, 4 = Kota Kinabalu,
|
|
240
|
+
5 = Kuching) and its MAGNITUDE is the holder class (one digit = head of
|
|
241
|
+
mission, two digits = head of a consular office, three digits = the mission
|
|
242
|
+
itself). That is a real, primary-sourced, two-dimensional decode.
|
|
243
|
+
|
|
244
|
+
# ---------------------------------------------------------------------------
|
|
245
|
+
# 4. UNITED NATIONS ("UN"). PRIMARY and closed as far as the page goes.
|
|
246
|
+
# ---------------------------------------------------------------------------
|
|
247
|
+
united_nations:
|
|
248
|
+
authority: "Wisma Putra, 'MOTOR VEHICLES', para 6.11"
|
|
249
|
+
marking: UN
|
|
250
|
+
allocation:
|
|
251
|
+
- { number: "01", holder: "official car of the Head of a United Nations Office or Specialised Agency" }
|
|
252
|
+
- { number: "02-05", holder: "personal car (if any) of that Head" }
|
|
253
|
+
- { number: "06-99", holder: "cars registered in the name of other UN officials" }
|
|
254
|
+
- { number: "101 and above", holder: "cars registered in the name of the UN Office or Specialised Agency" }
|
|
255
|
+
agency_numbers:
|
|
256
|
+
- { agency: UNDP, printed: "10 UN" }
|
|
257
|
+
- { agency: WHO, printed: "11 UN" }
|
|
258
|
+
- { agency: FAO, printed: "12 UN" }
|
|
259
|
+
- { agency: UNHCR, printed: "14 UN" }
|
|
260
|
+
agency_note: >-
|
|
261
|
+
Four agencies, and 13 IS SKIPPED. The page gives no reason and none is
|
|
262
|
+
invented here. The printed forms above are reproduced exactly as the
|
|
263
|
+
ministry writes them, which is why plates/my.yml my-un carries a
|
|
264
|
+
`recall-only` regex accepting both a one-group and a two-group arrangement:
|
|
265
|
+
"10 UN" and the two-group diplomatic-style form cannot both be described by
|
|
266
|
+
one strict grammar on this evidence.
|
|
267
|
+
colour: >-
|
|
268
|
+
RED field for the Chief Representative of the UN Regional Office; BLACK
|
|
269
|
+
field for UN Offices (para 6.9). JPJ's own specification page independently
|
|
270
|
+
lists "the UN" among those entitled to the red plate, alongside embassies
|
|
271
|
+
and the International Natural Rubber Association.
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
# plates/_decode/no-counties-1913.yml — the Norwegian SINGLE-letter county
|
|
2
|
+
# index, 1 April 1913 to 31 March 1971.
|
|
3
|
+
#
|
|
4
|
+
# PROVENANCE, STATED FIRST BECAUSE IT IS NOT UNIFORM. Two different things
|
|
5
|
+
# live in this file and they are sourced differently:
|
|
6
|
+
#
|
|
7
|
+
# * THE ERA'S BOUNDARIES ARE STATUTORY. Forskrift om bruk av kjøretøy
|
|
8
|
+
# (FOR-1990-01-25-92) § 2-16 is headed "Kjennemerke for registreringsordning
|
|
9
|
+
# før 1. april 1971" and gives the composition — "En bokstav og tre til
|
|
10
|
+
# seks tall" — in a regulation that is IN FORCE TODAY, because a 30-year-old
|
|
11
|
+
# vehicle may still be plated to the order of its first registration
|
|
12
|
+
# (§ 2-15). So the format and the closing date are primary.
|
|
13
|
+
# * THE LETTER-TO-COUNTY MAPPING IS NOT. No Norwegian instrument reachable in
|
|
14
|
+
# this pass enumerates it. The allocation was made by kongelig resolusjon
|
|
15
|
+
# of 18 March 1913 and amended by later royal resolutions, none of which is
|
|
16
|
+
# carried by lovdata (whose holdings begin far later) and none of which was
|
|
17
|
+
# retrieved. Every row below is therefore `secondary-wikipedia`, taken from
|
|
18
|
+
# no.wikipedia's article and re-expressed in this dataset's own shape and
|
|
19
|
+
# ordering — keyed by LETTER, which is the decode direction, rather than by
|
|
20
|
+
# the article's police-district arrangement.
|
|
21
|
+
#
|
|
22
|
+
# WHAT WAS DELIBERATELY NOT TAKEN. The source article also carries per-police-
|
|
23
|
+
# district NUMBER-RANGE allocations sourced to a 1936 almanac ("Hvem Hvad Hvor"
|
|
24
|
+
# 1936). Those are a single-year snapshot of an allocation that moved
|
|
25
|
+
# constantly, and shipping them would assert a period discipline the evidence
|
|
26
|
+
# cannot carry. They are omitted on purpose, not overlooked.
|
|
27
|
+
#
|
|
28
|
+
# THE ROWS ARE PERIODISED, because four of them genuinely move: G dies, Z is
|
|
29
|
+
# born, Q and P arrive late. Those four dates are the reason this table is
|
|
30
|
+
# worth having — a Norwegian plate reading "G-1234" cannot postdate 1930, and
|
|
31
|
+
# one reading "P-123" cannot predate 1967.
|
|
32
|
+
jurisdiction: "no"
|
|
33
|
+
topic: counties
|
|
34
|
+
authority:
|
|
35
|
+
name: Statens vegvesen (successor); the allocation was made by kongelig resolusjon
|
|
36
|
+
url: "https://lovdata.no/dokument/SF/forskrift/1990-01-25-92/KAPITTEL_2"
|
|
37
|
+
period: { start: 1913, end: 1971 }
|
|
38
|
+
period_evidence: statutory-date-end-secondary-start
|
|
39
|
+
period_note: >-
|
|
40
|
+
Both boundaries are dated to the day, from different tiers. START: the lov om
|
|
41
|
+
motorvogner of 21 June 1912 and the kongelig resolusjon of 18 March 1913 both
|
|
42
|
+
took effect on 1 APRIL 1913 (secondary-wikipedia — neither instrument was
|
|
43
|
+
retrieved). END: 31 MARCH 1971, which is primary — FOR-1990-01-25-92 § 2-16
|
|
44
|
+
names the order "før 1. april 1971" and § 2-17 opens the successor order "fra
|
|
45
|
+
og med 1. april 1971", so the boundary is stated in an in-force regulation
|
|
46
|
+
even though the 1913 instrument is not.
|
|
47
|
+
sources:
|
|
48
|
+
- "https://lovdata.no/dokument/SF/forskrift/1990-01-25-92/KAPITTEL_2 # FOR-1990-01-25-92 § 2-16: 'En bokstav og tre til seks tall', with a horizontal stroke at half height between letter and digits; § 2-15: the 30-year eligibility that keeps this order live. PRIMARY. Accessed 2026-08-02"
|
|
49
|
+
- "https://no.wikipedia.org/wiki/Kjennemerke_for_motorkj%C3%B8ret%C3%B8y_i_Norge # secondary-wikipedia (rev. 2026-07-16): EVERY letter-to-county row below; the 1912 lov / 1913 kgl.res. commencement of 1 April 1913; the Z (kgl.res. 20 April 1929), G (invalid 1 January 1931), Q (kgl.res. 12 July 1934 § 63) and P (1967) datings; the 1918 amt->fylke renaming; the June 1991 revival. Accessed 2026-08-02"
|
|
50
|
+
|
|
51
|
+
# ---------------------------------------------------------------------------
|
|
52
|
+
# THE LETTER INDEX. `amt` is the pre-1918 name of the unit, `fylke` the name it
|
|
53
|
+
# carried after the 1918 renaming took effect (1 January 1919) — the SAME
|
|
54
|
+
# territory under two names, not two allocations, which is why one row carries
|
|
55
|
+
# both. `period` is per row and closes at 1971 unless the letter died earlier.
|
|
56
|
+
# ---------------------------------------------------------------------------
|
|
57
|
+
letters:
|
|
58
|
+
A: { amt: "Kristiania amt", fylke: "Oslo", period: { start: 1913, end: 1971 } }
|
|
59
|
+
B: { amt: "Smaalenenes amt", fylke: "Østfold", period: { start: 1913, end: 1971 } }
|
|
60
|
+
C: { amt: "Akershus amt", fylke: "Akershus", period: { start: 1913, end: 1971 } }
|
|
61
|
+
D: { amt: "Hedemarkens amt", fylke: "Hedmark", period: { start: 1913, end: 1971 } }
|
|
62
|
+
E: { amt: "Kristians amt", fylke: "Oppland", period: { start: 1913, end: 1971 } }
|
|
63
|
+
F: { amt: "Buskeruds amt", fylke: "Buskerud", period: { start: 1913, end: 1971 } }
|
|
64
|
+
G:
|
|
65
|
+
amt: "Jarlsberg og Larviks amt"
|
|
66
|
+
fylke: "Vestfold"
|
|
67
|
+
period: { start: 1913, end: 1931 }
|
|
68
|
+
note: >-
|
|
69
|
+
WITHDRAWN, and the only letter in this table that was. G was invalid from
|
|
70
|
+
1 JANUARY 1931 because C and G proved too easy to confuse in traffic;
|
|
71
|
+
Vestfold had already begun issuing Z from 20 April 1929, and every G plate
|
|
72
|
+
was exchanged for a Z plate KEEPING THE SAME DIGITS over the winter of
|
|
73
|
+
1930/31. A "G-" plate is therefore a hard pre-1931 artefact, and its Z
|
|
74
|
+
twin carries the identical number.
|
|
75
|
+
H: { amt: "Bratsberg amt", fylke: "Telemark", period: { start: 1913, end: 1971 } }
|
|
76
|
+
I: { amt: "Nedenes amt", fylke: "Aust-Agder", period: { start: 1913, end: 1971 } }
|
|
77
|
+
K: { amt: "Lister og Mandals amt", fylke: "Vest-Agder", period: { start: 1913, end: 1971 } }
|
|
78
|
+
L: { amt: "Stavanger amt", fylke: "Rogaland", period: { start: 1913, end: 1971 } }
|
|
79
|
+
O:
|
|
80
|
+
amt: "Bergen amt"
|
|
81
|
+
fylke: "Bergen"
|
|
82
|
+
period: { start: 1913, end: 1971 }
|
|
83
|
+
note: >-
|
|
84
|
+
A CITY, not a county — Bergen was its own registration unit alongside
|
|
85
|
+
Hordaland (R). The royal household still holds O-1 for use in Bergen.
|
|
86
|
+
P:
|
|
87
|
+
fylke: "Svalbard"
|
|
88
|
+
period: { start: 1967, end: 1971 }
|
|
89
|
+
note: >-
|
|
90
|
+
SVALBARD, allocated only in 1967 — half a century after the rest of the
|
|
91
|
+
table. Svalbard's road network was privately owned by Store Norske
|
|
92
|
+
Spitsbergen Kulkompani, so P plates were YELLOW ON BLACK (the
|
|
93
|
+
not-approved-for-public-road colouring) and were not valid on the
|
|
94
|
+
mainland. P is one of the two letters NOT revived for veteran use in 1991.
|
|
95
|
+
Q:
|
|
96
|
+
fylke: "Ufortollete biler (uncustomed vehicles)"
|
|
97
|
+
period: { start: 1934, end: 1971 }
|
|
98
|
+
note: >-
|
|
99
|
+
NOT GEOGRAPHIC AT ALL — a nationwide series for the temporary registration
|
|
100
|
+
of vehicles on which customs duty had not been paid, introduced by
|
|
101
|
+
kongelig resolusjon of 12 July 1934 § 63. It is the direct ancestor of the
|
|
102
|
+
modern red-bordered export plate (`no-export-1971`), which replaced it in
|
|
103
|
+
1971. Q is the other letter not revived in 1991. A parse API must not
|
|
104
|
+
treat Q as a place.
|
|
105
|
+
R: { amt: "Søndre Bergenhus amt", fylke: "Hordaland", period: { start: 1913, end: 1971 } }
|
|
106
|
+
S: { amt: "Nordre Bergenhus amt", fylke: "Sogn og Fjordane", period: { start: 1913, end: 1971 } }
|
|
107
|
+
T: { amt: "Romsdals amt", fylke: "Møre og Romsdal", period: { start: 1913, end: 1971 } }
|
|
108
|
+
U: { amt: "Søndre Trondhjems amt", fylke: "Sør-Trøndelag", period: { start: 1913, end: 1971 } }
|
|
109
|
+
V: { amt: "Nordre Trondhjems amt", fylke: "Nord-Trøndelag", period: { start: 1913, end: 1971 } }
|
|
110
|
+
W: { amt: "Nordlands amt", fylke: "Nordland", period: { start: 1913, end: 1971 } }
|
|
111
|
+
X: { amt: "Tromsø amt", fylke: "Troms", period: { start: 1913, end: 1971 } }
|
|
112
|
+
Y: { amt: "Finmarken amt", fylke: "Finnmark", period: { start: 1913, end: 1971 } }
|
|
113
|
+
Z:
|
|
114
|
+
fylke: "Vestfold"
|
|
115
|
+
period: { start: 1929, end: 1971 }
|
|
116
|
+
note: "Vestfold from 20 April 1929, replacing G — see the G row."
|
|
117
|
+
|
|
118
|
+
letters_never_used: [J, M, N]
|
|
119
|
+
letters_never_used_note: >-
|
|
120
|
+
J, M and N appear nowhere in the allocation, and Æ, Ø and Å cannot be written
|
|
121
|
+
in this dataset's serial alphabet at all. Recorded as an observation about the
|
|
122
|
+
table, not as a sourced rule: no instrument stating a letter-exclusion policy
|
|
123
|
+
for the 1913 order was retrieved.
|
|
124
|
+
|
|
125
|
+
revival:
|
|
126
|
+
from: 1991
|
|
127
|
+
scope: >-
|
|
128
|
+
County letters came back into LIMITED use from June 1991: a vehicle
|
|
129
|
+
previously registered on a county-letter plate, or an imported vehicle of
|
|
130
|
+
model year 1970 or older, may be registered on one at the owner's choice,
|
|
131
|
+
with three to six digits in any combination — including the "telefonnummer"
|
|
132
|
+
grouping 00-00-00. Every previously used letter is available EXCEPT P and Q.
|
|
133
|
+
Unlike the 1913-1971 originals these plates follow the vehicle on sale.
|
|
134
|
+
authority_basis: >-
|
|
135
|
+
The current statutory hook is FOR-1990-01-25-92 §§ 2-15 to 2-18 (a vehicle
|
|
136
|
+
first registered more than 30 years ago may be plated to the order in force
|
|
137
|
+
at its first registration). The June 1991 start date and the P/Q exclusion
|
|
138
|
+
are secondary-wikipedia; no instrument dating the revival was retrieved.
|
|
139
|
+
source: "https://no.wikipedia.org/wiki/Kjennemerke_for_motorkj%C3%B8ret%C3%B8y_i_Norge # secondary-wikipedia (rev. 2026-07-16). Accessed 2026-08-02"
|
|
140
|
+
|
|
141
|
+
royal_household:
|
|
142
|
+
reserved: "A-1 to A-20, and O-1 (used only in Bergen)"
|
|
143
|
+
note: >-
|
|
144
|
+
The one part of this table that never lapsed: the royal household kept the
|
|
145
|
+
A-1..A-20 series through the 1971 cutover and still receives new
|
|
146
|
+
registrations on it. Ordinary plates are used when the vehicle is driven
|
|
147
|
+
without a member of the household aboard, and on sale.
|
|
148
|
+
source: "https://no.wikipedia.org/wiki/Kjennemerke_for_motorkj%C3%B8ret%C3%B8y_i_Norge # secondary-wikipedia (rev. 2026-07-16). Accessed 2026-08-02"
|