Skip to content

Fake User Data Generator

Locale
Format

Output

Click generate to create a batch of fake users.

Estimates for educational purposes — not financial, medical, or legal advice. See terms.

Generate synthetic user records for testing, development, and database seeding. Pick a locale, a count, and an output format (JSON, CSV, or SQL inserts), and the tool produces that many fake-but-realistic user records — names, emails, phone numbers, street addresses, cities, and postal codes — all locale-appropriate.

The tool runs entirely in your browser with hand-curated locale data. No external library is loaded, no network request is made, and your generated data never leaves your device. Records are cryptographically random when Web Crypto is available, falling back to Math.random otherwise.

Supported locales

Five locales, hand-curated:

  • United States — English first/last names from the SSA top-name list, US phone format (XXX) XXX-XXXX, 5-digit ZIP.
  • United Kingdom — English names from ONS top-name data, UK phone format 0XXXX XXXXXX, UK postcode format AB1 2CD.
  • Germany — German names, +49 phone format, 5-digit PLZ, German street types (Straße, Gasse, Weg).
  • France — French names, French phone format 0X XX XX XX XX, 5-digit code postal, French street types (rue, avenue, boulevard, place).
  • Netherlands — Dutch names, Dutch phone format 0X-XXXXXXXX, Dutch postal format 1234 AB, Dutch street types (straat, laan, plein).

Each locale has ~30 first names, ~30 last names, ~10 street types, and ~10 city names. That’s enough variety for test data while keeping the total payload under 15 KB for all five combined — compared to Faker-js’s ~500 KB when you include its full locale set.

Output formats

JSON — a pretty-printed array of user objects. The default when you want to paste data into a JSON fixture file or feed it to a test framework.

[
  {
    "firstName": "Alice",
    "lastName": "Smith",
    "email": "alice.smith@example.com",
    "phone": "(555) 123-4567",
    "street": "123 Main Street",
    "city": "New York",
    "zip": "10001"
  }
]

CSV — a header row followed by one record per line, with RFC 4180 escaping for values that contain commas, quotes, or newlines. The fastest way to get fake data into a spreadsheet.

firstName,lastName,email,phone,street,city,zip
Alice,Smith,alice.smith@example.com,(555) 123-4567,123 Main Street,New York,10001

SQL — one INSERT INTO users statement per record, with single quotes escaped by doubling. Drops straight into a psql or mysql client for seeding a test database.

INSERT INTO users (first_name, last_name, email, phone, street, city, zip) VALUES ('Alice', 'Smith', 'alice.smith@example.com', '(555) 123-4567', '123 Main Street', 'New York', '10001');

Example: seeding a dev database

You need 100 user records to populate a development database. Pick the US locale, set count to 100, pick SQL format, click generate, copy the output, and paste it into your psql session:

psql mydb < fake-users.sql

One hundred users, all with realistic names, valid email format, locale-correct phone numbers, and ZIP codes that would pass a regex check. Your app’s user-related features can be exercised without creating real accounts.

Example: testing a form with international input

Your signup form claims to support international users. Generate 50 records in the NL locale — you’ll get Dutch names with diacritics (ë, ï), Dutch postal codes, and +31 equivalent phone numbers. Feed them through your form and see which ones fail validation. You’ll usually find at least one: a regex that assumed ASCII names, a phone validator that only matches US formats, a postal code check that expected 5 digits.

This is better than inventing a few Dutch names yourself because you’ll test against actual frequency patterns — you’ll see common surnames like “de Jong” and “van der Berg” that have spaces and prefixes, which are a common source of form bugs.

Example: generating a CSV for a stress test

Your data import feature needs to handle a 1000-row CSV. Pick any locale, set count to 1000, pick CSV format, generate, and save the output as a .csv file. Drop it into your import flow and watch for performance issues, encoding problems, and edge cases like quoted fields or non-ASCII characters. Using generated data guarantees consistency — you can regenerate the exact same stress test as many times as you need.

Using generated data safely

Emails use reserved test domains (example.com, example.co.uk, example.de, etc.). These domains are defined by IANA and the top-level registries as “safe for documentation and testing” — they don’t resolve to real mail servers. This matters because generated test data sometimes ends up in real systems by accident, and emails sent to these reserved domains will simply fail to deliver rather than reaching real people. Never change this to use a real domain.

Phone numbers are not real. They use correct local formats but random digits. Occasionally a generated number will happen to be a real working number — treat them as “format checking only”, not “numbers you can actually call”.

Street addresses pair real street names with random numbers. The addresses are not real — they just look like addresses. Don’t use them for any geocoding work.

What this tool does not do

It does not generate UUIDs, user IDs, or timestamps — for IDs, the UUID generator produces v4 or v7 values to any count. It does not handle company names, job titles, or business data — just personal user data. It does not support weighted name distribution (e.g., generating names at the actual frequency they appear in US census data); every name in the list is equally likely. For placeholder prose to populate the fake profiles’ “bio” field, the lorem ipsum generator is the companion.

Frequently asked questions

Why not just use Faker.js?

Faker-js is the go-to library for this kind of thing, but it's around 500 KB minified with tree-shaking, which is heavy for a single web page. For a browser tool that generates under a thousand records at a time, hand-picked locale data at about 3 KB per locale is plenty — you get realistic names for the five supported locales without pulling in 200+ other locales and their data. If you need the full Faker-js feature set (UUIDs, lorem ipsum, company names, date helpers), use Faker-js in a Node script; for quick test data in the browser, this tool is leaner.

How realistic are the generated records?

The names are real names — drawn from actual top-name lists for each locale's country. The phone numbers use the correct local format (German +49, French 0X XX XX XX XX, etc.) but aren't real working numbers. Postal codes use the correct format but are random digits. Email addresses use example.com, test.net, and similar safe domains. Street addresses pair a real-format street name with a random number. Everything is realistic-shaped but obviously fake when examined — exactly the right fit for test data.

Why only five locales?

Because I hand-curated each one and the value curve drops off sharply after the big ones. US, UK, German, French, and Dutch cover a large fraction of the practical test-data needs for European and North American teams. Adding Spanish, Italian, Polish, and the major Asian locales is a reasonable next step, but each locale takes careful work to get names, streets, and postal formats right, so they'll be added in follow-up work rather than in a rush. If you need a locale that isn't here, use Faker-js — it has much broader coverage.

Are the email addresses safe to use?

Yes. The tool uses example.com, test.net, example.co.uk, example.de, etc. — domains explicitly reserved for documentation and testing by IANA and the top-level registries. These domains don't resolve to actual mail servers, so emails sent to them go nowhere. This is important because generated test data sometimes gets accidentally used in a real system, and routing a thousand emails to random real addresses would be a disaster. The reserved domains make that impossible.

Can I generate more than 1000 records at once?

Not from this tool — the count is capped at 1000 per batch to keep the UI responsive and avoid creating surprisingly large clipboard payloads. If you need 10,000+ records for a database seeding script, use Node: `npm install @faker-js/faker` and run a loop. The pure generator function in this tool's calculator module can also be called from a script if you want this tool's curated locale data without Faker's full dependency tree.