Synthetic Test Data Generator
Pick the fields a record needs from thirty-nine types — identifiers, names, addresses and telephone numbers, network addresses, dates and times, numbers, coordinates, companies and job titles, or your own fixed-choice list — set how many records you want, and get the whole set back as a table, JSON, CSV or ready-to-run SQL INSERT statements. Everything is built in your browser, and every value comes from a range reserved for fiction, an invention, or a public fact that is nobody's personal data.
What this generator does
Builds a table of fictional records from fields you choose, then exports them as JSON, CSV or SQL inserts. It is the only tool here that takes a schema as input rather than producing one fixed shape, which makes it the right choice for seeding a development database or generating fixtures, where the CSV and JSON sample generators are better for a quick one-off example.
How to use this tool
- Tick the fields each record should contain. The column order matches the list.
- Set the number of records, and choose a UK or North American formatting style for addresses and telephone numbers.
- Optionally ask for distinct values down a column, add a percentage of blank values, or enter a seed so the same settings always produce the same records.
- Choose an output format — table preview, JSON, CSV or SQL INSERT — then copy or download it.
- Press Regenerate for a fresh set, or change any setting and generate again.
Understanding the controls
- Field checkboxes
- Tick the fields each record should contain; the column order follows the list. Each field type draws from its own bank of deliberately fictional values.
- Number of records
- How many rows to build, up to 500. The cap exists because everything is generated and held in the browser tab rather than streamed from a server.
- Formatting style
- Switches addresses and telephone numbers between UK and North American shapes. Both draw only from ranges reserved for fiction, so neither produces a contactable number or a deliverable address.
- Distinct values
- Asks for no repeats down a column. It can only be honoured where the value space is large enough — UUIDs, emails, timestamps and numeric ranges — and the tool tells you when it could not manage it rather than quietly repeating.
- Blank rate
- The chance that any one cell comes back empty, so you can test how an importer or a validation layer copes with missing data. Columns marked distinct are never blanked.
- Seed
- Leave blank for cryptographic randomness. Enter a seed and the same settings reproduce the same records exactly, which is what you want for a fixture file committed alongside your tests.
Worked examples
- Four fields, JSON output
- { "id": "9f1c2b0e-…", "full_name": "Cleo Fenwick", "email": "dara.oakley42@example.net", "status": "pending" }
- SQL output
- INSERT INTO test_records (id, full_name, email, status) VALUES ('9f1c2b0e-…', 'Cleo Fenwick', 'dara.oakley42@example.net', 'pending');
- Reserved formats only
- Telephone numbers come from Ofcom's 07700 900xxx / 020 7946 0xxx drama ranges or NANPA's 555-01xx range; addresses use the ZZ99 3CZ pseudo-postcode or an unassigned 00000 ZIP.
- Network fields are documentation ranges
- IPv4 addresses come from RFC 5737's 192.0.2.0/24, 198.51.100.0/24 and 203.0.113.0/24; IPv6 from RFC 3849's 2001:db8::/32; MAC addresses from RFC 7042's 00-00-5E-00-53-xx. None of them routes anywhere, so a fixture that escapes cannot reach a real host.
Common use cases
- Seeding a development or staging database without touching production data
- Filling a UI prototype or demo with rows that look plausible in screenshots
- Creating fixtures for automated tests, with a seed so runs stay reproducible
- Exercising an importer or ETL job against blank values and awkward column mixes
- Producing sample rows for documentation, tutorials or a bug report
How this generator works
Each field type has its own generator function drawing from a fixed bank of invented values, and the record set is assembled column by column so a 'distinct values' request can be checked against everything already emitted for that column. Without a seed, every value comes from the browser's cryptographic random number generator. With a seed, the same values come from a small deterministic PRNG instead, so identical settings reproduce an identical file — useful for committed test fixtures, and the reason dates are drawn from a fixed 2020–2029 window rather than a window relative to today.
Limitations and good to know
- The seeded mode uses a deterministic, non-cryptographic PRNG. It exists for reproducible fixtures and must never be used to produce anything security-sensitive.
- Distinct values can only be guaranteed for types with a large value space — UUIDs, emails, timestamps and numeric ranges. Booleans and statuses will repeat, and the tool tells you when it could not honour the request.
- The output is not referentially consistent: an email is not derived from the name in the same row, and there are no foreign keys between generated columns.
- Records are capped at 500 per run, because everything is generated and held in the browser tab rather than streamed from a server.
- Names are randomly recombined from generic given-name and surname banks, so a combination may coincidentally match a real person. Nothing else in the record will.
- There are two locale styles, not seventy. A locale can only be added when that country's regulator publishes a range reserved for fiction — Ofcom and NANPA both do. Without one, a plausible-looking foreign telephone number in a fixture is either somebody's real number or a malformed one that proves nothing, and neither is worth the extra flag on the page.
- There is no card number, bank account or national identifier, and there will not be. A generator that emits a checksum-valid card number is one paste away from being somebody's problem, and being obviously synthetic is no defence once it is sitting in a log.
Common mistakes
- Assuming seeded output is safe for anything security-sensitive
- The seeded mode uses a small deterministic generator, not a cryptographic one. It exists for reproducible fixtures. There is deliberately no password, key or token field type here at all.
- Treating the rows as realistic personal data
- Every value is fictional by construction, but the records have no referential consistency — the email in a row is not derived from the name beside it, and there are no relationships between columns.
Privacy and your data
The whole dataset is generated on your device. Nothing you configure and nothing that is generated is uploaded, stored or logged, and downloads are assembled in the browser rather than fetched from a server.
Every value is fictional by construction: RFC 2606 reserved email domains, regulator-reserved fictional telephone ranges, and non-deliverable addresses. There is no password, key or token field type. Do not treat generated records as real personal data, and do not use this output to impersonate a real person or organisation.
Frequently asked questions
- Is any of this data real?
- No. Every field type comes from one of three sources and nothing else: a range an authority has reserved for fiction or documentation, a value invented for the purpose, or a public fact that is nobody's personal data. So email addresses only use the RFC 2606 reserved domains, telephone numbers only the regulators' drama ranges, network addresses only the RFC documentation blocks, and addresses combine invented streets and towns with a pseudo-postcode that cannot be delivered to. Country names are real, because a country is not a person. Names are randomly recombined from generic banks and are not taken from anybody.
- Does it send my data anywhere?
- No. The whole dataset is generated in your browser. Nothing you configure and nothing that is generated is uploaded, stored or logged.
- How does the seed option work?
- Type any text into the seed box and the tool switches from the browser's cryptographic random number generator to a deterministic one derived from that text. The same seed with the same field selection, record count and options will reproduce exactly the same records every time, which is what you want for a fixture file you commit alongside your tests.
- Can I generate test passwords or API keys with it?
- Not here, by design. This tool has no credential field type, so it can never hand you something that looks like a usable secret. Use the dedicated password, passphrase, API key and token generators for that.
- What is the blank-value option for?
- It sets the chance that any one cell comes back empty (null in JSON and SQL, an empty CSV cell), so you can check how an importer, a UI or a validation layer copes with missing data. Columns you have asked to be distinct are never blanked.
- How is this different from the CSV and JSON sample generators?
- Those tools each hand you one small fixed-shape sample to copy. This one takes a schema you define and produces as many records as you ask for in whichever of four formats you need, with uniqueness, blank-rate and seeding controls on top.
Related generators
- CSV Test Dataset GeneratorA small fictional CSV sample, including one deliberately messy row, for exercising a parser.
- Hash Table Scenario GeneratorKeys distributed into buckets by modulo hashing, with collisions, chain lengths and empty buckets all recounted from the table.
- Outlier Dataset GeneratorContaminated samples where the planted outliers are labelled, so a detection rule can be scored on both kinds of error.
- JSON Sample GeneratorGenerate a small sample JSON object with randomised placeholder values, for API mockups.
- Test Account GeneratorGenerate a fake username, @example.com email and password for testing signup forms.
- Correlated Dataset GeneratorTwo numeric columns with a correlation you choose, plus optional blanks, duplicate rows and outliers — for testing charts, cleaning pipelines and statistics teaching.