{
  "service": "data.placeholder.com/people",
  "version": "v1",
  "description": "Deterministic synthetic personas for tests, demos and AI agents. Same URL -> same person forever (v1 is frozen). Ages are computed against 2026-01-01.",
  "countries": [
    {
      "code": "SE",
      "name": "Sverige",
      "locale": "sv-SE",
      "national_id": {
        "type": "personnummer",
        "test_range": true,
        "source": "https://www.skatteverket.se/omoss/digitalasamarbeten/omvaraoppnadata/testpersonnummersomoppendata.4.5b35a6251761e6914202df9.html"
      },
      "phone": {
        "fictional_range": true,
        "ranges": "070-174 06 05..99 (mobile), 08-465 004 xx, 031-390 06 xx, 040-628 04 xx, 0980-319 2xx",
        "source": "https://www.pts.se/sv/bransch/telefoni/nummer-och-adressering/telefonnummer-for-anvandning-i-bocker-och-filmer-etc/"
      },
      "iban": {
        "value": "SE3550000000054910000003",
        "test": true,
        "kind": "psp_test",
        "source": "https://docs.stripe.com/testing?payment-method=sepa-direct-debit"
      },
      "example": "/people/se/1",
      "bulk_example": "/people/se.csv?count=100&seed=1"
    },
    {
      "code": "NO",
      "name": "Norge",
      "locale": "nb-NO",
      "national_id": {
        "type": "fødselsnummer (syntetisk, måned+80)",
        "test_range": true,
        "source": "https://skatteetaten.github.io/folkeregisteret-api-dokumentasjon/test-for-konsumenter/"
      },
      "phone": {
        "fictional_range": true,
        "ranges": "68 05 00 00..68 05 99 99 (Nkom, TV/film)",
        "source": "https://www.nkom.no/telefoni-og-telefonnummer/telefonnummer-og-den-norske-nummerplan/alle-nummerserier-for-norske-telefonnumre"
      },
      "iban": {
        "value": "NO9386011117947",
        "test": true,
        "kind": "psp_test",
        "source": "https://docs.stripe.com/testing?payment-method=sepa-direct-debit"
      },
      "example": "/people/no/1",
      "bulk_example": "/people/no.csv?count=100&seed=1"
    },
    {
      "code": "GB",
      "name": "United Kingdom",
      "locale": "en-GB",
      "national_id": {
        "type": "National Insurance number (QQ prefix, never issued)",
        "test_range": true,
        "source": "https://www.gov.uk/hmrc-internal-manuals/national-insurance-manual/nim39110"
      },
      "phone": {
        "fictional_range": true,
        "ranges": "07700 900xxx (mobile), Ofcom drama geographic ranges, 01632 960xxx",
        "source": "https://www.ofcom.org.uk/phones-and-broadband/phone-numbers/numbers-for-drama"
      },
      "iban": {
        "value": "GB82WEST12345698765432",
        "test": true,
        "kind": "psp_test",
        "source": "https://docs.stripe.com/testing?payment-method=sepa-direct-debit"
      },
      "example": "/people/gb/1",
      "bulk_example": "/people/gb.csv?count=100&seed=1"
    },
    {
      "code": "US",
      "name": "United States",
      "locale": "en-US",
      "national_id": {
        "type": "SSN (area 000, never assigned)",
        "test_range": true,
        "source": "https://secure.ssa.gov/poms.nsf/lnx/0110201020"
      },
      "phone": {
        "fictional_range": true,
        "ranges": "NPA-555-0100..0199",
        "source": "https://nanpa.com/numbering/555-line-numbers"
      },
      "iban": null,
      "example": "/people/us/1",
      "bulk_example": "/people/us.csv?count=100&seed=1"
    }
  ],
  "endpoints": {
    "/people/<cc>/<pid>": "one persona, pid 1..1000000 (also .json)",
    "/people/<cc>?count=N&seed=S&format=json|ndjson|csv|sql": "batch of N (1..10000, default 10) personas; seed S (1..100, default 1) selects pids (S-1)*10000+1 .. +N-1, so seeds never overlap and a smaller count is a prefix of a larger one. Also /people/<cc>.csv, .ndjson, .sql, .json. download=1 forces Content-Disposition: attachment for JSON. SQL: table=<name> (default people)."
  },
  "safety": [
    "Names, streets and employers are synthetic combinations; any match with a real person or company is coincidental. Postcode + city pairs are real (so addresses validate); street and number are invented.",
    "Emails are always on example.com / example.org / example.net (RFC 2606) and cannot be delivered.",
    "national_id.test_range=true: officially reserved test / never-issued range. false: only format/checksum-valid and could collide with a real person's number. Never use either outside tests.",
    "phone.fictional_range=true: regulator-reserved fictional range. false: format-valid only and MAY REACH A REAL SUBSCRIBER - never call or text it.",
    "iban.test=true: published PSP test / registry example IBAN, shared by many personas (not unique)."
  ],
  "withheld": {
    "FI": "No official fictional phone range exists in Finland, so FI personas are withheld from v1.",
    "DK": "Denmark has no official test CPR range or fictional phone range, so DK personas are withheld from v1."
  },
  "contract": "Python: from people import get_person, list_countries (see data/people/CONTRACT.md)",
  "safe_values": "/safe-values",
  "attribution": "SE, FI, DK, US: GeoNames postal codes (https://www.geonames.org, CC BY 4.0); US filtered to US Census 2020 ZCTAs (public domain). NO: Kartverket, Postnummerområder (https://kartkatalog.geonorge.no/metadata/uuid/462a5297-33ef-438a-82a5-07fff5799be3, CC BY 4.0). GB: OS Code-Point Open, Open Government Licence v3 (https://www.nationalarchives.gov.uk/doc/open-government-licence/version/3/): Contains OS data (c) Crown copyright and database right 2026; Contains Royal Mail data (c) Royal Mail copyright and database right 2026; Contains National Statistics data (c) Crown copyright and database right 2026. GB city labels are derived (local-authority district + post-town outward codes); Northern Ireland is not covered."
}