data.placeholder.com/people

Synthetic people and datasets

Realistic, fully synthetic personas for Sweden, Norway, the United Kingdom and the United States. Names fit the country, addresses validate, and identifiers come from official test ranges. Person 4711 in Sweden is the same person forever.

Quick start

curl -s "https://data.placeholder.com/people/se.csv?count=10000" -o people-se.csv
psql mydb -f <(curl -s "https://data.placeholder.com/people/no.sql?count=1000&table=users")

Endpoints

URLReturns
/people/<cc>/<pid>One persona. cc: se, no, gb, us. pid: 1 to 1,000,000. .json optional.
/people/<cc>.<format>?count=N&seed=SA batch. format: json (default), ndjson, csv, sql; as extension or ?format=.
/peopleIndex with every country's ID, phone and IBAN rules and sources.
ParameterValuesDefault
count1 to 10,000 per request10
seed1 to 100. Seed S returns persona IDs (S−1)×10,000+1 onwards, so seeds never overlap and a smaller count is a prefix of a larger one. 100 seeds × 10,000 = a million distinct people.1
tableSQL table name, [A-Za-z_][A-Za-z0-9_]{0,62}people
download1 adds Content-Disposition: attachment to JSON. CSV, NDJSON and SQL always download as a file.off

Errors are JSON, e.g. {"error": "...", "status": 400}. Too large a count is a 400, not a silent truncation.

What a persona looks like

{
  "id": "se-1",
  "country": "SE", "locale": "sv-SE", "version": "v1", "synthetic": true,
  "first_name": "Magnus", "last_name": "Magnusson", "full_name": "Magnus Magnusson",
  "gender": "male", "birth_date": "1968-05-22", "age": 57,
  "national_id": {
    "type": "personnummer", "value": "680522-9272",
    "test_range": true, "format_valid": true,
    "source": "https://www.skatteverket.se/…", "note": "Skatteverket test personnummer, never issued …"
  },
  "email": "[email protected]",
  "phone": { "e164": "+46701740633", "national": "070-174 06 33", "type": "mobile",
             "fictional_range": true, "source": "https://www.pts.se/…" },
  "address": { "street": "Ringvägen", "house_number": "71", "postal_code": "214 13",
               "city": "Malmö", "region": "Skåne län", "country": "SE",
               "country_name": "Sverige", "formatted": "Ringvägen 71, 214 13 Malmö" },
  "iban": { "value": "SE3550000000054910000003", "test": true, "kind": "psp_test",
            "source": "https://docs.stripe.com/testing?payment-method=sepa-direct-debit" },
  "employer": { "name": "Arkvant Energi AB", "title": "Sjuksköterska" },
  "username": "magnus_magnusson1",
  "avatar_url": "https://via.placeholder.com/avatar/Magnus%20Magnusson.png?seed=se-1"
}

All keys are always present; nested values can be null where a country has no such thing (US personas have no IBAN). CSV and SQL flatten nested objects into national_id_value, phone_e164, address_city and so on, with the same 38 columns for every country. SQL is a portable subset: standard types, booleans as SMALLINT 0/1, one INSERT per row.

How safe is each field?

Every value is generated, but some formats can collide with reality. Each persona says how safe its values are:

CountryNational IDPhoneIBAN
SESkatteverket test personnummer, picked from the official CC0 listPTS fiction ranges, e.g. 070-174 06 05 to 99, 08-465 004 xxStripe test SE35…
NOSynthetic fødselsnummer (month + 80), valid mod-11Nkom 68 05 xx xxStripe test NO93…
GBNational Insurance number with prefix QQ (never issued; fails strict validators)Ofcom drama numbers: 07700 900xxx, city ranges, 01632 960xxxStripe test GB82WEST…
USSSN 000-xx-xxxx (never assigned; fails strict validators)NANP NPA-555-0100 to 0199none

Don't add UNIQUE constraints on national_id, phone or iban: the safe pools are small (95 Swedish mobile numbers, one test IBAN per country). id, email and username are unique per country.

Finland and Denmark are implemented but withheld: neither has an official fictional phone range, and Denmark has no test CPR range. /people/fi/1 returns 404 with the reason. The safe test values reference covers them anyway.

Determinism

Address data

SE and US: GeoNames postal codes (CC BY 4.0); US filtered to US Census 2020 ZCTAs (public domain). NO: Kartverket, Postnummerområder (CC BY 4.0). GB: OS Code-Point Open, Open Government Licence v3. Contains OS data © Crown copyright and database right 2026; contains Royal Mail data © Royal Mail copyright and database right 2026; contains National Statistics data © Crown copyright and database right 2026. GB city labels are derived from local-authority districts and post towns; Northern Ireland is not covered.