PDTF overlays

    An overlay is a JSON-Schema artefact that adds one form, search or document to the base PDTF transaction schema. Overlays are the unit of composition the schema package ships in — pick the ones your use case needs, merge them on top of the base, and you get a complete validating schema.

    See also: Ontology manual — Physical-Database tier

    The BASPI5 overlay deployment page in the Ontology manual covers the ontology-layer overlay profile — how the BASPI5 consumer profile is assembled from the 24 source TTLs for triplestore deployment. That is a different artefact from the JSON Schema overlays catalogued here, but they serve the same property transaction data at different layers of the standards stack.

    Headline numbers
    • 1 base transaction schema — pdtf-transaction.json (not an overlay)
    • 18 main overlays in v3/overlays/*.json
    • 16 extension overlays in v3/overlays/extensions/*.json (modular NTS2 pieces)
    • 34 overlay files total in PDTF v3

    combined.json and skeleton.json at the v3 root aren't overlays — the first is a pre-merged convenience view, the second is a starter template for empty transactions.

    The overlay landscape

    One base schema; five business contexts that own overlays; a sixth (Property Tech) that runs on the base alone; and 16 extension overlays that sit inside Estate Agency as NTS2 fragments.

    The four columns in the diagram below, left to right:

    1. Base schema — the single pdtf-transaction.json that every overlay layers onto.
    2. Bounded contexts — the six business domains in the DDD model (Estate Agency, Conveyancing, Mortgage Lending, Surveying, Property Tech, Property Data Services). Every overlay belongs to exactly one.
    3. Main overlays — one JSON Schema per form, search or document (BASPI, TA6, CON29R, …). 18 in total, distributed across five of the six contexts.
    4. Extension overlays — 16 modular sub-pieces of NTS2, all inside Estate Agency. Adopt them individually to migrate from NTS 2023 → NTS2 2025 one topic at a time.
    flowchart LR BASE["`pdtf-transaction.json *base transaction schema*`"]:::infra EA[Estate Agency]:::user CONV[Conveyancing]:::user MORT[Mortgage Lending]:::user SURV[Surveying]:::user PTEC[Property Tech]:::user PDS[Property Data Services]:::user BASE --> EA BASE --> CONV BASE --> MORT BASE --> SURV BASE --> PTEC BASE --> PDS EA --> BASPI4["`Buyers and Sellers Property Information v4 (BASPI4)`"]:::data EA --> BASPI5["`Buyers and Sellers Property Information v5 (BASPI5)`"]:::data EA --> NTS["`NTS Material Information — Sales 2023 (NTS)`"]:::data EA --> NTS2["`NTS Material Information — Sales 2025 (NTS2)`"]:::data EA --> NTSL["`NTS Material Information — Lettings 2023 (NTSL)`"]:::data EA --> NTSL2["`NTS Material Information — Lettings 2025 (NTSL2)`"]:::data EA --> EXT["`+ 16 extension overlays (NTS2 fragments)`"]:::process EXT --> EAS["`Asbestos (AS)`"]:::process EXT --> EDR["`Dry-rot treatment (DR)`"]:::process EXT --> EJK["`Japanese knotweed (JK)`"]:::process EXT --> ESB["`Subsidence / structural faults (SB)`"]:::process EXT --> EHS["`Health & safety issues (HS)`"]:::process EXT --> EOA["`Outside areas (OA)`"]:::process EXT --> ELA["`Loft access & insulation (LA)`"]:::process EXT --> ESF["`Spray-foam insulation (SF)`"]:::process EXT --> EMC["`Main construction type (MC)`"]:::process EXT --> EER["`Estate rentcharges (ER)`"]:::process EXT --> EMA["`Managing agent (MA)`"]:::process EXT --> ETF["`Transfer fees (TF)`"]:::process EXT --> ESL["`Solar-panel ownership (SL)`"]:::process EXT --> EHI["`Heating installation date (HI)`"]:::process EXT --> EFD["`Flood defences (FD)`"]:::process EXT --> EOC["`Other property chain dependency (OC)`"]:::process CONV --> TA6["`Property Information Form (TA6)`"]:::data CONV --> TA7["`Leasehold Information Form (TA7)`"]:::data CONV --> TA10["`Fittings & Contents Form (TA10)`"]:::data CONV --> LPE1["`Leasehold Property Enquiries (LPE1)`"]:::data MORT --> FME1["`Freehold Management Enquiries (FME1)`"]:::data SURV --> PIQ["`Property Information Questionnaire (PIQ)`"]:::data PDS --> RDS["`Residential Development Survey (RDS)`"]:::data PDS --> OC1["`HMLR Official Copies of the Register (OC1)`"]:::data PDS --> LLC1["`Local Land Charges Search (LLC1)`"]:::data PDS --> CON29R["`Local Authority Search (CON29R)`"]:::data PDS --> CON29DW["`Drainage & Water Search (CON29DW)`"]:::data PDS --> SR24["`Sustainability Report 2024 (SR24)`"]:::data
    Six bounded contexts layered on the base PDTF transaction schema, with all 18 main overlays. Estate Agency also owns the 16 extension overlays (NTS2 fragments, listed in the catalogue below). Property Tech runs on the base schema alone, with no overlays of its own. Legacy overlays (baspi4, nts, ntsl) ship alongside their successors for backward compatibility.

    What an overlay is — and is not

    An overlay is a draft-07 JSON Schema that mirrors the shape of the base transaction but only specifies what it adds or constrains. The merge function turns the base + overlays into a complete schema.

    DimensionOverlayBounded context (DDD)
    LayerSchema layer — JSON Schema filesDomain layer — language and rules of a business function
    GranularityOne form, search or document (BASPI, TA6, CON29R …)An entire industry function (Estate Agency, Conveyancing …)
    Lives inv3/overlays/*.json in the schemas repoArchitecture documentation (see Bounded contexts)
    Who picks itDeveloper assembling a runtime schemaBusiness architect modelling the domain
    CardinalityMany overlays per bounded contextOne bounded context owns several overlays

    Overlays predate the DDD analysis — the bounded-context model is a retrofit onto a partition that was already there. So the answer to "are overlays the same as bounded contexts?" is: no, but they map cleanly onto them.

    The catalogue

    Main overlays (18)

    Bounded context is the business domain the overlay belongs to (one of six). Status is the lifecycle state of the overlay file: active means current, superseded / legacy means a newer overlay covers the same form but the older one is still shipped in v3 for backward compatibility. The two are orthogonal — every legacy overlay still belongs to its original bounded context.

    Property information forms

    What the seller declares about the property.

    FormFileVersionBounded contextStatus
    Buyers and Sellers Property Informationbaspi5.jsonv5.0Estate Agencyactive
    Buyers and Sellers Property Informationbaspi4.jsonv4.0Estate Agencysuperseded by baspi5
    NTS Material Information (Sales)nts2.json2025Estate Agencyactive
    NTS Material Information (Sales)nts.json2023Estate Agencylegacy — superseded by nts2
    NTS Material Information (Lettings)ntsl2.json2025Estate Agencyactive
    NTS Material Information (Lettings)ntsl.json2023Estate Agencylegacy — superseded by ntsl2
    Property Information Questionnairepiq.jsonv3Surveyingactive

    Legal forms (Law Society)

    What the conveyancer asks for.

    FormFileVersionBounded contextStatus
    Property Information Formta6.jsonEdition 4Conveyancingactive
    Leasehold Information Formta7.jsonEdition 3Conveyancingactive
    Fittings and Contents Formta10.jsonEdition 3Conveyancingactive

    Search and survey forms

    What the third-party data providers return.

    FormFileVersionBounded contextStatus
    Local Authority Searchcon29R.json2019Property Data Servicesactive
    Drainage and Water Searchcon29DW.jsoncurrentProperty Data Servicesactive
    Leasehold Property Enquirieslpe1.jsonEdition 4Conveyancingactive
    Freehold Management Enquiriesfme1.jsonEdition 2Mortgage Lendingactive
    Local Land Charges Searchllc1.jsonv2Property Data Servicesactive
    HMLR Official Copies of the Registeroc1.jsonv21Property Data Servicesactive

    Specialist

    Newer overlays covering domain-specific data.

    FormFileVersionBounded contextStatus
    Residential Development Surveyrds.jsonv3.3.3Property Data Servicesactive
    Sustainability Report 2024sr24.json2024Property Data Servicesactive

    Extension overlays (16)

    The 18 main overlays above span five bounded contexts. The 16 extension overlays here all belong to one — Estate Agency — because they fragment nts2 (the 2025 Material Information spec that estate agents publish when listing a property) into opt-in pieces.

    Each extension adds a single topic to an nts 2023 base, so an estate agent or listing platform can adopt NTS2 changes one topic at a time instead of switching their whole pipeline to the 2025 spec in one go.

    Four entries below have — in the NTS2 ref column. Those cover topics that sit alongside NTS2 (general property data) rather than mapping to a specific NTS2 section.

    flowchart LR NTS["`**nts** NTS 2023 base`"]:::infra E1["+ jk Japanese knotweed"]:::process E2["+ tf Transfer fees"]:::process E3["+ ... any of 16"]:::process NTS2["`**nts2** full NTS2 2025`"]:::success NTS --> E1 --> NTS2 NTS --> E2 --> NTS2 NTS --> E3 --> NTS2
    Start on the nts 2023 overlay, then layer in one or more extensions for the NTS2 topics you need. Adopting all 16 is functionally equivalent to the full nts2 overlay.

    Specialist issues

    KeyDescriptionNTS2 ref
    asAsbestosA5.2
    drDry-rot treatmentA5.1
    jkJapanese knotweedA5.3
    sbSubsidence / structural faultsA5.4
    hsHealth & safety issuesA5.5

    Property features

    KeyDescriptionNTS2 ref
    oaOutside areas (garden / balcony / communal)—
    laLoft access & insulationA4.1
    sfSpray-foam insulationA4.2
    mcMain construction type—

    Ownership & financial

    KeyDescriptionNTS2 ref
    erEstate rentcharges (freehold)A3.2
    maManaging agent (leasehold)A1.5.4
    tfTransfer feesA3.5.1.1

    Utilities & services

    KeyDescriptionNTS2 ref
    slSolar-panel ownershipB3.7.1
    hiHeating installation dateB3.4.3.2
    fdFlood defences—

    Transaction

    KeyDescriptionNTS2 ref
    ocOther property chain dependency—

    Bounded-context map

    Inverse view of the catalogue — each overlay belongs to exactly one bounded context. The 16 extension overlays all sit inside Estate Agency (as NTS2 fragments) and aren't repeated here.

    Bounded contextMain overlays
    Estate Agency
    • Buyers and Sellers Property Information (baspi4 legacy, baspi5)
    • NTS Material Information — Sales (nts legacy, nts2)
    • NTS Material Information — Lettings (ntsl legacy, ntsl2)
    Conveyancing
    • Property Information Form (ta6)
    • Leasehold Information Form (ta7)
    • Fittings and Contents Form (ta10)
    • Leasehold Property Enquiries (lpe1)
    Mortgage Lending Freehold Management Enquiries (fme1)
    Surveying Property Information Questionnaire (piq)
    Property Data Services
    • Residential Development Survey (rds)
    • HMLR Official Copies of the Register (oc1)
    • Local Land Charges Search (llc1)
    • Local Authority Search (con29R)
    • Drainage and Water Search (con29DW)
    • Sustainability Report 2024 (sr24)
    Property Tech The base pdtf-transaction.json + verified-claims wrapper (no overlays of its own)

    How an overlay is defined

    Every overlay is a draft-07 JSON Schema with this skeletal shape:

    {
      "$schema": "http://json-schema.org/draft-07/schema#",
      "$id": "https://trust.propdata.org.uk/schemas/v3/overlays/baspi5.json",
      "required": ["participants", "propertyPack"],
      "properties": {
        "propertyPack": {
          "baspi5Ref": "B",
          "required": ["priceInformation", "ownership", "..."],
          "properties": {
            "priceInformation": {
              "baspi5Ref": "B.1",
              "properties": { /* … */ }
            }
          }
        }
      }
    }

    The pieces that make an overlay an overlay:

    • Form reference attributes — baspi5Ref, ntsRef, nts2Ref, ta6Ref, ta7Ref, ta10Ref, lpe1Ref, fme1Ref, con29RRef, con29DWRef, rdsRef, piqRef. Each schema node carries the paper-form section number it traces back to.
    • required arrays — fields the form mandates. Different overlays make different things required.
    • title / description annotations — form-specific wording (often different from the base or another overlay).
    • oneOf discriminators — the canonical pattern is the yesNo discriminator: when yesNo = "Yes", a details field becomes required.

    How overlays are used at runtime

    Composition happens via the library entrypoint getTransactionSchema(schemaId, overlays[]) in index.js:

    const { getTransactionSchema } = require('@pdtf/schemas');
    
    // Estate-agency product:
    const eaSchema = getTransactionSchema(
      "https://trust.propdata.org.uk/schemas/v3/pdtf-transaction.json",
      ["baspi5", "nts2"]
    );
    
    // Conveyancer product:
    const cnvSchema = getTransactionSchema(
      "https://trust.propdata.org.uk/schemas/v3/pdtf-transaction.json",
      ["ta6", "ta7", "ta10", "lpe1"]
    );
    
    // Selective NTS → NTS2 migration:
    const stagedSchema = getTransactionSchema(
      "https://trust.propdata.org.uk/schemas/v3/pdtf-transaction.json",
      ["nts2023", "jk", "tf"]  // NTS 2023 + Japanese knotweed + transfer fees
    );

    Under the hood, the merge pipeline is:

    flowchart LR BASE["`pdtf-transaction.json *base transaction schema*`"]:::infra O1["`Overlay 1 e.g. baspi5`"]:::data O2["`Overlay 2 e.g. nts2`"]:::data O3[Overlay n …]:::data MERGE["`deepmerge( base, O1, O2, … ) + custom arrayMerge for required & oneOf`"]:::process RESULT["`Merged schema *complete and validatable*`"]:::success BASE --> MERGE O1 --> MERGE O2 --> MERGE O3 --> MERGE MERGE --> RESULT
    deepmerge with a custom arrayMerge: required arrays are unioned, oneOf arrays are concatenated, and the rest follows ordinary object-merge rules.

    Names and aliases

    Overlays are registered in overlaysMap[schemaId] in index.js under versioned aliases as well as the plain filename stem. Both work:

    Form / searchAlias in overlaysMapFile
    Buyers and Sellers Property Information (BASPI v4)baspiV4baspi4.json
    Buyers and Sellers Property Information (BASPI v5)baspiV5baspi5.json
    Property Information Form (TA6, Edition 4)ta6ed4ta6.json
    Leasehold Information Form (TA7, Edition 3)ta7ed3ta7.json
    Fittings and Contents Form (TA10, Edition 3)ta10ed3ta10.json
    Leasehold Property Enquiries (LPE1, Edition 4)lpe1ed4lpe1.json
    Freehold Management Enquiries (FME1, Edition 2)fme1ed2fme1.json
    Local Land Charges Search (LLC1)llc1v2llc1.json
    NTS Material Information — Sales (2023)nts2023nts.json
    NTS Material Information — Lettings (2023)ntsl2023ntsl.json
    NTS Material Information — Sales (2025)nts2025nts2.json
    NTS Material Information — Lettings (2025)ntsl2025ntsl2.json
    Local Authority Search (CON29R, 2019)con29R2019con29R.json
    Drainage and Water Search (CON29DW)con29DWcon29DW.json
    Residential Development Survey (RDS v3.3.3)rdsV333rds.json
    HMLR Official Copies of the Register (OC1 v21)oc1v21oc1.json
    Property Information Questionnaire (PIQ v3)piqV3piq.json
    Sustainability Report 2024 (SR24)sr24sr24.json

    Where this lives

    Comments

    Loading comments…