Scores: deterministic composite scoring.

One 0-to-100 number per UK area. Four scoring profiles tuned to four workflows: residential origination, commercial site selection, investment underwrite, and research. Each profile uses its own five-dimension set; override the weights per request or save your own recipe against your org. The engine is frozen, golden-tested, and AI never touches the scoring path. Every response stamps the engine version that produced it.

Sample response

One score. Five dimensions. The engine version on every response.

Pick a postcode and a scoring profile. See the composite number, the five dimensions that produced it, the weight applied to each, and the engine version that ran.

Postcode
Profile
POST/v1/score
62/ 100
areaM1 1AE
presetresearch
area_typeurban
weights_sourcepreset
engine_version2.0.2

Dimensions

Safety & Crimesafety_crime
42
weight 20contributes 8.4
high
Transport Linkstransport_links
84
weight 20contributes 16.8
high
Amenities & Servicesamenities_services
72
weight 20contributes 14.4
medium
Demographics & Economydemographics_economy
58
weight 20contributes 11.6
high
Environment Qualityenvironment_quality
55
weight 20contributes 11.0
medium

Reading this view

preset
The API parameter that selects the scoring profile. Each profile uses a different five-dimension set, not the same five re-weighted. The residential profile (safety, schools, commute, amenities, cost of living) does not share dimensions with the investment profile (price growth, yield, regeneration, tenant demand, risk factors).
weights_source
Either preset (defaults used) or custom (caller supplied weights, or resolved a saved org profile via preset_id). The strict 2-value enum lives in the contract; saved profiles surface as custom.
engine_version
Stamped on the response body and on the X-Engine-Version header. Org-level methodology pinning (Levers) overrides per caller. Supported window today: 2.0.0, 2.0.1, 2.0.2. All score-equivalent.

Sample shape and illustrative values. Real scores vary per release of the underlying sources and the engine version your org is pinned to.

Four scoring profiles. Each tuned to a different workflow.

Each profile selects a different five-dimension set plus default weights. The matrices are different on purpose: a residential origination flow does not care about commercial costs, and an investment underwrite does not care about schools. The engine should not pretend those are the same.

Residential origination

preset: moving

How liveable is this area for a household. Drives the area-quality lens on listing detail pages, valuation flows, and relocation tools.

5 Dimensions

  • Safety & Crime
  • Schools & Education
  • Transport & Commute
  • Daily Amenities
  • Cost of Living

Commercial site selection

preset: business

Where to open. Foot traffic, competition density, transport access, spending power, occupancy cost. Drives shortlisting at portfolio scale.

5 Dimensions

  • Foot Traffic & Demand
  • Competition Density
  • Transport Access
  • Local Spending Power
  • Commercial Costs

Investment underwrite

preset: investing

What this area looks like as an asset. Growth trajectory, yield, regeneration context, tenant demand, downside risk.

5 Dimensions

  • Price Growth
  • Rental Yield
  • Regeneration
  • Tenant Demand
  • Risk Factors

Research baseline

preset: research

Analyst-friendly default. Balanced weights across safety, transport, amenities, demographics and environment. Survives FOI and procurement review.

5 Dimensions

  • Safety & Crime
  • Transport Links
  • Amenities & Services
  • Demographics & Economy
  • Environment Quality

Deterministic pipeline. AI never touches the numbers.

Each call runs the same three steps in the same order. Caller weights enter the pure aggregation, not the engine. Same inputs always produce the same score.

SOURCESSTEP 01fetchAreaSourcesSTEP 02computeScoresFROZEN v2 ENGINEOPTIONALCaller weights / preset_idSTEP 03applyWeightsRESPONSE62 / 100
  • Step 01

    Fetch sources

    Hybrid read across the persisted store and live upstream fetches. Deprivation, property and crime served from the store when LSOA coverage exists; amenities, transport, schools and environment live per request.

  • Step 02

    Compute scores

    Frozen v2 deterministic engine produces the five per-dimension scores for the chosen preset, plus per-dimension confidence. Golden-tested. AI does not touch this step.

  • Step 03

    Apply weights

    Pure aggregation outside the engine. Default weights from the preset, overridden by caller weights or a saved org preset_id. Aggregate confidence is weight-weighted across dimensions.

The primary scoring endpoint, the legacy narrated report, plus Levers preset CRUD.

Plain JSON over HTTPS, Bearer-token auth with the oga_ prefix, all paths under /v1/. Score endpoint is free of the monthly report quota; the legacy /v1/report endpoint still consumes it.

The primary scoring endpoint. Send an area and a preset; get a 0-100 composite, the five dimensions that produced it, the weight applied to each, per-dimension confidence, the aggregate confidence, weights_source and the engine_version that ran. Not metered against the monthly report quota. No report is generated.

Parameters

  • areastringRequired

    UK postcode or place name. Geocoded server-side.

  • presetenum

    moving · business · investing · research. Defaults to research. Each preset has its OWN 5 dimensions.

  • weightsRecord<key, positive number>

    Override the preset's default weights. Keys must be in PRESET_DIMENSION_KEYS[preset]. Partial overrides keep defaults for missing keys.

  • preset_idstring (Lever)

    Reference a saved per-org preset (spr_…). Mutually exclusive with preset + weights. 422 preset_id_conflict otherwise.

  • X-Engine-Versionheader

    Pin response engine version per request. Must be in SUPPORTED_ENGINE_VERSIONS = ['2.0.0','2.0.1','2.0.2']. Beats org-level pin.

