BRP Test Data Generator
Generate fictional person records in the category structure of the Dutch Basisregistratie Personen: 01 persoon, 02 and 03 ouders, 04 nationaliteit, 05 huwelijk of partnerschap, 06 overlijden, 08 verblijfplaats, 09 kind, plus the historie categories 55 and 58. Choose the life events you need, then export with the generator's own column names or paste the header row of the system you are feeding so the file arrives with names it already knows. Everything runs in your browser and all data is fictional.
Testing a Dutch pension administration? BRP delivers the person, and the employer delivers the employment through UPA. The UPA File Generator builds the matching Uniforme Pensioenaangifte files, with the same kind of life events.
The counts repeat until the population is full, so what matters is their size relative to each other.
bsnBurgerservicenummeraNumberA-nummerfirstNameVoornamenaffixVoorvoegsellastNameGeslachtsnaamdateOfBirthGeboortedatumgenderGeslachtsaanduidingresidenceStreetStraatnaamresidenceHouseNumberHuisnummerresidenceHouseNumberAdditionHuisnummertoevoegingresidencePostalCodePostcoderesidenceCityWoonplaatsnaamcountryOfResidenceAbroadLand verblijf buitenlanddeathDateDatum overlijdenpartnerBsnBSN partnerpartnerFirstNameVoornamen partnerpartnerLastNameGeslachtsnaam partnerpartnershipStartDateDatum sluiting verbintenispartnershipTypeSoort verbintenispartnershipEndDateDatum ontbinding verbintenispartnershipReasonReden ontbinding verbintenispreviousPartnerBsnBSN vorige partnerpreviousPartnerLastNameGeslachtsnaam vorige partnerpreviousPartnershipEndDateDatum ontbinding vorige verbintenischildOneBsnBSN kind 1childOneFirstNameVoornamen kind 1childOneDateOfBirthGeboortedatum kind 1lifeEventLife event (not a BRP field)The Basisregistratie Personen holds a person as a persoonslijst split into numbered categories. The history of a category is numbered fifty higher, so an earlier partnership sits in 55 and a previous address in 58. Files exported from a BRP system usually carry those numbers as markers between the column blocks, which is how you can tell where one category ends and the next begins.
| Nr | Categorie | Historie | In this generator |
|---|---|---|---|
| 01 | Persoon | 51 | generated |
| 02 | Ouder1 | 52 | generated |
| 03 | Ouder2 | 53 | generated |
| 04 | Nationaliteit | 54 | generated |
| 05 | Huwelijk/geregistreerd partnerschap | 55 | generated |
| 06 | Overlijden | 56 | generated |
| 07 | Inschrijving | - | not generated |
| 08 | Verblijfplaats | 58 | generated |
| 09 | Kind | - | generated |
| 10 | Verblijfstitel | 60 | not generated |
| 11 | Gezagsverhouding | 61 | not generated |
| 12 | Reisdocument | 66 | not generated |
| 13 | Kiesrecht | - | not generated |
Which version. Category numbering follows the Logisch Ontwerp BRP published by RvIG. It is unchanged across the 4.x releases and the later 20xx.Qn releases, so this generator is not tied to a single one. The standard is the Logisch Ontwerp BRP, published by RvIG.
| bsn | aNumber | firstName | affix | lastName | dateOfBirth | gender | residenceStreet | residenceHouseNumber | residenceHouseNumberAddition | residencePostalCode | residenceCity |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 588456317 | 4713783589 | Elske | - | d'Hondt | 19931214 | V | Julianalaan | 269 | - | 9711AA | Groningen |
| 228119856 | 2846962883 | Femke | in de | Brouwer | 19510107 | V | Burgemeester Baron van Voorst tot Voorststraat | 233 | - | 6411AA | Heerlen |
| 748568098 | 1741240786 | Marijke | - | Peters | 19991016 | V | Julianalaan | 315 | - | 6411AA | Heerlen |
| 358385337 | 3253601124 | Anna | - | Smit | 20070829 | V | Molenweg | 145 | - | 9711AA | Groningen |
| 393428849 | 6995534084 | Julia | - | van Heemskerck van Beest tot Nijenhuis | 19410207 | V | Kerkstraat | 208 | - | 5611AA | Eindhoven |
| 102965699 | 4963846481 | Maite | - | Brouwer | 19530112 | V | Beatrixstraat | 123 | - | 3011AA | Rotterdam |
| 329831422 | 1013429086 | Nienke | - | Visser | 19981103 | V | Professor Doctor Jan van Zuijlenstraat | 37 | rood | 3011AA | Rotterdam |
| 527277447 | 8140600960 | Roos | - | Schouten | 19480612 | V | Professor Doctor Jan van Zuijlenstraat | 214 | bis | 3512JE | Utrecht |
| 345973884 | 6895052718 | Thijs | - | Kuipers | 19930901 | M | Molenweg | 125 | - | 3512JE | Utrecht |
| 372207728 | 2288009377 | Sophie | de | Vos | 19551021 | V | Kerkstraat | 117 | - | 2511CW | 's-Gravenhage |
| 588766550 | 8428250929 | Aaltje | - | Visser | 19340111 | V | Schoolstraat | 33 | - | 3512JE | Utrecht |
| 116697428 | 8051554399 | Aaltje | - | Smit | 19320212 | V | Schoolstraat | 208 | - | 2511CW | 's-Gravenhage |
Showing the first 12 rows and 12 columns. The download contains all 50 rows and 28 columns.
Person test data in the BRP category structure
The Basisregistratie Personen stores a person as a persoonslijst split into numbered categories: 01 persoon, 02 and 03 ouders, 04 nationaliteit, 05 huwelijk of geregistreerd partnerschap, 06 overlijden, 07 inschrijving, 08 verblijfplaats and 09 kind, with the historie of a category numbered fifty higher, so 55 for an earlier partnership and 58 for a previous address. Systems that consume BRP data follow that shape, and test data that does not follow it exercises the wrong paths.
Every BSN passes the elfproef and never starts with a zero, so an importer cannot read it as a number and drop the first digit. A-nummers are ten digits. Municipality codes, country codes, gender M and V, partnership type H and P, and dissolution reason O and S all use the values the registration itself uses. Dates default to yyyymmdd, which is what most BRP exports carry.
Column names differ per system, which is the usual reason an import is rejected with nothing matched. Paste the header row of a file the target system already accepts and the generator maps its own fields onto those names, guessing the obvious ones and leaving the rest for you to set. Placeholder columns stay empty rather than disappearing, so the column count stays exactly as the target expects.
The CSV is comma separated with CRLF line endings, no byte order mark and quotes only where a value needs them, which is what importers expect. The Excel option adds a byte order mark and a sep= line, which makes Excel split the columns in any language version but breaks strict parsers, so use it only for reading. Everything runs in your browser and nothing is uploaded.
How the BRP Test Data Generator Works
- 01Set the number of records, the age range and the reference year the dates are calculated against
- 02Choose how many people of each life event you need, from married and divorced to deceased with a surviving partner
- 03Pick the output: a compact overview to read, the full structure for completeness, or your own header row
- 04Check the mapping table and set any column the automatic guess did not recognise
- 05Download the CSV, or the Excel variant if you only want to read it
Getting a BRP Import Accepted the First Time
Almost every rejected import comes down to column names rather than the file format. Take a file the target system already accepts, paste its first line into the header field, and let the generator produce the same columns in the same order. Leave placeholder and unused columns mapped to nothing so they stay empty instead of disappearing, because many importers check the column count. Then start small, with ten records and no unusual names, and only add edge cases once a clean file is accepted.
When to Use the BRP Test Data Generator
Use it when a system consumes person data from the Basisregistratie Personen and you need a realistic population to test it: pension administrations, insurers, municipalities, healthcare and any chain test where a death, a marriage or a move has to travel through several systems.
Common Use Cases
- Life event testing: death with a surviving partner and a minor child, marriage, divorce, remarriage and moving abroad in one population
- Import testing: match the header of a target system and see the file accepted instead of rejected
- Correspondence testing: long surnames, apostrophes and voorvoegsels show how letter templates and address labels hold up
- Edge case testing: confidential records, records under investigation and people without a fixed address
- Volume testing: up to 5,000 person records in one file
Expert Tips
- Note the seed in your test report so the same population can be regenerated later
- Map placeholder columns to nothing rather than removing them, so the column count stays what the target expects
- Turn the Excel option off for anything you import, it adds a sep= line that strict parsers read as data
- Raise the share of unusual names once a clean file is accepted, that is where letter templates break
Frequently Asked Questions
- It is how the Dutch Basisregistratie Personen holds one person: a set of numbered categories rather than a flat record. 01 is the person, 02 and 03 the parents, 04 nationality, 05 marriage or registered partnership, 06 death, 07 registration, 08 residence and 09 children. A category numbered fifty higher holds the history of that category, so 55 is an earlier partnership and 58 a previous address.
- No. They are random numbers that satisfy the elfproef, which is what validation checks. They are not issued to any person. They also never start with a zero, because a spreadsheet or an importer reads such a value as a number and silently drops the first digit, after which it is no longer a valid BSN.
- That message almost always means the column names are not in the target system's vocabulary, not that the file is malformed. Switch the output mode to match your own header row, paste the first line of a file that system does accept, and the generator will produce those exact column names in that exact order.
- Compact gives a short overview of about thirty columns: who the person is, where they live, the partner, an earlier partner, the first child and the life event the record was generated for. It is the version you scan yourself or hand to a colleague. Full structure writes every field the generator knows, across all the categories, for when the receiving system wants completeness. Both hold exactly the same people.
- They stay in the file and are written empty. That matters, because many importers check the number of columns, and placeholder or unused columns are part of the expected layout even when they carry no data.
- yyyymmdd is the default because that is what most BRP exports carry, so 11 March 1995 is written as 19950311. ISO and Dutch notation are available for systems that expect them.
- Yes. The seed plus the settings fully determine the output, so noting the seed in your test report is enough to regenerate exactly the same records.
- No. Generation runs entirely in JavaScript on your own machine, including the header row you paste. Nothing is uploaded and the tool works offline once the page has loaded.
What is a BRP persoonslijst?→
Are the BSN numbers real?→
My import says no fields were matched. What now?→
What is the difference between the compact and the full output?→
What happens to columns I do not map?→
Which date format should I use?→
Can I reproduce the same file later?→
Does my data leave the browser?→
Related tools
12 suggested- 01DNS Lookup - A, MX, TXT, NS & MoreQuery A, AAAA, MX, TXT, NS, CNAME, SOA, and CAA records for any domain via DNS-over-HTTPS. Free browser-based DNS lookup with a query-all mode.
- 02ZIP Extractor - Open ZIP Files OnlineOpen and extract ZIP files directly in your browser: list contents, preview text and images, download files. Free and private - nothing is uploaded.
- 03User Agent Parser - Browser & OS LookupParse any user agent string to identify browser, version, engine, OS, and device type, including bots. Free, instant, and fully browser-based.
- 04HTML to JSX Converter - Free & InstantConvert HTML to valid React JSX instantly: className, camelCase attributes, style objects, and self-closed tags. Free, browser-based, and private.
- 05.htaccess Redirect Generator - Apache & NginxGenerate 301 and 302 redirect rules for Apache .htaccess and Nginx, with HTTPS, www, and trailing-slash templates. Free and fully browser-based.
- 06Generate .env.example Files - Free & PrivatePaste a .env file and instantly get a .env.example with secret values stripped. Free, browser-based, and private - credentials never leave your device.
- 07JSON Formatter & Validator - Instant ResultsFormat, validate, and minify JSON with instant error highlighting. Pinpoints syntax errors. Free, private, browser-based.
- 08JSON to CSV Converter - Export InstantlyConvert JSON arrays to CSV format with automatic header detection. Download as CSV file. Free, browser-based - no upload needed.
- 09CSV to JSON Converter - Auto-Detect FormatConvert CSV data to JSON format instantly. Auto-detects delimiters and headers. Free, private, browser-based - no upload needed.
- 10JSON to XML Converter - Instant & FreeConvert JSON data to XML format with proper indentation and escaping. Free, browser-based converter - no upload needed.
- 11JSON Tree Viewer - Expandable VisualizerVisualize JSON data as an expandable, collapsible tree. Search keys and values, copy JSON paths. Free online JSON explorer.
- 12JSON Schema Validator - Free Online ToolValidate JSON data against a JSON Schema instantly. Perfect for AI function calling and API validation. Free, browser-based.