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.
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.
- 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:
- Base schema — the single
pdtf-transaction.jsonthat every overlay layers onto. - 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.
- Main overlays — one JSON Schema per form, search or document (BASPI, TA6, CON29R, …). 18 in total, distributed across five of the six contexts.
- 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.
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.
| Dimension | Overlay | Bounded context (DDD) |
|---|---|---|
| Layer | Schema layer — JSON Schema files | Domain layer — language and rules of a business function |
| Granularity | One form, search or document (BASPI, TA6, CON29R …) | An entire industry function (Estate Agency, Conveyancing …) |
| Lives in | v3/overlays/*.json in the schemas repo | Architecture documentation (see Bounded contexts) |
| Who picks it | Developer assembling a runtime schema | Business architect modelling the domain |
| Cardinality | Many overlays per bounded context | One 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.
| Form | File | Version | Bounded context | Status |
|---|---|---|---|---|
| Buyers and Sellers Property Information | baspi5.json | v5.0 | Estate Agency | active |
| Buyers and Sellers Property Information | baspi4.json | v4.0 | Estate Agency | superseded by baspi5 |
| NTS Material Information (Sales) | nts2.json | 2025 | Estate Agency | active |
| NTS Material Information (Sales) | nts.json | 2023 | Estate Agency | legacy — superseded by nts2 |
| NTS Material Information (Lettings) | ntsl2.json | 2025 | Estate Agency | active |
| NTS Material Information (Lettings) | ntsl.json | 2023 | Estate Agency | legacy — superseded by ntsl2 |
| Property Information Questionnaire | piq.json | v3 | Surveying | active |
Legal forms (Law Society)
What the conveyancer asks for.
| Form | File | Version | Bounded context | Status |
|---|---|---|---|---|
| Property Information Form | ta6.json | Edition 4 | Conveyancing | active |
| Leasehold Information Form | ta7.json | Edition 3 | Conveyancing | active |
| Fittings and Contents Form | ta10.json | Edition 3 | Conveyancing | active |
Search and survey forms
What the third-party data providers return.
| Form | File | Version | Bounded context | Status |
|---|---|---|---|---|
| Local Authority Search | con29R.json | 2019 | Property Data Services | active |
| Drainage and Water Search | con29DW.json | current | Property Data Services | active |
| Leasehold Property Enquiries | lpe1.json | Edition 4 | Conveyancing | active |
| Freehold Management Enquiries | fme1.json | Edition 2 | Mortgage Lending | active |
| Local Land Charges Search | llc1.json | v2 | Property Data Services | active |
| HMLR Official Copies of the Register | oc1.json | v21 | Property Data Services | active |
Specialist
Newer overlays covering domain-specific data.
| Form | File | Version | Bounded context | Status |
|---|---|---|---|---|
| Residential Development Survey | rds.json | v3.3.3 | Property Data Services | active |
| Sustainability Report 2024 | sr24.json | 2024 | Property Data Services | active |
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.
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
| Key | Description | NTS2 ref |
|---|---|---|
as | Asbestos | A5.2 |
dr | Dry-rot treatment | A5.1 |
jk | Japanese knotweed | A5.3 |
sb | Subsidence / structural faults | A5.4 |
hs | Health & safety issues | A5.5 |
Property features
| Key | Description | NTS2 ref |
|---|---|---|
oa | Outside areas (garden / balcony / communal) | — |
la | Loft access & insulation | A4.1 |
sf | Spray-foam insulation | A4.2 |
mc | Main construction type | — |
Ownership & financial
| Key | Description | NTS2 ref |
|---|---|---|
er | Estate rentcharges (freehold) | A3.2 |
ma | Managing agent (leasehold) | A1.5.4 |
tf | Transfer fees | A3.5.1.1 |
Utilities & services
| Key | Description | NTS2 ref |
|---|---|---|
sl | Solar-panel ownership | B3.7.1 |
hi | Heating installation date | B3.4.3.2 |
fd | Flood defences | — |
Transaction
| Key | Description | NTS2 ref |
|---|---|---|
oc | Other 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 context | Main overlays |
|---|---|
| Estate Agency |
|
| Conveyancing |
|
| Mortgage Lending | Freehold Management Enquiries (fme1) |
| Surveying | Property Information Questionnaire (piq) |
| Property Data Services |
|
| 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. requiredarrays — fields the form mandates. Different overlays make different things required.title/descriptionannotations — form-specific wording (often different from the base or another overlay).oneOfdiscriminators — the canonical pattern is theyesNodiscriminator: whenyesNo= "Yes", adetailsfield 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:
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 / search | Alias in overlaysMap | File |
|---|---|---|
| Buyers and Sellers Property Information (BASPI v4) | baspiV4 | baspi4.json |
| Buyers and Sellers Property Information (BASPI v5) | baspiV5 | baspi5.json |
| Property Information Form (TA6, Edition 4) | ta6ed4 | ta6.json |
| Leasehold Information Form (TA7, Edition 3) | ta7ed3 | ta7.json |
| Fittings and Contents Form (TA10, Edition 3) | ta10ed3 | ta10.json |
| Leasehold Property Enquiries (LPE1, Edition 4) | lpe1ed4 | lpe1.json |
| Freehold Management Enquiries (FME1, Edition 2) | fme1ed2 | fme1.json |
| Local Land Charges Search (LLC1) | llc1v2 | llc1.json |
| NTS Material Information — Sales (2023) | nts2023 | nts.json |
| NTS Material Information — Lettings (2023) | ntsl2023 | ntsl.json |
| NTS Material Information — Sales (2025) | nts2025 | nts2.json |
| NTS Material Information — Lettings (2025) | ntsl2025 | ntsl2.json |
| Local Authority Search (CON29R, 2019) | con29R2019 | con29R.json |
| Drainage and Water Search (CON29DW) | con29DW | con29DW.json |
| Residential Development Survey (RDS v3.3.3) | rdsV333 | rds.json |
| HMLR Official Copies of the Register (OC1 v21) | oc1v21 | oc1.json |
| Property Information Questionnaire (PIQ v3) | piqV3 | piq.json |
| Sustainability Report 2024 (SR24) | sr24 | sr24.json |
Where this lives
- Overlay JSON files:
source/03-standards/schemas/src/schemas/v3/overlays/ - Extension overlays:
source/03-standards/schemas/src/schemas/v3/overlays/extensions/ - Upstream README:
source/03-standards/schemas/src/schemas/v3/overlays/README.md - Merge entrypoint:
source/03-standards/schemas/index.js(functiongetTransactionSchemaat line 170) - Bounded-context mapping rationale: Bounded contexts (DDD)
Comments