HouseData.uk Scoring API

Consent-gap risk scores for individual properties.

GitHub OpenAPI

Operations 3

POST /score Score one property #
GET /score/{uprn} Get a cached score #
POST /batch Score up to 50 properties #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/housedata-uk:housedata-uk-scoring-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

housedata-uk-scoring-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: HouseData PRISM Scoring API
  version: 3.0.0
  summary: Consent-gap risk scoring for UK residential property.
  description: 'PRISM scores the risk that a UK property has undisclosed alterations — works without planning consent or building regulations sign-off — by comparing its EPC history (floor area and room counts over time) with planning records, heritage designations, flood zone and HM Land Registry sales. It returns a 0–100 score, a risk band (LOW, MODERATE, ELEVATED, HIGH), six sub-scores, plain-English risk flags, guidance for conveyancers and, for scores above 45, remediation options.


    **Authentication:** send your API key as `Authorization: Bearer hd_prism_…` or `X-API-Key: hd_prism_…`. Get a free key at https://housedata.uk/prism/signup.


    **Rate limits:** self-serve keys allow 500 requests per day (UTC). A batch request counts as one request. Exceeding the limit returns HTTP 429.


    **Caching:** scores are cached for 30 days per property and model version; `GET /score/{uprn}` reads the cache without recomputing.


    Coverage: England and Wales. Data: EPC Register, HM Land Registry Price Paid Data, Environment Agency flood zones, local planning authority registers and Historic England, all under the Open Government Licence.'
  termsOfService: https://housedata.uk/terms
  contact:
    name: HouseData
    email: hello@housedata.uk
    url: https://housedata.uk/prism
servers:
- url: https://housedata.uk/api/v1/prism
security:
- bearerAuth: []
- apiKeyHeader: []
tags:
- name: Scoring
  description: Consent-gap risk scores for individual properties.
paths:
  /score:
    post:
      tags:
      - Scoring
      operationId: scoreProperty
      summary: Score one property
      description: 'Computes (or returns a cached) PRISM score for one property. Supply a UPRN for the most reliable result: EPC histories are only compared for a confident UPRN match.'
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/ScoreRequest'
            example:
              postcode: CV4 7AL
              uprn: '100070000000'
              property_type: semi-detached
      responses:
        '200':
          description: PRISM score.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ScoreResult'
              example:
                finalScore: 38
                riskBand: MODERATE
                weightedBand: MODERATE
                bandElevatedBySubScore: false
                subScores:
                  floorAreaDelta:
                    score: 55
                  roomDelta:
                    score: 20
                  planningMatch:
                    score: 40
                  heritage:
                    score: 0
                  flood:
                    score: 10
                  transaction:
                    score: 15
                riskFlags:
                - type: risk
                  signal: floorAreaDelta
                  message: Floor area increased by 18 m² between EPCs with no matching planning record.
                conveyancerGuidance: Moderate risk. Raise targeted additional enquiries on TA6 regarding works completed. Request copies of planning permissions and building regulations completion certificates. Consider obtaining an indemnity insurance quotation as a precaution.
                postcode: CV47AL
                uprn: '100070000000'
                epcCount: 3
                propertyType: semi-detached
                model_version: v3
                computed_at: '2026-10-13T09:00:00.000Z'
                data_sources:
                - EPC Register
                - Planning Portal
                - HM Land Registry
                remediation: null
        '400':
          description: Invalid request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: postcode or uprn required
        '401':
          description: Missing, invalid or revoked API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: 'Valid API key required. Use Authorization: Bearer hd_prism_... or X-API-Key header.'
        '403':
          description: The account has no PRISM access.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Daily request limit reached.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitError'
              example:
                error: Daily rate limit exceeded
                limit: 500
                used: 500
        '500':
          description: Scoring failed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: Service temporarily unavailable.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /score/{uprn}:
    get:
      tags:
      - Scoring
      operationId: getCachedScore
      summary: Get a cached score
      description: Returns the most recent cached score for a UPRN computed in the last 30 days. Does not compute a new score.
      parameters:
      - name: uprn
        in: path
        required: true
        description: Unique Property Reference Number.
        schema:
          type: string
          pattern: ^[0-9]{1,12}$
      responses:
        '200':
          description: Cached PRISM score.
          content:
            application/json:
              schema:
                allOf:
                - $ref: '#/components/schemas/ScoreResult'
                - type: object
                  properties:
                    _cached:
                      type: boolean
                      const: true
                    _computed_at:
                      type: string
        '404':
          description: No cached score for this UPRN.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: No cached PRISM score for this UPRN
        '400':
          description: Invalid request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: postcode or uprn required
        '401':
          description: Missing, invalid or revoked API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: 'Valid API key required. Use Authorization: Bearer hd_prism_... or X-API-Key header.'
        '403':
          description: The account has no PRISM access.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Daily request limit reached.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitError'
              example:
                error: Daily rate limit exceeded
                limit: 500
                used: 500
        '500':
          description: Scoring failed.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '503':
          description: Service temporarily unavailable.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
  /batch:
    post:
      tags:
      - Scoring
      operationId: scoreBatch
      summary: Score up to 50 properties
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              required:
              - properties
              properties:
                properties:
                  type: array
                  minItems: 1
                  maxItems: 50
                  items:
                    $ref: '#/components/schemas/ScoreRequest'
            example:
              properties:
              - postcode: CV4 7AL
                uprn: '100070000000'
              - postcode: M1 1AE
      responses:
        '200':
          description: One result per property, in request order. A property that fails has an `error` field instead of a score.
          content:
            application/json:
              schema:
                type: object
                required:
                - count
                - results
                properties:
                  count:
                    type: integer
                  results:
                    type: array
                    items:
                      oneOf:
                      - $ref: '#/components/schemas/ScoreResult'
                      - $ref: '#/components/schemas/BatchItemError'
        '400':
          description: Invalid request.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: postcode or uprn required
        '401':
          description: Missing, invalid or revoked API key.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
              example:
                error: 'Valid API key required. Use Authorization: Bearer hd_prism_... or X-API-Key header.'
        '403':
          description: The account has no PRISM access.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '429':
          description: Daily request limit reached.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/RateLimitError'
              example:
                error: Daily rate limit exceeded
                limit: 500
                used: 500
        '503':
          description: Service temporarily unavailable.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
