Mock Data Generator
Build a schema, generate realistic fake rows, and download them as CSV, TSV, JSON, NDJSON, SQL, XML, HTML or Excel. Up to 5 million rows, no sign-up, and nothing ever leaves your browser.
What This Mock Data Generator Does Differently
Most "random data" sites hand you a column of unrelated values: a first name from one row, an email belonging to somebody else, a postcode from a different country entirely. That is fine until you actually load the file into a staging database and your joins, validators and display logic start behaving in ways real data never would. This generator builds a coherent identity for every row first — person, address, employer — and then fills your columns from it. The email is derived from the name in the same row. The postal code format matches the selected country. Rearranging your columns does not break any of it.
Reproducible output is the headline feature
Type anything into the Seed box and the generator becomes deterministic: the same schema plus the same seed produces a byte-identical file, on any machine, in any browser. That is what turns generated data into something you can actually commit to a repository. Your fixture file stops being a mystery blob that nobody dares regenerate — anyone can rebuild it from the seed and get the same bytes, so a diff in CI means a real change, not just fresh randomness. Leave the seed blank and you get fresh data on every run instead.
One detail that most generators get wrong: anything derived from “now” quietly breaks reproducibility. A column defined as some date between 2020 and today shifts every time the clock moves, so a seeded rerun a minute later produces a different file. Here, a seeded run anchors now to midnight UTC rather than the live clock, so repeated runs on the same day match exactly — and Copy share link pins the exact anchor into the URL, so a shared or committed schema keeps reproducing the same bytes indefinitely. Set an explicit To date on your date columns and the output is fixed regardless.
Everything runs in your browser
There is no account, no row cap behind a paywall, no API key and no upload. The generator is plain JavaScript running in your tab; the only network request it ever makes is fetching the ZIP library from a CDN when you choose Excel output. You can disconnect from the network after the page loads and keep generating files. That matters more than it sounds: schemas often mirror a real production table, and column names alone can leak a surprising amount about an internal system.
Field types available
- Identity — row number, UUID v4, Mongo-style ObjectId, and prefixed sequential IDs like
EMP-00042with configurable start and padding. - People — first / last / full name, gender, date of birth, age, email, username, local and international phone numbers, avatar URL.
- Locations — street address, city, state or region with its code, postal code, country, country code, full one-line address, latitude, longitude and timezone.
- Internet — domain, URL, slug, IPv4, IPv6, MAC address, user agent, weighted HTTP status codes and MIME types.
- Business — company name, job title, department, product name, product category, SKU, price and currency code.
- Dates and numbers — dates, timestamps, ISO 8601, Unix epoch, times, integers, decimals with configurable precision, booleans in four styles, and percentages.
- Custom — pick from your own comma-separated list, build values from a pattern such as
DEV-@@##-####, or pin a fixed constant.
Output formats and what they are good for
- CSV / TSV — RFC 4180 compliant, with configurable delimiter, optional UTF-8 BOM for Excel, and correct quoting whenever a value contains the delimiter, a quote or a line break.
- JSON — numbers stay numbers, booleans stay booleans and blank cells become
null, so the file loads cleanly into a typed language without a post-processing step. - NDJSON — one object per line, which is what BigQuery, Elasticsearch bulk import and most log pipelines expect.
- SQL — a
CREATE TABLEwith sensible per-column types plus batched multi-rowINSERTstatements, quoted for MySQL, PostgreSQL, SQLite or SQL Server. - XML — configurable root and record element names, with column names coerced into legal XML element names and control characters stripped.
- HTML — a standalone styled table you can open directly or paste into a document.
- Excel (XLSX) — a real spreadsheet with a bold frozen header row, auto-sized columns, and numbers written as genuine numeric cells so
SUMworks without converting anything.
Why generated CSVs are a security problem (and how this one is not)
Spreadsheet software treats any cell beginning with =, +, - or @ as a formula. A CSV containing =cmd|'/c calc'!A1 can therefore trigger a command prompt when somebody opens it in Excel — the well-documented CSV injection class of attack. Test data ends up in exactly the places where this bites: shared with QA, attached to tickets, imported into admin dashboards. This tool prefixes any such cell with an apostrophe by default, which forces the value to be treated as text and renders it inert. You can disable the guard with the checkbox above when you specifically want to test how your own importer handles those characters.
Generating very large datasets
Up to 100,000 rows the file is assembled in memory and handed to the browser as a normal download. Beyond that, tick Stream straight to disk: the generator writes CSV, TSV, JSON or NDJSON in chunks through the File System Access API and never holds the full dataset in RAM, which is what makes multi-million-row files possible in a tab. Streaming needs a Chromium browser (Chrome, Edge, Opera, Brave or Arc); Safari and Firefox have not shipped the API, and fall back to the in-memory limit.
Limitations worth knowing
- In-memory cap: 100,000 rows. Above this you must stream, or the tab risks running out of memory.
- Streaming cap: 5,000,000 rows, and only for CSV, TSV, JSON and NDJSON. SQL, XML, HTML and XLSX need the whole dataset to build a valid document and cannot be streamed.
- Excel is practical to about 50,000 rows. The format itself allows 1,048,576, but building that much XML in a browser tab is slow — use CSV for very large spreadsheets and let Excel import it.
- Maximum 40 columns.
- Three locales — United States, United Kingdom and India. Names, cities, regions, postcode shapes and phone formats change with the selection; everything is Latin script.
- Card numbers are synthetic. They carry a valid Luhn check digit so payment forms accept them for validation testing, but they are not issued and will always fail real authorization.
- Values are not guaranteed unique. Random fields will repeat across large datasets by design. Use Row number or Prefixed ID when you need a genuine primary key.
- Seeded runs anchor to midnight UTC. Columns with an open-ended date range would otherwise drift with the clock. Share links pin the anchor; explicit To dates avoid the question entirely.
- Avatar URLs point to a third-party placeholder service and are generated as text only — nothing is fetched by this page.
- Dates use UTC throughout, so output does not shift with your local timezone.
Privacy
Your schema, your seed and the generated rows exist only in your browser tab. Nothing is transmitted, logged or stored on a server, and the share link encodes your schema in the URL itself rather than saving it anywhere. Because the data is entirely synthetic, it carries none of the GDPR, HIPAA or DPDP obligations that come with copying a production table into a test environment — which is the real reason to use generated data in the first place.
Frequently Asked Questions
CREATE TABLE with a sensible type per column followed by batched multi-row INSERT statements. Turn the CREATE TABLE off if the table already exists.=, +, - or @ as a formula, so a leading apostrophe forces it to be read as plain text instead. Uncheck the guard if you are deliberately testing how your own importer handles those characters.SUM and sorting work immediately with no "convert to number" prompt. It opens in Excel, LibreOffice, Google Sheets and Numbers, and is validated in testing against strict OOXML parsers.