Mock Data Generator
Generate realistic seed rows from a one-line-per-field schema and export them as JSON, CSV, NDJSON or SQL inserts. Seeded, so the output is reproducible.
Schema
8 fieldsJSON
10 rows · 2.5 KB[
{
"id": 1,
"uuid": "d08690fb-721b-47fe-b371-24e9da6fd59f",
"first_name": "Uma",
"last_name": "Adeyemi",
"email": "sami.ueda@example.com",
"country": "FI",
"is_active": true,
"created_at": "2024-10-11T06:30:22Z"
},
{
"id": 2,
"uuid": "db9b4011-1273-42d9-84a2-59040028e29e",
"first_name": "Nadia",
"last_name": "Moreau",
"email": "alan.okafor@example.com",
"country": "IN",
"is_active": true,
"created_at": "2024-11-20T03:21:17Z"
},
{
"id": 3,
"uuid": "9cbc965e-c9b5-4081-8211-d7e9f20b480b",
"first_name": "Rosa",
"last_name": "Garcia",
"email": "diego.okafor@example.com",
"country": "FR",
"is_active": true,
"created_at": "2024-03-27T22:30:26Z"
},
{
"id": 4,
"uuid": "2a3328fa-f1f4-4191-be5e-1c5bc85dc28d",
"first_name": "Nadia",
"last_name": "Xu",
"email": "farah.xu@example.com",
"country": "IN",
"is_active": true,
"created_at": "2024-05-06T07:09:32Z"
},
{
"id": 5,
"uuid": "e04cd2a1-7e16-4408-8058-4d23725561a0",
"first_name": "Alan",
"last_name": "Ibrahim",
"email": "quinn.ibrahim@example.com",
"country": "ZA",
"is_active": true,
"created_at": "2025-01-16T09:33:02Z"
},
{
"id": 6,
"uuid": "245bb66a-16a2-47a5-b50d-d0766aa35360",
"first_name": "Omar",
"last_name": "Chen",
"email": "wei.eriksen@example.com",
"country": "MX",
"is_active": true,
"created_at": "2024-02-09T22:07:45Z"
},
{
"id": 7,
"uuid": "2d477e46-6b69-41f1-b34a-94a445ee9bf8",
"first_name": "Priya",
"last_name": "Ibrahim",
"email": "kofi.bauer@example.com",
"country": "KR",
"is_active": true,
"created_at": "2025-09-19T13:21:02Z"
},
{
"id": 8,
"uuid": "64bc286f-959c-4d9a-8d8e-e28cb55ad6d5",
"first_name": "Ivan",
"last_name": "Petrov",
"email": "tariq.oliveira@example.com",
"country": "AU",
"is_active": false,
"created_at": "2024-12-31T13:46:43Z"
},
{
"id": 9,
"uuid": "83ae7db9-6001-47af-baaf-60407c0b46f0",
"first_name": "Quinn",
"last_name": "Mensah",
"email": "diego.yilmaz@example.com",
"country": "ZA",
"is_active": true,
"created_at": "2024-02-19T13:17:12Z"
},
{
"id": 10,
"uuid": "5ed54f3b-f603-46b1-8f5b-d45a18983059",
"first_name": "Amara",
"last_name": "Jensen",
"email": "viktor.nakamura@example.com",
"country": "CZ",
"is_active": true,
"created_at": "2025-10-13T21:41:34Z"
}
]
Generation is seeded: the same schema, row count and seed always produce identical output, so generated data can be committed as a fixture. The PRNG is not cryptographically secure — these are test rows, not secrets.
About the Mock Data Generator
Describe your table one field per line and this mock data generator produces realistic rows you can export as JSON, NDJSON, CSV or a SQL INSERT. Thirty-four field types, from uuid and email to enum, pattern and date ranges. Everything is generated in your browser.
The difference from every other fake data generator is the seed. Generation is deterministic: the same schema, row count and seed always produce byte-identical output. That turns generated data into something you can commit as a fixture, assert against in a test, and diff when it changes — none of which works when pressing the button twice gives you two different datasets. Change the seed when you want different data; leave it alone when you want the same data tomorrow.
The values are chosen to be safe to use. Email addresses are on example.com, which RFC 2606 reserves so they cannot reach a real inbox. Phone numbers are in the 555-0100 to 555-0199 block reserved for fiction. IP addresses are in 192.0.2.0/24, which RFC 5737 reserves for documentation. Seed data has a way of escaping into a staging environment that sends email, and none of these can reach anyone.
One thing to be clear about: the PRNG is mulberry32, chosen because it is deterministic. It is fast and it is not cryptographically secure. The uuid type produces correctly formed v4 UUIDs whose random bits come from that generator, so they are unique within a run and entirely predictable outside it. They are fixtures. Use the UUID Generator for identifiers that reach production.
- Seeded and reproducible — same seed, same rows, every time
- 34 field types including uuid, email, name, company, enum, pattern, price and date ranges
- A compact one-line-per-field schema, with errors reported by line and a suggestion for a mistyped type
- Export as JSON, NDJSON, CSV or a single multi-row SQL INSERT
- SQL output escapes single quotes by doubling them, and quotes identifiers only when needed
- Four presets: users, orders, products and API request logs
- Up to 1,000 rows per run
How to use it
- Write one field per line as name:type — for example email:email or age:int(18, 65). Start from a preset if it is close.
- Set the row count and pick an output format.
- Leave the seed alone if you want to be able to regenerate exactly this data later. Press New seed for a different dataset.
- For SQL, set the table name. The output is one INSERT with every row as a VALUES tuple.
- Copy or download. Press All field types for the full reference of what you can put on the right of the colon.
Real-world use cases
Backend & API developers
Seed a local database or a dev script with rows shaped exactly like the real schema, without standing up a service or writing a generator by hand.
QA & test engineers
Generate fixtures for a test suite where the seed is committed alongside the assertions — row three is always row three, so a test that checks a specific value keeps passing.
Frontend developers
Fill a table, list or dashboard with realistic-looking data before the real API exists, including edge cases like a mostly-true boolean column or a narrow date range.
Data engineers
Produce a sample CSV or NDJSON file to smoke-test an ingestion pipeline or ETL job before pointing it at a real, and much slower, data source.
DevOps & platform engineers
Seed a staging environment or a demo tenant with data that looks real but structurally cannot reach a live inbox, phone number or IP address.
Examples
A users table
id:id email:email country:countryCode is_active:bool(0.9) created_at:datetime(2024-01-01, 2026-07-01)
{
"id": 1,
"email": "amara.okafor@example.com",
"country": "PT",
"is_active": true,
"created_at": "2025-03-11T04:22:19Z"
}bool(0.9) means true about 90% of the time — useful when you want mostly-active users with a few exceptions.
A pattern for a SKU or reference
sku:pattern(??-####)
QT-4820
# becomes a digit, ? an uppercase letter, and everything else is literal.
SQL output
id:id name:constant(Ada)
INSERT INTO users (id, name) VALUES (1, 'Ada'), (2, 'Ada');
One statement, not one per row. Single quotes inside values are doubled, which is the only escape standard SQL defines.
The same seed, twice
seed: seed-1, 3 rows of uuid seed: seed-1, 3 rows of uuid
identical output both times
This is the property the tool is built around. Commit the seed alongside the fixture and the data is regenerable.
Common errors
| Message | Cause | Fix |
|---|---|---|
| Unknown type "emai" | A typo in the field type. Everything after the colon must be one of the listed types. | The error suggests the nearest match. Press All field types for the full list. |
| "justaname" is missing a type | A line with no colon on it. | Every line is name:type. A line starting with # is a comment and is ignored. |
| duplicate key value violates unique constraint | A generated column with a unique index repeated a value — likely enum, pattern or int over a small range. | Use id for a guaranteed-unique integer or uuid for a unique string. A random int over a narrow range collides quickly: with 1,000 rows over int(1, 100) it is certain. |
| The data changed when I regenerated it | The seed changed, or the field order did. Values are drawn from one stream left to right, so reordering fields changes every value after the one you moved. | Keep the seed and the field order fixed. Both are part of what makes the output reproducible. |
| Excel shows a date column as text, or mangles it | Excel applies locale rules to CSV, and ISO dates are frequently misread outside the US. | Use the semicolon delimiter for European locales, or import via Data → From Text rather than double-clicking the file. |
| insert or update violates foreign key constraint | A field like user_id:int(1, 200) generated an id with no matching parent row. | Generate the parent table first with id:id, note how many rows it has, then use int(1, N) for the foreign key with the same N. |
Frequently asked questions
›Is anything sent to a server?
No. The schema is parsed and the rows generated in your browser, which is also why there is no rate limit and why it works offline. Your schema often mirrors your real database structure, and it never leaves the page.
›Why does the seed matter?
Because it is the difference between generated data you can use once and generated data you can commit. With a fixed seed the output is byte-identical every time, so a fixture file regenerates cleanly, a test asserting on row three keeps passing, and a diff shows only what actually changed. Every generator that uses Math.random gives you a new dataset on every run, which is why nobody commits their output.
›Are the UUIDs safe to use as real identifiers?
No, and this is worth being blunt about. They are correctly formed RFC 9562 v4 UUIDs and they are unique within a run, but their random bits come from a seeded 32-bit PRNG, so anyone with the seed can reproduce every one of them. That is the point for fixtures and disqualifying for anything else. Use the UUID Generator, which uses crypto.getRandomValues, for identifiers that reach production.
›Could this data accidentally reach a real person?
The generated values are deliberately chosen to make that impossible. Email addresses use example.com (reserved by RFC 2606), phone numbers use the 555-01xx range reserved for fictional use, and IP addresses use 192.0.2.0/24 (reserved by RFC 5737 for documentation). Seed data does escape into environments that send email, so the defaults assume it will.
›How do I generate related tables?
Generate the parent first with id:id, which counts up from 1, and note the row count. Then in the child table use int(1, N) with that same N for the foreign key. There is no cross-table awareness — the tool generates one table at a time, so keeping the ranges consistent is on you.
›Why is there a 1,000-row limit?
Because everything is generated, formatted and rendered synchronously in the page, and beyond a few thousand rows the string handling starts to block the main thread. For a larger dataset, generate 1,000 rows of SQL and run the INSERT repeatedly with different seeds, or use the schema here as the specification for a script.
›Can I get a fixed value in every row?
Yes — constant(value) repeats the same literal, which is what you want for a tenant id, a region, or a status every row should share. For a value that varies over a small known set, use enum(a, b, c) instead.
›Will the same seed produce the same data on a different computer or browser?
Yes. mulberry32 is a pure-JavaScript PRNG seeded from the text you type — it does not read Math.random, the system clock, or anything else environment-specific. The output depends only on the schema, the row count and the seed string, so a fixture generated on one machine reproduces exactly on another, which is what makes it safe to commit.
Last updated