vehicles 0.4.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.
Files changed (189) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +164 -0
  3. data/CHANGELOG.md +321 -0
  4. data/README.md +88 -15
  5. data/data/PROVENANCE-vehicles.md +12 -0
  6. data/data/plates/PROVENANCE.md +10 -0
  7. data/data/plates/_decode/at-districts.yml +287 -0
  8. data/data/plates/_decode/ch-cantons.yml +110 -0
  9. data/data/plates/_decode/cn-issuing-offices.yml +463 -0
  10. data/data/plates/_decode/cn-provinces.yml +614 -0
  11. data/data/plates/_decode/cz-kraj.yml +159 -0
  12. data/data/plates/_decode/dk-serial-blocks.yml +327 -0
  13. data/data/plates/_decode/es-provinces.yml +116 -0
  14. data/data/plates/_decode/fr-departements.yml +191 -0
  15. data/data/plates/_decode/gb-age-identifiers.yml +170 -0
  16. data/data/plates/_decode/gb-memory-tags.yml +202 -0
  17. data/data/plates/_decode/gr-prefectures.yml +1408 -0
  18. data/data/plates/_decode/hr-cities.yml +315 -0
  19. data/data/plates/_decode/ie-counties.yml +227 -0
  20. data/data/plates/_decode/in-state-codes.yml +169 -0
  21. data/data/plates/_decode/is-districts-1938.yml +116 -0
  22. data/data/plates/_decode/it-provinces.yml +348 -0
  23. data/data/plates/_decode/jp-office-marks.yml +960 -0
  24. data/data/plates/_decode/jp-use-marks.yml +205 -0
  25. data/data/plates/_decode/kr-authority-marks.yml +146 -0
  26. data/data/plates/_decode/kr-use-syllables.yml +194 -0
  27. data/data/plates/_decode/lu-series-order.yml +638 -0
  28. data/data/plates/_decode/mx-entity-series.yml +380 -0
  29. data/data/plates/_decode/my-index-marks.yml +271 -0
  30. data/data/plates/_decode/no-counties-1913.yml +148 -0
  31. data/data/plates/_decode/no-districts.yml +901 -0
  32. data/data/plates/_decode/pl-powiats.yml +567 -0
  33. data/data/plates/_decode/pt-trailer-services.yml +96 -0
  34. data/data/plates/_decode/ro-counties.yml +213 -0
  35. data/data/plates/_decode/se-diplomatic.yml +220 -0
  36. data/data/plates/_decode/si-regions.yml +123 -0
  37. data/data/plates/_decode/sk-districts.yml +314 -0
  38. data/data/plates/_decode/th-registration-elements.yml +208 -0
  39. data/data/plates/_decode/ua-regions.yml +393 -0
  40. data/data/plates/_decode/za-licence-marks.yml +215 -0
  41. data/data/plates/_meta/classes.yml +26 -0
  42. data/data/plates/_meta/separators.yml +102 -0
  43. data/data/plates/ad.yml +961 -0
  44. data/data/plates/ar.yml +762 -0
  45. data/data/plates/at.yml +1424 -0
  46. data/data/plates/au-act.yml +472 -0
  47. data/data/plates/au-nsw.yml +282 -0
  48. data/data/plates/au-nt.yml +431 -0
  49. data/data/plates/au-qld.yml +272 -0
  50. data/data/plates/au-sa.yml +248 -0
  51. data/data/plates/au-tas.yml +302 -0
  52. data/data/plates/au-vic.yml +215 -0
  53. data/data/plates/au-wa.yml +309 -0
  54. data/data/plates/be.yml +1840 -0
  55. data/data/plates/br.yml +1152 -0
  56. data/data/plates/ca-ab.yml +430 -0
  57. data/data/plates/ca-bc.yml +697 -0
  58. data/data/plates/ca-mb.yml +499 -0
  59. data/data/plates/ca-nb.yml +537 -0
  60. data/data/plates/ca-nl.yml +743 -0
  61. data/data/plates/ca-ns.yml +808 -0
  62. data/data/plates/ca-nt.yml +610 -0
  63. data/data/plates/ca-nu.yml +280 -0
  64. data/data/plates/ca-on.yml +881 -0
  65. data/data/plates/ca-pe.yml +592 -0
  66. data/data/plates/ca-qc.yml +1036 -0
  67. data/data/plates/ca-sk.yml +256 -0
  68. data/data/plates/ca-yt.yml +656 -0
  69. data/data/plates/ch.yml +1273 -0
  70. data/data/plates/cn.yml +1431 -0
  71. data/data/plates/cy.yml +688 -0
  72. data/data/plates/cz.yml +1179 -0
  73. data/data/plates/de.yml +1107 -0
  74. data/data/plates/dk.yml +1647 -0
  75. data/data/plates/ee.yml +1275 -0
  76. data/data/plates/es.yml +888 -0
  77. data/data/plates/fi.yml +1271 -0
  78. data/data/plates/fr.yml +1265 -0
  79. data/data/plates/gb.yml +1188 -0
  80. data/data/plates/gr.yml +721 -0
  81. data/data/plates/hr.yml +860 -0
  82. data/data/plates/hu.yml +959 -0
  83. data/data/plates/ie.yml +775 -0
  84. data/data/plates/in.yml +1172 -0
  85. data/data/plates/is.yml +667 -0
  86. data/data/plates/it.yml +1317 -0
  87. data/data/plates/jp.yml +3650 -0
  88. data/data/plates/kr.yml +1375 -0
  89. data/data/plates/li.yml +1010 -0
  90. data/data/plates/lt.yml +879 -0
  91. data/data/plates/lu.yml +842 -0
  92. data/data/plates/lv.yml +924 -0
  93. data/data/plates/mc.yml +1024 -0
  94. data/data/plates/mt.yml +854 -0
  95. data/data/plates/mx.yml +1372 -0
  96. data/data/plates/my.yml +685 -0
  97. data/data/plates/nl.yml +1016 -0
  98. data/data/plates/no.yml +1018 -0
  99. data/data/plates/nz.yml +1699 -0
  100. data/data/plates/pl.yml +1296 -0
  101. data/data/plates/pt.yml +847 -0
  102. data/data/plates/ro.yml +785 -0
  103. data/data/plates/se.yml +1091 -0
  104. data/data/plates/si.yml +1105 -0
  105. data/data/plates/sk.yml +1439 -0
  106. data/data/plates/sm.yml +1119 -0
  107. data/data/plates/th.yml +1150 -0
  108. data/data/plates/ua.yml +1672 -0
  109. data/data/plates/us-ak.yml +763 -0
  110. data/data/plates/us-al.yml +457 -0
  111. data/data/plates/us-ar.yml +427 -0
  112. data/data/plates/us-as.yml +454 -0
  113. data/data/plates/us-az.yml +430 -0
  114. data/data/plates/us-ca.yml +892 -0
  115. data/data/plates/us-co.yml +452 -0
  116. data/data/plates/us-ct.yml +427 -0
  117. data/data/plates/us-dc.yml +614 -0
  118. data/data/plates/us-de.yml +551 -0
  119. data/data/plates/us-fl.yml +741 -0
  120. data/data/plates/us-ga.yml +644 -0
  121. data/data/plates/us-gu.yml +658 -0
  122. data/data/plates/us-hi.yml +585 -0
  123. data/data/plates/us-ia.yml +438 -0
  124. data/data/plates/us-id.yml +531 -0
  125. data/data/plates/us-il.yml +516 -0
  126. data/data/plates/us-in.yml +324 -0
  127. data/data/plates/us-ks.yml +351 -0
  128. data/data/plates/us-ky.yml +770 -0
  129. data/data/plates/us-la.yml +568 -0
  130. data/data/plates/us-ma.yml +379 -0
  131. data/data/plates/us-md.yml +536 -0
  132. data/data/plates/us-me.yml +445 -0
  133. data/data/plates/us-mi.yml +408 -0
  134. data/data/plates/us-mn.yml +411 -0
  135. data/data/plates/us-mo.yml +356 -0
  136. data/data/plates/us-mp.yml +402 -0
  137. data/data/plates/us-ms.yml +432 -0
  138. data/data/plates/us-mt.yml +619 -0
  139. data/data/plates/us-nc.yml +602 -0
  140. data/data/plates/us-nd.yml +419 -0
  141. data/data/plates/us-ne.yml +483 -0
  142. data/data/plates/us-nh.yml +394 -0
  143. data/data/plates/us-nj.yml +547 -0
  144. data/data/plates/us-nm.yml +574 -0
  145. data/data/plates/us-nv.yml +655 -0
  146. data/data/plates/us-ny.yml +592 -0
  147. data/data/plates/us-oh.yml +404 -0
  148. data/data/plates/us-ok.yml +513 -0
  149. data/data/plates/us-or.yml +392 -0
  150. data/data/plates/us-pa.yml +506 -0
  151. data/data/plates/us-pr.yml +507 -0
  152. data/data/plates/us-ri.yml +445 -0
  153. data/data/plates/us-sc.yml +605 -0
  154. data/data/plates/us-sd.yml +428 -0
  155. data/data/plates/us-tn.yml +471 -0
  156. data/data/plates/us-tx.yml +535 -0
  157. data/data/plates/us-ut.yml +384 -0
  158. data/data/plates/us-va.yml +567 -0
  159. data/data/plates/us-vi.yml +489 -0
  160. data/data/plates/us-vt.yml +458 -0
  161. data/data/plates/us-wa.yml +484 -0
  162. data/data/plates/us-wi.yml +509 -0
  163. data/data/plates/us-wv.yml +446 -0
  164. data/data/plates/us-wy.yml +523 -0
  165. data/data/plates/va.yml +604 -0
  166. data/data/plates/za.yml +1141 -0
  167. data/data/vehicles.json +160653 -105090
  168. data/lib/vehicles/configuration.rb +18 -2
  169. data/lib/vehicles/dataset.rb +73 -18
  170. data/lib/vehicles/fuzzy.rb +115 -0
  171. data/lib/vehicles/http.rb +48 -0
  172. data/lib/vehicles/make.rb +36 -6
  173. data/lib/vehicles/mcp_server.rb +5 -5
  174. data/lib/vehicles/model.rb +42 -6
  175. data/lib/vehicles/plates/jurisdiction.rb +32 -0
  176. data/lib/vehicles/plates/series.rb +291 -0
  177. data/lib/vehicles/plates/template_fill.rb +188 -0
  178. data/lib/vehicles/plates/templates.rb +162 -0
  179. data/lib/vehicles/plates.rb +122 -0
  180. data/lib/vehicles/providers/hosted_provider.rb +49 -58
  181. data/lib/vehicles/providers/local_provider.rb +4 -3
  182. data/lib/vehicles/validators/vehicle_make_validator.rb +3 -1
  183. data/lib/vehicles/validators/vehicle_model_validator.rb +1 -1
  184. data/lib/vehicles/version.rb +1 -1
  185. data/lib/vehicles.rb +53 -16
  186. data/rakelib/data_refresh.rake +109 -0
  187. data/rakelib/plates_refresh.rake +29 -0
  188. data/sig/vehicles.rbs +18 -0
  189. metadata +174 -2
