Real Fake Data Generators
by real-fake-data.com
A developer-friendly API for realistic but valid synthetic test data — almost any data with correct checksums, edge cases and validation variants. Safe for staging, demos, seeding, and tests.
$ curl https://api.real-fake-data.com/v1/email?domainCategory=regional
{
"data": {
"name": "Zuzana",
"surname": "Nováková",
"initials": "ZN",
"sex": "f",
"country": "sk"
},
"meta": {
"seed": 7421,
"generatorId": "any.person-name",
"sex": "f"
}
}Every field is valid by format — and tied to no real person.
Real Fake Database
by real-fake-data.com
Seed an entire nested dataset in a single call — users with their tasks, orders with their line items, posts dated after the author joined. You describe the shape; POST /v1/compose returns the whole tree, valid and reproducible.
{
"seed": 42,
"time": {
"start": "2026-05-01T00:00:00Z",
"formats": {
"day": "yyyy-MM-dd"
}
},
"shared": {
"restaurant": {
"generator": "fr.company-name"
}
},
"shape": {
"restaurant": "$shared.restaurant.value",
"menu": {
"$count": 3,
"dishId": "$generator.any.nanoid.value",
"name": "$generator.fr.offering.offeringName",
"price": "$generator.fr.offering.price",
"currency": "$generator.fr.offering.currency"
},
"customers": {
"$count": 3,
"customerId": "$generator.any.uuid.value",
"name": "$generator.fr.person-name.name",
"email": "$generator.fr.email.value",
"orders": {
"$count": [
1,
2
],
"orderId": "$generator.any.uuid.value",
"placedAt": "$date.-2mo~+0d.day",
"items": {
"$count": 2,
"dish": "$generator.fr.offering.offeringName",
"price": "$generator.fr.offering.price"
}
}
}
}
}One French restaurant, its menu, and customers with their orders — the whole shop from a single request. Scroll the response to see the full tree.
Test data you can actually trust
Faker libraries produce garbage that fails validation. Real Fake Data produces data that is correct by format and safe by design.
Valid checksums
National IDs and tax numbers pass real checksum validation, so they flow through your validators exactly like production data.
Real-world geography
Addresses are built from actual cities, streets, and postal-code prefixes — believable in any demo or screenshot.
Edge cases on demand
Flip a flag and a generator returns only edge cases — boundary values, unusual-but-valid records, and deliberately invalid checksums — so you can test how your product handles the hard inputs.
Deterministic & seedable
Pass a seed and get the same record every time. Reproducible fixtures for tests and stable demo environments.
Drop it into your stack
Pull valid records over REST or straight from your tests — no glue code required.
REST API + OpenAPI docs
A clean REST interface with a full OpenAPI spec, typed clients, and predictable JSON responses.
Playwright addon
Skip the HTTP calls — drop in the Playwright addon and pull seeded, valid records straight into your tests with one line per record.
MCP server
Connect an AI assistant — Claude, Cursor, any MCP client — and generate valid records conversationally, with no glue code.
From single records up to full database seed
Pull one record at a time, or POST a shape to /v1/compose and get a whole nested dataset — users, their orders, every line item — valid and reproducible in one call.
How it works
Three steps from zero to a fully seeded test environment.
- 01
No API key required
Start generating right away — the free tier is rate-limited per IP address. Add an API key only when you need higher limits on a paid plan.
- 02
Pick how you connect
Call the REST endpoint directly, drop in the Playwright addon for one-line fixtures, or connect the MCP server to your AI assistant. More interconnectors are on the way.
- 03
Seed your app
Drop the JSON into fixtures, factories, or demo databases. Everything validates — nothing is real.
const response = await fetch(
"https://api.real-fake-data.com/v1/email?domainCategory=regional"
);
const { data } = await response.json();
console.log(data.value); // "anna.wojcik@wp.pl"Ready to generate?
Try it live in the playground — no signup required.
Playwright addon
Realistic fixtures, one line per record
Drop the @przeslijmi/real-fake-data-playwright fixture into your tests and pull valid people, addresses, national IDs, and IBANs with a single call. Seeded by default — a failing test replays the exact same data, so repros are trivial.
Explore the Playwright addonimport { test, expect } from '@przeslijmi/real-fake-data-playwright';
test.use({ realFakeData: { baseUrl } });
test('registers a customer', async ({ page, fakeData }) => {
const person = await fakeData.plPerson({ sex: 'f' });
await page.getByLabel('PESEL').fill(person.pesel);
await page.getByLabel('Surname').fill(person.surname);
});MCP server
Generate test data from your AI assistant
Connect the @przeslijmi/real-fake-data-mcp server to Claude, Cursor, or any MCP client and ask for valid people, addresses, national IDs, and companies in plain language — across 27 EU countries, seeded on request.
Explore the MCP server{
"mcpServers": {
"real-fake-data": {
"command": "npx",
"args": ["-y", "@przeslijmi/real-fake-data-mcp"]
}
}
}
// then: "Generate 3 female Polish people."From the blog
Notes on realistic test data
-
Introducing extreme mode: correct data in a hostile encoding
Correct data, presented in the most disturbing way a real system ever sees it — untrimmed whitespace, invisible characters, homoglyphs, and right-to-left overrides. Does your pipeline survive it?
-
Testing the unhappy path with edge and invalid modes
Your happy path is well covered. What about the boundary values, the awkward-but-valid records, and the deliberately broken checksums your rejection code is supposed to catch?
-
Deterministic fixtures: the case for seeding everything
A flaky test that fails once and passes on retry is worse than no test at all. Pass a seed, get the same record every time, and make your fixtures reproducible.