Mock Data Generator
Typed columns in, CSV, JSON, NDJSON or SQL out. Up to 100,000 rows, made on your device; the same seed gives the same data.
Columns
Name, type, options, % left blankOutput options
Numbers stay numbers, booleans are true/false and blank cells are null. NDJSON writes one object per line.
Preview: the first 20 rows
Blank cells show as null.How to make mock data
- Edit the columns: give each a name (it becomes the CSV header, the JSON key or the SQL column), pick a type and open Options for its range, list or pattern. Set % blank to leave that share of cells empty.
- Type a seed, or keep the one shown. The preview below updates as you edit; it is exactly the first 20 rows of the file.
- Set the number of rows, up to 100,000, and the format: CSV, a JSON array, NDJSON or SQL INSERT. CSV and SQL have their own options above the preview.
- Tap Generate. The rows are made in a background Worker with a progress bar, so the page stays usable.
- Download the file or Copy it. Tap Share link to send the schema (not the data) to a colleague: with the same seed they get the same file.
The column types
- First, last and full name: from 1,563 female and 1,391 male first names and 473 last names (the English lists of @faker-js/faker 10.6.0). First and full names can be female, male or either.
- Email: built from the first and last name columns of the same row (or a full name column) in one of five shapes, such as
jordy.fritsch74@example.net, always on example.com, example.net or example.org. RFC 2606, section 3, reserves exactly those three second-level names as examples (rfc-editor.org/rfc/rfc2606.txt, fetched 2026-10-20), so a test that really sends mail cannot reach a stranger. - Phone: North American numbers in 555-0100 to 555-0199, the range "specifically reserved by the North American Numbering Plan Administrator for fictitious, non-working numbers", with a random area code, such as
(501) 555-0183; or the UK drama ranges, London 020 7946 0000 to 0999 and mobile 07700 900000 to 900999. Source: Fictitious telephone number, fetched 2026-10-20 (Ofcom's own page refused the request and NANPA's old address did not resolve that day). The US range holds only 100 numbers per area code, so large tables repeat numbers. - Street address: made up, a random house number and a street name, such as
350 Cormier Stream. City (927 names), country (249) and company (built from last names, such asConn Group) are drawn independently of each other. - Integer and decimal: uniform between a minimum and a maximum (both included for integers), or normal with a mean and a standard deviation (no clipping, so a normal column can go past any limit you have in mind). Decimals keep the number of places you set, so 3.10 stays 3.10.
- Date (YYYY-MM-DD) and date and time (ISO 8601 in UTC, such as
2024-09-30T06:20:05Z; SQL gets2024-09-30 06:20:05), uniform between two days, both included. - Boolean with the percentage that is true. Pick from my list: one value per line, with an optional weight after a bar, so
free | 6,pro | 3,team | 1gives about 60 %, 30 % and 10 %. - Pattern:
Ais a capital letter,aa small one,#a digit,?a capital or a digit, and\makes the next character literal;AAA-####gives values likeQHT-0475. Sequence: a start and a step, 1, 2, 3... UUID v4: random hex with the version digit 4 and the variant bits set, drawn from the seed, so they repeat with it. - Built from other columns: a template like
{first_name}.{last_name}orUSER-{row}, upper- or lower-cased if you like. It can use any column that is not itself built, and built columns above it. Lorem text: a sentence of pseudo-Latin words, between the counts you set.
Same seed, same data: a worked example
The example schema has six columns (id, first_name, last_name, email, plan, signup_date with 10 % blank). With seed 42 its CSV always starts
id,first_name,last_name,email,plan,signup_date 1,Beaulah,Stroman,beaulahstroman@example.net,free,2023-08-31 2,Jordy,Fritsch,jordy.fritsch74@example.net,free,2020-02-24
and with seed 43 the first row is 1,Alvera,Zboncak,alvera.zboncak@example.net,pro,2023-10-01. The seed text is hashed (cyrb128) with each column's position to start that column's own sfc32 generator, so the values do not depend on the device, the time zone or the day. Two cautions: renaming a column keeps its values, but moving it changes them; and a later version of this page with longer name lists would change the names for the same seed.
Why on your device
Hosted generators usually limit free downloads; one popular one lists its free plan as "Limited to 1,000 rows per file" (mockaroo.com/pricing, fetched 2026-10-20). Here the limit is 100,000 rows per file, set by what a phone's memory handles comfortably, with no account. In desktop Chrome 100,000 rows of the six example columns take well under a second (0.4 s measured, 5.8 MB of CSV).
What it cannot do
- Values are random draws from lists and ranges, not a real population's distribution: names are not weighted by how common they are, and a city is not matched to its country.
- One table at a time: there are no foreign keys or relations between tables. A sequence column gives you ids you can reuse as keys in a second table built with a pick list.
- It never contains real personal data, and it is not a substitute for it: it cannot anonymise or mask a real data set.
- At most 100,000 rows and 40 columns per file. Copy is slow for very large files on phones; Download is the better choice there.
- English names and places only. Phone numbers are US/Canada or UK formats only.
- UUIDs and every other value come from the seeded generator, not a cryptographic one: fine for test data, never for tokens or passwords.
- Share links carry the schema, not the data, and links longer than 2,000 characters (long pick lists) may be cut short by some chat apps.
Privacy and what is stored
Everything is generated by code in this page on your device; no schema and no generated value is sent anywhere. The schema (columns, seed and output settings) is saved in this browser's local storage once you edit it, so a reload keeps it; Clear saved schema deletes it in one tap. The page sends an anonymous page-view count and, at most, two fixed words (mock-generate, mock-download), never a column name or a value. A share link carries the schema after the #, which browsers do not send to any server, and opening one saves nothing unless you tap Keep this copy. New seed draws its number with crypto.getRandomValues; the data itself comes from the seeded generator so that it can be repeated.
Questions
Is this mock data generator online and free, and is anything uploaded?
It runs in your browser tab: the rows are made by code in this page, in a background Worker, on your own device, and the file is built there too. Nothing you type and nothing it generates is sent anywhere. There is no account, no row limit below 100,000 per file and no price.
How do I generate mock JSON data?
Set up your columns, pick JSON array or NDJSON under Format and tap Generate. A JSON array is one file of objects, one object per row, with column names as keys; NDJSON puts one object per line with no surrounding brackets, which streaming tools and bulk loaders read line by line. Integers, decimals and sequences are written as JSON numbers, booleans as true or false, and blank cells as null.
Can it make SQL INSERT statements?
Yes. Pick SQL INSERT, type the table name and choose PostgreSQL, MySQL or SQLite. Identifiers are quoted the way that database expects (double quotes, or backticks for MySQL), a ' inside a value is written '', MySQL also gets backslashes doubled, and blank cells become NULL. Rows go into multi-row INSERT statements of 1 to 1,000 rows each, and a CREATE TABLE with matching column types can be added at the top.
How do I get the same data every time?
Keep the seed. The same seed and the same columns give a byte-identical file, on any device and any day, because every value comes from a seeded generator (sfc32) and nothing reads the clock. Each column has its own stream, so adding a column does not change the columns you already had. Change the seed, or tap New seed, for a different data set.
I use Python or JavaScript. Why not a library?
If the data has to be made inside your test run, a library is the right tool: Faker for Python or @faker-js/faker for JavaScript and TypeScript, seeded with their seed function. This page is for when you need a file now, to load into a database, a spreadsheet or an API mock, without installing anything. Its name and place lists come from @faker-js/faker's English locale, but the generator is its own, so seed 42 here does not give the same rows as seed 42 in a library.
Is the data real? Could it belong to someone?
No real records are used. Names are drawn at random from lists of 2,954 first names and 473 last names, so a combination can match a real person by chance, but it is not taken from anyone. Emails are only on example.com, example.net and example.org, which RFC 2606 reserves for examples, so no message can reach a real inbox. Phone numbers are only in ranges published for fiction. Street addresses are a random house number and a street name, not a real address of anyone in the row.