Developer platform

The UK property API where every number shows its source

Area intelligence, property reports, EPC, sold-price comparables and published indices — over REST and MCP with one key. Every section carries machine-readable provenance: source, licence, vintage, and a methodology page where one exists. Built for applications and AI agents that have to show their working.

Free tier: 250 credits/month, no card. Paid plans from £29/month, no contracts — pricing.

REST

One key, one curl

Query by UPRN (preferred), postcode, or outcode. Responses are address-light by default — facts and identifiers, never bulk address data.

curl -H "Authorization: Bearer ppa_live_YOUR_KEY" \
  "https://postcodeproperty.ai/api/v1/property?uprn=100021082254"

Model Context Protocol

Remote MCP for agents

The same data as 8 read-only tools on the same credit meter. Works in Claude Code, Cursor, and any Streamable HTTP client.

{
  "mcpServers": {
    "postcodeproperty": {
      "url": "https://postcodeproperty.ai/mcp",
      "headers": {
        "Authorization": "Bearer ppa_live_YOUR_KEY"
      }
    }
  }
}

Endpoints & credits

Calls are metered in weighted credits; X-Credits-* headers report your allowance on every response. Sandbox keys (ppa_test_…) return canned fixtures on area and investment-score only — no quota, no live data. The other endpoints answer a test key with 400 test_fixture_unavailable, and the MCP server requires a live key.

EndpointCreditsWhat you get
GET /api/v1/area1Area report: score, crime, schools, transport, broadband, flood, prices, trends, rental, healthcare, amenities, demographics, air quality, planning.
GET /api/v1/investment-score1The 1–10 score with weighted breakdown and completeness.
GET /api/v1/property5Flagship: property-grade report by UPRN or postcode — EPC, sale history, council tax estimate, risk, area context. +2 credits for address-string resolution (paid plans).
GET /api/v1/comparables2Recent sold prices around a postcode (exact-outcode) with stats. Max 100 rows/call.
GET /api/v1/epc1EPC certificate attributes by UPRN or postcode, newest first.
GET /api/v1/coverage0Free pre-flight: which datasets hold data here, before you spend credits.
POST /api/v1/compare1/postcodeCompare 2–5 areas with honest data-backed verdicts.
POST /api/v1/summary10AI summary of our cached area data (no client-supplied prompts).
GET /api/v1/metrics/{metric}1Published indices (green-premium live; more publish with their methodology pages).
GET /api/v1/rankings1Persona outcode rankings — investor, family or young_professional — rank-ordered nationally, recomputed twice monthly. Optional region prefix filter; up to 250 rows/call. meta.attribution carries the licence statements for that persona’s inputs (OSM/ODbL for young-professional nightlife).

MCP tools mirror these on the same meter: get_area_reportget_investment_scoreget_property_reportget_comparablesget_epccheck_coveragecompare_areasget_metric

Playground

Calls run from your browser with your own key — create one free in under a minute.

Provenance is the product

Every section names its source, licence and vintage; meta.attribution carries the exact statements to reproduce when republishing; cached serves are disclosed in meta.cache, and failures are honest unavailableSources — never confident zeros.

"crime": {
  "level": "average",
  "summary": "…",
  "provenance": {
    "source": "police.uk street-level crime",
    "licence": "OGL-v3",
    "asOf": "2026-08",
    "note": "Police.uk publishes with a ~2-month lag…"
  }
},
"meta": {
  "sourceCompleteness": 100,
  "vintages": { "crime": "2026-08", "housePrices": "2026-08", … },
  "attribution": [ { "source": "HM Land Registry", "statement": "…" } ],
  "cache": { "hit": true, "age_seconds": 312, "tier": "memory" }
}

Rate limits & errors

Two limits apply to every key: a per-minute burst rate and your plan's monthly credit allowance. Both come back as 429s you tell apart by the error code — every v1 error uses the same envelope, { "error": "…", "message": "…" }. A per-IP guard applies on top, in two tiers: requests without an Authorization header are capped at 120 requests/minute per IP; requests carrying one are capped at 600 — above every plan ceiling.

PlanRequests/minCredits/month
Free30250
Developer603,000
Growth12020,000
Scale300100,000
StatusCodeWhat it means
401invalid_api_keyMissing, malformed or revoked key.
403insufficient_scopeThe key lacks the scope this endpoint requires.
429rate_limitedPer-minute burst limit hit. Carries Retry-After: 60; per-key 429s also carry X-RateLimit-Limit — back off and retry.
429usage_limit_exceededMonthly credit allowance exhausted. Carries X-Credits-Limit, X-Credits-Used and X-Credits-Remaining: 0 — no Retry-After, because credits return when your billing window rolls (or you upgrade), not after a wait.

Every metered success carries X-Credits-Limit, X-Credits-Used, X-Credits-Remaining and X-RateLimit-Limit, so you never have to guess where your allowance stands.

There is no cursor pagination — responses are capped instead, and say so: comparables returns at most 100 rows (with a truncated flag when more exist), epc at most 100 certificates newest-first, and compare accepts at most 5 postcodes. If a cap bites, narrow the query.

Versioning & changelog: additive changes — new fields, new endpoints, new MCP tools — ship within v1 without notice; breaking changes get a new versioned path and 90 days' notice on the changelog.