Changelog
Our product is growing for You
A curated, month-by-month history of what shipped — new generators, capabilities added across the whole catalogue, and the platform milestones that made them possible.
- New generator
Plates from anywhere — one endpoint, 29 countries, one vocabulary
The 29 per-country plate endpoints now have a blend:
/v1/vehicle-registrationdraws a country per record and returns a plate in that country’s real format — its mask, its national alphabet, its region codes, its reserved series.?countries=pl,de,itnarrows the pool exactly as it does on the other multi-country endpoints. The part that took actual work istype. Every country names its plate kinds the way its own law does, and those names do not line up: Italy’sstandardis the United States’passenger, Hungary’soldtimeris Ireland’svintageis Finland’smuseum, Lithuania’sevis Germany’selectric. Filtering on the raw union of all 29 would have produced something that looks like it works while quietly meaning "not the US and not Canada" forstandard, and missing five countries forhistoric. So the cross-countrytypespeaks a shared vocabulary of 17 categories —standard,custom,motorcycle,moped,military,police,diplomatic,government,commercial,taxi,trailer,historic,electric,temporary,export,dealer,other— and every record reports both: thecategoryyou asked for and thetypeits own country actually calls it. Asking forhistoricreaches all fifteen countries that issue a veteran plate, under five different names. Atypealso narrows the pool to the countries that issue it, so?type=taxidraws from the seven that do rather than failing on the other 22 — and pairing it with acountrieslist that issues nothing of the kind returns a 400 naming the countries that can, instead of quietly substituting another class. Each record also carries itsregionspelled out where the country has one (Bayern,mazowieckie), which matters most for the US and Canada, whose plates encode no jurisdiction at all. For a country’s full record — era, district, individual part — and its ownformat, use that country’s endpoint; those are unchanged. - Across generators Enhancement
A seed you can pin — dictionaries grow without moving your data
Until now, adding a single surname to a dictionary reshuffled almost everything: names were drawn by position in a list, so one insertion shifted every position after it and ~95% of pinned seeds returned something different. That made enriching the catalogue a breaking change, so in practice it never happened. Generators now draw by scoring each entry against the seed rather than indexing — the entry that scores highest wins, and a newcomer only wins where it genuinely scores highest. Adding 10 surnames to a pool of 480 now moves 2.1% of draws instead of 95%, which is the mathematical floor: new entries have to be reachable by someone, and nothing can do better than their proportional share. Reordering a dictionary file is now completely free. In exchange, this release changes the value every seed returns once — a deliberate, one-time reset so that it never has to happen again for a dictionary addition. Applies to person names across all 28 languages, company names, offerings, junk words, email nouns and domains.
- Enhancement
Polish addresses: a frozen catalogue by default, the live register on request
A pinned
seedon/v1/pl/addressnow reproduces the same address indefinitely. The endpoint serves a curated catalogue — a frozen extract of the national register with ~9,300 places, ~25,000 streets and ~329,000 addresses — instead of drawing from the live PRG dataset, which shifts whenever GUGiK renames a street or adds a building. Every one of Poland’s 2,479 gminas is represented, soterytfiltering still resolves at voivodeship, powiat and gmina level, and every address is real: a real street, in a real place, with a real postal code. Villages with no street name are in there too, exactly as the register has them. If you need the full breadth or today’s data — an address that resolves on a map right now, or a locality the catalogue does not carry — passlive=trueand you get the whole register as before, with the honest caveat that a seed is not guaranteed to reproduce across releases. Existing callers who want the previous behaviour should addlive=true. - Milestone
A VS Code extension — data without leaving the editor
The third addon, after Playwright and the MCP server, and the first one you see rather than call:
przeslijmi.real-fake-dataon the Visual Studio Marketplace. PressCtrl+Shift+P, pick from all 326 generators, and the record lands at your cursor — insertion follows multiple cursors, so three cursors and a batch of three give each its own value. The generator list is read from the API at runtime rather than baked into the extension, so a generator shipped here appears there with no update to install. Presets pin a generator, its parameters, and the one field worth inserting — a preset forde/vehicle-registrationwithdistrict: Mandextract: "value"gives youM AB 1234rather than the whole five-field record — and living in.vscode/settings.jsonthey travel with the repo and bind to a key. Generator defaults are the same shape applied as policy:any.offeringcapped tocountries: "pl,de,fr"holds on every call, however the generator is reached. The other half is compose: describe the shape your app expects in a.rfd.jsonfile and press Reseed, and the filled dataset opens beside it — edit, reseed, look again. Those files get completion for the whole$-grammar (every generator id, and the actual response fields of whichever one you picked, both read from the API) and validation as you type, so an unknown generator or an undeclared$aliasis underlined before you spend a token on it. Because compose bills per draw and nested counts multiply, a$countover 100 is flagged and a reseed estimated above 1,000 draws asks first — and Reseed Preview caps every count at 2, so checking that a shape is right costs a fraction of running it. No account needed: without an API key everything runs on the anonymous lane. - Enhancement
The multi-country endpoints now span 29 countries, not 27
/v1/person-name,/v1/company-nameand/v1/offeringdrew from the 27 EU member states only — the United States and Canada were reachable one country at a time, but invisible in the blend that/v1/emailhad already covered. All four now span the same 29. Nothing new had to be built: the American and Canadian generators, name pools and company data were already shipping; the three aggregate endpoints simply were not wired to them.?countries=us,canow narrows the pool the same way?countries=pl,sk,italways has, and an unqualified call reaches all 29. Canadian records arrive bilingual, as they do on/v1/ca/*— names from a weighted anglophone and French-Canadian mix, legal forms includingLtéeandULC. One thing to know before you upgrade a fixture:/v1/offeringis no longer single-currency. American offerings are quoted in USD and Canadian ones in CAD, and prices are not rate-converted, so a batch drawn withoutcountriesnow mixes EUR, USD and CAD. Every record has always carried its owncurrencyfield — read it rather than assuming euros, or pincountriesto keep a test in one currency. - Milestone
For educators — free credits for your students
Teaching QA, testing, or backend development? We now issue a batch of one-time codes for your course, and the offer has its own card on the pricing page rather than a footnote. You tell us the institution, the course and roughly how many students; we send back a list of codes, one per student. Each student redeems on their own account — there is no shared class login, so their work stays theirs after the course ends, and the credits do not expire once redeemed, including after they graduate. A code works exactly once, so a leaked handout costs one grant and nothing more, and codes themselves lapse a year after issue so an old slide cannot be redeemed indefinitely. A student may redeem more than one, so a short workshop now does not rule out a full-semester grant later. No payment details at any point — not to sign up, not to redeem. This is the same product, not a teaching edition: every generator, every country, edge, extreme, invalid and compose all included, because paying here only ever buys volume.
- Milestone New generator
Canada — eleven generators, bilingual throughout
Eleven new generators at
/v1/ca/*: SIN, Business Number, transit number, bank account, vehicle registration, whole person and company, plus person-name, company-name, email and offering. Canada inverts several of the American expectations, and the API reflects it rather than copying the US shapes across. Where the SSN and EIN carry no checksum at all, the SIN and Business Number are both Luhn-checked — genuinely verifiable, soinvalid=truebreaks real arithmetic instead of merely violating a range. Where the US has no national account-number standard, Canada has CPA Standard 006 fixing the account number at 7 or 12 digits, making/v1/ca/bank-accountthe better standardised of the two. The transit number returns both real renderings —XXXXX-YYYas printed on a cheque,0YYYXXXXXfor electronic transfer — whose field order reverses, because a system that accepts one routinely chokes on the other. The Business Number treats the CRA program account correctly:123456789RC0001and123456789RT0001are the same company filing corporate tax and GST/HST, so the bare nine digits are the default and code treating all fifteen characters as the identity will double-count. Everything is bilingual: names draw from a weighted anglophone and French-Canadian mix (Quebec’s Tremblay and Gagnon descend from a few thousand 17th-century settlers and are concentrated in a way no French list reflects), legal forms includeLtéeand the unlimited-liabilityULCbesideInc.andLtd., plates cover all 13 provinces and territories in each jurisdiction’s own format, andQC,QuebecandQuébecall resolve to the same place. Offerings are quoted in CAD. - Milestone New generator
The United States — the first country outside the EU
Eleven new generators at
/v1/us/*: SSN, EIN, ABA routing number, bank account, vehicle registration, whole person and company, plus person-name, company-name, email and offering. Three of them work unlike anything in the European catalogue, and the API says so rather than papering over it. A Danish CPR or Polish PESEL encodes the birth date and sex — an SSN encodes neither, nor (since the SSA moved to randomised assignment in 2011) a state of issue, so/v1/us/ssnoffers nosexor age filters at all, and/v1/us/personaccepts them but draws the birth date rather than decoding it./v1/us/companycarries only an EIN, because US incorporation is a state matter with no federal registry — there is no American equivalent of the CVR or KRS. And/v1/us/bank-accountis honest about a split: the ABA routing number is a real standard with a real3-7-1mod-10 checksum (andrealBank=truereturns a genuine published one from a registry of 40 institutions), while the account number has no national standard whatsoever — length and structure are each bank’s own choice — so it is a plausible digit string of a length that bank really issues, and nothing more. Plates cover all 51 jurisdictions in each state’s own serial format, with the state reported rather than parsed out of the characters (a US plate doesn’t encode it), and Wyoming’s real county codes 1–23 rather than free digits. US offerings are quoted in USD.
- Milestone
Seed a database — a whole dataset in one request
Every other endpoint returns one field.
POST /v1/composereturns your whole database: not a value at a time, but the entire nested shape your app expects — users with their orders, orders with their line items, foreign keys that line up — ready to load into Postgres, adb.json, or a mock server. You send a JSON skeleton and mark each slot with a$-source ($generator.pl.person,$generator.any.uuid, a literal, a nested object); everything else passes through.$countturns any node into an array (a fixed number, or a random[2, 5]that rolls per parent, so 100 orders each get their own 2–5 items). Declaring an entity once under$generatorsor top-levelsharedkeeps several fields describing the same person — a buyer whose name, PESEL, and email agree — wheresharedis drawn once for the whole response (the one admin who created every row) and a local entity is drawn fresh per record. Dates relate to each other:$datecomputes an offset or a random range from an anchor, and$anchor/$parent.createdAtmeasure a child from its own parent, so every order lands after the customer who placed it and every shipment after its order. The whole dataset is reproducible from oneseed, and the output format is pluggable — JSON today, with SQL and CSV designed for. See the “Seed a database” guide under the Data menu for the full grammar; reachable from the/docsplayground, the MCP server, and the Playwright addon (compose()). - New generator
Weighted enum and object pickers — bring your own distribution
Two new locale-agnostic generators for the categorical fields no registry issues but every dataset needs — status, tier, plan, a skewed cohort.
/v1/enumdraws a member from a weighted map you supply (choices={"gold":1,"silver":4,"bronze":15}→ drawn 1/20, 4/20, 15/20), and/v1/objectdoes the same over whole JSON objects (choices=[{"object":{"tier":"gold"},"weight":3},…]), returning the chosen object verbatim. Weights are relative — they need not sum to 1, so probabilities and integer counts are the same thing — and the response echoes the drawn value’s normalizedprobability. Pass thechoicesas URL-encoded JSON (capped at 16 KB). Output is reproducible from theseed, and all three testing modes apply:edgeinverts the distribution (the rarest member becomes the most likely, a zero-weight member rises to the top),extremewraps the value in a hostile encoding, andinvalidreturns a value that is not in your set. Live in the/docsplayground and the MCP server. - New generator
Product & service offerings for all 27 EU countries
A whole new data type: the offering — a realistic product or service a business sells, with a name, a price, and the industry it belongs to. Every EU country gets a
/v1/<cc>/offeringendpoint, and/v1/offeringdraws across the union — passcountries=pl,de,itto mix, omit for all 27, and each record reports itscountry. The name is localised into that country’s language (multilingual states blend theirs — Belgium across Dutch/French/German, Luxembourg across French/German/Luxembourgish, Finland Finnish/Swedish, Ireland English/Irish, Malta Maltese/English), and the industry label comes back localised too. Draw the whole catalogue or narrow it: pin anindustryby NACE code, restrict totype=productortype=service, or full-text filter byofferingNameorindustryName(?offeringName=fibre). Prices are the real touch — each is a single plausible amount snapped onto a sensible grid for its size (a €25 haircut, a €1,499.99 fibre install, a €209,500 construction job), never raw machine noise. As everywhere, output is reproducible from theseed, andedge(the price/format corners),extreme(a hostile-encoded name), andinvalid(a deliberately broken record) all apply. Live in the/docsplayground and the MCP server. - New generator
Synthetic ID generators — UUID, ULID, Nano ID, ObjectId, and sequences
Five new locale-agnostic generators for the technical identifiers every record needs but no national registry issues — the primary keys.
/v1/uuidproduces a UUID, random (version=4, the default) or time-ordered (version=7, RFC 9562);/v1/ulida 26-character Crockford-Base32 ULID;/v1/nanoida compact URL-safe Nano ID, withsizeand a customalphabet;/v1/object-ida well-formed 24-character MongoDB ObjectId; and/v1/sequencean auto-increment integer — the classic SQL primary key — where a single call returnsstart(default 1) and a batch (count) returns the runstart, start + step, …. Like everything else they are deterministic from theseed, so a seeded UUID is reproducible — better than a real random one for fixtures. Any embedded timestamp (UUID v7, ULID, ObjectId) is derived from the seed, not the wall clock, keeping output stable. They fill the gap when you seed a whole record and need anidcolumn to sit beside the name, address, and national number. - New generator
IBANs for all 27 EU countries
The IBAN generator went pan-European: every EU country now has its own
/v1/<cc>/ibanendpoint producing a bank account number in that country’s exact ISO 13616 format — Germany’s 22-characterDE…, France’s 27-characterFR…, Italy’sIT…with its leading CIN letter, Spain’sES…with the two dígitos de control, and so on. Every IBAN carries correct mod-97 check digits and, where the national account number embeds its own internal check digit, that too is computed the real way (Belgium’s mod-97 suffix, France’s clé RIB, Italy’s CIN, Spain’s DC, Portugal’s and Slovenia’s ISO 7064 checks, Finland’s Luhn, Estonia’s 7-3-1, Hungary’s two check digits, Croatia’s per-field MOD 11-10, and the Czech/Slovak self-checking account) — so the numbers pass strict per-country validators, not just the outer checksum. The embedded bank identifier is drawn from a real registry per country (Germany’s Bankleitzahl, France’s code banque, the Netherlands’ four-letter BIC prefix, …), so you can pin the issuing bank bybankCodeorbankName, or let it be chosen at random. As before,invalid=truedeliberately breaks the checksum for testing validators, andedgeandextremeboth apply. - New generator
Vehicle registration plates for all 27 EU countries
The vehicle-registration generator went pan-European: every EU country now has its own
/v1/<cc>/vehicle-registrationendpoint producing realistic plates in that country’s exact current format — Germany’s district-codedM-AB 1234, France’sAB-965-KL, Italy’sAK 514 RH, Ireland’s year-and-county262-D-12345, the Netherlands’ sidecodePDA-01-D, and so on. Where a country encodes a region in the plate, the code is drawn from the real registry (Germany’s Unterscheidungszeichen, Slovakia’s district codes, Romania’s 42 counties, Ireland’s counties, Poland’s wyróżniki, …), so the regional part is genuine and filterable. Each country offers the plate classes whose format actually differs — standard plus, where they exist, custom/vanity, military, diplomatic, police, temporary/dealer/export, motorcycle, historic, taxi, and electric — and, where the old format still on the road looks different, aneraswitch (current/legacy/both) that reaches back to it (Spain’s province plates, France’s FNI, Hungary’s 3-letter series, Ireland’s two-digit-year plates, …). Bulgaria and Greece can render in their native Cyrillic/Greek glyphs on request. Poland additionally gained motorcycle and reduced-size (US/JP-import) variants. Plates carry no checksum, so there is no “invalid” mode — butedgeandextremeboth apply. - Across generators Enhancement
New
extremetrigger — correct data in a deliberately hostile encodingEvery generator that already took
Read the full story →edgenow also acceptsextreme=true: it returns correct data presented in the most disturbing way a real system ever sees it. The value is wrapped with one class per record — untrimmed whitespace (including non-breaking spaces and a trailing newline), invisible and zero-width characters with a leading byte-order mark, homoglyph letters (Cyrillic/Greek/fullwidth lookalikes that read as Latin), or a right-to-left override / stacked combining marks — so a batch (count) rotates across all four. It’s built to answer “how should my system behave here?”: does your pipeline trim, normalise (NFKC), and compare values safely, or does a zero-width space break an equality check and a homoglyph slip past a filter? Only the human-facing string is mangled and it stays recoverable: identifiers (PESEL, NIP, IBAN, CPR, codice fiscale, BSN, …) keep their digits ASCII — homoglyphs are excluded — so they still parse and checksum after normalisation; names, companies, emails, and whole people/companies mangle the name (or assembled value) only, leavinginitials,legalForm, birth dates, and national identifiers clean. Theloremand custom-regex endpoints don’t take it (it would break their length and pattern-match contracts). Output stays reproducible from theseed; the flag is live in the/docsplayground, the MCP server, and the Playwright addon.
- New generator Enhancement
Localised email generators for all 27 EU countries
Email generation goes country-aware: every member state gets a
/v1/<country>/emailendpoint, and/v1/emailnow draws across the EU — passcountries=pl,de,itto mix, omit for all 27, and each record reports itscountry. Names come from each country’s real first-name and surname banks, romanised to ASCII for non-Latin scripts so Bulgarian and Greek names become deliverable local parts. A newcorporatedomain category builds the address on a company-derived domain (anna.schmidt@mueller-bau.de), drawing the brand from that country’s company-name generator and the suffix from its ccTLDs; two new local-part patterns weave a company token in (first.company,company.first), alongside regional providers (wp.pl,web.de, …) and global webmail. Output stays reproducible from theseed; the new endpoints are live in the/docsplayground and the MCP server. - New generator
Full-company generators for all 27 EU countries
The one-call “whole company” idea behind
/v1/pl/companynow spans the EU: every member state gets a/v1/<country>/companyendpoint that returns a consistent synthetic company — a full trading name with its legal form, plus the matching national identifiers — in a single request. Each bundles that country’s real registers: Denmark’s CVR, France’s SIREN, Sweden’s organisationsnummer, Italy’s partita IVA, the Netherlands’ KvK + RSIN + btw-id, Germany’s Handelsregister + USt-IdNr + Wirtschafts-IdNr, Austria’s Firmenbuchnummer + UID + Steuernummer, and so on — one to three numbers depending on what the country issues. The name and identifiers are drawn from one seeded sequence, so a givenseedalways yields the same company;strategyandlegalFormshape the name exactly as on/v1/<country>/company-name,invalid=truecorrupts every checksummed identifier while leaving the name (and any checksum-less number) intact, andedge=truesweeps the rare corners. Each costs the same as any other single-record call, regardless of the sub-draws inside. The new endpoints are live in the/docsplayground and the MCP server. - New generator
Custom-regex generator — random data matching your own pattern
A new
/v1/custom-regexendpoint inverts a regular expression you supply into a random string that matches it — for seeding data whose format the catalogue doesn’t model: in-house serial numbers, SKUs, ticket ids, order references. Passpattern(the regex in source form, e.g.[A-Z]{2}-\d{6}) and get back a conforming value;maxRepetitioncaps how far unbounded quantifiers (*,+,{n,}) expand. Patterns are validated up front — back-references and look-around assertions are rejected (they can’t be honoured when generating a match), as is any pattern whose worst-case expansion is too large. Reserved characters must be percent-encoded in the query (+as%2B). Output stays reproducible from theseed. Requires a free account — so a submitted pattern is attributable — but never payment. - New generator
Full-person generators for all 27 EU countries
The one-call “whole person” idea behind
/v1/pl/personnow spans the EU: every member state gets a/v1/<country>/personendpoint that returns a mutually consistent synthetic person — given name(s), surname, initials, birth date, and the matching national number — in a single request, so the name, sex, and identity always agree. Each is wired to that country’s real identifier: Denmark’s CPR, France’s NIR, Italy’s Codice Fiscale, Sweden’s personnummer, Germany’s Steuer-ID, Spain’s DNI, the Netherlands’ BSN, and so on. Where the number encodes a birth date and sex (CPR, EGN, isikukood, CNP, EMŠO, …) it is minted first and those facts flow into the name — so a female record always carries the matching parity and birth date. Italy’s Codice Fiscale, which encodes the name itself, is built the other way round: the name is generated first and the code derived from it, letters and all. Where the number is non-semantic (BSN, DNI, Steuer-ID, PPSN, TIC, Maltese ID, Cartão de Cidadão, personas kods) the birth date is drawn independently within the same age/birth-date filters andsexshapes the name. Every endpoint takes the familiarsexand age/birth-date filters,invalid=true(a deliberately wrong checksum, name and date intact),edge=true, andcaseStrict=falseto mangle the name casing for testing; each costs the same as any other single-record call, regardless of the sub-draws inside, and stays reproducible from theseed. The new endpoints are live in the/docsplayground and the MCP server. - Enhancement
Mix both standards in one call for the time-versioned ID generators
The national-ID generators that run two coexisting standards now take
standard=bothalongside the existing single-standard choices: Ireland’s PPSN (/v1/ie/ppsn) and VAT (/v1/ie/vat) —pre-2013vsmodern; the Netherlands’ btw-id (/v1/nl/btw-id) —legacyvsmodern; Latvia’s personas kods (/v1/lv/personas-kods) —legacyvsmodern; and Hungary’s személyi azonosító (/v1/hu/szemelyi-azonosito) —pre-1997vsmodern. Withboth, each record independently draws one of the two standards, so a single batch realistically mixes the old and new forms instead of being uniform. The drawn standard is resolved before generation and reported back where the generator already returns it, so values are never ambiguous. Output stays reproducible from theseed. - Enhancement
Historic (vintage) plates for the Polish vehicle-registration generator
The
/v1/pl/vehicle-registrationgenerator gains a fifth plate kind:type=historicmints a tablica zabytkowa — the black-on-yellow plate carried by registered vintage vehicles. Its right-hand historic-vehicle symbol shortens the number to five characters, so behind a genuine area code (wyróżnik, drawn from the official registry exactly like a standard plate) sits a short individual part of digits, optionally with one letter —BSI 12A,DJ 15M,IM 62C. Like standard plates it honoursvoivodeshipandcounty, reports the real region back, and joins theedge=truecorner set. Output stays reproducible from theseed. - New generator
National ID and tax numbers for all 27 EU countries
Real Fake Data now mints the national identification and tax numbers of every EU member state — 66 new generators, the PESEL/NIP idea taken Europe-wide. Personal numbers (
/v1/de/steuer-id,/v1/fr/nir,/v1/it/codice-fiscale,/v1/se/personnummer,/v1/es/dni, …) and company/VAT numbers (/v1/fr/siren,/v1/de/ust-idnr,/v1/nl/btw-id,/v1/it/partita-iva, …) for all 27 countries, each carrying a correct, country-specific checksum — Luhn, mod-11, ISO 7064, Verhoeff, mod-97, the lot — so they pass real validators. Date-encoded personal numbers accept the familiarsexand age/birth-date filters and report the encoded birth date back; company and VAT numbers takeformat(national vs the EUvatform, e.g.HR…→HR…, Greece’sELprefix); every generator supportsinvalid=true(a deliberately wrong checksum, for testing your validators) andedge=true(rare-but-valid corners). Where a country runs two standards the generator lets you pick: Denmark’s pre/post-2007 CPR checksum, the Netherlands’ 2020 btw-id, Latvia’s 2017 personal-code format, Ireland’s 2013 PPSN. Croatia’s single OIB serves both people and companies; legacy numbers (Croatian JMBG) are available too. Everything stays reproducible from theseed, and the new endpoints are live in the/docsplayground and the MCP server. - New generator
Company-name generators for all 27 EU countries
Company-name generation now spans the EU: new
company-nameendpoints for every member state at/v1/<country>/company-name, plus a multi-country/v1/company-name?countries=de,fr,itthat blends them in one call (each record reports itscountry). Every country produces names across four naming families — coined portmanteaus (Polbud,Eurosysteme), owner-surname firms with the local partnership form (Kowalski i Syn,Müller & Söhne,Rossi & Figli,García e Hijos), descriptive trading names, and modern tech brands — each closed with that country’s real legal form in its authentic local script: GermanGmbH/AG, FrenchSARL/SAS, ItalianS.r.l./S.p.A., SpanishS.L., GreekΑ.Ε./Ε.Π.Ε.in Greek letters, BulgarianООД/АДin Cyrillic, and so on. The/docsplayground enumerates each country’s actual legal forms, so requesting one that doesn’t exist there is rejected.strategy,legalForm, andedgecontrols work everywhere, founder surnames are shared with the person-name generators, and output stays reproducible from theseed. - New generator
Mixed-country person-name generator
A new
/v1/person-nameendpoint returns names drawn from a mix of EU countries in one call. Passcountriesas a comma-separated list of ISO codes —?countries=pl,sk,it— and each record is generated by one of them, picked at random, so a single batch can blend Polish, Slovak, and Italian names, each in its own local form (script, surname inflection, ordering). Every record reports thecountryit came from. Omitcountriesto draw from all 27 EU countries at once. The samesex,edge, andcaseStrictcontrols apply, and output stays reproducible from theseed— handy for seeding a realistic, pan-European set of test users in one request. - New generator
Person-name generators for 26 EU countries
Person-name generation now spans the whole EU: new
person-nameendpoints for all 26 other member states — Austria, Belgium, Bulgaria, Croatia, Cyprus, Czechia, Denmark, Estonia, Finland, France, Germany, Greece, Hungary, Ireland, Italy, Latvia, Lithuania, Luxembourg, Malta, Netherlands, Portugal, Romania, Slovakia, Slovenia, Spain, and Sweden — each at/v1/<country>/person-name. Every one uses authentic local given names and surnames in the country’s own script and diacritics: Greek and Cypriot names in Greek letters, Bulgarian in Cyrillic, German umlauts, Polish and Czech diacritics. The local conventions are built in, not bolted on — surnames inflect to the chosensexwhere the language does (Czech/Slovak-ová, Lithuanian-aitė, Latvian-a, Greek genitive, Bulgarian-ова, IrishNí/Nic); Spain and Portugal carry two surnames; Hungary writes the surname first; France hyphenates compound given names (Jean-Pierre); Denmark leans on double given names (Hans Christian); and Dutch/German/Italian nobiliary particles (van der,von,De) are handled correctly, including in the initials. The samesex,edge, andcaseStrictcontrols work everywhere, and every result is reproducible from itsseed. - New generator
Standalone Polish person-name generator
A new
pl/person-nameendpoint generates just a realistic Polish name — given name(s), surname, and initials — without minting an identity around it. Often you only need a believable name to label a row, seed a UI, or fill a form, and pulling a full PESEL and birth date for it is overkill; now you can ask for the name alone. It carries the same realism as the full person: the surname is inflected to the chosensex(Kowalski/Kowalska), names can run to a second given name (Anna Maria) or a double-barrelled surname (Kowalska-Nowak),edge=truepushes those rarer shapes plus very short names (Jan Lis), andcaseStrict=falsemangles the casing for testing case-insensitive matching. The fullpl/persongenerator is now built on top of it — same names, same seeds — and still returns the name together with the birth date and a matching, checksum-valid PESEL. - Enhancement
Richer Polish names and casing control
The Polish person generator now produces realistic name variety — second given names (
Anna Maria), double-barrelled surnames (Kowalska-Nowak), and very short names (Jan Lis), all far more likely underedge. A newcaseStrict=falseswitch deliberately mangles the casing of name and surname (all-lower, all-upper, or random likekArOl nOwAkOwSki) for testing case-insensitive matching and storage. - Milestone
Public website and live playground
Launched the marketing site with a spec-driven live Playground, an API reference generated straight from the OpenAPI spec, pricing, and self-contained GDPR cookie consent. The product now has a public face people can try before they buy.
- Across generators
Edge-case mode for every generator
Rolled an
Read the full story →edgeparameter across all fifteen generators in one sweep: boundary values, unusual-but-valid records, and deliberately awkward inputs on demand. Customers can now test how their systems handle the hard cases, not just the happy path. - New generator
Five Polish identity and registry generators
Added Polish ID card, passport, KRS, land-register, and driving-licence number generators in one batch — five new document types, each valid by format.
- New generator
Lorem Ipsum generator
A locale-agnostic Lorem Ipsum generator for filler text, exposed over REST and as a Playwright fixture.
- Across generators
KRS numbers and the P.S.A. legal form for companies
The Polish company generator now emits KRS registration numbers and can produce the P.S.A. (simple joint-stock) legal form.
- Milestone
Seeded test suites across every generator
Added seeded invariant test suites covering every generator, so each one is checked for valid output and deterministic, reproducible results on every change.
- Across generators
Bulk generation with count
Every endpoint can now return many records in a single call. Seed a whole table or fixture set in one request instead of looping over the API.
- New generator
Email addresses
A locale-agnostic email generator, exposed over REST and as a Playwright fixture.
- New generator
Composite Polish company generator
A full Polish company generator that assembles a coherent record — name, NIP, REGON, and address — available over REST and as a Playwright fixture.
- New generator
Polish person and company-name generators
New Polish person and company-name generators — coherent people and believable Polish business names.
- Milestone
Playwright addon launched
Shipped the @przeslijmi/real-fake-data-playwright addon — seeded, valid fixtures pulled straight into Playwright tests, one line per record. No HTTP glue required.
- New generator
Polish REGON and vehicle-registration generators
New Polish REGON numbers (with correct checksums) and Polish vehicle registration plates.
- Milestone
Self-service API docs
Interactive OpenAPI docs went live at /docs, generated from the same Zod schemas that validate every request — so the docs can never drift from the API.
- Across generators
Invalid-data testing
An
invalidparameter across the API returns deliberately invalid records — wrong checksums, malformed fields — so customers can test their rejection paths, not just the happy path. - New generator
Polish tax and banking identifiers
Polish NIP, IBAN (with bank selection by code or name), and PESEL generators — every one with correct checksums, so they pass real validation just like production data.
Read the full story →
- Milestone
Polish addresses at national scale
Moved the Polish address generator onto the PRG dataset — 8.57 million real Polish address points with valid postal codes — behind a memory-bounded cache so it runs comfortably on modest hosting.
- Milestone New generator
Platform launch and first generator
The hexagonal core, deterministic PRNG, generator registry, and REST API went live, shipping with the first generator: Polish addresses built from real TERYT cities and streets.