API DocsProperty Market Intel
Getting StartedServiced AccommodationPricing
API Reference
1. Property Identity & Lookup
2. Valuations & Pricing
3. Rental Market Intelligence
4. Serviced Accommodation
5. Listings & Sourcing
6. Location Intelligence
7. Environmental & Risk
8. Planning & Regulatory
9. Account & Platform
Free Tier

Get 100 credits free, no card required. Try every endpoint with your own key.

Get a free keyNo credit card · cancel anytime

MCP Server

Live

Connect any AI assistant or agent to the PMI API using the Model Context Protocol, Anthropic's open standard for tool calling. One URL, one Bearer token, 28 tools for the LLM to choose from.

Endpointhttps://pmi-api-beta-7tvvt.ondigitalocean.app/mcp
TransportStreamable HTTP
AuthBearer pmi_live_…
Tools28 (one per REST endpoint)

Why MCP?

If you're building anything where an LLM needs UK property data (investor agents, lead-gen widgets, due-diligence copilots, valuation chatbots), MCP is the fastest path. Instead of writing REST integration code, you give the LLM a single connection URL and it figures out which tool to call.

Without MCPWith PMI MCP
Write 28 tool definitions, 28 schemas, 28 wrapper functionsOne URL, zero schema work
Every new endpoint = code change, test, deployAdd a tool to PMI, all clients see it instantly
Each AI client (Claude, ChatGPT, Cursor) needs its own integrationOne server, every client speaks MCP
You handle auth, billing, rate limitsAll inherited from your existing PMI API key

How it works

Once you've connected PMI to your AI assistant, it works like this:

You ask a question in plain English

“What’s the rental yield in LS6?” or “Find me 3-bed flats under £200k in Manchester with yields above 7%.”

Your AI works out which PMI tools to use

The model picks one or more of our 28 tools (yields, comparables, listings, planning, risks, etc.) and calls them in the right order, no coding from you.

You get an answer in seconds

The AI gets back live PMI data and weaves it into a normal reply. Credits come off your monthly allowance, exactly the same as if you’d called the REST API yourself.

No new dashboard, no new login, no second invoice. If you can use Claude or ChatGPT, you can use PMI through MCP.

What you get

  • 28 tools: one per REST endpoint, including all Serviced Accommodation tools.
  • Pass-through auth: your existing PMI API key works unchanged.
  • Same billing: MCP tool calls deduct from the same monthly credit allowance as REST calls. They appear in /v1/account/usage under the same endpoint names.
  • Same rate limit: your tier's per-10-second cap applies whether the request comes via REST or MCP.
  • Streamable HTTP: modern transport supported by Claude Desktop, Cursor, ChatGPT, and the official MCP SDKs in Python and TypeScript.

Tools available (28)

Same names and credit cost as the REST endpoints. When the LLM picks one, it sees:

ToolPath it proxiesCredits
pmi_search_address/addresses/search1
pmi_match_address/addresses/match1
pmi_get_property/properties/{uprn}1
pmi_valuation_sale/valuations/{uprn}/sale3
pmi_valuation_rental/valuations/{uprn}/rental3
pmi_valuation_hmo/valuations/{uprn}/hmo5
pmi_valuation_development_gdv/valuations/development-gdv5
pmi_comparables_by_uprn/prices/{uprn}/comparables5
pmi_comparables_by_location/prices/comparables5
pmi_area_market_prices/prices/market2
pmi_rents_long_term/rents/long-term2
pmi_rents_hmo/rents/hmo2
pmi_rents_lha/rents/lha1
pmi_rents_yields/rents/yields2
pmi_rents_demand/rents/demand2
pmi_str_market/str/market3
pmi_str_revenue_estimate/valuations/str-estimate50
pmi_search_listings/listings1
pmi_nearby_schools/location/schools1
pmi_nearby_infrastructure/location/infrastructure2
pmi_area_profile/location/profile2
pmi_property_risks/risks/{uprn}8 (or 1 per type)
pmi_planning_applications/planning/applications2
pmi_hmo_register/planning/hmo-register2
pmi_property_title/property/title/{title_number}3
pmi_account_info/account0
pmi_account_usage/account/usage0
pmi_api_status/status0

What you can ask

