Faker fills fields with plausible-looking strings. Real Fake Data fills them with values that are valid by format — correct checksums, real geography, and identifiers that survive your own validators.
Faker (@faker-js/faker) is a fine library, and for placeholder copy, avatars, and lorem it is exactly the right tool. The question this page answers is narrower: when a field has rules — a checksum, a national format, a real-world referent — does the value you get back actually satisfy them?
For a whole class of fields, Faker does not claim to. Its IBAN generator warns in its own docs that the result may be invalid; it ships no national-ID, PESEL, NIP, or tax-number generators at all; and its addresses are assembled from independently drawn pieces. Everything below is checked against Faker’s official documentation and source — nothing here is stretched to make a point.
The differences at a glance
Read top to bottom, general to specific. The first band is setup and environment — how you adopt and run each tool, mostly differences where the right choice depends on your needs. The second band is the data itself, where validity is decided and Real Fake Data is built to win. Every Faker column describes the real, documented behaviour of @faker-js/faker; a check marks a Real Fake Data advantage, a dash marks a difference that is not a win either way.
Capability
@faker-js/faker
Real Fake Data
Setup & environment
Installation
npm install @faker-js/faker into every project
Nothing to install — call the REST API (or npm the addons)
Access model
Local library, bundled into your app
Hosted API, plus a self-hosted instance option
Runtime / language
JavaScript / TypeScript only
Any language — it is an HTTP endpoint returning JSON
Runs offline, zero network
Pure library — no network call
Network call to the hosted API (self-hosted removes it)
Cost
Free, open source (MIT)
Free tier (rate-limited); paid plans for higher limits & modes
Getting new data / fixes
Bump the package version; seeds may shift across versions
Served centrally — new countries and fixes with no upgrade
When a format changes
Your problem — track the change and fix your own patterns
Covered out of the box — the generator is updated centrally
The data itself
National IDs (PESEL, SSN-style, etc.)
No generator — the library ships no national-ID module
Dedicated generators with correct check digits
Tax / VAT numbers (NIP, VAT IDs)
No generator — no tax-number module
Country tax-number generators, checksum-valid
IBAN validity
Docs warn the generated IBAN “might be invalid”
IBANs with correct ISO 7064 check digits
Addresses
City, street and postcode drawn independently
Built from real cities, streets and postal-code ranges
Edge-case mode (rare-but-valid)
No built-in boundary-value mode
edge=true biases every field to rare-but-valid corners
Invalid mode (broken on purpose)
No built-in “make this fail validation” mode
invalid=true returns broken check digits and formats
Extreme mode (hostile encoding)
No built-in mode for whitespace / zero-width / homoglyph values
extreme=true wraps correct values in hostile Unicode
Reproducible values
Global seed; result depends on call count since seeding
Per-request seed — same seed always returns the same record
Locale / country coverage
70+ locales, but many fall back to English for missing data
27 EU countries with first-class, complete data
Placeholder copy, lorem, avatars
Rich set of lorem, images, and product-copy generators
Not the focus — we generate structured, valid records
Where it matters most
The differences that decide whether your fixtures behave like production data. Each one expands into the full story.
Identifiers pass real validators
A national ID, a tax number, an IBAN is not just a string of the right length — it carries a check digit computed from the rest. Real Fake Data computes those check digits across the 27 EU countries it covers, so every identifier flows through the same validation your production code runs. Faker has no national-ID or tax-number generator to begin with, and its own IBAN docs warn the result may be invalid. When your app rejects the fixture your test was supposed to exercise, you have found this difference the hard way.
Real-world formats are not fixed. A national ID rule is amended, a country revises its IBAN structure, a plate scheme is redesigned. With Faker, those formats live in your code — you track each change, rewrite your own regexes and generators, and hope you caught every rule. With Real Fake Data the format lives in the generator, and the generator is maintained centrally: when a rule changes we update it, and your next request already returns the new-format data. No package bump, no patch to your patterns, no drift. Correctness is our job to keep current, not a maintenance task we hand back to you.
Faker draws a city, a street, and a postcode independently, then prints them together — the pieces are individually plausible but collectively describe nowhere. Real Fake Data anchors an address to actual cities, real street names, and the postal-code ranges that genuinely serve them, so the whole record is internally consistent. It matters the moment anything downstream — a postcode lookup, a shipping estimate, a map pin — treats the parts as related.
Average data never finds the bugs at the boundaries, and Faker gives you no switch to leave the average. Real Fake Data gives you three. edge=true steers every field to the rare-but-valid corners (longest legal names, leap-year dates, unusual serial ranges). invalid=true does the opposite — deliberately broken check digits and malformed formats — so you can prove your rejection paths reject. extreme=true keeps the value correct but wraps it in the most hostile Unicode a real system ever sees: untrimmed and zero-width whitespace, homoglyph lookalikes, right-to-left overrides. Three flags that turn one generator into boundary, negative, and encoding-hardening test suites. Faker has none of them built in.
Both libraries are reproducible, but the model differs. Faker’s seed is global and positional: a value depends on the seed and on how many draws happened since you set it, so inserting one call upstream shifts everything after it, and relative-date helpers need an explicit reference date to reproduce at all. Real Fake Data takes the seed per request — the same seed on the same endpoint always yields the same record, independent of anything else your suite did first. Stable fixtures that do not drift when a colleague adds a test above yours.
Faker is a well-built, widely-used library, and none of this is a knock on its engineering. It is a general-purpose fake-data generator, and for the things it is designed for — placeholder text, product names, avatars, plausible-looking values where nothing downstream validates them — it is excellent and requires no network call.
Real Fake Data solves a narrower, stricter problem: structured records whose every field is valid by its real-world format, for the 27 EU countries we cover. If you need lorem and images, reach for Faker. If your test fails because a fixture would not pass your own validators, that is the gap this product fills.
See it for yourself
Generate a valid, seeded record in the Playground — no key required — or read how the API works.