Free tool
Mock data generator
Make fake test data in your browser: add fields such as names, emails, UUIDs, dates, prices and statuses, then get up to 10,000 rows as JSON, NDJSON, CSV or SQL INSERT statements. Start from a preset, or build your own schema.
Free · no sign-up · runs in your browser, nothing is uploaded
Generating…
Field types
| Type | Example | Options |
|---|---|---|
| Row number | 1, 2, 3 | Start value |
| UUID v4 | b3f1c2d4-…-4… | none (always unique) |
| First, last, full name | Priya Patel | Names from many countries, some with accents |
| priya.patel12@example.com | Built from the same row's name, ASCII only | |
| Phone | +1-415-555-0142 | Fictional 555-01xx numbers |
| City, country, code | Lisbon, Portugal, PT | City and country match in each row |
| URL, URL path | https://example.com/…, /nisl/augue-12 | example.com, .org and .net only |
| IPv4 / IPv6 | 203.0.113.7 / 2001:db8:… | Documentation ranges only |
| Date, date-time, Unix time | 2025-03-14T09:26:53Z | From and to dates (UTC) |
| Integer, decimal | 42, 19.99 | Min, max, decimal places |
| Boolean | true | Percent true |
| One of a list | paid | Values with weights: paid:6, refunded:1 |
| Word, sentence, paragraph | Lorem ipsum dolor | Lorem ipsum filler |
Every field can be partly null (set a percent) and most can be unique. If a unique field runs out of values, for example 50 unique integers between 1 and 10, the tool says which field and why instead of looping. For one-off IDs, the UUID generator makes v4, v7 and ULIDs in bulk.
Test data that cannot reach real people
Random emails and phone numbers can belong to someone. If a test sends a welcome email or an SMS by mistake, it goes to a stranger. This generator only uses values that are reserved for examples:
| Kind | Values used | Reserved by |
|---|---|---|
| Email domains | example.com, example.org, example.net | RFC 2606 |
| Phone numbers | 555-0100 to 555-0199 | NANPA, for fictional use |
| IPv4 | 192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24 | RFC 5737 |
| IPv6 | 2001:db8::/32 | RFC 3849 |
RFC 2606 also reserves the .test, .example, .invalid and .localhost top-level domains, which are handy for fake hostnames in configs.
JSON, NDJSON, CSV or SQL?
- JSON is one array of objects. Good for API mocks, fixtures and front-end props. Dot names become nested objects.
- NDJSON (JSON Lines) has one JSON object per line. Tools like
jq, BigQuery and Elasticsearch's bulk API read it line by line, so large files do not have to fit in memory. - CSV follows RFC 4180: values with commas, quotes or line breaks are quoted, inner quotes are doubled, lines end in CRLF and nulls are empty. Opens in Excel and Google Sheets. Pick a semicolon, tab or pipe delimiter if your import expects one. To reshape it, use CSV to JSON or the CSV viewer.
- SQL writes multi-row
INSERTstatements, with an optionalCREATE TABLE. Strings are escaped by doubling single quotes; MySQL also gets backslashes escaped, and SQL Server getsN'…'for non-ASCII text. Date-times are written as UTC in the form each database accepts:2024-05-01 10:20:30for MySQL, without theZfor SQL Server.
CREATE TABLE "users" (
"id" INTEGER NOT NULL PRIMARY KEY,
"email" VARCHAR(255) NOT NULL,
"is_active" BOOLEAN NOT NULL
);
INSERT INTO "users" ("id", "email", "is_active") VALUES
(1, 'olivia.garcia1@example.com', TRUE),
(2, 'kpark2@example.org', FALSE);Generate fake data in code
For data you regenerate in CI or need in the millions, script it. Seed the generator so test runs are repeatable.
// JavaScript: @faker-js/faker
import { faker } from '@faker-js/faker';
faker.seed(42);
const users = faker.helpers.multiple(() => ({
id: faker.string.uuid(),
name: faker.person.fullName(),
email: faker.internet.email({ provider: 'example.com' }),
createdAt: faker.date.past(),
}), { count: 100 });
# Python: Faker
from faker import Faker
Faker.seed(42)
fake = Faker()
users = [{"name": fake.name(), "email": fake.email(), "city": fake.city()} for _ in range(100)]
-- PostgreSQL: a million rows without leaving the database
INSERT INTO users (id, email, created_at)
SELECT gen_random_uuid(),
'user' || g || '@example.com',
now() - random() * interval '365 days'
FROM generate_series(1, 1000000) AS g;Faker for JavaScript builds emails on real free-mail domains such as gmail.com unless you pass a provider, so set it to example.com if your tests can send mail. Python Faker's fake.email() uses example domains by default (safe=True).
Tips for useful test data
- Add nulls on purpose. Real data has missing phones and empty companies. A 10-20% null rate on optional fields finds the UI and query bugs that perfect data hides.
- Weight your statuses. Most orders are paid and a few are refunded. Weights like
paid:6, pending:2, refunded:1make charts and filters look like production. - Test the edges. Include names with accents and apostrophes (the name lists have both), the minimum and maximum of each range, and at least one long text field.
- Never copy production data into dev. Fake data avoids leaking personal data into laptops, logs and screenshots.
Need a real backend for the data? DevHunt lists database tools and API tools. For placeholder prose rather than rows, use the lorem ipsum generator.
More free developer tools
FAQ
What is mock data?+
Mock data is fake data shaped like your real records: users with names and emails, orders with totals and dates. You use it to fill a dev database, build a UI before the API is ready, write tests or show a demo, without touching real customer data.
How do I generate fake data for testing?+
Add a field for each column, pick its type (name, email, date, number, one of a list), set the number of rows and choose JSON, CSV or SQL. The output updates as you edit. In code, the Faker library does the same in JavaScript and Python, as shown above.
Can I get the same data again?+
Yes. The data comes from a seeded generator, so the same fields, row count and seed always give the same rows. The schema and seed are kept in the page URL; bookmark or share the link to reproduce the data. Press New data for a different seed.
Are the emails and phone numbers real?+
No, and they are picked so they cannot be. Emails use example.com, example.org and example.net, which RFC 2606 reserves for documentation. Phone numbers use 555-0100 to 555-0199, which NANPA keeps for fictional use. IP addresses come from the ranges set aside for documentation.
How many rows can I generate?+
Up to 10,000 per run, for free and without an account. Everything is generated in your browser. For more, run it a few times with different seeds, or use generate_series in PostgreSQL or a Faker script (see the code section).
How do I make nested JSON?+
Put a dot in the field name. address.city and address.country become {"address": {"city": …, "country": …}} in JSON and NDJSON. In CSV the header stays address.city, and in SQL the column becomes address_city.
Can I import the SQL into my database?+
Yes. Pick your dialect (PostgreSQL, MySQL, SQLite or SQL Server) so identifiers are quoted the right way, booleans are written the right way and CREATE TABLE uses matching column types. Rows are split into INSERT statements of at most 1,000 rows, the SQL Server limit for one VALUES list.
Sources: RFC 2606 (reserved domain names) · RFC 5737 (IPv4 documentation ranges) · RFC 3849 (IPv6 documentation prefix) · NANPA: 555 line numbers · RFC 4180 (CSV) · JSON Lines · Microsoft Learn: Table Value Constructor · PostgreSQL: generate_series · Faker (JavaScript) · Faker (Python). Checked 2026-10-31.