Once PMI is connected, you stop reaching for the dashboard. You just ask the AI you already use. Here are the kinds of questions that work well:

Sourcing & deal hunting

In Claude or ChatGPT

“Find me 3-bed houses for sale under £200k in Leeds outcodes LS4, LS6 and LS11. For each one, give me the area’s average rent, gross yield and tenant demand score, then rank them by yield.”

What happens: The AI calls pmi_search_listings, then loops pmi_rents_long_term, pmi_rents_yields and pmi_rents_demand for each one. Comes back with a ranked shortlist in one reply. Five minutes of work compressed into one prompt.

Rental market analysis

In Claude or ChatGPT

“How does tenant demand in Salford compare to Manchester city centre? Show me HMO room rents, LHA rates, and which postcodes inside each are the strongest performers.”

What happens: The AI pulls pmi_rents_demand, pmi_rents_hmo and pmi_rents_lha for both areas, then the strongest sub-postcodes. You get a side-by-side narrative comparison, not raw JSON.

Property due diligence

In Claude or ChatGPT

“I’m thinking about buying 17 Park Terrace, Edinburgh EH8. Give me the AVM, recent sold comparables, planning applications in the last 2 years, flood risk and the nearest schools.”

What happens: The AI uses pmi_match_address to find the UPRN, then calls pmi_valuation_sale, pmi_comparables_by_uprn, pmi_planning_applications, pmi_property_risks and pmi_nearby_schools. A full one-page DD report in 30 seconds.

Serviced accommodation feasibility

In Claude or ChatGPT

“What would a 2-bed flat near BA1 1 earn as a short-let? Show me ADR, occupancy, and how it compares to long-let income for the same property.”

What happens: The AI calls pmi_str_revenue_estimate and pmi_str_market for the SA side, then pmi_rents_long_term for the long-let comparison. You get the side-by-side and a recommendation, in one go.

Inside Cursor (for technical users)

In Cursor while coding

“Use the PMI tools to pull the AVM and 5 sold comparables for UPRN 100023336956, then write a Python function that does the same lookup for any UPRN I pass in.”

What happens: Cursor calls the PMI tools to verify the data shape, then writes you a working Python wrapper. You can chat with the API and build against it in the same window.

Build it into your own product

Via the OpenAI or Anthropic API

Add a “What would my property earn?” chatbot to a property management website. Owner types their address, the AI calls pmi_str_revenue_estimate, returns the projection plus a “book a consultation” CTA.

Why it works: No REST integration code, no schema files. The AI handles the tool calls. You handle the conversation. Around 35p per estimate, typically \u00A3140\u2013\u00A3200 LTV per converted client.

See it in action

If you've never set up an MCP server before, these public walkthroughs from other providers show what the experience looks like. Most installs are 30 seconds and one config-file edit. The PMI setup is identical: same JSON shape, just our URL and your key.

Quick Setup Guide

1

Get your API key

Every PMI account has an API key. Find yours under Account → API Keys in the dashboard. The free tier comes with 100 credits a month, enough to try every tool.

2

Configure your AI client

Add PMI to your AI client's MCP configuration. Pick your client below for a copy-paste config.

Edit claude_desktop_config.json (Settings → Developer → Edit Config), add the PMI block, then fully quit and reopen Claude Desktop.

claude_desktop_config.json
{
  "mcpServers": {
    "pmi": {
      "type": "http",
      "url": "https://pmi-api-beta-7tvvt.ondigitalocean.app/mcp",
      "headers": {
        "Authorization": "Bearer pmi_live_YOUR_KEY_HERE"
      }
    }
  }
}
3

Start asking questions

Once it's connected, ask your AI assistant about UK property data. Try things like:

“What's the rental yield in LS6, and is the area growing in demand?”
“Get me the AVM and 5 sold comparables for UPRN 100023336956.”
“What's the projected STR revenue for a 2-bed flat in BA1 1?”
“Find chain-free 3-bed properties under £200k in LS6 with yield > 7%.”

Testing your connection

If a tool isn't behaving, run these cURL commands directly against the server to confirm everything's wired up correctly.

1. Health check (no auth)

The simplest “is the server alive?” check. No API key needed, plain JSON response.

