{"openapi":"3.0.3","info":{"title":"Tradelynx Property Intelligence API","version":"v1","description":"Consent-floored, verified-at-source property intelligence. Every response is evidence to support human decisions, never the sole basis for an adverse decision affecting a person. Access is commercial: an API key with the right scope, plus a per-organisation entitlement and feature flag, are all required (contact enterprise@tradelynx.co.uk). Sandbox keys (tlx_test_) return deterministic synthetic data and need no entitlement.","contact":{"email":"enterprise@tradelynx.co.uk"}},"servers":[{"url":"https://www.tradelynx.co.uk/api/enterprise/v1"}],"components":{"securitySchemes":{"apiKey":{"type":"http","scheme":"bearer","description":"API key: tlx_live_… (or tlx_test_… for sandbox). Issue keys in your workspace under API keys."}},"schemas":{"PropertyAnchor":{"type":"object","description":"The consolidated property record. history is only populated where the property's owner holds standing disclosure consent for your organisation type; it is a minimised summary (counts), never event payloads.","properties":{"property":{"type":"object","properties":{"id":{"type":"string"},"label":{"type":"string","nullable":true},"address_line1":{"type":"string","nullable":true},"postcode":{"type":"string","nullable":true},"uprn":{"type":"string","nullable":true},"status":{"type":"string","nullable":true},"property_type":{"type":"string","nullable":true},"bedrooms":{"type":"integer","nullable":true},"bathrooms":{"type":"integer","nullable":true},"floor_area_sqm":{"type":"number","nullable":true},"updated_at":{"type":"string","nullable":true}}},"compliance":{"type":"array","description":"Every statutory duty that applies to this property (resolved from its attributes and tenure), with status, due date, and how well-evidenced the record is.","items":{"type":"object","properties":{"key":{"type":"string"},"label":{"type":"string"},"status":{"type":"string","enum":["valid","due_soon","expired","missing","failed","waived"]},"due_date":{"type":"string","nullable":true},"evidence_grade":{"type":"string","enum":["verified_at_source","document_on_file","self_declared","unknown"]}}}},"history":{"type":"object","description":"Consented, minimised marketplace-history summary. available:false with a reason when there is no linked history or no standing consent.","properties":{"available":{"type":"boolean"},"reason":{"type":"string","nullable":true},"event_count":{"type":"integer","nullable":true},"by_event_type":{"type":"object","nullable":true},"by_verification_level":{"type":"object","nullable":true},"last_event_at":{"type":"string","nullable":true}}}}}}},"paths":{"/property/{propertyId}":{"get":{"summary":"The property anchor object","description":"One call returns identity + evidence-graded statutory-compliance posture + a consented minimised history summary for a property in YOUR portfolio (foreign ids return 404). Gates: property:read scope + property_api entitlement + enterprise.property_api flag.","security":[{"apiKey":[]}],"parameters":[{"name":"propertyId","in":"path","required":true,"schema":{"type":"string"},"description":"Your org_property id"}],"responses":{"200":{"description":"The anchor object (plus ok, version, notice).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PropertyAnchor"}}}},"401":{"description":"Missing/invalid API key"},"403":{"description":"Missing scope, entitlement, or feature flag"},"404":{"description":"Not in your portfolio"}}}},"/property/batch":{"post":{"summary":"Portfolio-scale anchor reads","description":"Up to 50 property_ids per call; page through larger books. Partial results: a slot not in your portfolio returns ok:false in place without failing the batch. Same gates as the single endpoint; consent is checked per property.","security":[{"apiKey":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"property_ids":{"type":"array","items":{"type":"string"},"maxItems":50}},"required":["property_ids"]}}}},"responses":{"200":{"description":"results[]: each { ok, …anchor } or { ok:false, error, property_id }"},"400":{"description":"invalid_json / property_ids required / over the batch cap"},"401":{"description":"Missing/invalid API key"},"403":{"description":"Missing scope, entitlement, or feature flag"}}}},"/compliance":{"get":{"summary":"Compliance posture (portfolio calendar)","description":"The org-wide compliance calendar (CHG-2026-0560). Gates: compliance_api entitlement + enterprise.compliance_api flag + compliance-scoped key.","security":[{"apiKey":[]}],"responses":{"200":{"description":"The compliance calendar"},"401":{"description":"Unauthorized"},"403":{"description":"Not enabled"}}}},"/property-risk":{"post":{"summary":"Insurer risk signal","description":"Insurer organisations only; requires risk:read scope + risk_api entitlement + flag, and the property owner's standing risk_pricing consent. See your commercial agreement.","security":[{"apiKey":[]}],"responses":{"200":{"description":"Risk profile with per-metric provenance"},"403":{"description":"Not an insurer / not enabled / no consent"},"404":{"description":"Not in your portfolio"}}}},"/property/underwriting":{"post":{"summary":"Insurer underwriting-at-source","description":"For a marketplace property_id (body: { property_id }), returns the underwriting profile over the property owner's CONSENTED work history for a property your insurer org is CONNECTED to. Verified servicing cadence per trade + water-event mentions, aggregated only (never a derived score). consent:false when the owner has no standing risk_pricing consent. Requires underwriting:read scope + risk_api entitlement + flag. Evidence for a human underwriter, never an automated decision.","security":[{"apiKey":[]}],"responses":{"200":{"description":"Underwriting profile (or consent:false)"},"400":{"description":"property_id required"},"403":{"description":"Not enabled for your org"}}}},"/property/claims-evidence":{"post":{"summary":"Insurer claims-evidence lookup","description":"For a marketplace property_id, returns claim-relevant evidence over the consented, connected work history (was the boiler serviced? prior water damage? wiring recent?) with provenance. Evidence only, a human decides. Requires claims:read scope + risk_api entitlement + flag.","security":[{"apiKey":[]}],"responses":{"200":{"description":"Claims evidence (or consent:false)"},"400":{"description":"property_id required"},"403":{"description":"Not enabled for your org"}}}},"/property/lender-risk":{"post":{"summary":"Lender EPC/MEES + flood risk","description":"For an address (body: { address: { line1?, postcode } }), returns the EPC band + improvement pathway (official EPC register) and the flood peril band (Environment Agency open data). PUBLIC reference data, no consent required, no personal data. MEES F/G flagged as current law; a proposed EPC-C-by-2030 rental minimum is flagged as exposure (consultation, not yet law). Intelligence, not a lending decision. Requires lender:read scope + lender_api entitlement + enterprise.lender_api flag.","security":[{"apiKey":[]}],"responses":{"200":{"description":"EPC transition + flood product, with OGL attribution + notice"},"400":{"description":"address.postcode required"},"403":{"description":"Not enabled for your org"}}}}},"webhooks":{"property.compliance.changed":{"post":{"summary":"A compliance record on one of your properties changed","description":"Thin payload. { property_id, changed_at } only. Fetch the anchor endpoint for detail (consent + audit are enforced on the pull, never bypassed by the push). Configure endpoints in your workspace under Webhooks; deliveries are signed and retried."}},"property.history.appended":{"post":{"summary":"New consented history exists on one of your properties","description":"Thin payload. { property_id, changed_at } only. Emitted only while the owner's disclosure consent stands."}}}}