components:
  schemas:
    RateLimitError:
      type: object
      required:
      - error
      - limit
      - used
      properties:
        error:
          type: string
        limit:
          type: integer
        used:
          type: integer
    Error:
      type: object
      required:
      - error
      properties:
        error:
          type: string
    BatchItemError:
      type: object
      required:
      - error
      properties:
        postcode:
          type: string
        uprn:
          type:
          - string
          - 'null'
        error:
          type: string
    RiskFlag:
      type: object
      properties:
        type:
          type: string
          enum:
          - risk
          - info
        signal:
          type: string
        message:
          type: string
      additionalProperties: true
    ScoreResult:
      type: object
      additionalProperties: true
      required:
      - finalScore
      - riskBand
      - subScores
      - riskFlags
      - conveyancerGuidance
      - model_version
      properties:
        finalScore:
          type: number
          minimum: 0
          maximum: 100
          description: Headline consent-gap risk score.
        riskBand:
          type: string
          enum:
          - LOW
          - MODERATE
          - ELEVATED
          - HIGH
          description: LOW ≤20, MODERATE ≤45, ELEVATED ≤70, HIGH above. Raised above the weighted band when a single sub-score warrants it.
        weightedBand:
          type: string
          enum:
          - LOW
          - MODERATE
          - ELEVATED
          - HIGH
        bandElevatedBySubScore:
          type: boolean
        subScores:
          type: object
          properties:
            floorAreaDelta:
              $ref: '#/components/schemas/SubScore'
            roomDelta:
              $ref: '#/components/schemas/SubScore'
            planningMatch:
              $ref: '#/components/schemas/SubScore'
            heritage:
              $ref: '#/components/schemas/SubScore'
            flood:
              $ref: '#/components/schemas/SubScore'
            transaction:
              $ref: '#/components/schemas/SubScore'
        riskFlags:
          type: array
          items:
            $ref: '#/components/schemas/RiskFlag'
        conveyancerGuidance:
          type: string
        heritageAmplified:
          type: boolean
        dataQualityFlags:
          type: array
          items:
            type: object
            additionalProperties: true
        remediation:
          type:
          - object
          - 'null'
          additionalProperties: true
          description: Remediation options (retrospective consent, indemnity insurance, price renegotiation); present when finalScore > 45.
        postcode:
          type: string
        uprn:
          type:
          - string
          - 'null'
        address:
          type:
          - string
          - 'null'
        epcCount:
          type: integer
        propertyType:
          type:
          - string
          - 'null'
        constructionYear:
          type:
          - integer
          - 'null'
        computed_at:
          type: string
          format: date-time
        model_version:
          type: string
          examples:
          - v3
        data_sources:
          type: array
          items:
            type: string
        epcHistory:
          type: array
          items:
            type: object
            additionalProperties: true
        planningApplications:
          type: array
          items:
            type: object
            additionalProperties: true
        heritage:
          type: object
          additionalProperties: true
        floodZone:
          type:
          - integer
          - 'null'
        transactions:
          type: array
          items:
            type: object
            additionalProperties: true
        localMedianPrice:
          type:
          - number
          - 'null'
    ScoreRequest:
      type: object
      description: Provide a postcode or a UPRN (or both).
      anyOf:
      - required:
        - postcode
      - required:
        - uprn
      properties:
        postcode:
          type: string
          description: UK postcode, any spacing.
          examples:
          - CV4 7AL
        uprn:
          type: string
          description: Unique Property Reference Number. Strongly recommended.
        lat:
          type: number
        lon:
          type: number
        address:
          type: string
        property_type:
          type: string
          description: e.g. detached, semi-detached, terraced, flat.
        skip_cache:
          type: boolean
          default: false
          description: Force a fresh score (single-property endpoint only).
    SubScore:
      type: object
      additionalProperties: true
      properties:
        score:
          type: number
          minimum: 0
          maximum: 100
        weight:
          type: number
          description: Weight of this signal in the headline score.
        dataSource:
          type:
          - string
          - 'null'
        flags:
          type: array
          items:
            $ref: '#/components/schemas/RiskFlag'
        rawValues:
          type: object
          additionalProperties: true
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: 'API key as a bearer token: `Authorization: Bearer hd_prism_…`'
    apiKeyHeader:
      type: apiKey
      in: header
      name: X-API-Key
externalDocs:
  description: PRISM documentation
  url: https://housedata.uk/prism#docs