cURL
curl https://pmi-api-beta-7tvvt.ondigitalocean.app/health

Expected response:

{"status":"ok"}

2. List available tools (free, requires API key)

Returns the full schema of all 28 tools. No credits used.

cURL
curl -X POST https://pmi-api-beta-7tvvt.ondigitalocean.app/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "Authorization: Bearer pmi_live_YOUR_KEY" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'
About the response format. The MCP server speaks Streamable HTTP, so the response comes back as an SSE stream (lines prefixed with event: message and data: { ... }), not plain JSON. MCP clients like Claude Desktop, ChatGPT, and the official MCP SDK parse this automatically. If you're testing with raw cURL, you'll see the SSE wrapping. That's expected.

3. Call a tool (uses credits)

Example: get the rental yield for outcode LS6 (2 credits).

cURL
curl -X POST https://pmi-api-beta-7tvvt.ondigitalocean.app/mcp \
  -H "Content-Type: application/json" \
  -H "Accept: application/json, text/event-stream" \
  -H "Authorization: Bearer pmi_live_YOUR_KEY" \
  -d '{"jsonrpc":"2.0","id":1,"method":"tools/call",
       "params":{"name":"pmi_rents_yields","arguments":{"outcode":"LS6"}}}'
POST only on the /mcp endpoint. GET requests to /mcp return 405 Method Not Allowed by design. The /health endpoint above accepts GET as you'd expect.

Technical reference

Server information

Endpoint URLhttps://pmi-api-beta-7tvvt.ondigitalocean.app/mcp
ProtocolMCP over HTTP (Streamable HTTP transport)
AuthenticationAPI key via Authorization: Bearer header
Server namepmi
Version1.0.0

Location inputs

Most location-based tools accept input in one of these formats. Provide only ONE per request:

uprnUnique Property Reference Number, e.g. 100023336956 (use pmi_match_address to find one)
postcodeFull UK postcode, e.g. SW1A 1AA
outcodePostcode prefix, e.g. LS6 or SW1
lat, lng, radius_mCoordinates with a radius in metres
polygonGeoJSON polygon for custom area boundaries

Building your own agent?

If you're rolling your own MCP client, the minimal connection sequence is initializetools/listtools/call. Same Bearer token throughout.

Auth, billing & limits

  • Auth: standard Authorization: Bearer <api_key> header. Same key as REST.
  • Credits: deducted on 2xx tool responses. Same credit weights as the REST endpoints (see table above). All MCP usage shows up in GET /v1/account/usage under the existing endpoint names. There's no separate “MCP usage” view.
  • Rate limit: per-10-second window, scoped to your API key. MCP and REST share the same bucket.
  • Errors: MCP tool responses always come back as text (success or readable error). 401, 402, 429, 404 from the REST API become natural-language messages the LLM can quote.

FAQ

Do MCP calls cost more than REST calls?

No, same credit weights, same bucket.

Can I disable MCP for my key?

Not currently. If you don’t connect any client, you’ll generate zero MCP traffic. Get in touch if you need this.

Is there a separate API key for MCP?

No, your existing pmi_live_… key works. Best practice: create a dedicated key per client (Claude Desktop on your laptop, your production agent, etc.) so you can rotate or revoke them independently.

What about latency?

Add ~30–50ms for the MCP-to-REST hop on top of the underlying endpoint’s latency. The MCP server is in the same DigitalOcean region as the REST API.

Streamable HTTP vs SSE vs stdio?

PMI only exposes Streamable HTTP, the modern, supported transport. SSE is deprecated in MCP, and stdio doesn’t make sense for a hosted SaaS.

Troubleshooting

You seeLikely causeFix
401 from a tool callMissing or invalid Bearer tokenCheck the Authorization header is Bearer pmi_live_…
402 from a tool callMonthly credit allowance exhaustedUpgrade your plan in the dashboard or wait for the next cycle
429 from a tool callRate limit hitWait 10 seconds before retrying
Client connects but lists 0 toolsClient doesn’t support Streamable HTTP, or auth header isn’t sentConfirm transport is http (not sse / stdio); check headers
Client hangs on initializeTrailing-slash mismatch (clients sometimes auto-redirect)Ensure URL has no trailing slash: …ondigitalocean.app/mcp