vehicles 0.4.0 → 0.6.1

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.
@@ -0,0 +1,972 @@
1
+ # plates/nl.yml — Netherlands (PRD-PLATES gate L0 pilot, COMPLETION PASS).
2
+ #
3
+ # Supersedes the 4-entry L0 seed. Entry ids from the seed are preserved
4
+ # verbatim (nl-sidecode11-moped, nl-sidecode11-agricultural,
5
+ # nl-sidecode11-car, nl-historic-darkblue) per the id contract
6
+ # (PRD-QUALITY I-5/I-6); their DATA is corrected where the RDW pages
7
+ # contradicted the seed — corrections are called out in each `notes`.
8
+ #
9
+ # THE NL MODELLING RULE (EU dossier finding 6, binding): a sidecode is a
10
+ # PATTERN identity, not a period — the same pattern reaches each vehicle
11
+ # category on its own date (RDW's official series table). One pattern ×
12
+ # one category-group = one series entry. Age inference is one-sided (a
13
+ # pattern gives the EARLIEST date; series run until exhausted). RDW says
14
+ # so in its own words on the series page: "Bij een nieuwe kentekenserie
15
+ # krijgen niet direct alle voertuigcategorieën deze combinatie. Eerst maken
16
+ # we de huidige serie 'vol', wat soms lang duurt."
17
+ #
18
+ # Dutch plates encode NO geography. Category IS encoded, in the first letter
19
+ # of the registration (RDW cijfers-en-letters page):
20
+ # M motorcycle · D/F moped · E special moped · V light commercial ·
21
+ # B heavy commercial · W trailer · O semi-trailer · GV border traffic ·
22
+ # T agricultural tractor/mobile machine/MMBS ·
23
+ # L agricultural trailer & interchangeable towed equipment ·
24
+ # passenger cars: G H J K L N P R S T X Z (L and T dropped from sidecode 11).
25
+ #
26
+ # REGEX POLICY IN THIS FILE (schema stressor, see the L0 report):
27
+ # `format.regex` is the LINT-ROUND-TRIPPABLE regex — the lint generates
28
+ # serials from `format.pattern` (L -> any A-Z, 9 -> any 0-9) and requires
29
+ # the regex to accept every one of them, so the regex can never be
30
+ # narrower than the pattern's own alphabet.
31
+ # `format.regex_strict` (NOT yet lint-validated — proposed amendment) is
32
+ # the regex the AUTHORITY actually supports: no vowels since sidecode 4,
33
+ # no C, no Q, and the category first-letter sets above. Consumers doing
34
+ # validation should prefer regex_strict; consumers doing recall should use
35
+ # regex. Where a single first letter is mandated and that letter is not
36
+ # "L" or "9", it is written as a literal in the pattern and regex needs no
37
+ # strict twin.
38
+ jurisdiction: nl
39
+ authority:
40
+ name: RDW (Dienst Wegverkeer)
41
+ url: "https://www.rdw.nl/de-kentekenplaat"
42
+ binding: vehicle # NL plates bind to the VEHICLE (contrast CH: owner)
43
+
44
+ # ---------------------------------------------------------------------------
45
+ # Jurisdiction-wide charset facts, cited once and referenced per series.
46
+ # ---------------------------------------------------------------------------
47
+ charset_defaults:
48
+ letters: [B, D, F, G, H, J, K, L, M, N, P, R, S, T, V, W, X, Y, Z]
49
+ excluded_letters: [A, E, I, O, U, C, Q]
50
+ excluded_letters_note: >-
51
+ "Sinds kentekencombinatie 4 gebruiken we geen klinkers meer in het kenteken
52
+ (met uitzondering van het kenteken voor opleggers). De letter C en Q
53
+ gebruiken we ook niet omdat deze letters teveel op een nul lijken."
54
+ Semi-trailer (oplegger) registrations are the stated exception and DO use
55
+ the vowel O.
56
+ excluded_combinations: [GVD, KKK, NSB, PKK, PSV, TBS, SS, SD, PVV, SGP, VVD, FVD, BBB]
57
+ source: "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # no vowels since combination 4 (opleggers excepted); no C/Q; the 13 forbidden letter combinations"
58
+
59
+ series:
60
+
61
+ # =========================================================================
62
+ # PASSENGER CARS — RDW table "Auto's". class standard, categories [car].
63
+ # First letter from {G H J K L N P R S T X Z}; L and T withdrawn from
64
+ # sidecode 11 onward.
65
+ # =========================================================================
66
+ - id: nl-sidecode6-car
67
+ class: standard
68
+ categories: [car]
69
+ period: { start: 2000 } # 20-01-2000; open — series run until exhausted
70
+ format:
71
+ pattern: "99-LL-LL"
72
+ regex: '\A\d{2}-[A-Z]{2}-[A-Z]{2}\z'
73
+ regex_strict: '\A\d{2}-[GHJKLNPRSTXZ][BDFGHJKLMNPRSTVWXYZ]-[BDFGHJKLMNPRSTVWXYZ]{2}\z'
74
+ charset:
75
+ first_letter: [G, H, J, K, L, N, P, R, S, T, X, Z]
76
+ notes: "no vowels, no C/Q — see charset_defaults"
77
+ progression: "letter groups advance; RDW does not publish the intra-series allocation order"
78
+ design:
79
+ plate: { w: 520, h: 110, unit: mm }
80
+ plate_variants:
81
+ - { w: 340, h: 210, unit: mm, note: "rechthoekig (two-line) model 27.2" }
82
+ - { w: 310, h: 110, unit: mm, note: "'Amerikaans model' 18.2 — only where the vehicle record carries code 55 'kentekenplaat model 18.2 toegestaan'" }
83
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
84
+ foreground: "#000000"
85
+ border: { color: "#000000", note: "zwart kader voor de leesbaarheid" }
86
+ band: { side: left, color: "#003399", content: eu-stars+NL }
87
+ emblem: { present: false }
88
+ rear_differs: false
89
+ region_encoding: none
90
+ variants:
91
+ - class: taxi
92
+ design: { background: { color: "#7CB9E8", finish: retroreflective, hex_basis: observed }, foreground: "#000000", plate: { w: 520, h: 110, unit: mm } }
93
+ note: >-
94
+ Light-blue taxi plates carry the vehicle's OWN registration — colour-only
95
+ variant of this series, so a sub-entry per PRD-PLATES §2.3, not a series.
96
+ Models 27.30 (long), 27.31 (rectangular), 18.2 (American, light blue).
97
+ sources:
98
+ - "https://www.rdw.nl/de-kentekenplaat/soorten-kentekenplaten # taxikentekenplaat lichtblauw met zwarte letters en cijfers; 520x110 / 340x210 / 310x110"
99
+ - "https://www.rdw.nl/zakelijke-partners/erkende-bedrijven/kentekenplaatfabrikanten/extra-eisen-per-kleur-en-model/kentekenplaat-voor-auto-motorfiets-trike-of-quad # taxi models 27.30 / 27.31 / 18.2"
100
+ - class: trailer
101
+ design: { background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }, foreground: "#000000" }
102
+ note: >-
103
+ Trailers and appendages (bike racks) up to 750 kg have NO registration of
104
+ their own — they repeat the towing vehicle's registration on a WHITE plate.
105
+ Colour-only variant, hence a sub-entry.
106
+ sources:
107
+ - "https://www.rdw.nl/de-kentekenplaat/soorten-kentekenplaten # witte kentekenplaat, aanhangwagens <751 kg, zelfde kenteken als het trekkende voertuig"
108
+ sources:
109
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Auto's: serie 6, combinatie 99-XX-XX, ingangsdatum 20-01-2000"
110
+ - "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # personenauto first letters G H J K L N P R S T X Z"
111
+ - "https://www.rdw.nl/de-kentekenplaat/soorten-kentekenplaten # gele plaat, zwart kader, blauw EU-vlak met NL; 520x110 of 340x210"
112
+ notes: >-
113
+ Sidecode 6 for PASSENGER CARS, from 20-01-2000. The first NL series to be
114
+ issued under the EU-band yellow design. Parallel with sidecodes 7-11: RDW
115
+ exhausts a series before switching, so all six car series remain live stock.
116
+
117
+ - id: nl-sidecode7-car
118
+ class: standard
119
+ categories: [car]
120
+ period: { start: 2008 } # 19-05-2008
121
+ format:
122
+ pattern: "99-LLL-9"
123
+ regex: '\A\d{2}-[A-Z]{3}-\d\z'
124
+ regex_strict: '\A\d{2}-[GHJKLNPRSTXZ][BDFGHJKLMNPRSTVWXYZ]{2}-\d\z'
125
+ charset: { first_letter: [G, H, J, K, L, N, P, R, S, T, X, Z], notes: "no vowels, no C/Q" }
126
+ design:
127
+ plate: { w: 520, h: 110, unit: mm }
128
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
129
+ foreground: "#000000"
130
+ band: { side: left, color: "#003399", content: eu-stars+NL }
131
+ region_encoding: none
132
+ sources:
133
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Auto's: serie 7, combinatie 99-XXX-9, ingangsdatum 19-05-2008"
134
+ - "https://www.rdw.nl/de-kentekenplaat/soorten-kentekenplaten # colours + dimensions"
135
+ notes: >-
136
+ Sidecode 7 for PASSENGER CARS, from 19-05-2008. Same pattern reached HEAVY
137
+ commercial vehicles four years later (20-07-2012) — the pattern-x-category
138
+ rule; see nl-sidecode7-heavycommercial.
139
+
140
+ - id: nl-sidecode8-car
141
+ class: standard
142
+ categories: [car]
143
+ period: { start: 2013 } # 05-03-2013
144
+ format:
145
+ pattern: "9-LLL-99"
146
+ regex: '\A\d-[A-Z]{3}-\d{2}\z'
147
+ regex_strict: '\A\d-[GHJKLNPRSTXZ][BDFGHJKLMNPRSTVWXYZ]{2}-\d{2}\z'
148
+ charset: { first_letter: [G, H, J, K, L, N, P, R, S, T, X, Z], notes: "no vowels, no C/Q" }
149
+ design:
150
+ plate: { w: 520, h: 110, unit: mm }
151
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
152
+ foreground: "#000000"
153
+ band: { side: left, color: "#003399", content: eu-stars+NL }
154
+ region_encoding: none
155
+ sources:
156
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Auto's: serie 8, combinatie 9-XXX-99, ingangsdatum 05-03-2013"
157
+ notes: >-
158
+ Sidecode 8 for PASSENGER CARS, from 05-03-2013. The same pattern had already
159
+ been running for LIGHT commercial vehicles since 26-02-2009 — a four-year
160
+ lead, and the clearest single counter-example to "sidecode = era".
161
+
162
+ - id: nl-sidecode9-car
163
+ class: standard
164
+ categories: [car]
165
+ period: { start: 2015 } # 30-03-2015
166
+ format:
167
+ pattern: "LL-999-L"
168
+ regex: '\A[A-Z]{2}-\d{3}-[A-Z]\z'
169
+ regex_strict: '\A[GHJKLNPRSTXZ][BDFGHJKLMNPRSTVWXYZ]-\d{3}-[BDFGHJKLMNPRSTVWXYZ]\z'
170
+ charset: { first_letter: [G, H, J, K, L, N, P, R, S, T, X, Z], notes: "no vowels, no C/Q" }
171
+ design:
172
+ plate: { w: 520, h: 110, unit: mm }
173
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
174
+ foreground: "#000000"
175
+ band: { side: left, color: "#003399", content: eu-stars+NL }
176
+ region_encoding: none
177
+ sources:
178
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Auto's: serie 9, combinatie XX-999-X, ingangsdatum 30-03-2015"
179
+ notes: >-
180
+ Sidecode 9 for PASSENGER CARS, from 30-03-2015. Mopeds got this pattern in
181
+ 2006 and light commercials in 2012 — cars are the LAST category to reach it.
182
+
183
+ - id: nl-sidecode10-car
184
+ class: standard
185
+ categories: [car]
186
+ period: { start: 2019 } # 19-08-2019
187
+ format:
188
+ pattern: "L-999-LL"
189
+ regex: '\A[A-Z]-\d{3}-[A-Z]{2}\z'
190
+ regex_strict: '\A[GHJKLNPRSTXZ]-\d{3}-[BDFGHJKLMNPRSTVWXYZ]{2}\z'
191
+ charset: { first_letter: [G, H, J, K, L, N, P, R, S, T, X, Z], notes: "no vowels, no C/Q" }
192
+ design:
193
+ plate: { w: 520, h: 110, unit: mm }
194
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
195
+ foreground: "#000000"
196
+ band: { side: left, color: "#003399", content: eu-stars+NL }
197
+ region_encoding: none
198
+ sources:
199
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Auto's: serie 10, combinatie X-999-XX, ingangsdatum 19-08-2019"
200
+ notes: >-
201
+ Sidecode 10 for PASSENGER CARS, from 19-08-2019. Note the single-letter first
202
+ group: the category first-letter rule still applies to it.
203
+
204
+ - id: nl-sidecode11-car # seed id — PRESERVED
205
+ class: standard
206
+ categories: [car] # CORRECTED from the seed's [car, van]: RDW's
207
+ # "Auto's" table is passenger cars only; light
208
+ # commercials reached sidecode 11 on 13-06-2019
209
+ # (see nl-sidecode11-lightcommercial).
210
+ period: { start: 2024 } # 04-06-2024
211
+ format:
212
+ pattern: "LLL-99-L"
213
+ regex: '\A[A-Z]{3}-\d{2}-[A-Z]\z'
214
+ regex_strict: '\A[GHJKNPRSXZ][BDFGHJKLMNPRSTVWXYZ]{2}-\d{2}-[BDFGHJKLMNPRSTVWXYZ]\z'
215
+ charset:
216
+ first_letter: [G, H, J, K, N, P, R, S, X, Z]
217
+ notes: >-
218
+ "Vanaf kentekenserie 11 worden de medeklinkers L en T niet langer gebruikt
219
+ als eerste letter voor personenauto's" — L and T are withdrawn for CARS
220
+ from sidecode 11, which is why this series' first-letter set is 10 letters
221
+ where sidecodes 6-10 have 12.
222
+ design:
223
+ plate: { w: 520, h: 110, unit: mm }
224
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
225
+ foreground: "#000000"
226
+ band: { side: left, color: "#003399", content: eu-stars+NL }
227
+ region_encoding: none
228
+ sources:
229
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Auto's: serie 11, combinatie XXX-99-X, ingangsdatum 04-06-2024"
230
+ - "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # L and T withdrawn as car first letters from serie 11"
231
+ notes: >-
232
+ Sidecode 11 for PASSENGER CARS, from 04-06-2024 — the current car issue.
233
+ The same pattern reached mopeds in 2015 and agricultural trailers in 2021;
234
+ the trio is the pattern-x-category rule demonstrated. Seed correction: the
235
+ seed listed categories [car, van] and no first-letter narrowing.
236
+
237
+ # =========================================================================
238
+ # LIGHT COMMERCIAL — RDW "Bedrijfsauto's licht" (<= 3500 kg). First letter V.
239
+ # V is not a pattern metacharacter, so the literal goes in the pattern and
240
+ # the regex is exact without a strict twin.
241
+ # =========================================================================
242
+ - id: nl-sidecode8-lightcommercial
243
+ class: standard
244
+ categories: [van]
245
+ period: { start: 2009 } # 26-02-2009
246
+ format:
247
+ pattern: "9-VLL-99"
248
+ regex: '\A\d-V[A-Z]{2}-\d{2}\z'
249
+ regex_strict: '\A\d-V[BDFGHJKLMNPRSTVWXYZ]{2}-\d{2}\z'
250
+ charset: { first_letter: [V], notes: "light commercial registrations always begin with V" }
251
+ design:
252
+ plate: { w: 520, h: 110, unit: mm }
253
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
254
+ foreground: "#000000"
255
+ band: { side: left, color: "#003399", content: eu-stars+NL }
256
+ region_encoding: none
257
+ sources:
258
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Lichte bedrijfsauto's: serie 8, combinatie 9-XXX-99, ingangsdatum 26-02-2009"
259
+ - "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # Lichte bedrijfsauto's (tot 3500 kg): eerste letter V"
260
+ notes: >-
261
+ Sidecode 8 for LIGHT COMMERCIAL vehicles, from 26-02-2009 — four years ahead
262
+ of the same pattern's car rollout. Campers registered as light commercial
263
+ also carry V.
264
+
265
+ - id: nl-sidecode9-lightcommercial
266
+ class: standard
267
+ categories: [van]
268
+ period: { start: 2012 } # 12-12-2012
269
+ format:
270
+ pattern: "VL-999-L"
271
+ regex: '\AV[A-Z]-\d{3}-[A-Z]\z'
272
+ regex_strict: '\AV[BDFGHJKLMNPRSTVWXYZ]-\d{3}-[BDFGHJKLMNPRSTVWXYZ]\z'
273
+ charset: { first_letter: [V] }
274
+ design:
275
+ plate: { w: 520, h: 110, unit: mm }
276
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
277
+ foreground: "#000000"
278
+ band: { side: left, color: "#003399", content: eu-stars+NL }
279
+ region_encoding: none
280
+ sources:
281
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Lichte bedrijfsauto's: serie 9, combinatie XX-999-X, ingangsdatum 12-12-2012"
282
+ notes: Sidecode 9 for LIGHT COMMERCIAL vehicles, from 12-12-2012.
283
+
284
+ - id: nl-sidecode10-lightcommercial
285
+ class: standard
286
+ categories: [van]
287
+ period: { start: 2016 } # 14-10-2016
288
+ format:
289
+ pattern: "V-999-LL"
290
+ regex: '\AV-\d{3}-[A-Z]{2}\z'
291
+ regex_strict: '\AV-\d{3}-[BDFGHJKLMNPRSTVWXYZ]{2}\z'
292
+ charset: { first_letter: [V] }
293
+ design:
294
+ plate: { w: 520, h: 110, unit: mm }
295
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
296
+ foreground: "#000000"
297
+ band: { side: left, color: "#003399", content: eu-stars+NL }
298
+ region_encoding: none
299
+ sources:
300
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Lichte bedrijfsauto's: serie 10, combinatie X-999-XX, ingangsdatum 14-10-2016"
301
+ notes: Sidecode 10 for LIGHT COMMERCIAL vehicles, from 14-10-2016.
302
+
303
+ - id: nl-sidecode11-lightcommercial
304
+ class: standard
305
+ categories: [van]
306
+ period: { start: 2019 } # 13-06-2019
307
+ format:
308
+ pattern: "VLL-99-L"
309
+ regex: '\AV[A-Z]{2}-\d{2}-[A-Z]\z'
310
+ regex_strict: '\AV[BDFGHJKLMNPRSTVWXYZ]{2}-\d{2}-[BDFGHJKLMNPRSTVWXYZ]\z'
311
+ charset: { first_letter: [V] }
312
+ design:
313
+ plate: { w: 520, h: 110, unit: mm }
314
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
315
+ foreground: "#000000"
316
+ band: { side: left, color: "#003399", content: eu-stars+NL }
317
+ region_encoding: none
318
+ sources:
319
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Lichte bedrijfsauto's: serie 11, combinatie XXX-99-X, ingangsdatum 13-06-2019"
320
+ notes: >-
321
+ Sidecode 11 for LIGHT COMMERCIAL vehicles, from 13-06-2019 — FIVE YEARS
322
+ before the same pattern reached cars (04-06-2024). The single most useful
323
+ NL age-inference fact: a XXX-99-X plate starting with V can be 2019+, while
324
+ the same pattern on a car cannot predate June 2024.
325
+
326
+ - id: nl-sidecode12-lightcommercial
327
+ class: standard
328
+ categories: [van]
329
+ period: { start: 2024 } # 08-01-2024
330
+ format:
331
+ pattern: "V-99-LLL"
332
+ regex: '\AV-\d{2}-[A-Z]{3}\z'
333
+ regex_strict: '\AV-\d{2}-[BDFGHJKLMNPRSTVWXYZ]{3}\z'
334
+ charset: { first_letter: [V] }
335
+ design:
336
+ plate: { w: 520, h: 110, unit: mm }
337
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
338
+ foreground: "#000000"
339
+ band: { side: left, color: "#003399", content: eu-stars+NL }
340
+ region_encoding: none
341
+ sources:
342
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Lichte bedrijfsauto's: serie 12, combinatie X-99-XXX, ingangsdatum 08-01-2024"
343
+ notes: >-
344
+ Sidecode 12 for LIGHT COMMERCIAL vehicles, from 08-01-2024 — light
345
+ commercials are the ONLY road category on sidecode 12 besides special mopeds
346
+ (2025) and agricultural tractors (2021). Cars have never reached it.
347
+
348
+ # =========================================================================
349
+ # HEAVY COMMERCIAL — RDW "Bedrijfsauto's zwaar" (> 3500 kg). First letter B.
350
+ # =========================================================================
351
+ - id: nl-sidecode5-heavycommercial
352
+ class: standard
353
+ categories: [truck, bus]
354
+ period: { start: 1994 } # 03-01-1994 — the oldest date RDW publishes
355
+ # for a still-listed series other than the
356
+ # 1951 GV block.
357
+ format:
358
+ pattern: "BL-LL-99"
359
+ regex: '\AB[A-Z]-[A-Z]{2}-\d{2}\z'
360
+ regex_strict: '\AB[BDFGHJKLMNPRSTVWXYZ]-[BDFGHJKLMNPRSTVWXYZ]{2}-\d{2}\z'
361
+ charset: { first_letter: [B], notes: "heavy commercial registrations always begin with B" }
362
+ design:
363
+ plate: { w: 520, h: 110, unit: mm }
364
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
365
+ foreground: "#000000"
366
+ band: { side: left, color: "#003399", content: eu-stars+NL }
367
+ band_note: >-
368
+ The EU band is a property of the CURRENT plate, not of the 1994 series:
369
+ plates made today for a 1994-series registration carry it. RDW does not
370
+ publish the date the band became mandatory in NL — recorded gap.
371
+ region_encoding: none
372
+ sources:
373
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Zware bedrijfsauto's: serie 5, combinatie XX-XX-99, ingangsdatum 03-01-1994"
374
+ - "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # Zware bedrijfsauto's (boven 3500 kg): eerste letter B"
375
+ notes: >-
376
+ Sidecode 5 for HEAVY COMMERCIAL vehicles, from 03-01-1994. This is the ONLY
377
+ sidecode-5 rollout RDW publishes — the pattern's car-era dates are not on
378
+ any RDW page (recorded gap).
379
+
380
+ - id: nl-sidecode7-heavycommercial
381
+ class: standard
382
+ categories: [truck, bus]
383
+ period: { start: 2012 } # 20-07-2012
384
+ format:
385
+ pattern: "99-BLL-9"
386
+ regex: '\A\d{2}-B[A-Z]{2}-\d\z'
387
+ regex_strict: '\A\d{2}-B[BDFGHJKLMNPRSTVWXYZ]{2}-\d\z'
388
+ charset: { first_letter: [B] }
389
+ design:
390
+ plate: { w: 520, h: 110, unit: mm }
391
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
392
+ foreground: "#000000"
393
+ band: { side: left, color: "#003399", content: eu-stars+NL }
394
+ region_encoding: none
395
+ sources:
396
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Zware bedrijfsauto's: serie 7, combinatie 99-XXX-9, ingangsdatum 20-07-2012"
397
+ notes: >-
398
+ Sidecode 7 for HEAVY COMMERCIAL vehicles, from 20-07-2012 — four years after
399
+ the car rollout of the same pattern. Heavy commercials skipped sidecode 6.
400
+
401
+ # =========================================================================
402
+ # MOTORCYCLES — RDW "Motoren". First letter M.
403
+ # =========================================================================
404
+ - id: nl-sidecode6-motorcycle
405
+ class: motorcycle
406
+ categories: [motorcycle]
407
+ period: { start: 2011 } # 19-08-2011
408
+ format:
409
+ pattern: "99-ML-LL"
410
+ regex: '\A\d{2}-M[A-Z]-[A-Z]{2}\z'
411
+ regex_strict: '\A\d{2}-M[BDFGHJKLMNPRSTVWXYZ]-[BDFGHJKLMNPRSTVWXYZ]{2}\z'
412
+ charset: { first_letter: [M], notes: "motorcycle registrations always begin with M" }
413
+ design:
414
+ plate: { w: 210, h: 143, unit: mm }
415
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
416
+ foreground: "#000000"
417
+ band: { side: left, color: "#003399", content: eu-stars+NL }
418
+ rear_differs: false
419
+ note: "one plate, rear only (motorcycle model 27.10)"
420
+ region_encoding: none
421
+ sources:
422
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Motoren: serie 6, combinatie 99-XX-XX, ingangsdatum 19-08-2011"
423
+ - "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # Motoren: eerste letter M"
424
+ - "https://www.rdw.nl/de-kentekenplaat/soorten-kentekenplaten # motorkentekenplaat 210x143 mm"
425
+ notes: >-
426
+ Sidecode 6 for MOTORCYCLES, from 19-08-2011 — eleven years after the same
427
+ pattern reached cars (20-01-2000). This is the ONLY motorcycle rollout on
428
+ RDW's table: motorcycles registered before 2011 carry earlier sidecodes
429
+ whose motorcycle dates RDW does not publish (recorded gap). The
430
+ 210x143 mm plate also serves three-wheelers, agricultural vehicles, MMBS,
431
+ mobile machines and agricultural trailers.
432
+
433
+ # =========================================================================
434
+ # MOPEDS — RDW "Brom- en snorfietsen". First letters D and F.
435
+ # Two options, so the pattern keeps its generic L and regex carries [DF].
436
+ # =========================================================================
437
+ - id: nl-sidecode7-moped
438
+ class: moped
439
+ categories: [moped]
440
+ period: { start: 2005 } # 01-09-2005
441
+ format:
442
+ pattern: "99-LLL-9"
443
+ regex: '\A\d{2}-[A-Z]{3}-\d\z'
444
+ regex_strict: '\A\d{2}-[DF][BDFGHJKLMNPRSTVWXYZ]{2}-\d\z'
445
+ charset: { first_letter: [D, F], notes: "moped registrations begin with D or F" }
446
+ design:
447
+ plate: { w: 145, h: 125, unit: mm }
448
+ plate_variants:
449
+ - { w: 100, h: 175, unit: mm, note: "staand (portrait) model 30.1" }
450
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
451
+ foreground: "#000000"
452
+ band: { side: left, color: "#003399", content: eu-stars+NL }
453
+ region_encoding: none
454
+ variants:
455
+ - class: moped
456
+ design: { background: { color: "#7CB9E8", finish: retroreflective, hex_basis: observed }, foreground: "#000000" }
457
+ note: >-
458
+ SNORFIETS (25 km/h max) carries the same registration on a LIGHT BLUE
459
+ plate — models 30.3 (portrait) / 30.4 (landscape). Yellow is the
460
+ 45 km/h bromfiets and the speed-pedelec. Colour-only variant, so a
461
+ sub-entry, but note this loses the light-blue/yellow distinction to
462
+ class-keyed queries (see the L0 report's schema stressors).
463
+ sources:
464
+ - "https://www.rdw.nl/zakelijke-partners/erkende-bedrijven/kentekenplaatfabrikanten/extra-eisen-per-kleur-en-model/kentekenplaat-voor-snor-of-bromfiets # 45 km/h = geel model 30.1/30.2; 25 km/h snorfiets = lichtblauw model 30.3/30.4"
465
+ sources:
466
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Brom- en snorfietsen: serie 7, combinatie 99-XXX-9, ingangsdatum 01-09-2005"
467
+ - "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # Brom- en snorfietsen: eerste letters D en F"
468
+ - "https://www.rdw.nl/de-kentekenplaat/soorten-kentekenplaten # bromfietsplaat 145x125 liggend of 100x175 staand"
469
+ notes: >-
470
+ Sidecode 7 for MOPEDS, from 01-09-2005 — the NL moped registration
471
+ obligation's first series, and three years ahead of the car rollout of the
472
+ same pattern.
473
+
474
+ - id: nl-sidecode9-moped
475
+ class: moped
476
+ categories: [moped]
477
+ period: { start: 2006 } # 11-08-2006
478
+ format:
479
+ pattern: "LL-999-L"
480
+ regex: '\A[A-Z]{2}-\d{3}-[A-Z]\z'
481
+ regex_strict: '\A[DF][BDFGHJKLMNPRSTVWXYZ]-\d{3}-[BDFGHJKLMNPRSTVWXYZ]\z'
482
+ charset: { first_letter: [D, F] }
483
+ design:
484
+ plate: { w: 145, h: 125, unit: mm }
485
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
486
+ foreground: "#000000"
487
+ band: { side: left, color: "#003399", content: eu-stars+NL }
488
+ region_encoding: none
489
+ sources:
490
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Brom- en snorfietsen: serie 9, combinatie XX-999-X, ingangsdatum 11-08-2006"
491
+ notes: >-
492
+ Sidecode 9 for MOPEDS, from 11-08-2006 — NINE YEARS before cars reached the
493
+ same pattern (30-03-2015). Mopeds skipped sidecode 8 entirely.
494
+
495
+ - id: nl-sidecode10-moped
496
+ class: moped
497
+ categories: [moped]
498
+ period: { start: 2008 } # 11-12-2008
499
+ format:
500
+ pattern: "L-999-LL"
501
+ regex: '\A[A-Z]-\d{3}-[A-Z]{2}\z'
502
+ regex_strict: '\A[DF]-\d{3}-[BDFGHJKLMNPRSTVWXYZ]{2}\z'
503
+ charset: { first_letter: [D, F] }
504
+ design:
505
+ plate: { w: 145, h: 125, unit: mm }
506
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
507
+ foreground: "#000000"
508
+ band: { side: left, color: "#003399", content: eu-stars+NL }
509
+ region_encoding: none
510
+ sources:
511
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Brom- en snorfietsen: serie 10, combinatie X-999-XX, ingangsdatum 11-12-2008"
512
+ notes: Sidecode 10 for MOPEDS, from 11-12-2008 — eleven years ahead of the car rollout.
513
+
514
+ - id: nl-sidecode11-moped # seed id — PRESERVED
515
+ class: moped
516
+ categories: [moped]
517
+ period: { start: 2015 } # 16-01-2015 (seed said 2015 — confirmed)
518
+ format:
519
+ pattern: "LLL-99-L"
520
+ regex: '\A[A-Z]{3}-\d{2}-[A-Z]\z'
521
+ regex_strict: '\A[DF][BDFGHJKLMNPRSTVWXYZ]{2}-\d{2}-[BDFGHJKLMNPRSTVWXYZ]\z'
522
+ charset: { first_letter: [D, F] }
523
+ design:
524
+ plate: { w: 145, h: 125, unit: mm }
525
+ plate_variants:
526
+ - { w: 100, h: 175, unit: mm, note: "staand model" }
527
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
528
+ foreground: "#000000"
529
+ band: { side: left, color: "#003399", content: eu-stars+NL }
530
+ region_encoding: none
531
+ sources:
532
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Brom- en snorfietsen: serie 11, combinatie XXX-99-X, ingangsdatum 16-01-2015"
533
+ - "https://www.rdw.nl/de-kentekenplaat/soorten-kentekenplaten # colours + dimensions"
534
+ notes: >-
535
+ Sidecode 11 for MOPEDS, from 16-01-2015 — the pattern's FIRST rollout of all,
536
+ nine years before cars. Seed correction: the seed gave 520x110 as an implied
537
+ default and the D/F rule only in prose; dimensions here are the moped models.
538
+
539
+ - id: nl-sidecode12-specialmoped
540
+ class: moped
541
+ categories: [moped]
542
+ period: { start: 2025 } # 01-07-2025
543
+ format:
544
+ pattern: "E-99-LLL"
545
+ regex: '\AE-\d{2}-[A-Z]{3}\z'
546
+ regex_strict: '\AE-\d{2}-[BDFGHJKLMNPRSTVWXYZ]{3}\z'
547
+ charset: { first_letter: [E], notes: "bijzondere bromfietsen begin with E — the one place a VOWEL is issued outside the oplegger exception" }
548
+ design:
549
+ plate: { w: 100, h: 120, unit: mm }
550
+ background: { color: "#7CB9E8", finish: retroreflective, hex_basis: observed }
551
+ foreground: "#000000"
552
+ band: { side: left, color: "#003399", content: eu-stars+NL }
553
+ note: "model 31.1; mounted at the rear, but front-mounted on Ninebot Urban, Ninebot type E, Trikke and Paukool S1"
554
+ region_encoding: none
555
+ sources:
556
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Bijzondere bromfietsen: serie 12, combinatie X-99-XXX, ingangsdatum 01-07-2025"
557
+ - "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # Bijzondere bromfietsen: eerste letter E"
558
+ - "https://www.rdw.nl/de-kentekenplaat/soorten-kentekenplaten # bijzondere bromfiets 100x120 mm; lichtblauw for 25 km/h"
559
+ - "https://www.rdw.nl/zakelijke-partners/erkende-bedrijven/kentekenplaatfabrikanten/extra-eisen-per-kleur-en-model/kentekenplaat-voor-snor-of-bromfiets # bijzondere bromfiets = lichtblauw, model 31.1"
560
+ notes: >-
561
+ Sidecode 12 for BIJZONDERE BROMFIETSEN (special mopeds — e-scooters and
562
+ similar light electric vehicles), from 01-07-2025. The newest NL series and
563
+ the smallest NL plate. Distinct from the 45 km/h bromfiets and the 25 km/h
564
+ snorfiets, both of which carry ordinary moped registrations.
565
+
566
+ # =========================================================================
567
+ # TRAILERS AND SEMI-TRAILERS — RDW "Aanhangwagens" / "Opleggers", both
568
+ # sidecode 4 from 01-10-1988, but different first letters (W vs O), which is
569
+ # exactly why they are two entries and not one.
570
+ # =========================================================================
571
+ - id: nl-sidecode4-trailer
572
+ class: trailer
573
+ categories: [trailer]
574
+ period: { start: 1988 } # 01-10-1988
575
+ format:
576
+ pattern: "WL-99-LL"
577
+ regex: '\AW[A-Z]-\d{2}-[A-Z]{2}\z'
578
+ regex_strict: '\AW[BDFGHJKLMNPRSTVWXYZ]-\d{2}-[BDFGHJKLMNPRSTVWXYZ]{2}\z'
579
+ charset: { first_letter: [W], notes: "trailer registrations always begin with W" }
580
+ design:
581
+ plate: { w: 520, h: 110, unit: mm }
582
+ plate_variants:
583
+ - { w: 340, h: 210, unit: mm }
584
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
585
+ foreground: "#000000"
586
+ band: { side: left, color: "#003399", content: eu-stars+NL }
587
+ note: "yellow plate + own registration only ABOVE 750 kg maximum permitted mass; at or below 750 kg the trailer repeats the towing vehicle's registration on a white plate"
588
+ region_encoding: none
589
+ sources:
590
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Aanhangwagens: serie 4, combinatie XX-99-XX, ingangsdatum 01-10-1988"
591
+ - "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # Aanhangwagens: eerste letter W"
592
+ - "https://www.rdw.nl/zakelijke-partners/erkende-bedrijven/kentekenplaatfabrikanten/extra-eisen-per-kleur-en-model/kentekenplaat-voor-aanhangwagen-of-caravan # 'Het kenteken van een aanhangwagen begint altijd met de letter W'; >750 kg = eigen kenteken"
593
+ notes: >-
594
+ Sidecode 4 for TRAILERS AND CARAVANS over 750 kg, from 01-10-1988 — the
595
+ oldest continuously-issuing NL series on RDW's table, still not exhausted
596
+ after 38 years.
597
+
598
+ - id: nl-sidecode4-semitrailer
599
+ class: trailer
600
+ categories: [semitrailer]
601
+ period: { start: 1988 } # 01-10-1988
602
+ format:
603
+ pattern: "OL-99-LL"
604
+ regex: '\AO[A-Z]-\d{2}-[A-Z]{2}\z'
605
+ regex_strict: '\AO[ABDEFGHIJKLMNOPRSTUVWXYZ]-\d{2}-[ABDEFGHIJKLMNOPRSTUVWXYZ]{2}\z'
606
+ charset:
607
+ first_letter: [O]
608
+ notes: >-
609
+ Semi-trailer registrations always begin with O — and the no-vowels rule
610
+ is expressly disapplied for opleggers ("met uitzondering van het kenteken
611
+ voor opleggers"), so this is the one NL series whose regex_strict keeps
612
+ the vowels. C and Q remain excluded (nought-lookalikes).
613
+ design:
614
+ plate: { w: 520, h: 110, unit: mm }
615
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
616
+ foreground: "#000000"
617
+ band: { side: left, color: "#003399", content: eu-stars+NL }
618
+ region_encoding: none
619
+ sources:
620
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Opleggers: serie 4, combinatie XX-99-XX, ingangsdatum 01-10-1988"
621
+ - "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # Opleggers: eerste letter O; no-vowels rule excepted for opleggers"
622
+ notes: >-
623
+ Sidecode 4 for SEMI-TRAILERS, from 01-10-1988 — same pattern and same date as
624
+ trailers but a different letter space, which is why RDW publishes them as two
625
+ tables and why they are two series here.
626
+
627
+ # =========================================================================
628
+ # AGRICULTURAL / MOBILE MACHINERY. First letter T for tractors, mobile
629
+ # machines and MMBS; L for agricultural trailers and interchangeable towed
630
+ # equipment. "L" collides with the pattern DSL's letter placeholder, so the
631
+ # L-prefix survives only in charset + regex_strict (schema stressor).
632
+ # =========================================================================
633
+ - id: nl-sidecode12-agritractor
634
+ class: agricultural
635
+ categories: [tractor, machine]
636
+ period: { start: 2021 } # 01-12-2021
637
+ format:
638
+ pattern: "T-99-LLL"
639
+ regex: '\AT-\d{2}-[A-Z]{3}\z'
640
+ regex_strict: '\AT-\d{2}-[BDFGHJKLMNPRSTVWXYZ]{3}\z'
641
+ charset: { first_letter: [T], notes: "agricultural/forestry tractors, mobile machines and MMBS all begin with T" }
642
+ design:
643
+ plate: { w: 520, h: 110, unit: mm }
644
+ plate_variants:
645
+ - { w: 340, h: 210, unit: mm }
646
+ - { w: 210, h: 143, unit: mm, note: "motorcycle-size model permitted for agricultural vehicles" }
647
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
648
+ foreground: "#000000"
649
+ band: { side: left, color: "#003399", content: eu-stars+NL }
650
+ region_encoding: none
651
+ sources:
652
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Land- en bosbouwtrekkers (trekkend): serie 12, combinatie X-99-XXX, ingangsdatum 01-12-2021"
653
+ - "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # Land-/bosbouwtrekkers, mobiele machines, MMBS'en: eerste letter T"
654
+ - "https://www.rdw.nl/de-kentekenplaat/soorten-kentekenplaten # 520x110 / 340x210 / 210x143 for (land)bouwvoertuigen, MMBS, mobiele machines"
655
+ notes: >-
656
+ Sidecode 12 for AGRICULTURAL AND FORESTRY TRACTORS, mobile machines and MMBS,
657
+ from 01-12-2021 — the NL agricultural registration obligation. Sidecode 12
658
+ reached tractors before it reached light commercials (2024) or special
659
+ mopeds (2025).
660
+
661
+ - id: nl-sidecode11-agricultural # seed id — PRESERVED
662
+ class: agricultural
663
+ categories: [trailer] # CORRECTED from the seed's [truck]: this is the
664
+ # agricultural TRAILER / interchangeable towed
665
+ # equipment series (RDW's own table heading).
666
+ period: { start: 2021 } # 01-01-2021 (seed said 2021 — confirmed)
667
+ format:
668
+ pattern: "LLL-99-L"
669
+ regex: '\A[A-Z]{3}-\d{2}-[A-Z]\z'
670
+ regex_strict: '\AL[BDFGHJKLMNPRSTVWXYZ]{2}-\d{2}-[BDFGHJKLMNPRSTVWXYZ]\z'
671
+ charset:
672
+ first_letter: [L]
673
+ notes: >-
674
+ "Het kenteken van een aanhangwagen of verwisselbaar getrokken
675
+ uitrustingsstuk van een land- of bosbouwtrekker, MMBS of mobiele machine
676
+ begint altijd met de letter 'L'." The literal L CANNOT be written into
677
+ format.pattern because L is the pattern DSL's letter placeholder — it
678
+ survives only here and in regex_strict. See the L0 report.
679
+ design:
680
+ plate: { w: 520, h: 110, unit: mm }
681
+ plate_variants:
682
+ - { w: 340, h: 210, unit: mm }
683
+ - { w: 210, h: 143, unit: mm, note: "model 27.10 permitted for agricultural trailers" }
684
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
685
+ foreground: "#000000"
686
+ band: { side: left, color: "#003399", content: eu-stars+NL }
687
+ region_encoding: none
688
+ sources:
689
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Land- en bosbouwaanhangwagens en verwisselbare getrokken uitrustingsstukken: serie 11, combinatie XXX-99-X, ingangsdatum 01-01-2021"
690
+ - "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # Land-/bosbouwaanhangwagens: eerste letter L"
691
+ - "https://www.rdw.nl/zakelijke-partners/erkende-bedrijven/kentekenplaatfabrikanten/extra-eisen-per-kleur-en-model/kentekenplaat-voor-aanhangwagen-of-caravan # 'begint altijd met de letter L'"
692
+ notes: >-
693
+ Sidecode 11 for AGRICULTURAL TRAILERS and interchangeable towed equipment,
694
+ from 01-01-2021. Seed correction: the seed carried categories [truck] and
695
+ called this "agricultural vehicles/trailers"; RDW's table separates the
696
+ TOWING agricultural vehicles (sidecode 12, first letter T, 01-12-2021) from
697
+ the TOWED ones (this entry, first letter L, 01-01-2021).
698
+
699
+ # =========================================================================
700
+ # GRENSVERKEER (GV). The only place RDW dates sidecodes 1, 2 and 3, and the
701
+ # only NL series whose LETTER GROUP IS A LITERAL: "GV - altijd in combinatie
702
+ # met 4 cijfers" (cijfers-en-letters). All five GV patterns carry exactly
703
+ # four digits and the pair GV, which is self-consistent with the shapes.
704
+ # =========================================================================
705
+ - id: nl-gv-sidecode1
706
+ class: agricultural
707
+ categories: [tractor, machine]
708
+ period: { start: 1951 }
709
+ format:
710
+ pattern: "GV-99-99"
711
+ regex: '\AGV-\d{2}-\d{2}\z'
712
+ charset: { fixed_letters: "GV", notes: "the letter pair is literally GV" }
713
+ design:
714
+ plate: { w: 520, h: 110, unit: mm }
715
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
716
+ foreground: "#000000"
717
+ band: { side: left, color: "#003399", content: eu-stars+NL }
718
+ region_encoding: none
719
+ sources:
720
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Grensverkeer (GV-serie): 1951, afwisselend series 1, 2 en 3; serie 1 = XX-99-99"
721
+ - "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # 'Grensverkeer: GV - altijd in combinatie met 4 cijfers'"
722
+ notes: >-
723
+ GV series on SIDECODE 1 (XX-99-99), from 1951 — RDW's series page states the
724
+ national kenteken began in 1951 and that the GV series ran series 1, 2 and 3
725
+ alternately ("Afwisselend 1, 2 en 3"). CLASS CAVEAT: RDW publishes the GV
726
+ table under its "Landbouwvoertuigen, mobiele machines en MMBS'en" heading, so
727
+ the class is recorded as agricultural on that placement; RDW's plate pages do
728
+ not define the grensverkeer series' scope. Flagged for L1 verification.
729
+
730
+ - id: nl-gv-sidecode2
731
+ class: agricultural
732
+ categories: [tractor, machine]
733
+ period: { start: 1951 }
734
+ format:
735
+ pattern: "99-99-GV"
736
+ regex: '\A\d{2}-\d{2}-GV\z'
737
+ charset: { fixed_letters: "GV" }
738
+ design:
739
+ plate: { w: 520, h: 110, unit: mm }
740
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
741
+ foreground: "#000000"
742
+ band: { side: left, color: "#003399", content: eu-stars+NL }
743
+ region_encoding: none
744
+ sources:
745
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Grensverkeer: serie 2 = 99-99-XX, from 1951"
746
+ - "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # GV always with 4 digits"
747
+ notes: >-
748
+ GV series on SIDECODE 2 (99-99-XX), from 1951. One of the three alternating
749
+ 1951 shapes; separate entry because a series is one PATTERN, and the parse
750
+ API must be able to score each shape independently.
751
+
752
+ - id: nl-gv-sidecode3
753
+ class: agricultural
754
+ categories: [tractor, machine]
755
+ period: { start: 1951 }
756
+ format:
757
+ pattern: "99-GV-99"
758
+ regex: '\A\d{2}-GV-\d{2}\z'
759
+ charset: { fixed_letters: "GV" }
760
+ design:
761
+ plate: { w: 520, h: 110, unit: mm }
762
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
763
+ foreground: "#000000"
764
+ band: { side: left, color: "#003399", content: eu-stars+NL }
765
+ region_encoding: none
766
+ sources:
767
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Grensverkeer: serie 3 = 99-XX-99, from 1951"
768
+ - "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # GV always with 4 digits"
769
+ notes: >-
770
+ GV series on SIDECODE 3 (99-XX-99), from 1951. Third of the three alternating
771
+ 1951 shapes.
772
+
773
+ - id: nl-gv-sidecode13
774
+ class: agricultural
775
+ categories: [tractor, machine]
776
+ period: { start: 2016 } # 23-05-2016
777
+ format:
778
+ pattern: "9-GV-999"
779
+ regex: '\A\d-GV-\d{3}\z'
780
+ charset: { fixed_letters: "GV" }
781
+ design:
782
+ plate: { w: 520, h: 110, unit: mm }
783
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
784
+ foreground: "#000000"
785
+ band: { side: left, color: "#003399", content: eu-stars+NL }
786
+ region_encoding: none
787
+ sources:
788
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Grensverkeer: serie 13, combinatie 9-XX-999, ingangsdatum 23-05-2016"
789
+ - "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # GV always with 4 digits"
790
+ notes: >-
791
+ GV series on SIDECODE 13, from 23-05-2016. Sidecode 13 exists ONLY for the GV
792
+ series — no other NL category has ever been issued this pattern, which makes
793
+ a 9-GV-999 plate a one-shot identification.
794
+
795
+ - id: nl-gv-sidecode14
796
+ class: agricultural
797
+ categories: [tractor, machine]
798
+ period: { start: 2019 } # 13-06-2019
799
+ format:
800
+ pattern: "999-GV-9"
801
+ regex: '\A\d{3}-GV-\d\z'
802
+ charset: { fixed_letters: "GV" }
803
+ design:
804
+ plate: { w: 520, h: 110, unit: mm }
805
+ background: { color: "#F9B700", finish: retroreflective, hex_basis: observed }
806
+ foreground: "#000000"
807
+ band: { side: left, color: "#003399", content: eu-stars+NL }
808
+ region_encoding: none
809
+ sources:
810
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # Grensverkeer: serie 14, combinatie 999-XX-9, ingangsdatum 13-06-2019"
811
+ - "https://www.rdw.nl/de-kentekenplaat/cijfers-en-letters-op-de-kentekenplaat # GV always with 4 digits"
812
+ notes: >-
813
+ GV series on SIDECODE 14, from 13-06-2019 — the highest sidecode RDW
814
+ publishes, and like sidecode 13 exclusive to the GV series.
815
+
816
+ # =========================================================================
817
+ # HISTORIC (donkerblauw). A DESIGN REGIME laid over pre-existing sidecode
818
+ # 1/2/3 registrations, not a serial series of its own: RDW requires the
819
+ # registration to consist of "2 groepen van 2 cijfers en 1 groep van 2
820
+ # letters", which is exactly sidecodes 1, 2 and 3. Hence three entries plus
821
+ # one for the agricultural exemption.
822
+ # =========================================================================
823
+ - id: nl-historic-darkblue # seed id — PRESERVED
824
+ class: historic
825
+ categories: [car, van, motorcycle]
826
+ period: { start: 1978 }
827
+ period_evidence: eligibility-cutoff # NOT an issuance-start claim; see notes
828
+ format:
829
+ pattern: "LL-99-99"
830
+ regex: '\A[A-Z]{2}-\d{2}-\d{2}\z'
831
+ regex_strict: '\A[BDFGHJKLMNPRSTVWXYZ]{2}-\d{2}-\d{2}\z'
832
+ charset: { notes: "sidecode-1 shape; the historic regime accepts only registrations of 2+2 digits and 2 letters" }
833
+ design:
834
+ plate: { w: 445, h: 105, unit: mm }
835
+ plate_variants:
836
+ - { w: 275, h: 195, unit: mm, note: "rechthoekig" }
837
+ - { w: 200, h: 145, unit: mm, note: "motorcycle, 200 mm maximum" }
838
+ - { w: 310, h: 110, unit: mm, note: "American model 18.2 in dark blue" }
839
+ background: { color: "#1D2E5B", finish: painted, hex_basis: observed }
840
+ foreground: "#FFFFFF"
841
+ band: { side: none }
842
+ note: "models 1.1 to 18.1; no duplicaatcode and no lamineercode, and not registered in GAIK"
843
+ region_encoding: none
844
+ sources:
845
+ - "https://www.rdw.nl/de-kentekenplaat/soorten-kentekenplaten # donkerblauwe plaat, DET before 1-1-1978, kenteken = 2 groepen van 2 cijfers en 1 groep van 2 letters; 445x105 / 275x195 / 200x145 / 310x110"
846
+ - "https://www.rdw.nl/de-kentekenplaat/kentekenplaten-voor-oldtimer-aanvragen # eligibility (auto, bedrijfsauto, kampeerauto, motor, landbouwvoertuig, mobiele machine, aanhangwagen >=751 kg); mopeds excluded; EUR 50 to swap to a historisch kenteken"
847
+ - "https://www.rdw.nl/zakelijke-partners/erkende-bedrijven/kentekenplaatfabrikanten/extra-eisen-per-kleur-en-model/donkerblauwe-kentekenplaten-historisch # models 1.1 t/m 18.1; no duplicaatcode/lamineercode; not registered in GAIK"
848
+ notes: >-
849
+ Oldtimer regime on a SIDECODE-1 registration (XX-99-99). SEED CORRECTIONS,
850
+ both material: (1) the seed set `ended: true`; RDW still issues these today
851
+ (the oldtimer page takes applications and prices the swap at EUR 50), so the
852
+ series is OPEN. (2) The seed's pattern was flagged "refine in the L0
853
+ completion pass" — refined here: RDW's eligibility text pins the accepted
854
+ shapes to exactly sidecodes 1, 2 and 3, so the regime is modelled as three
855
+ format entries plus the agricultural exemption. period.start 1978 records the
856
+ ELIGIBILITY CUTOFF ("datum eerste toelating" before 1 January 1978), not an
857
+ issuance start — the date the dark-blue regime itself began is on no RDW page
858
+ and is a recorded gap.
859
+
860
+ - id: nl-historic-darkblue-sidecode2
861
+ class: historic
862
+ categories: [car, van, motorcycle]
863
+ period: { start: 1978 }
864
+ period_evidence: eligibility-cutoff
865
+ format:
866
+ pattern: "99-99-LL"
867
+ regex: '\A\d{2}-\d{2}-[A-Z]{2}\z'
868
+ regex_strict: '\A\d{2}-\d{2}-[BDFGHJKLMNPRSTVWXYZ]{2}\z'
869
+ design:
870
+ plate: { w: 445, h: 105, unit: mm }
871
+ background: { color: "#1D2E5B", finish: painted, hex_basis: observed }
872
+ foreground: "#FFFFFF"
873
+ band: { side: none }
874
+ region_encoding: none
875
+ sources:
876
+ - "https://www.rdw.nl/de-kentekenplaat/soorten-kentekenplaten # the 2+2 digits / 2 letters rule admits the sidecode-2 shape 99-99-XX"
877
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # sidecode 2 = 99-99-XX"
878
+ notes: >-
879
+ Oldtimer regime on a SIDECODE-2 registration (99-99-XX). Second of the three
880
+ shapes RDW's "2 groepen van 2 cijfers en 1 groep van 2 letters" rule admits.
881
+
882
+ - id: nl-historic-darkblue-sidecode3
883
+ class: historic
884
+ categories: [car, van, motorcycle]
885
+ period: { start: 1978 }
886
+ period_evidence: eligibility-cutoff
887
+ format:
888
+ pattern: "99-LL-99"
889
+ regex: '\A\d{2}-[A-Z]{2}-\d{2}\z'
890
+ regex_strict: '\A\d{2}-[BDFGHJKLMNPRSTVWXYZ]{2}-\d{2}\z'
891
+ design:
892
+ plate: { w: 445, h: 105, unit: mm }
893
+ background: { color: "#1D2E5B", finish: painted, hex_basis: observed }
894
+ foreground: "#FFFFFF"
895
+ band: { side: none }
896
+ region_encoding: none
897
+ sources:
898
+ - "https://www.rdw.nl/de-kentekenplaat/soorten-kentekenplaten # the 2+2 digits / 2 letters rule admits the sidecode-3 shape 99-XX-99"
899
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # sidecode 3 = 99-XX-99"
900
+ notes: >-
901
+ Oldtimer regime on a SIDECODE-3 registration (99-XX-99). Third of the three
902
+ admitted shapes. A vehicle whose registration has another shape must first
903
+ swap to a "historisch kenteken" before blue plates can be made.
904
+
905
+ - id: nl-historic-darkblue-agricultural
906
+ class: historic
907
+ categories: [tractor, machine, trailer]
908
+ period: { start: 1978 }
909
+ period_evidence: eligibility-cutoff
910
+ format:
911
+ pattern: "LLL-99-L"
912
+ regex: '\A(?:[A-Z]{2}-\d{2}-\d{2}|\d{2}-\d{2}-[A-Z]{2}|\d{2}-[A-Z]{2}-\d{2}|[A-Z]{2}-\d{2}-[A-Z]{2}|[A-Z]{2}-[A-Z]{2}-\d{2}|\d{2}-[A-Z]{2}-[A-Z]{2}|\d{2}-[A-Z]{3}-\d|\d-[A-Z]{3}-\d{2}|[A-Z]{2}-\d{3}-[A-Z]|[A-Z]-\d{3}-[A-Z]{2}|[A-Z]{3}-\d{2}-[A-Z]|[A-Z]-\d{2}-[A-Z]{3}|\d-[A-Z]{2}-\d{3}|\d{3}-[A-Z]{2}-\d)\z'
913
+ pattern_note: >-
914
+ The pattern shown is ONE representative shape (sidecode 11). This series has
915
+ no format of its own: RDW expressly exempts agricultural vehicles, mobile
916
+ machines and >=751 kg trailers from the 2+2+2 rule ("Bij een landbouwvoertuig
917
+ hoeft het kenteken niet 'historisch' te zijn"), so ANY current NL sidecode may
918
+ appear on a dark-blue plate here. The regex is therefore the union of all
919
+ fourteen RDW-published sidecode shapes.
920
+ design:
921
+ plate: { w: 445, h: 105, unit: mm }
922
+ background: { color: "#1D2E5B", finish: painted, hex_basis: observed }
923
+ foreground: "#FFFFFF"
924
+ band: { side: none }
925
+ region_encoding: none
926
+ sources:
927
+ - "https://www.rdw.nl/de-kentekenplaat/kentekenplaten-voor-oldtimer-aanvragen # agricultural vehicles, mobile machines and trailers >=751 kg need only pre-1978 first admission"
928
+ - "https://www.rdw.nl/zakelijke-partners/erkende-bedrijven/kentekenplaatfabrikanten/extra-eisen-per-kleur-en-model/donkerblauwe-kentekenplaten-historisch # 'Bij een landbouwvoertuig hoeft het kenteken niet historisch te zijn'"
929
+ - "https://www.rdw.nl/de-kentekenplaat/overzicht-van-kentekenseries # the fourteen sidecode shapes the union regex is built from"
930
+ notes: >-
931
+ Oldtimer regime for AGRICULTURAL vehicles, mobile machines, MMBS and trailers
932
+ of 751 kg or more, which RDW exempts from the 2+2+2 registration-shape rule.
933
+ The only NL entry whose regex is a union rather than a single shape.
934
+
935
+ # =========================================================================
936
+ # EXPORT. RDW: the export plate REUSES the vehicle's existing registration,
937
+ # so its regex is the union of all NL shapes, exactly like the agricultural
938
+ # historic entry above, and for the same sourced reason.
939
+ # =========================================================================
940
+ - id: nl-export
941
+ class: export
942
+ categories: [car, van, truck, bus, motorcycle, moped, trailer, semitrailer, tractor, machine]
943
+ period: { start: 1951 }
944
+ period_evidence: earliest-underlying-series # the regime's own start is unsourced
945
+ format:
946
+ pattern: "LLL-99-L"
947
+ regex: '\A(?:[A-Z]{2}-\d{2}-\d{2}|\d{2}-\d{2}-[A-Z]{2}|\d{2}-[A-Z]{2}-\d{2}|[A-Z]{2}-\d{2}-[A-Z]{2}|[A-Z]{2}-[A-Z]{2}-\d{2}|\d{2}-[A-Z]{2}-[A-Z]{2}|\d{2}-[A-Z]{3}-\d|\d-[A-Z]{3}-\d{2}|[A-Z]{2}-\d{3}-[A-Z]|[A-Z]-\d{3}-[A-Z]{2}|[A-Z]{3}-\d{2}-[A-Z]|[A-Z]-\d{2}-[A-Z]{3}|\d-[A-Z]{2}-\d{3}|\d{3}-[A-Z]{2}-\d)\z'
948
+ pattern_note: "representative shape only; the regex is the union of all fourteen RDW sidecode shapes because the export plate carries the vehicle's existing registration"
949
+ design:
950
+ plate: { w: 520, h: 110, unit: mm }
951
+ plate_variants:
952
+ - { w: 340, h: 210, unit: mm }
953
+ - { w: 210, h: 143, unit: mm, note: "motorcycle" }
954
+ - { w: 100, h: 175, unit: mm, note: "moped, portrait" }
955
+ - { w: 145, h: 125, unit: mm, note: "moped, landscape" }
956
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
957
+ foreground: "#000000"
958
+ band: { side: none }
959
+ note: "models 27.24 (long) / 27.25 (rectangular) / 27.26 (motorcycle) / 30.13 / 30.14; owners may make these plates themselves; no duplicaatcode, no lamineercode, not registered in GAIK"
960
+ validity: { days: 14, note: "valid 14 days, and never longer than the vehicle's APK (roadworthiness) certificate" }
961
+ region_encoding: none
962
+ sources:
963
+ - "https://www.rdw.nl/de-kentekenplaat/soorten-kentekenplaten # uitvoerkentekenplaat: wit met zwarte cijfers en letters; 'U mag hiervoor het bestaande kenteken van het voertuig gebruiken'; 14 dagen geldig, niet langer dan de APK"
964
+ - "https://www.rdw.nl/zakelijke-partners/erkende-bedrijven/kentekenplaatfabrikanten/extra-eisen-per-kleur-en-model/witte-kentekenplaten-tijdelijk # export models 27.24/27.25/27.26/30.13/30.14; checked against papieren kentekenbewijs deel II voor uitvoer"
965
+ notes: >-
966
+ EXPORT plates (uitvoerkentekenplaat). White with black characters, carrying
967
+ the vehicle's OWN existing registration, valid 14 days. period.start records
968
+ the earliest date any reusable NL registration was issued (1951), not the
969
+ date the export regime began — that date is on no RDW page and is a recorded
970
+ gap. Distinct from the TRANSIT (transito) plate, which issues a NEW number to
971
+ a vehicle that never held a Dutch registration; the transit number's grammar
972
+ is not published by RDW and is therefore NOT modelled here (see the L0 report).