Response

ScoreResult: { area, preset, score, area_type, dimensions[5]: { key, label, score, weight, confidence }, confidence, weights_source ('preset' | 'custom'), engine_version }. Response header X-Engine-Version carries the effective pin.

Status codes

200
Score computed.
400
Missing area, invalid preset, unknown dimension key, non-positive weight, empty weights.
401
Missing or invalid Bearer oga_… API key.
403
Plan has no API access, or IP-allowlist blocked.
404
Area cannot be geocoded, or preset_id unknown in caller's org.
422
preset_id_conflict (mutually exclusive) or no_org_context.
429
Per-key rate-limited (30 req / min).

Same engine. Five different buyer workflows.

What the score is FOR changes per buyer. The deterministic pipeline underneath does not.

Lenders

The problem

A mortgage lender's model risk register treats every API the underwriting model depends on as a model input. If the supplier silently changes a coefficient, that's an undisclosed model change, a regulated event. Auditors ask: 'what version of the area score produced this decision, and is it byte-equivalent to the score you'd compute today?'

Why Scores

Every /v1/score response carries engine_version in the body AND X-Engine-Version on the response header. Both can be locked at the org level (Levers methodology pin), owner-only, write-time validated against SUPPORTED_ENGINE_VERSIONS. The deterministic engine is frozen v2, golden-tested. AI never touches the scoring path.

Their value

Every decision produced from /v1/score is reproducible to a known methodology version. The model risk register has a 1:1 mapping between an API call and the engine that ran. Closes a compliance gap that's table-stakes for any production underwriting model.

Versioned, pinnable, deterministic area scoring with the audit trail your model risk register already asks for.

Insurance and InsureTech

The problem

An underwriter's area-risk view is a weighted blend the actuary owns (safety, flood, demographics, property volatility) and the weights change with each pricing cycle. Off-the-shelf 'area scores' are black-box composites with frozen weights the vendor chose; useless inside an underwriting model because the actuary cannot see or tune the weighting.

Why Scores

POST /v1/score returns every dimension's raw score, weight, and per-dimension confidence. The actuary sees the components, not a black box. With Levers saved presets the carrier saves a preset once and references it as preset_id forever. Confidence is variance-aware on property-backed dimensions so wide swings cap at MEDIUM.

Their value

Configurable weights without per-call payload. Transparent components for actuary review. Honest confidence signal that flags volatility before adverse selection bites. One preset_id per underwriting model lifecycle.

Configurable composite scoring the actuary can audit, with a saved preset_id per model and honest confidence on every dimension.

PropTech

The problem

PropTech tools need a single composite 'how good is this area' number for the UI, not a 12-signal forensics view. But buyers, renters and agents see different things in 'good': a family cares about schools and safety, an investor cares about growth and yield, a business cares about footfall. One score does not fit; building four bespoke scores in-house means owning the data pipeline.

Why Scores

The four scoring profiles are exactly those four audiences. One endpoint, one call, four UX flavours by parameter. The engine is deterministic, so the score is stable for a given postcode + profile across deploys, so cached UI states stay coherent. Components plus weights plus confidence come back in every response.

Their value

Four audience-matched scores from one endpoint, no in-house pipeline. Deterministic + stable for caching. Transparency on demand (drill into the five dimensions) without a second API roundtrip.

One endpoint, four audience-tuned composite scores, deterministic enough to cache and transparent enough to drill into.

CRE and site selection

The problem

A CRE site-selection workflow needs to compare hundreds of candidate locations on a consistent yardstick: footfall demand, competition density, transport access, local spending power, commercial costs. Most data vendors stop at single-signal lookups; rolling them into a defensible score is the analyst's problem.

Why Scores

POST /v1/score with the commercial site-selection profile returns exactly the five dimensions a site-selection analyst needs, with weights the team can override per portfolio class or save once via preset_id. Every response carries per-dimension confidence + the deterministic engine version, so the committee paper has a defensible methodology pointer.

Their value

Purpose-built commercial-workflow dimensions instead of a generic composite. Configurable weights per portfolio class. Defensible methodology cite. Free of the monthly report quota: score thousands of candidates at the per-key rate limit.

A purpose-built commercial site-selection score with per-portfolio weights and a methodology cite you can put in the committee paper.

Public sector

The problem

A council planning team or regeneration body needs a consistent way to triage LSOAs across a borough. They do not need an AI narrative; they need a reproducible, methodology-documented number that survives FOI scrutiny and the next procurement review.

Why Scores

POST /v1/score with the research baseline profile is the general-purpose composite. The engine is deterministic: same postcode + profile equals the same score across deploys. The methodology changelog is published and engine_version is stamped on every response. An FOI request can be answered by pointing at the version.

Their value

FOI-defensible methodology trail. Reproducible across deploys and procurement cycles. Researcher-tuned default preset that does not bias toward commercial or investor lenses.

A reproducible, methodology-documented composite for triaging areas at the LSOA level, built for the procurement notice and the FOI request.

Configurable composite scoring, version-stamped and deterministic.

Four presets, each with its own five dimensions. Override weights per request or save them as a per-org preset. AI never touches the scoring path. The methodology version is on every response, both body and header.