@@ -0,0 +1,1141 @@
1
+ # plates/za.yml — South Africa (PRD-PLATES gate L3).
2
+ #
3
+ # EVERY grammar claim in this file comes from ONE regulation — regulation 27
4
+ # of the National Road Traffic Regulations, 2000 (GNR.225 of 17 March 2000),
5
+ # made by the Minister of Transport under s. 75 of the National Road Traffic
6
+ # Act 93 of 1996 — and every colour, layout and dimension claim from
7
+ # regulation 35 of the same instrument. Both were read in the consolidated
8
+ # regulations (consolidated to GNR.359 of 2 May 2010) and again, word for
9
+ # word, in a Government Gazette reproduction (GG 37542, General Notice 287 of
10
+ # 9 April 2014). The Free State design and personalised-number claims come
11
+ # from that province's own gazette notices, fetched in full.
12
+ #
13
+ # SIX STRUCTURAL FACTS THAT SHAPE THIS FILE
14
+ #
15
+ # 1. SOUTH AFRICA HAS ONE STATUTORY GRAMMAR AND NINE ISSUING PROVINCES, AND
16
+ # THE GRAMMAR IS SMALL, CLOSED AND DIRECTLY REGEX-ABLE. Reg 27(2)(a),
17
+ # verbatim: the MEC of a province shall "(i) allocate a licence mark to
18
+ # every registering authority in the province concerned, which licence mark
19
+ # shall consist of a combination of letters; or (ii) establish a licence
20
+ # number system for the province concerned which license number system
21
+ # shall consist of: (aa) a combination of three letters and three figures
22
+ # in any sequence; or (bb) a combination of two letters, two figures and
23
+ # two letters in any sequence: and the licence mark of the province
24
+ # concerned, referred to in sub regulation (1)". That is the whole of the
25
+ # ordinary South African plate: EITHER a town code followed by figures, OR
26
+ # a national serial shape followed by a two- or one-letter provincial mark.
27
+ # Everything else in this file is a reg 27(5) or reg 71(2) special class.
28
+ #
29
+ # 2. THE CHARSET IS STATUTORY AND IT IS THE PROVISO TO REG 27(2)(a)(ii),
30
+ # verbatim: "Provided that vowels and the letter 'Q' shall not be used and
31
+ # the first letter shall not be the letter 'G'." Twenty letters survive
32
+ # (B C D F G H J K L M N P R S T V W X Y Z), nineteen in first position.
33
+ # Two consequences worth stating because they are easy to get wrong:
34
+ # the proviso governs the SERIAL, not the provincial mark — "EC" and
35
+ # "ZN" both contain letters the serial may not use — and the G exclusion
36
+ # exists because reg 27(5)(a)(ii) reserves a leading G for departments of
37
+ # State. `format.regex` therefore cannot carry the charset (the lint
38
+ # generates vowels from `pattern`); `format.regex_strict` carries it, on
39
+ # every series where the proviso applies and on no other.
40
+ #
41
+ # 3. THE 2009 AMENDMENT IS THE ONE CLEAN ERA BOUNDARY IN THE WHOLE PASS.
42
+ # Sub-paragraph (ii) was SUBSTITUTED by r. 5(a) of GNR.589 of 27 May 2009
43
+ # (Government Gazette 32258), and that substitution is what introduced
44
+ # limb (bb) — the two-letter/two-figure/two-letter shape. Before 27 May
45
+ # 2009 no South African province could lawfully issue "BC 12 DF GP". That
46
+ # is an ENABLING-INSTRUMENT date, and it is recorded as one; the dates on
47
+ # which individual provinces began ISSUING under (bb) are separate facts
48
+ # with separate (and weaker) evidence, recorded per series.
49
+ #
50
+ # 4. THE 1994 PROVINCIAL REORGANISATION IS THE ERA BOUNDARY THIS FILE CANNOT
51
+ # DATE, AND SAYS SO. Four provinces became nine on 27 April 1994; seven of
52
+ # the nine went on to adopt suffix systems under reg 27(2)(a)(ii) while the
53
+ # Western Cape and (until 2023) KwaZulu-Natal kept the inherited town-code
54
+ # system of reg 27(2)(a)(i). The provincial notices that made those choices
55
+ # were issued in the second half of the 1990s under the Road Traffic Act 29
56
+ # of 1989 and its provincial ordinances, and NOT ONE of them was reachable
57
+ # in this pass: SAFLII sits behind Cloudflare, opengazettes.org.za has
58
+ # retired its full-text search, and gazettes.africa exposes no query
59
+ # endpoint. Every suffix series here therefore carries period.start 2000
60
+ # with `period_evidence: instrument-in-force` — the date of the instrument
61
+ # that governs the format TODAY, expressly not the date the format began.
62
+ # The real start years are a recorded gap and the single most valuable
63
+ # target for the verifier.
64
+ #
65
+ # 5. THE PROVINCIAL MARK IS NOT ALWAYS TWO LETTERS AND ONE OF THEM COLLIDES
66
+ # WITH THE PATTERN DSL. Limpopo's mark is the single letter L, which the
67
+ # human-pattern language reads as "any letter". This is the first file in
68
+ # the dataset to use the owner's 2026-08-02 pattern escape in anger:
69
+ # `LLL 999 \L` means three letters, three figures and a LITERAL L.
70
+ #
71
+ # 6. THERE IS NO NATIONAL PLATE DESIGN, AND THE ATTEMPT TO CREATE ONE IS
72
+ # UNFINISHED. Reg 35(2) fixes only a palette — "yellow or white retro-
73
+ # reflective surface" with "black, dark blue, dark red, or dark green
74
+ # letters and figures, but shall display only black letters and figures in
75
+ # the case of a yellow retro-reflective surface" — and reg 27(2)(b) hands
76
+ # the logo, landscape, letter type and colours to each MEC. GG 37542 GN 287
77
+ # of 9 April 2014 proposed a single national plate carrying "the allocated
78
+ # licence number, South African Flag and the licence mark of the respective
79
+ # province at the end ... on a white retro-reflective surface landscape as
80
+ # shown in Schedule 5". It was published FOR COMMENT under s. 75(6) of the
81
+ # Act. Whether it was ever promulgated was not established in this pass and
82
+ # is NOT asserted here.
83
+ #
84
+ # REGEX POLICY (identical to plates/gb.yml, plates/de.yml and plates/nl.yml):
85
+ # `format.regex` is the LINT-ROUND-TRIPPABLE regex; `format.regex_strict`
86
+ # carries the reg 27(2)(a)(ii) proviso alphabet, which `regex` cannot.
87
+ #
88
+ # SEPARATOR NOTE (PRD-PLATES § 2.6): a South African plate prints NO separator
89
+ # glyph between the serial groups. Reg 35(3) prescribes the ARRANGEMENT of the
90
+ # groups ("with all the letters and figures in one line", or the two-line
91
+ # forms) and never a separator character; the millimetre spacing lives in
92
+ # SANS/SABS 1116, a paywalled SABS publication which PRD-PLATES § 6 lets us
93
+ # build to and forbids us to reproduce. The space in every `pattern` here is
94
+ # the conventional textual rendering of that gap, and every regex accepts it
95
+ # as optional. The hyphen widely printed in the Western Cape ("CA 123-456") is
96
+ # a typographic convention with no instrument behind it and is NOT written
97
+ # into any pattern; the Western Cape regexes accept the digits with or without
98
+ # the gap.
99
+ jurisdiction: za
100
+ authority:
101
+ name: "Department of Transport (national) and the MEC responsible for road traffic in each of the nine provinces"
102
+ url: "https://www.transport.gov.za/"
103
+ binding: vehicle
104
+ binding_note: >-
105
+ Reg 27(3), verbatim: "Every motor vehicle licensed in a province shall be
106
+ allocated with a licence number". The number is allocated to the VEHICLE on
107
+ licensing, not to the owner; reg 29(1)-(2) lets the MEC change it, and reg
108
+ 28(5) lets the holder of a personalised number apply to move that number to
109
+ another vehicle he or she owns — the personalised regime is the one place
110
+ where a South African number follows a PERSON.
111
+ instrument:
112
+ act:
113
+ citation: "National Road Traffic Act, 1996 (Act No. 93 of 1996)"
114
+ assented: "1996-11-12"
115
+ published: "1996-11-22" # President's Office Notice No. 1892
116
+ commencement: "on a date fixed by the President by proclamation (s. 94(2)) — the proclamation was not pinned in this pass"
117
+ enabling_power: >-
118
+ s. 75(1), verbatim: "The Minister may after consultation with the MECs
119
+ make regulations ... and in particular, but without derogating from the
120
+ generality of this subsection, regarding— ... (b) the identification of
121
+ vehicles or parts of vehicles and, in relation to a motor vehicle, the
122
+ size and shape of the registration mark or number to be displayed in
123
+ terms of this Act and the means to be applied to validate such mark or
124
+ number and to render any such mark or number easily distinguishable,
125
+ whether by night or by day, when any such vehicle is operated on a
126
+ public road".
127
+ source: "https://www.gov.za/sites/default/files/gcis_document/201409/a93-96.pdf # Act 93 of 1996 as published; s. 75(1)(b), s. 68 (unlawful acts in relation to registration plates), s. 94 short title and commencement"
128
+ regulations:
129
+ citation: "National Road Traffic Regulations, 2000, GNR.225 of 17 March 2000 (Department of Transport)"
130
+ repeals: "GNR.910 of 26 April 1990 (Road Traffic Regulations, 1990)"
131
+ consolidation_read: "as amended to GNR.359 of 2 May 2010"
132
+ amended_by:
133
+ - "R.761, GG 21425, 31 July 2000"
134
+ - "R.941, GG 21569, 22 September 2000"
135
+ - "R.726, GG 22553, 3 August 2001"
136
+ - "R.2116, GG 22736, 5 October 2001"
137
+ - "R.779, GG 23484, 4 June 2002"
138
+ - "R.1341, GG 25484, 25 September 2003"
139
+ - "R.881, GG 26598, 23 July 2004"
140
+ - "R.871, GG 27999, 2 September 2005"
141
+ - "R.1066, GG 28227, 23 November 2005"
142
+ - "R.1319, GG 28258, 2 December 2005"
143
+ - "R.92, GG 28446, 7 April 2006"
144
+ - "R.891, GG 29195, 4 September 2006"
145
+ - "R.964, GG 29260, 29 September 2006"
146
+ - "R.404, GG 29865, 4 May 2007"
147
+ - "R.865, GG 30295, 28 September 2007"
148
+ - "R.589, GG 32258, 27 May 2009"
149
+ - "R.359, GG 33168, 2 May 2010"
150
+ amendment_note: >-
151
+ The consolidation read for this pass stops at GNR.359 of 2 May 2010.
152
+ Amendments after 2010 are NOT reflected in any claim in this file, and a
153
+ verifier should treat every reg 27/35 quote as "in force as at 2 May
154
+ 2010, unchanged as at GG 37542 of 9 April 2014" rather than as
155
+ necessarily current. GG 37542 GN 287 (2014) is the latest text located
156
+ and it reproduces reg 27(1)-(5) identically.
157
+ source: "https://disasterlaw.ifrc.org/sites/default/files/media/disaster_law/2021-06/%20ROAD%20TRAFFIC%20REGULATIONS,%202000.pdf # the consolidated National Road Traffic Regulations 2000 — table of repeals, amendment table, regs 27, 28, 28A, 29, 35, 50, 71, 82, 84; accessed 2026-08-02"
158
+ source_host_caveat: >-
159
+ THE HOST IS NOT THE PUBLISHER, AND THAT IS STATED HERE RATHER THAN
160
+ HIDDEN. The consolidated regulations were read from the IFRC Disaster
161
+ Law database, which mirrors the text; no South African government or
162
+ free-access-to-law host served it in this pass (SAFLII and
163
+ lawlibrary.org.za both returned HTTP 403 behind bot protection,
164
+ acts.co.za paywalls the regulation pages, natis.gov.za returned 403, and
165
+ gov.za's own search returns no regulation documents). The mitigation is
166
+ corroboration rather than trust: every regulation 27 and regulation 35
167
+ claim in this file was independently re-read in Government Gazette
168
+ 37542, General Notice 287 of 9 April 2014, hosted on gov.za, and the two
169
+ texts agree word for word. Where GN 287 does NOT reproduce a provision
170
+ (regs 28A, 50, 71, 82, 84 and the amendment table) the claim rests on
171
+ the mirror alone and is flagged for the verifier.
172
+ licence: >-
173
+ South African statutes and regulations are edicts of government. The
174
+ Government Printing Works republication note carried by the gazette PDFs
175
+ ("This gazette is also available free online at www.gpwonline.co.za")
176
+ accompanies the Government Gazette text quoted here. SANS/SABS 1116 is a
177
+ COPYRIGHTED SABS publication and is cited, never reproduced
178
+ (PRD-PLATES § 6).
179
+
180
+ # ---------------------------------------------------------------------------
181
+ # Jurisdiction-wide facts, cited once and referenced per series.
182
+ # ---------------------------------------------------------------------------
183
+ common:
184
+ charset:
185
+ permitted_letters: [B, C, D, F, G, H, J, K, L, M, N, P, R, S, T, V, W, X, Y, Z]
186
+ excluded_letters: [A, E, I, O, U, Q]
187
+ first_letter_excluded: [G]
188
+ scope: >-
189
+ Reg 27(2)(a)(ii) proviso ONLY — that is, the provincial licence NUMBER
190
+ systems (three letters + three figures; two letters + two figures + two
191
+ letters). It does NOT reach the provincial mark itself, the registering-
192
+ authority marks of reg 27(2)(a)(i), or the reg 27(5) special classes.
193
+ Reg 71(2) imposes a parallel but not identical rule on motor trade
194
+ numbers: "shall not consist of vowels, except the letter 'A' as referred
195
+ to in paragraph (a), or the letter 'Q'".
196
+ source: "https://www.gov.za/sites/default/files/gcis_document/201409/37542gen287.pdf # GG 37542 GN 287 of 9 April 2014 reproducing reg 27(2)(a)(ii): 'Provided that vowels and the letter \"Q\" shall not be used and the first letter shall not be the letter \"G\"'"
197
+ layouts:
198
+ note: >-
199
+ Reg 35(3), verbatim: "The letters and figures on a number plate shall be
200
+ arranged— (a) with all the letters and figures in one line; or (b) with
201
+ the letters preceding the figures in one line and immediately thereunder,
202
+ the figures and, if applicable, the last letter in one line; (c) with all
203
+ the letters and figures and the logo or landscape in one line; or (d)
204
+ with the letters or the figures and the logo or landscape in one line,
205
+ and immediately thereunder— (i) the figures and letters; (ii) the letters
206
+ and letters; or (iii) the letters and figures, and, if applicable,
207
+ immediately thereunder, the letters in one line."
208
+ source: "https://disasterlaw.ifrc.org/sites/default/files/media/disaster_law/2021-06/%20ROAD%20TRAFFIC%20REGULATIONS,%202000.pdf # reg 35(3)"
209
+ colours:
210
+ note: >-
211
+ Reg 35(2), verbatim: the number plate "(b) shall have a yellow or white
212
+ retro-reflective surface; (c) shall have black, dark blue, dark red, or
213
+ dark green letters and figures, but shall display only black letters and
214
+ figures in the case of a yellow retro-reflective surface; (d) may display
215
+ a logo or landscape if it appears on a white retro-reflective surface;
216
+ and (e) shall be clearly legible and visible." Para (c) was substituted
217
+ by GNR.404 of 4 May 2007.
218
+ hex_basis_note: >-
219
+ The Regulations NAME the colours and never number them; the chromaticity
220
+ lives in SANS/SABS 1116, which PRD-PLATES § 6 forbids reproducing. Every
221
+ hex in this file is therefore `hex_basis: observed` inside a
222
+ statutorily named colour — the same posture plates/gb.yml takes for BS
223
+ AU 145e and plates/de.yml for "grünes Kennzeichen".
224
+ source: "https://disasterlaw.ifrc.org/sites/default/files/media/disaster_law/2021-06/%20ROAD%20TRAFFIC%20REGULATIONS,%202000.pdf # reg 35(2)(b)-(e)"
225
+ dimensions:
226
+ note: >-
227
+ Reg 35(10), second sentence, inserted by GNR.404 of 2007, verbatim:
228
+ "Provided that notwithstanding the provisions of this regulation, no
229
+ person shall operate on a public road a motor vehicle first registered
230
+ on or after 1 January 2010, unless such motor vehicle is fitted with a
231
+ 520 - 113 or 250 - 205 or 250 -165 size number plate." Millimetres. The
232
+ Free State separately recognises a 305 x 165 mm plate for seven-character
233
+ personalised numbers (Provincial Notice 278 of 2006) — a size the
234
+ national regulation does not list, and the discrepancy is recorded, not
235
+ averaged (PRD-PLATES § 5.3).
236
+ character_height: >-
237
+ Reg 35(4): 75 mm is the norm and 60 mm characters may be approved by the
238
+ MEC for a rear illuminated space too small for 75 mm. The Free State
239
+ notices name the typeface with the height: "FE modified 75mm as
240
+ prescribed in the standard specifications of the South African Bureau of
241
+ Standards, SABS 1116".
242
+ source: "https://disasterlaw.ifrc.org/sites/default/files/media/disaster_law/2021-06/%20ROAD%20TRAFFIC%20REGULATIONS,%202000.pdf # reg 35(4), 35(10)"
243
+ fitment:
244
+ note: >-
245
+ Reg 35(7): a number plate is affixed "(e) to the back of a motor cycle,
246
+ motor tricycle, motor quadrucycle or trailer; and (f) one to the back and
247
+ one to the front of all other motor vehicles" — so motorcycles and
248
+ trailers are REAR ONLY and carry the same licence number as any other
249
+ vehicle. From 1 January 2009 the plate must be riveted or one-way-screwed
250
+ within 20 mm of the edges (proviso inserted by r. 7 of GNR.589 of 27 May
251
+ 2009). Reg 35(6)(h) requires every plate on one vehicle to display "the
252
+ same licence number, letter type, colours, and logo or landscape", which
253
+ is why `rear_differs` is false throughout this file.
254
+ source: "https://disasterlaw.ifrc.org/sites/default/files/media/disaster_law/2021-06/%20ROAD%20TRAFFIC%20REGULATIONS,%202000.pdf # reg 35(6)(h), 35(7)"
255
+ standard:
256
+ citation: >-
257
+ Reg 35(1), as substituted by R.17(a) of GNR.1341 w.e.f. 25 September
258
+ 2003, verbatim: the licence number "shall be displayed on a plate, to be
259
+ referred to as a number plate and which complies with standard
260
+ specification SABS 1116: 'Retro-reflective Registration Plates for Motor
261
+ Vehicles', Part 2: 'Registration plates (metal)' or Part 4: 'Registration
262
+ plates (plastic)'." Reg 50(1) binds registered manufacturers of number
263
+ plates to the same two parts.
264
+ posture: "cited, never reproduced — SABS 1116 is a paywalled SABS publication (PRD-PLATES § 6)"
265
+ source: "https://disasterlaw.ifrc.org/sites/default/files/media/disaster_law/2021-06/%20ROAD%20TRAFFIC%20REGULATIONS,%202000.pdf # reg 35(1), reg 35(6)(i), reg 50(1)(a)"
266
+ font:
267
+ name: "FE-Schrift, modified (\"FE modified\"), 75 mm — 60 mm on the 305 x 165 mm Free State personalised plate"
268
+ posture: >-
269
+ The TYPEFACE IS NAMED IN A GAZETTE, which is unusual and worth recording:
270
+ Free State Provincial Notice 51 of 2002 Schedule 3 para 1 and Provincial
271
+ Notice 52 of 2002 Schedule 2 para 1 both read "The letter type used for
272
+ the number shall be FE modified 75mm as prescribed in the standard
273
+ specifications of the South African Bureau of Standards, SABS 1116". The
274
+ drawing itself is in SABS 1116 and is not reproduced. Whether the other
275
+ eight provinces prescribe the same face was not established.
276
+ source: "https://www.policeroadstransport.fs.gov.za/wp-content/uploads/2012/09/Licence-number-plate-for-the-Free-State-2002.pdf # PN 51 of 2002, Schedule 3 para 1"
277
+ not_modelled:
278
+ - "TEMPORARY AND SPECIAL PERMITS (regs 84-86). A permit is a document, not a plate; reg 84(1) covers delivery, testing, repair, weighing and repossession, and reg 84(3) covers an owner who cannot comply with reg 35. Free State Provincial Notice 52 of 2002 para 2(2) refers to 'the temporary or special permit number system of the Free State Province', so permits DO carry numbers — but no permit-number grammar was located in any instrument reachable in this pass. Recorded gap."
279
+ - "MILITARY. The South African National Defence Force is a department of State and would fall under reg 27(5)(a)(iii) ('any other licence number determined by the chief executive officer by notice in the Gazette'). No such notice was located, so no military series is asserted here even though a three-letter/three-figure/M form is widely reported. Recorded gap."
280
+ - "HISTORIC / VINTAGE. No national historic-vehicle plate regime was located in the Act or the Regulations. Recorded gap."
281
+ - "EXPORT. No export-plate regime was located. Reg 35(6)(e) instead deals with FOREIGN plates: a vehicle registered in a prescribed territory other than Namibia must display the Convention distinguishing sign."
282
+ - "THE FULL REGISTERING-AUTHORITY MARK TABLES for the Western Cape and (pre-2023) KwaZulu-Natal. See plates/_decode/za-licence-marks.yml — a floor, not a census."
283
+ - "GAUTENG'S 2025 'SMART' NUMBER PLATE. The Gauteng Provincial Government's own media statement of 5 June 2025 describes a PILOT of tamper-evident decals, forensic QR codes and a digitised back-end portal on g-Fleet vehicles, six months of stress testing 'before the provincial rollout'. It changes the plate's SECURITY FEATURES, not the licence-number grammar, and it was still a pilot at that date — so it is recorded here and not modelled as a series."
284
+
285
+ series:
286
+
287
+ # =========================================================================
288
+ # A. PROVINCIAL LICENCE NUMBER SYSTEMS — reg 27(2)(a)(ii)(aa):
289
+ # "a combination of three letters and three figures in any sequence ...
290
+ # and the licence mark of the province concerned".
291
+ # One series per province, because the provincial mark is a LITERAL and
292
+ # a series is one format (PRD-PLATES § 2.2).
293
+ # =========================================================================
294
+
295
+ - id: za-gp-standard-3l3f
296
+ class: standard
297
+ categories: [car, van, truck, bus, motorcycle, trailer]
298
+ period: { start: 2000 }
299
+ period_evidence: instrument-in-force
300
+ matching: strict
301
+ format:
302
+ pattern: "LLL 999 GP"
303
+ regex: '\A[A-Z]{3} ?\d{3} ?GP\z'
304
+ regex_strict: '\A[BCDFHJKLMNPRSTVWXYZ][BCDFGHJKLMNPRSTVWXYZ]{2} ?\d{3} ?GP\z'
305
+ charset:
306
+ notes: >-
307
+ Reg 27(2)(a)(ii) proviso: no vowels, no Q, and no leading G. The
308
+ strict twin encodes both, which `regex` cannot carry because the
309
+ lint generates vowels from `pattern`.
310
+ progression: >-
311
+ Reg 27 does not publish an allocation order and no Gauteng gazette
312
+ setting one was located. Letter-triple exhaustion is the reported
313
+ reason for the move to the two-letter/two-figure/two-letter shape
314
+ (see za-gp-standard-2l2f2l).
315
+ design:
316
+ plate: { w: 520, h: 113, unit: mm }
317
+ plate_variants:
318
+ - { w: 250, h: 205, unit: mm, note: "reg 35(10)" }
319
+ - { w: 250, h: 165, unit: mm, note: "reg 35(10)" }
320
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
321
+ foreground: "#000000"
322
+ emblem: { present: false, note: "reg 27(2)(b) lets the MEC determine a logo or landscape; no Gauteng determination was located" }
323
+ rear_differs: false
324
+ region_encoding: "plates/_decode/za-licence-marks.yml"
325
+ region_encoding_mechanism: >-
326
+ The trailing GP is the reg 27(1) provincial mark for Gauteng and encodes
327
+ the province of LICENSING, not the owner's address and not the place of
328
+ first registration. It does not narrow further: Gauteng runs one
329
+ province-wide system, not per-town codes.
330
+ sources:
331
+ - "https://disasterlaw.ifrc.org/sites/default/files/media/disaster_law/2021-06/%20ROAD%20TRAFFIC%20REGULATIONS,%202000.pdf # reg 27(2)(a)(ii)(aa) three letters + three figures; reg 27(3) composition; the proviso"
332
+ - "https://www.gov.za/sites/default/files/gcis_document/201409/37542gen287.pdf # GG 37542 GN 287 of 9 April 2014 reproducing reg 27 in identical words"
333
+ - "https://cmbinary.gauteng.gov.za/Media?path=transport/Documents/Documents/GP%20Application%20Form%20-%20Personalised%20Number%20Plate.pdf&Item=658&Type=Documents&Location=/transport # Gauteng form PRN1-GP: the registration-number fields are pre-printed 'G P' — the GP mark"
334
+ - "https://disasterlaw.ifrc.org/sites/default/files/media/disaster_law/2021-06/%20ROAD%20TRAFFIC%20REGULATIONS,%202000.pdf # reg 35(2) colours, 35(10) sizes"
335
+ notes: >-
336
+ GAUTENG, three letters + three figures + GP. period.start 2000 is the
337
+ NRTR 2000 and is an instrument-in-force date, NOT the year the format
338
+ began: Gauteng's suffix system dates from the province's creation in the
339
+ 1994 reorganisation, under the Road Traffic Act 29 of 1989, and the
340
+ provincial notice that established it was not reachable in this pass.
341
+ This series is not closed — the overwhelming majority of Gauteng plates
342
+ on the road carry it — and it runs in parallel with the newer
343
+ two-letter/two-figure/two-letter issue.
344
+
345
+ - id: za-ec-standard-3l3f
346
+ class: standard
347
+ categories: [car, van, truck, bus, motorcycle, trailer]
348
+ period: { start: 2000 }
349
+ period_evidence: instrument-in-force
350
+ matching: strict
351
+ format:
352
+ pattern: "LLL 999 EC"
353
+ regex: '\A[A-Z]{3} ?\d{3} ?EC\z'
354
+ regex_strict: '\A[BCDFHJKLMNPRSTVWXYZ][BCDFGHJKLMNPRSTVWXYZ]{2} ?\d{3} ?EC\z'
355
+ charset: { notes: "reg 27(2)(a)(ii) proviso — no vowels, no Q, no leading G. Note that the MARK itself contains the vowel E: the proviso governs the serial only." }
356
+ design:
357
+ plate: { w: 520, h: 113, unit: mm }
358
+ plate_variants:
359
+ - { w: 250, h: 205, unit: mm, note: "reg 35(10)" }
360
+ - { w: 250, h: 165, unit: mm, note: "reg 35(10)" }
361
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
362
+ foreground: "#000000"
363
+ rear_differs: false
364
+ region_encoding: "plates/_decode/za-licence-marks.yml"
365
+ sources:
366
+ - "https://disasterlaw.ifrc.org/sites/default/files/media/disaster_law/2021-06/%20ROAD%20TRAFFIC%20REGULATIONS,%202000.pdf # reg 27(2)(a)(ii)(aa) + proviso; reg 35(2),(10)"
367
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_South_Africa # the provincial mark EC — secondary-wikipedia, untraced to its provincial gazette notice; accessed 2026-08-02"
368
+ notes: >-
369
+ EASTERN CAPE, three letters + three figures + EC. THE MARK IS THE WEAK
370
+ CLAIM HERE: the grammar is primary (reg 27) but the two letters "EC" rest
371
+ on Wikipedia and were not traced to the Eastern Cape provincial gazette
372
+ notice made under reg 27(1). Flagged for the verifier.
373
+
374
+ - id: za-fs-standard-3l3f
375
+ class: standard
376
+ categories: [car, van, truck, bus, motorcycle, trailer]
377
+ period: { start: 2000 }
378
+ period_evidence: instrument-in-force
379
+ matching: strict
380
+ format:
381
+ pattern: "LLL 999 FS"
382
+ regex: '\A[A-Z]{3} ?\d{3} ?FS\z'
383
+ regex_strict: '\A[BCDFHJKLMNPRSTVWXYZ][BCDFGHJKLMNPRSTVWXYZ]{2} ?\d{3} ?FS\z'
384
+ charset: { notes: "reg 27(2)(a)(ii) proviso — no vowels, no Q, no leading G" }
385
+ design:
386
+ plate: { w: 520, h: 113, unit: mm }
387
+ plate_variants:
388
+ - { w: 250, h: 205, unit: mm, note: "reg 35(10)" }
389
+ - { w: 250, h: 165, unit: mm, note: "reg 35(10)" }
390
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
391
+ foreground: "#000000"
392
+ emblem:
393
+ present: true
394
+ rendered: placeholder
395
+ note: >-
396
+ THE ONLY FULLY-SOURCED PROVINCIAL DESIGN IN THIS FILE. Free State
397
+ Provincial Notice 51 of 2002 (Provincial Gazette 25 of 9 April 2002),
398
+ Schedule 1, verbatim: the background "shall be printed under the top
399
+ coat of the retro-reflective surface with translucent ink and shall
400
+ be - (a) a cheetah in the colour brown 0760 with black spots, 50 mm
401
+ high and 84 mm wide; (b) sky in the colour blue 0460; (c) mountain
402
+ range in the colour brown 0760 with black rock reeves; and (d)
403
+ rolling hills in the colour green 0660". The ink codes are the
404
+ notice's own and are NOT convertible to hex here. Schedule 3 para 4
405
+ adds a covert element: the retro-reflective sheeting carries the
406
+ manufacturer's identifier and "the Province by way of the letters
407
+ 'FS' inside a 12 mm circle interspersed throughout the sheeting".
408
+ PRD-PLATES § 3 placeholder rule applies to the cheetah landscape.
409
+ rear_differs: false
410
+ region_encoding: "plates/_decode/za-licence-marks.yml"
411
+ sources:
412
+ - "https://disasterlaw.ifrc.org/sites/default/files/media/disaster_law/2021-06/%20ROAD%20TRAFFIC%20REGULATIONS,%202000.pdf # reg 27(2)(a)(ii)(aa) + proviso"
413
+ - "https://www.policeroadstransport.fs.gov.za/wp-content/uploads/2012/09/Licence-number-plate-for-the-Free-State-2002.pdf # Free State Provincial Notice 51 of 2002, Provincial Gazette 25 of 9 April 2002, made under reg 27: para 3(c) black letters on white retro-reflective with the Schedule 1/3 landscape; para 12 metal only (SABS 1116 Part 2); para 14 'This notice takes effect on 1 June 2002'; Schedule 3 para 1 FE modified 75 mm; Schedule 3 para 4 the FS-in-a-circle sheeting mark"
414
+ - "https://www.policeroadstransport.fs.gov.za/wp-content/uploads/2012/09/Amendment-of-personalised-and-licence-number-plates-for-the-Free-State-2010.pdf # Free State Provincial Notice 16 of 2010, Provincial Gazette 17 of 23 April 2010: deletes the number-plate validation label and the five-year plate-replacement rule from PN 51 of 2002"
415
+ notes: >-
416
+ FREE STATE, three letters + three figures + FS. The SERIAL grammar is the
417
+ national reg 27 grammar; what is province-specific and fully primary here
418
+ is the DESIGN: black on white with the cheetah landscape from 1 June 2002
419
+ (Provincial Notice 51 of 2002), metal plates only, with a four-year
420
+ run-out for existing plastic and for the older black-on-white and
421
+ black-on-yellow plates authorised by the repealed Government Notice 1579
422
+ of 28 November 1997. The five-year plate validity and the self-destructing
423
+ "number plate validation label" that PN 51 introduced were both REPEALED
424
+ by Provincial Notice 16 of 2010 (23 April 2010) — a rare, cleanly dated
425
+ reversal, recorded because a consumer reading only the 2002 notice would
426
+ wrongly expire every Free State plate.
427
+
428
+ - id: za-lp-standard-3l3f
429
+ class: standard
430
+ categories: [car, van, truck, bus, motorcycle, trailer]
431
+ period: { start: 2000 }
432
+ period_evidence: instrument-in-force
433
+ matching: strict
434
+ format:
435
+ pattern: 'LLL 999 \L'
436
+ regex: '\A[A-Z]{3} ?\d{3} ?L\z'
437
+ regex_strict: '\A[BCDFHJKLMNPRSTVWXYZ][BCDFGHJKLMNPRSTVWXYZ]{2} ?\d{3} ?L\z'
438
+ charset: { notes: "reg 27(2)(a)(ii) proviso — no vowels, no Q, no leading G" }
439
+ pattern_note: >-
440
+ THE PATTERN ESCAPE'S FIRST PRODUCTION USE. Limpopo's provincial mark is
441
+ the single letter L, which is also the human-pattern DSL's token for
442
+ "any letter". `\L` is the LITERAL L (owner ruling, 2026-08-02), so
443
+ `LLL 999 \L` reads "three letters, three figures, literal L" and the
444
+ round-trip is exact. Before the escape existed this series would have
445
+ had to be downgraded to recall-only.
446
+ design:
447
+ plate: { w: 520, h: 113, unit: mm }
448
+ plate_variants:
449
+ - { w: 250, h: 205, unit: mm, note: "reg 35(10)" }
450
+ - { w: 250, h: 165, unit: mm, note: "reg 35(10)" }
451
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
452
+ foreground: "#000000"
453
+ rear_differs: false
454
+ region_encoding: "plates/_decode/za-licence-marks.yml"
455
+ sources:
456
+ - "https://disasterlaw.ifrc.org/sites/default/files/media/disaster_law/2021-06/%20ROAD%20TRAFFIC%20REGULATIONS,%202000.pdf # reg 27(2)(a)(ii)(aa) + proviso; reg 27(1) provincial mark"
457
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_South_Africa # the one-letter provincial mark L for Limpopo — secondary-wikipedia, untraced to its provincial gazette notice; accessed 2026-08-02"
458
+ notes: >-
459
+ LIMPOPO, three letters + three figures + L. Two caveats. (1) The mark is
460
+ Wikipedia-derived and untraced to the Limpopo provincial gazette. (2) The
461
+ province was named Northern Province until its 2003 renaming and the mark
462
+ it used before then was not established — a plate collected in the 1990s
463
+ may therefore decode to a mark this file does not carry. Recorded gap.
464
+
465
+ - id: za-mp-standard-3l3f
466
+ class: standard
467
+ categories: [car, van, truck, bus, motorcycle, trailer]
468
+ period: { start: 2000 }
469
+ period_evidence: instrument-in-force
470
+ matching: strict
471
+ format:
472
+ pattern: "LLL 999 MP"
473
+ regex: '\A[A-Z]{3} ?\d{3} ?MP\z'
474
+ regex_strict: '\A[BCDFHJKLMNPRSTVWXYZ][BCDFGHJKLMNPRSTVWXYZ]{2} ?\d{3} ?MP\z'
475
+ charset: { notes: "reg 27(2)(a)(ii) proviso — no vowels, no Q, no leading G" }
476
+ design:
477
+ plate: { w: 520, h: 113, unit: mm }
478
+ plate_variants:
479
+ - { w: 250, h: 205, unit: mm, note: "reg 35(10)" }
480
+ - { w: 250, h: 165, unit: mm, note: "reg 35(10)" }
481
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
482
+ foreground: "#000000"
483
+ rear_differs: false
484
+ region_encoding: "plates/_decode/za-licence-marks.yml"
485
+ sources:
486
+ - "https://disasterlaw.ifrc.org/sites/default/files/media/disaster_law/2021-06/%20ROAD%20TRAFFIC%20REGULATIONS,%202000.pdf # reg 27(2)(a)(ii)(aa) + proviso"
487
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_South_Africa # the provincial mark MP — secondary-wikipedia, untraced; accessed 2026-08-02"
488
+ notes: >-
489
+ MPUMALANGA, three letters + three figures + MP. The province was named
490
+ Eastern Transvaal at its 1994 creation and renamed Mpumalanga in 1995;
491
+ neither the mark nor the rename's effect on it was traced to a provincial
492
+ gazette in this pass.
493
+
494
+ - id: za-nc-standard-3l3f
495
+ class: standard
496
+ categories: [car, van, truck, bus, motorcycle, trailer]
497
+ period: { start: 2000 }
498
+ period_evidence: instrument-in-force
499
+ matching: strict
500
+ format:
501
+ pattern: "LLL 999 NC"
502
+ regex: '\A[A-Z]{3} ?\d{3} ?NC\z'
503
+ regex_strict: '\A[BCDFHJKLMNPRSTVWXYZ][BCDFGHJKLMNPRSTVWXYZ]{2} ?\d{3} ?NC\z'
504
+ charset: { notes: "reg 27(2)(a)(ii) proviso — no vowels, no Q, no leading G" }
505
+ design:
506
+ plate: { w: 520, h: 113, unit: mm }
507
+ plate_variants:
508
+ - { w: 250, h: 205, unit: mm, note: "reg 35(10)" }
509
+ - { w: 250, h: 165, unit: mm, note: "reg 35(10)" }
510
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
511
+ foreground: "#000000"
512
+ rear_differs: false
513
+ region_encoding: "plates/_decode/za-licence-marks.yml"
514
+ sources:
515
+ - "https://disasterlaw.ifrc.org/sites/default/files/media/disaster_law/2021-06/%20ROAD%20TRAFFIC%20REGULATIONS,%202000.pdf # reg 27(2)(a)(ii)(aa) + proviso"
516
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_South_Africa # the provincial mark NC — secondary-wikipedia, untraced; accessed 2026-08-02"
517
+ notes: >-
518
+ NORTHERN CAPE, three letters + three figures + NC. A Northern Cape plate
519
+ is the clearest demonstration of the two-dimension trap this file guards
520
+ against: the province was carved out of the old Cape Province, whose
521
+ registering-authority marks all began with C and are still issued next
522
+ door in the Western Cape, so a C-initial mark and an NC suffix are the
523
+ SAME geography a generation apart and must never be conflated.
524
+
525
+ - id: za-nw-standard-3l3f
526
+ class: standard
527
+ categories: [car, van, truck, bus, motorcycle, trailer]
528
+ period: { start: 2000 }
529
+ period_evidence: instrument-in-force
530
+ matching: strict
531
+ format:
532
+ pattern: "LLL 999 NW"
533
+ regex: '\A[A-Z]{3} ?\d{3} ?NW\z'
534
+ regex_strict: '\A[BCDFHJKLMNPRSTVWXYZ][BCDFGHJKLMNPRSTVWXYZ]{2} ?\d{3} ?NW\z'
535
+ charset: { notes: "reg 27(2)(a)(ii) proviso — no vowels, no Q, no leading G" }
536
+ design:
537
+ plate: { w: 520, h: 113, unit: mm }
538
+ plate_variants:
539
+ - { w: 250, h: 205, unit: mm, note: "reg 35(10)" }
540
+ - { w: 250, h: 165, unit: mm, note: "reg 35(10)" }
541
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
542
+ foreground: "#000000"
543
+ rear_differs: false
544
+ region_encoding: "plates/_decode/za-licence-marks.yml"
545
+ sources:
546
+ - "https://disasterlaw.ifrc.org/sites/default/files/media/disaster_law/2021-06/%20ROAD%20TRAFFIC%20REGULATIONS,%202000.pdf # reg 27(2)(a)(ii)(aa) + proviso"
547
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_South_Africa # the provincial mark NW, and a reported new North West numbering system announced December 2015 and implemented February 2016 — secondary-wikipedia, untraced; accessed 2026-08-02"
548
+ notes: >-
549
+ NORTH WEST, three letters + three figures + NW. A change of numbering
550
+ system is reported for February 2016 (announced December 2015) and was
551
+ NOT modelled: no notice was located, and a reg 27(4) notice establishing
552
+ a NEW system would have had to choose between limbs (aa) and (bb), which
553
+ would decide whether this series should have an end year. Recorded as the
554
+ most likely missing series in this file.
555
+
556
+ # =========================================================================
557
+ # B. PROVINCIAL LICENCE NUMBER SYSTEMS — reg 27(2)(a)(ii)(bb), the limb
558
+ # INSERTED by r. 5(a) of GNR.589 of 27 May 2009 (GG 32258):
559
+ # "a combination of two letters, two figures and two letters in any
560
+ # sequence ... and the licence mark of the province concerned".
561
+ # =========================================================================
562
+
563
+ - id: za-gp-standard-2l2f2l
564
+ class: standard
565
+ categories: [car, van, truck, bus, motorcycle, trailer]
566
+ period: { start: 2023 }
567
+ period_evidence: secondary-wikipedia
568
+ matching: strict
569
+ format:
570
+ pattern: "LL 99 LL GP"
571
+ regex: '\A[A-Z]{2} ?\d{2} ?[A-Z]{2} ?GP\z'
572
+ regex_strict: '\A[BCDFHJKLMNPRSTVWXYZ][BCDFGHJKLMNPRSTVWXYZ] ?\d{2} ?[BCDFGHJKLMNPRSTVWXYZ]{2} ?GP\z'
573
+ charset: { notes: "reg 27(2)(a)(ii) proviso — no vowels, no Q, no leading G; the proviso attaches to sub-para (ii) as a whole and so governs limb (bb) exactly as it governs limb (aa)" }
574
+ design:
575
+ plate: { w: 520, h: 113, unit: mm }
576
+ plate_variants:
577
+ - { w: 250, h: 205, unit: mm, note: "reg 35(10)" }
578
+ - { w: 250, h: 165, unit: mm, note: "reg 35(10)" }
579
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
580
+ foreground: "#000000"
581
+ rear_differs: false
582
+ region_encoding: "plates/_decode/za-licence-marks.yml"
583
+ sources:
584
+ - "https://disasterlaw.ifrc.org/sites/default/files/media/disaster_law/2021-06/%20ROAD%20TRAFFIC%20REGULATIONS,%202000.pdf # reg 27(2)(a)(ii)(bb) and its amendment note '[Sub-para. (ii) substituted by r. 5 (a) of GNR.589 of 27 May 2009.]' — the enabling instrument"
585
+ - "https://www.gov.za/sites/default/files/gcis_document/201409/37542gen287.pdf # GG 37542 GN 287 of 9 April 2014 reproducing limb (bb) verbatim"
586
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_South_Africa # the 2023 Gauteng transition from three-letter/three-digit to two-letter/two-digit/two-letter, and the example BC 12 DF GP — secondary-wikipedia, untraced to a Gauteng provincial gazette notice; accessed 2026-08-02"
587
+ - "https://cmbinary.gauteng.gov.za/Media?path=transport/Documents/Documents/GP%20Application%20Form%20-%20Personalised%20Number%20Plate.pdf&Item=658&Type=Documents&Location=/transport # the GP mark itself (Gauteng form PRN1-GP)"
588
+ notes: >-
589
+ GAUTENG, two letters + two figures + two letters + GP. THE PERIOD IS THE
590
+ WEAK CLAIM AND IT IS THE ONLY REASON THIS SERIES IS NOT FULLY PRIMARY.
591
+ The FORMAT is primary twice over (reg 27(2)(a)(ii)(bb), and GG 37542 GN
592
+ 287 reproducing it) and could not have been issued before 27 May 2009,
593
+ the day GNR.589 inserted limb (bb) — that is the hard lower bound. The
594
+ 2023 start is Wikipedia-derived: the Gauteng notice under reg 27(4)
595
+ establishing the new system was not located, and no Gauteng provincial
596
+ gazette index with full-text search was reachable. Distinct from
597
+ za-gp-standard-3l3f, which continues in parallel and still carries the
598
+ overwhelming majority of Gauteng registrations. RANKED FIRST for the
599
+ verifier: one Gauteng Provincial Gazette citation converts this from
600
+ secondary to instrument-evidenced.
601
+
602
+ - id: za-zn-standard-2l2f2l
603
+ class: standard
604
+ categories: [car, van, truck, bus, motorcycle, trailer]
605
+ period: { start: 2023 }
606
+ period_evidence: secondary-first-issue
607
+ matching: strict
608
+ format:
609
+ pattern: "LL 99 LL ZN"
610
+ regex: '\A[A-Z]{2} ?\d{2} ?[A-Z]{2} ?ZN\z'
611
+ regex_strict: '\A[BCDFHJKLMNPRSTVWXYZ][BCDFGHJKLMNPRSTVWXYZ] ?\d{2} ?[BCDFGHJKLMNPRSTVWXYZ]{2} ?ZN\z'
612
+ charset: { notes: "reg 27(2)(a)(ii) proviso — no vowels, no Q, no leading G" }
613
+ progression: >-
614
+ Phased, and the phases are dated by the provincial government itself:
615
+ phase 1 from 1 December 2023 covers "the registration of new vehicles,
616
+ change of ownership, and re-registration of stolen-recovered vehicles";
617
+ phase 2 from 1 March 2024 opens voluntary migration, with a 24-month
618
+ window "after which all motor vehicles will automatically be issued
619
+ with a new format licence number upon licensing".
620
+ design:
621
+ plate: { w: 520, h: 113, unit: mm }
622
+ plate_variants:
623
+ - { w: 250, h: 205, unit: mm, note: "reg 35(10)" }
624
+ - { w: 250, h: 165, unit: mm, note: "reg 35(10)" }
625
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
626
+ foreground: "#000000"
627
+ rear_differs: false
628
+ region_encoding: "plates/_decode/za-licence-marks.yml"
629
+ sources:
630
+ - "https://disasterlaw.ifrc.org/sites/default/files/media/disaster_law/2021-06/%20ROAD%20TRAFFIC%20REGULATIONS,%202000.pdf # reg 27(2)(a)(ii)(bb) inserted by r. 5(a) of GNR.589 of 27 May 2009 — the enabling instrument; reg 27(4) MEC may establish a new licence number system"
631
+ - "https://www.sanews.gov.za/south-africa/new-provincial-number-plate-system-unveiled-kzn # SAnews.gov.za (Government Communication and Information System), 1 December 2023: KwaZulu-Natal Premier unveils the new system, 'marking an end to the traditional discrete numbering system to a more dynamic and continuous numbering system'; phase 1 from that Friday, phase 2 from 1 March 2024, 24-month migration window; accessed 2026-08-02"
632
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_South_Africa # the ZN mark and the two-letter/two-digit/two-letter shape for KwaZulu-Natal — secondary-wikipedia; accessed 2026-08-02"
633
+ notes: >-
634
+ KWAZULU-NATAL, two letters + two figures + two letters + ZN, from
635
+ 1 December 2023. The DATE is pinned to a government publication (SAnews,
636
+ GCIS) that also states the reason in the province's own words — "towns
637
+ running out of available numbers" — which is exactly what a
638
+ registering-authority-mark system does when it exhausts. The SHAPE rests
639
+ on reg 27(2)(a)(ii)(bb) plus Wikipedia for the choice of limb, and the
640
+ mark "ZN" on Wikipedia alone. Supersedes za-zn-ra-mark for NEW
641
+ registrations only; the old discrete numbers stay valid and on the road
642
+ through the migration window.
643
+
644
+ # =========================================================================
645
+ # C. REGISTERING-AUTHORITY MARK SYSTEMS — reg 27(2)(a)(i) + reg 27(3):
646
+ # "the licence mark referred to in subregulation (2)(a)(i) and figures".
647
+ # The inherited pre-1994 town-code system, surviving in two provinces.
648
+ # =========================================================================
649
+
650
+ - id: za-wc-ra-mark
651
+ class: standard
652
+ categories: [car, van, truck, bus, motorcycle, trailer]
653
+ period: { start: 2000 }
654
+ period_evidence: instrument-in-force
655
+ matching: strict
656
+ format:
657
+ pattern: "CL 999999"
658
+ regex: '\AC[A-Z]{1,2} ?\d{1,3}(?:[- ]?\d{1,3})?\z'
659
+ charset:
660
+ notes: >-
661
+ NO STRICT TWIN, DELIBERATELY. The reg 27(2)(a)(ii) proviso does not
662
+ reach this limb, and the only thing that would narrow the regex is
663
+ the closed list of Western Cape registering-authority marks — which
664
+ is not published anywhere this pass could reach. A strict twin built
665
+ from the eight marks the Western Cape Government happens to print as
666
+ worked examples would REJECT valid plates, which is worse than no
667
+ twin at all. See plates/_decode/za-licence-marks.yml.
668
+ progression: >-
669
+ Sequential within a mark; a mark is replaced when it exhausts (Cape
670
+ Town CA -> CAA, reported 13 April 2019; George CAW -> CAG, reported
671
+ late 2019 — both secondary-wikipedia).
672
+ design:
673
+ plate: { w: 520, h: 113, unit: mm }
674
+ plate_variants:
675
+ - { w: 250, h: 205, unit: mm, note: "reg 35(10)" }
676
+ - { w: 250, h: 165, unit: mm, note: "reg 35(10)" }
677
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
678
+ foreground: "#000000"
679
+ rear_differs: false
680
+ region_encoding: "plates/_decode/za-licence-marks.yml"
681
+ region_encoding_mechanism: >-
682
+ The LEADING letters are the reg 27(2)(a)(i) registering-authority mark
683
+ and they decode to the licensing OFFICE, which is a real town-level
684
+ decode and the most Geoguessr-useful fact in South Africa. Every Western
685
+ Cape mark located begins with C, inherited from the pre-1994 Cape
686
+ Province allocation; marks are two or three letters and are MAXIMAL-MUNCH
687
+ against the digits (CB and CBY both exist, so a parser must take the
688
+ longest alphabetic run before the first digit). The table is a floor, not
689
+ a census — an unlisted C-initial mark is unresolved, never invalid.
690
+ sources:
691
+ - "https://disasterlaw.ifrc.org/sites/default/files/media/disaster_law/2021-06/%20ROAD%20TRAFFIC%20REGULATIONS,%202000.pdf # reg 27(2)(a)(i) 'a combination of letters'; reg 27(3) 'the licence mark ... and figures'"
692
+ - "https://www.westerncape.gov.za/mobility/service/applying-special-motor-vehicle-number-plates # Western Cape Government fee table, worked discrete-number examples 'CY 6', 'CW 16', 'CBY 3', 'CG 131', 'CBY 15', 'CK 1441', 'CB 131', 'CFM 2332' — the mark shapes and the 1-to-6-figure range; accessed 2026-08-02"
693
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_South_Africa # the CA/CAA (Cape Town, 13 April 2019) and CAW/CAG (George, late 2019) exhaustion changes — secondary-wikipedia; accessed 2026-08-02"
694
+ notes: >-
695
+ WESTERN CAPE, registering-authority mark + up to six figures — the last
696
+ province that never adopted a suffix system, and the direct survival of
697
+ the pre-1994 Cape Province town codes. period.start 2000 is the NRTR and
698
+ is an instrument-in-force date: these marks are decades older than the
699
+ instrument that now governs them. Note the asymmetry with every suffix
700
+ province: "WP" is NOT on an ordinary Western Cape plate at all — it
701
+ appears only on personalised numbers (see za-wc-personalised). The
702
+ 1-to-6-figure range is taken from the province's own fee table, which
703
+ prices discrete numbers by character count from three to six and then
704
+ "All others"; the six-digit full-length number is conventionally printed
705
+ 3-3 with a hyphen ("CA 123-456") and no instrument requires that hyphen,
706
+ so it is not written into the pattern.
707
+
708
+ - id: za-zn-ra-mark
709
+ class: standard
710
+ categories: [car, van, truck, bus, motorcycle, trailer]
711
+ period: { start: 2000, end: 2023 }
712
+ period_evidence: instrument-in-force
713
+ matching: strict
714
+ format:
715
+ pattern: "NL 999999"
716
+ regex: '\AN[A-Z]{1,2} ?\d{1,3}(?:[- ]?\d{1,3})?\z'
717
+ charset: { notes: "No strict twin, for the same reason as za-wc-ra-mark: no closed KwaZulu-Natal mark table was located." }
718
+ design:
719
+ plate: { w: 520, h: 113, unit: mm }
720
+ plate_variants:
721
+ - { w: 250, h: 205, unit: mm, note: "reg 35(10)" }
722
+ - { w: 250, h: 165, unit: mm, note: "reg 35(10)" }
723
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
724
+ foreground: "#000000"
725
+ rear_differs: false
726
+ region_encoding: "plates/_decode/za-licence-marks.yml"
727
+ region_encoding_mechanism: >-
728
+ Leading letters are the registering-authority mark and decode to the
729
+ licensing town. Every KwaZulu-Natal mark located begins with N,
730
+ inherited from the pre-1994 Natal allocation. Only two rows are carried
731
+ in the decode table (NPS -> NSC, Port Shepstone) and both are
732
+ secondary-wikipedia; the rest of the table is a recorded gap.
733
+ sources:
734
+ - "https://disasterlaw.ifrc.org/sites/default/files/media/disaster_law/2021-06/%20ROAD%20TRAFFIC%20REGULATIONS,%202000.pdf # reg 27(2)(a)(i) + reg 27(3); reg 27(4) MEC may establish a new system"
735
+ - "https://www.sanews.gov.za/south-africa/new-provincial-number-plate-system-unveiled-kzn # SAnews.gov.za, 1 December 2023: the end of 'the traditional discrete numbering system', phase 1 from 1 December 2023, and 'the issue of towns running out of available numbers' as the stated reason; accessed 2026-08-02"
736
+ - "https://en.wikipedia.org/wiki/Vehicle_registration_plates_of_South_Africa # the N-initial mark family and the Port Shepstone NPS -> NSC change of 30 June 2020 — secondary-wikipedia; accessed 2026-08-02"
737
+ notes: >-
738
+ KWAZULU-NATAL, registering-authority mark + up to six figures — CLOSED TO
739
+ NEW ISSUE on 1 December 2023, when the province moved to the ZN suffix
740
+ system. The end year is the government-announced phase-1 date and is the
741
+ date NEW registrations stopped receiving these numbers; existing discrete
742
+ numbers remain valid and on the road, and the province gave owners a
743
+ 24-month voluntary-migration window from 1 March 2024. Distinct from
744
+ za-wc-ra-mark, which is the same statutory limb still open in the
745
+ Western Cape.
746
+
747
+ # =========================================================================
748
+ # D. PERSONALISED LICENCE NUMBERS — reg 28. Each province establishes and
749
+ # prices its own system; the shape is always "chosen characters +
750
+ # provincial mark".
751
+ # =========================================================================
752
+
753
+ - id: za-wc-personalised
754
+ class: personalized
755
+ categories: [car, van, truck, bus, motorcycle, trailer]
756
+ period: { start: 2000 }
757
+ period_evidence: instrument-in-force
758
+ matching: strict
759
+ format:
760
+ pattern: "LLL WP"
761
+ regex: '\A[A-Z0-9]{1,7}[- ]?WP\z'
762
+ charset:
763
+ notes: >-
764
+ Owner-chosen alphanumerics — the reg 27(2)(a)(ii) proviso does not
765
+ apply to reg 28, which is why vowels and Q are admitted here and
766
+ nowhere else in this file. The Western Cape Government's own worked
767
+ examples include "JOHNNY2 - WP" and "RUN2ME - WP". A match is a
768
+ WELL-FORMEDNESS claim and not an availability claim: whether a
769
+ particular combination is free is a register question no regex can
770
+ answer.
771
+ progression: "owner-chosen; availability-checked on application (form SLN1)"
772
+ design:
773
+ plate: { w: 520, h: 113, unit: mm }
774
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
775
+ foreground: "#000000"
776
+ rear_differs: false
777
+ region_encoding: "plates/_decode/za-licence-marks.yml"
778
+ sources:
779
+ - "https://disasterlaw.ifrc.org/sites/default/files/media/disaster_law/2021-06/%20ROAD%20TRAFFIC%20REGULATIONS,%202000.pdf # reg 28(1) MEC may establish a personalised licence number system; reg 28(3) issued on application on conditions and fees the MEC determines; reg 28A cancellation"
780
+ - "https://www.westerncape.gov.za/mobility/service/applying-special-motor-vehicle-number-plates # Western Cape Government, verbatim: 'Personalised number plates contain the letters WP (Western Province) at the end of the number plate'; the fee table prices 1, 2, 3 and 'All others, up to a maximum of seven alpha and/or numeric characters'; form SLN1; manufacturer Uniplate Group; accessed 2026-08-02"
781
+ notes: >-
782
+ WESTERN CAPE personalised numbers — one to seven owner-chosen
783
+ alphanumerics followed by WP. This is the ONLY context in which "WP"
784
+ appears on a Western Cape plate, because the province issues its ordinary
785
+ numbers under the registering-authority limb. The province distinguishes
786
+ PERSONALISED numbers (arbitrary characters + WP) from DISCRETE numbers
787
+ (short serials inside an existing registering-authority mark, e.g. "CY 6"
788
+ or "CFM 2332"); discrete numbers are modelled as short serials of
789
+ za-wc-ra-mark, not here, because they carry a town mark and not WP.
790
+
791
+ - id: za-fs-personalised
792
+ class: personalized
793
+ categories: [car, van, truck, bus, motorcycle, trailer]
794
+ period: { start: 2002 }
795
+ period_evidence: enabling-instrument
796
+ matching: strict
797
+ format:
798
+ pattern: "LLL FS"
799
+ regex: '\A[A-Z0-9]{1,7}[- ]?FS\z'
800
+ charset:
801
+ notes: >-
802
+ Free State Provincial Notice 52 of 2002 para 2(1) as substituted by
803
+ Provincial Notice 278 of 2006, verbatim: a personalised licence
804
+ number "must consist of - (a) at least one, but not more than seven
805
+ letters, followed by the letters FS; or (b) a combination of a
806
+ maximum of seven letters and figures, followed by the letters FS".
807
+ Para 2(2) excludes any combination "that occur in the general licence
808
+ number system, the motor dealer number system, the temporary or
809
+ special permit number system of the Free State Province or be
810
+ offensive of nature to any person or group of persons in the
811
+ community" — an exclusion no regex can express, so a match here is a
812
+ well-formedness claim and not an availability claim.
813
+ design:
814
+ plate: { w: 520, h: 113, unit: mm }
815
+ plate_variants:
816
+ - { w: 305, h: 165, unit: mm, note: "Free State PN 278 of 2006: seven characters + FS may be displayed only on 520 x 113 mm and 305 x 165 mm plates, and the 305 x 165 mm plate uses FE modified 60 mm rather than 75 mm" }
817
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
818
+ foreground: "#006400"
819
+ emblem:
820
+ present: true
821
+ rendered: placeholder
822
+ note: "the same cheetah/sky/mountain/hills landscape as the ordinary Free State plate (PN 52 of 2002 Schedule 1)"
823
+ rear_differs: false
824
+ region_encoding: "plates/_decode/za-licence-marks.yml"
825
+ sources:
826
+ - "https://www.policeroadstransport.fs.gov.za/wp-content/uploads/2012/09/Personalised-licence-number-system-for-the-Free-State-2002.pdf # Free State Provincial Notice 52 of 2002, Provincial Gazette 25 of 9 April 2002, made under regs 28, 28A and 29(2): para 2(1) the six-character grammar; para 3 'dark green letters and figures on a white retro-reflective surface with a landscape as set out in Schedules 1 and 2'; para 19 metal plates only; para 21 'This notice shall take effect on 10 April 2002'; Schedule 2 para 1 FE modified 75 mm"
827
+ - "https://www.policeroadstransport.fs.gov.za/wp-content/uploads/2012/09/Amendment-of-personal-licence-number-system-2006.pdf # Free State Provincial Notice 278 of 2006, Provincial Gazette 102 of 15 December 2006: six -> seven characters, the 520 x 113 / 305 x 165 restriction, FE modified 60 mm on the smaller plate, metal OR plastic; para 4 'This Notice takes effect on 1 April 2007'"
828
+ - "https://www.policeroadstransport.fs.gov.za/wp-content/uploads/2012/09/Amendment-of-personalised-and-licence-number-plates-for-the-Free-State-2010.pdf # Free State Provincial Notice 16 of 2010: repeals the validation label and the plate-validity period"
829
+ - "https://disasterlaw.ifrc.org/sites/default/files/media/disaster_law/2021-06/%20ROAD%20TRAFFIC%20REGULATIONS,%202000.pdf # reg 28; reg 28(4A) and reg 27(2)(bA), both inserted by r. 2-3 of GNR.779 w.e.f. 4 June 2002, which give the Free State MEC alone the power to determine the TYPE of number plate notwithstanding reg 35"
830
+ notes: >-
831
+ FREE STATE personalised numbers — DARK GREEN characters on white with the
832
+ cheetah landscape, from 10 April 2002. The fully-primary series in this
833
+ file and the one that earns `enabling-instrument`: Provincial Notice 52
834
+ of 2002 creates the system, dates its own commencement, and prints its
835
+ own grammar. The grammar was SIX characters from 10 April 2002 and became
836
+ SEVEN on 1 April 2007 (PN 278 of 2006); the regex carries the current
837
+ seven, and a plate of exactly seven characters therefore cannot predate
838
+ April 2007. The Free State is also the one province with a bespoke
839
+ national carve-out: GNR.779 of 4 June 2002 inserted reg 27(2)(bA) and reg
840
+ 28(4A) to let the Free State MEC determine the TYPE of plate
841
+ notwithstanding reg 35.
842
+
843
+ - id: za-gp-personalised
844
+ class: personalized
845
+ categories: [car, van, truck, bus, motorcycle, trailer]
846
+ period: { start: 2000 }
847
+ period_evidence: instrument-in-force
848
+ matching: strict
849
+ format:
850
+ pattern: "LLL GP"
851
+ regex: '\A[A-Z0-9]{1,7}[- ]?GP\z'
852
+ charset:
853
+ notes: >-
854
+ Owner-chosen alphanumerics + GP. The seven-character maximum is
855
+ NOT stated on the form's face; it is inferred from the form's own
856
+ document reference ("dvds/Aansoekspe2/(7karakters)han/2") and
857
+ corroborated by Wikipedia, which reports seven for Gauteng,
858
+ KwaZulu-Natal and the Western Cape and six elsewhere. Treated as
859
+ secondary and flagged. As with every personalised series, a match is
860
+ a well-formedness claim and not an availability claim, and the regex
861
+ necessarily also accepts an ordinary GP-suffixed licence number of
862
+ the same length — the two systems share a terminal mark and only the
863
+ register can separate them.
864
+ design:
865
+ plate: { w: 520, h: 113, unit: mm }
866
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
867
+ foreground: "#000000"
868
+ rear_differs: false
869
+ region_encoding: "plates/_decode/za-licence-marks.yml"
870
+ sources:
871
+ - "https://cmbinary.gauteng.gov.za/Media?path=transport/Documents/Documents/GP%20Application%20Form%20-%20Personalised%20Number%20Plate.pdf&Item=658&Type=Documents&Location=/transport # Gauteng Province form PRN1-GP 'Application for special/personalised registration number for motor vehicle': three choice fields each pre-printed with 'G P'; the applicant marks each character N (number) or A (alphabet); the form's own footer reference reads '(7karakters)'; accessed 2026-08-02"
872
+ - "https://disasterlaw.ifrc.org/sites/default/files/media/disaster_law/2021-06/%20ROAD%20TRAFFIC%20REGULATIONS,%202000.pdf # reg 28(1),(3),(5); reg 28A cancellation and surrender"
873
+ notes: >-
874
+ GAUTENG personalised numbers — owner-chosen characters followed by GP.
875
+ A DATING CURIOSITY WORTH KEEPING: the province's own current form still
876
+ cites "Road Traffic Act, 1989, Sec. 14" in its heading, an Act the NRTA
877
+ 1996 replaced. That stale citation is itself evidence that the Gauteng
878
+ personalised system predates the NRTR 2000 and was carried forward rather
879
+ than created by it — which is exactly why period_evidence here is
880
+ instrument-in-force and not enabling-instrument.
881
+
882
+ # =========================================================================
883
+ # E. THE REG 27(5) SPECIAL CLASSES. These are national, not provincial, and
884
+ # they are the reason a South African plate's LAST letter must never be
885
+ # decoded as geography.
886
+ # =========================================================================
887
+
888
+ - id: za-government-g
889
+ class: government
890
+ categories: [car, van, truck, bus, motorcycle, trailer]
891
+ period: { start: 2000 }
892
+ period_evidence: instrument-in-force
893
+ matching: strict
894
+ format:
895
+ pattern: "GLL 999 G"
896
+ regex: '\AG[A-Z]{2} ?\d{3} ?G\z'
897
+ charset:
898
+ notes: >-
899
+ NO STRICT TWIN: the reg 27(2)(a)(ii) proviso governs the provincial
900
+ licence NUMBER SYSTEMS and does not reach reg 27(5), so no sourced
901
+ letter restriction applies to the two middle letters.
902
+ design:
903
+ plate: { w: 520, h: 113, unit: mm }
904
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
905
+ foreground: "#000000"
906
+ rear_differs: false
907
+ note: >-
908
+ Reg 35(2)(b)-(c) admits a yellow surface with black characters as an
909
+ alternative for any class, and government fleets are commonly reported
910
+ on yellow; no instrument fixing the government colour nationally was
911
+ located. The Free State prescribes RED characters on white with the
912
+ provincial coat of arms for vehicles owned by the Free State
913
+ Provincial Government (PN 51 of 2002 para 5(b)) — a province-level
914
+ design on this national format.
915
+ region_encoding: "plates/_decode/za-licence-marks.yml"
916
+ sources:
917
+ - "https://disasterlaw.ifrc.org/sites/default/files/media/disaster_law/2021-06/%20ROAD%20TRAFFIC%20REGULATIONS,%202000.pdf # reg 27(5)(a), verbatim: the licence number of a motor vehicle 'the owner of which is a department of State, may consist of— (i) the licence number allocated to the vehicle upon licensing thereof; (ii) the letter G followed by two letters, three figures, and the letter G; or (iii) any other licence number determined by the chief executive officer by notice in the Gazette'"
918
+ - "https://www.gov.za/sites/default/files/gcis_document/201409/37542gen287.pdf # GG 37542 GN 287 of 9 April 2014 reproducing reg 27(5)(a) identically"
919
+ - "https://www.policeroadstransport.fs.gov.za/wp-content/uploads/2012/09/Licence-number-plate-for-the-Free-State-2002.pdf # PN 51 of 2002 para 5(b): red letters and figures on white with the Free State coat of arms for provincial-government vehicles"
920
+ notes: >-
921
+ DEPARTMENT OF STATE, G + two letters + three figures + G. Reg 27(5)(a) is
922
+ PERMISSIVE — "may consist of" — and limb (i) expressly allows a State
923
+ department to keep the ordinary licence number allocated on licensing, so
924
+ a government vehicle need not carry this format at all and a G-suffix
925
+ match is a sufficient but not necessary test for state ownership. This
926
+ series is also the reason the reg 27(2)(a)(ii) proviso forbids G as the
927
+ first letter of an ordinary licence number: the two rules exist to keep
928
+ the G space clear of each other.
929
+
930
+ - id: za-police-b
931
+ class: police
932
+ categories: [car, van, truck, bus, motorcycle]
933
+ period: { start: 2000 }
934
+ period_evidence: instrument-in-force
935
+ matching: strict
936
+ format:
937
+ pattern: "LLL 999 B"
938
+ regex: '\A[A-Z]{3} ?\d{3} ?B\z'
939
+ charset: { notes: "No strict twin: the reg 27(2)(a)(ii) proviso does not reach reg 27(5)(b)." }
940
+ design:
941
+ plate: { w: 520, h: 113, unit: mm }
942
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
943
+ foreground: "#000000"
944
+ rear_differs: false
945
+ region_encoding: "plates/_decode/za-licence-marks.yml"
946
+ sources:
947
+ - "https://disasterlaw.ifrc.org/sites/default/files/media/disaster_law/2021-06/%20ROAD%20TRAFFIC%20REGULATIONS,%202000.pdf # reg 27(5)(b), verbatim: the licence number of a motor vehicle 'the owner of which is the South African Police Service, may consist of three letters, three figures, followed by the letter B'; reg 21A/25(2)(f) confirms a SAPS-allocated number is recorded as such"
948
+ - "https://www.gov.za/sites/default/files/gcis_document/201409/37542gen287.pdf # GG 37542 GN 287 of 9 April 2014 reproducing reg 27(5)(b) identically"
949
+ notes: >-
950
+ SOUTH AFRICAN POLICE SERVICE, three letters + three figures + B. The
951
+ shape is identical to a provincial 3+3 number and the ONLY thing that
952
+ distinguishes it is the terminal letter, which is why the decode table
953
+ carries B in its `not_geographic` list. Like reg 27(5)(a) this limb is
954
+ permissive ("may consist of"), so SAPS vehicles on ordinary provincial
955
+ numbers exist. Metropolitan police departments are municipal, not SAPS,
956
+ and are not covered by this limb.
957
+
958
+ - id: za-zulu-royal-zk
959
+ class: government
960
+ categories: [car, van, truck, bus]
961
+ period: { start: 2000 }
962
+ period_evidence: instrument-in-force
963
+ matching: strict
964
+ format:
965
+ pattern: "ZK 999"
966
+ regex: '\AZK ?[A-Z0-9]{1,6}\z'
967
+ regex_statutory: '\AZK ?[A-Z0-9]+\z'
968
+ charset:
969
+ notes: >-
970
+ Reg 27(5)(c) sets NO LENGTH LIMIT — "the letters ZK followed by
971
+ figures or letters or combination of figures and letters" — so the
972
+ statutory twin is unbounded and `regex` is deliberately narrower at
973
+ six characters, which is the longest serial any South African
974
+ provincial system issues. Narrower than the statute is still
975
+ `strict` (PRD-PLATES § 2.7); the outer legal bound is in
976
+ `regex_statutory`, which is exactly what that field is for.
977
+ design:
978
+ plate: { w: 520, h: 113, unit: mm }
979
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
980
+ foreground: "#000000"
981
+ rear_differs: false
982
+ note: >-
983
+ Reg 27(2)(bB) and reg 28(4B), both inserted by r. 5(b) and r. 6 of
984
+ GNR.589 of 27 May 2009, empower the KwaZulu-Natal MEC to determine a
985
+ distinct logo or landscape, letter type, letter colour and sheeting
986
+ colour for these numbers. No such determination was located, so the
987
+ design here is the reg 35 default and is not a claim about the
988
+ plates actually issued.
989
+ region_encoding: "plates/_decode/za-licence-marks.yml"
990
+ sources:
991
+ - "https://disasterlaw.ifrc.org/sites/default/files/media/disaster_law/2021-06/%20ROAD%20TRAFFIC%20REGULATIONS,%202000.pdf # reg 27(5)(c) as substituted by GNR.865 of 2007: 'set aside for the use by the King of the Zulu Nation, shall consist of the letters ZK followed by figures or letters or combination of figures and letters'; reg 27(2)(bB) and reg 28(4B) inserted by GNR.589 of 27 May 2009"
992
+ - "https://www.gov.za/sites/default/files/gcis_document/201409/37542gen287.pdf # GG 37542 GN 287 of 9 April 2014 reproducing reg 27(5)(c) identically"
993
+ notes: >-
994
+ NUMBERS SET ASIDE FOR THE KING OF THE ZULU NATION — the only South
995
+ African series tied to a traditional office rather than a government
996
+ department, and a genuine schema oddity: ZK is a PREFIX where every other
997
+ special class in reg 27(5) is a suffix. Classed `government` because the
998
+ vocabulary has no traditional-monarchy class and the series is a state
999
+ set-aside; flagged for the verifier in case a class PR is preferred. The
1000
+ current wording was substituted by GNR.865 of 28 September 2007, which
1001
+ means an earlier ZK provision existed in the 2000 text — hence
1002
+ instrument-in-force at 2000 rather than a 2007 creation.
1003
+
1004
+ - id: za-diplomatic-d
1005
+ class: diplomatic
1006
+ categories: [car, van, truck, bus, motorcycle]
1007
+ period: { start: 2000 }
1008
+ period_evidence: instrument-in-force
1009
+ # RECALL-ONLY (PRD-PLATES § 2.7): reg 27(5)(d) delegates the ENTIRE
1010
+ # grammar to the Director-General of Foreign Affairs and fixes exactly one
1011
+ # thing about it — that the number "shall end in the letter 'D'". No
1012
+ # DIRCO determination was located, so the regex below is a shape net built
1013
+ # around the one sourced fact. A match says "this string ends in D and has
1014
+ # a diplomatic-looking shape", never "this is a valid South African
1015
+ # diplomatic number".
1016
+ matching: recall-only
1017
+ format:
1018
+ pattern: "LLL 999 D"
1019
+ regex: '\A(?:[A-Z] )?[A-Z]{1,4} ?\d{1,4} ?D\z'
1020
+ pattern_note: >-
1021
+ The pattern shows one representative shape. The optional leading
1022
+ single letter in the regex accommodates the widely-reported class
1023
+ letter (D diplomatic, C consular, X and S for other categories) that
1024
+ precedes the serial on the current style; that class-letter set is
1025
+ NOT sourced to an instrument and is recorded as a gap, which is the
1026
+ second reason this series is recall-only.
1027
+ design:
1028
+ plate: { w: 520, h: 113, unit: mm }
1029
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
1030
+ foreground: "#000000"
1031
+ rear_differs: false
1032
+ note: >-
1033
+ Reg 35(2)(c) permits dark red and dark green characters on a white
1034
+ surface, and diplomatic plates are widely reported to use exactly
1035
+ those two colours to separate the diplomatic from the consular
1036
+ category. That correspondence is plausible and UNSOURCED; the default
1037
+ black is recorded instead of guessing.
1038
+ region_encoding: none
1039
+ region_encoding_note: >-
1040
+ A diplomatic number carries no provincial mark and no registering-
1041
+ authority mark: reg 27(5)(d) takes it out of the provincial systems
1042
+ entirely. Decoding its letters as geography is the single most likely
1043
+ parse-API error in South Africa.
1044
+ sources:
1045
+ - "https://disasterlaw.ifrc.org/sites/default/files/media/disaster_law/2021-06/%20ROAD%20TRAFFIC%20REGULATIONS,%202000.pdf # reg 27(5)(d), verbatim: the licence number of a motor vehicle the owner of which is '(i) a foreign government, diplomat representing a foreign government, an international or inter-governmental organisation; (ii) a member of staff or suite of such government or organisation; or (iii) any other person or class of person determined by the Minister of Foreign Affairs, shall consist of such letters and figures as are determined by the Director-General: Department of Foreign Affairs but shall end in the letter \"D\"'"
1046
+ - "https://www.gov.za/sites/default/files/gcis_document/201409/37542gen287.pdf # GG 37542 GN 287 of 9 April 2014 reproducing reg 27(5)(d) identically"
1047
+ notes: >-
1048
+ DIPLOMATIC AND CONSULAR CORPS. The one certain fact is the terminal D,
1049
+ and it is the whole of what the Regulations say. The Department of
1050
+ Foreign Affairs (now DIRCO) determination that carries the real grammar —
1051
+ country codes, class letters, serial length — was not located in this
1052
+ pass and is the highest-value single missing document for South Africa
1053
+ after the provincial reg 27(1) notices. Until it lands this series is a
1054
+ recall net and is labelled as one.
1055
+
1056
+ # =========================================================================
1057
+ # F. MOTOR TRADE (DEALER) NUMBERS — reg 71(2). Two shapes, one per limb,
1058
+ # and they mirror the two provincial systems exactly.
1059
+ # =========================================================================
1060
+
1061
+ - id: za-dealer-a
1062
+ class: dealer
1063
+ categories: [car, van, truck, bus, motorcycle, trailer]
1064
+ period: { start: 2000 }
1065
+ period_evidence: instrument-in-force
1066
+ matching: strict
1067
+ format:
1068
+ pattern: "ALL 999 LL"
1069
+ regex: '\AA[A-Z]{2} ?\d{3} ?[A-Z]{1,2}\z'
1070
+ regex_strict: '\AA[BCDFGHJKLMNPRSTVWXYZ]{2} ?\d{3} ?(?:EC|FS|GP|L|MP|NC|NW|WP|ZN)\z'
1071
+ charset:
1072
+ notes: >-
1073
+ Reg 71(2), closing words, verbatim: "but shall not consist of vowels,
1074
+ except the letter 'A' as referred to in paragraph (a), or the letter
1075
+ 'Q'." So the leading A is a sanctioned vowel and the two following
1076
+ letters are drawn from the same twenty-letter set as an ordinary
1077
+ licence number — but WITHOUT the leading-G exclusion, which reg 71
1078
+ does not repeat. The strict twin also closes the provincial-mark
1079
+ position to the nine marks in the decode table, six of which are
1080
+ themselves secondary-wikipedia.
1081
+ design:
1082
+ plate: { w: 520, h: 113, unit: mm }
1083
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
1084
+ foreground: "#000000"
1085
+ rear_differs: false
1086
+ note: >-
1087
+ Reg 82(1): a motor trade number is displayed on a reg 35 plate but ONE
1088
+ plate only, to the rear, inside the rear window where there is one, and
1089
+ reg 82(4) forbids affixing it permanently to any vehicle — the plate is
1090
+ bound to the BUSINESS, not the vehicle. The Free State prescribes dark
1091
+ blue characters on white with the provincial landscape for dealer
1092
+ plates (PN 51 of 2002 para 4(b)).
1093
+ region_encoding: "plates/_decode/za-licence-marks.yml"
1094
+ sources:
1095
+ - "https://disasterlaw.ifrc.org/sites/default/files/media/disaster_law/2021-06/%20ROAD%20TRAFFIC%20REGULATIONS,%202000.pdf # reg 71(2)(a), verbatim: a motor trade number system 'shall consist of— (a) the letter \"A\" followed by two letters, three figures and the licence mark of the province concerned as contemplated in regulation 27 (1)'; reg 82(1),(4) display and non-permanence"
1096
+ - "https://www.policeroadstransport.fs.gov.za/wp-content/uploads/2012/09/Licence-number-plate-for-the-Free-State-2002.pdf # PN 51 of 2002 para 4(b): dark blue letters and figures on white with the landscape, for motor dealer plates"
1097
+ notes: >-
1098
+ MOTOR TRADE NUMBERS on the provincial limb — A + two letters + three
1099
+ figures + provincial mark. Bound to a registered motor dealer,
1100
+ manufacturer, builder or importer, licensed annually under regs 73-77 and
1101
+ cancellable under reg 80. The A prefix is why A survives the vowel ban in
1102
+ this one series and nowhere else, and it makes a dealer number
1103
+ instantly separable from an ordinary 3+3 provincial number.
1104
+
1105
+ - id: za-dealer-figures
1106
+ class: dealer
1107
+ categories: [car, van, truck, bus, motorcycle, trailer]
1108
+ period: { start: 2000 }
1109
+ period_evidence: instrument-in-force
1110
+ matching: strict
1111
+ format:
1112
+ pattern: "9999 LL"
1113
+ regex: '\A\d{3,4} ?[A-Z]{1,3}\z'
1114
+ charset:
1115
+ notes: >-
1116
+ No strict twin: the trailing group is a registering-authority mark
1117
+ and no closed table of those exists (see za-wc-ra-mark). Reg 71(2)'s
1118
+ vowel/Q exclusion is written for the SYSTEM's letters and its
1119
+ interaction with an allocated mark that already contains a vowel
1120
+ (CA, for instance) is not resolved by the text — recorded, not
1121
+ guessed.
1122
+ design:
1123
+ plate: { w: 520, h: 113, unit: mm }
1124
+ background: { color: "#FFFFFF", finish: retroreflective, hex_basis: observed }
1125
+ foreground: "#000000"
1126
+ rear_differs: false
1127
+ region_encoding: "plates/_decode/za-licence-marks.yml"
1128
+ region_encoding_mechanism: >-
1129
+ Here the mark TRAILS the figures, which is the mirror image of an
1130
+ ordinary registering-authority number (mark first, figures after). A
1131
+ parser must therefore not assume mark position from the presence of a
1132
+ mark: "1234 CA" is a Western Cape dealer number and "CA 1234" is an
1133
+ ordinary Cape Town registration.
1134
+ sources:
1135
+ - "https://disasterlaw.ifrc.org/sites/default/files/media/disaster_law/2021-06/%20ROAD%20TRAFFIC%20REGULATIONS,%202000.pdf # reg 71(2)(b), verbatim: 'three or four figures followed by the licence mark of the registering authority as contemplated in regulation 27 (2) (a) (i), but shall not consist of vowels, except the letter \"A\" as referred to in paragraph (a), or the letter \"Q\"'"
1136
+ notes: >-
1137
+ MOTOR TRADE NUMBERS on the registering-authority limb — three or four
1138
+ figures followed by the town mark. The counterpart of za-dealer-a for the
1139
+ provinces that never adopted a suffix system, and the only South African
1140
+ series where the geographic token comes LAST while the serial comes
1141
+ FIRST. Distinct from za-dealer-a in both shape and statutory limb.