API v1.0.0

API Documentation

Build with London's property scoring data. RESTful JSON endpoints, simple API key auth, and predictable responses.

5Scoring Dimensions
16London Boroughs
215+Postcodes
431Property Listings

Quick start

1

Get an API key

Generate an API key from the API key page. Pass it in the x-api-key header.

2

Base URL

All endpoints are relative to https://api.localpinned.co.uk/api.

3

JSON responses

Every response is JSON. Set Content-Type: application/json in your requests.

Example request

curl -X GET https://api.localpinned.co.uk/api/scores/postcode/WC1 \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json"

Endpoints

GET/properties/postcode/:postcode

Get property listings and scores for a specific postcode.

{
  "postcode": "WC1",
  "propertyCount": 2,
  "averageScore": 81,
  "properties": [ ... ]
}
GET/properties/boroughs

Get all London boroughs with average scores and property counts.

{
  "boroughs": [
    { "name": "City of London", "propertyCount": 8, "averageScore": 82.3 }
  ],
  "total": 16
}
GET/properties/postcodes

Get all postcodes with average scores and borough mapping.

{
  "postcodes": [
    { "postcode": "WC1", "borough": "Westminster", "propertyCount": 2, "averageScore": 81 }
  ],
  "total": 215
}
GET/properties/searchAPI key required

Search properties by score, rent, borough, bedrooms, and type. Requires API key.

NameTypeRequiredDescription
minScorenumberNoMinimum overall score (0-100)
maxScorenumberNoMaximum overall score (0-100)
minRentnumberNoMinimum monthly rent in GBP
maxRentnumberNoMaximum monthly rent in GBP
boroughstringNoFilter by borough name
bedroomsnumberNoNumber of bedrooms
propertyTypestringNoRoom, studio, 1-bed flat, 2-bed flat, 3-bed flat, house
curl -X GET "https://api.localpinned.co.uk/api/properties/search?minScore=70&maxRent=2000&borough=Westminster" \
  -H "x-api-key: YOUR_API_KEY"
GET/propertiesAPI key required

List all properties with pagination. Requires API key.

NameTypeDefaultDescription
pagenumber1Page number
limitnumber50Items per page
curl -X GET "https://api.localpinned.co.uk/api/properties?page=1&limit=20" \
  -H "x-api-key: YOUR_API_KEY"
GET/commute/analyzeAPI key required

Analyze commute times from an origin to one or more destinations.

NameTypeRequiredDescription
originstringYesOrigin postcode or address
destinationsstringYesComma-separated destination postcodes
modestringNotransit, driving, walking, bicycling
curl -X GET "https://api.localpinned.co.uk/api/commute/analyze?origin=SW1A&destinations=EC1A,E14&mode=transit" \
  -H "x-api-key: YOUR_API_KEY"
GET/commute/routeAPI key required

Get detailed route information between two points.

NameTypeRequiredDescription
originstringYesOrigin postcode or address
destinationstringYesDestination postcode or address
modestringNotransit, driving, walking, bicycling
curl -X GET "https://api.localpinned.co.uk/api/commute/route?origin=SW1A&destination=EC1A&mode=transit" \
  -H "x-api-key: YOUR_API_KEY"
GET/scores/postcode/:postcode

Get the full score-system data for a postcode, including all five dimension scores and raw details.

{
  "postcode": "WC1",
  "area": "Bloomsbury",
  "borough": "Westminster",
  "scores": {
    "amenities": 95,
    "commute": 95,
    "safety": 90,
    "value": 30,
    "transport": 95,
    "overall": 81
  }
}
GET/scores

Get a summary of all scored postcodes with overall and dimension scores.

{
  "scores": [ ... ],
  "total": 215
}

Get Your Free API Key

Start with 1,000 requests/month. Free API key.

Create Free API Key

Rate Limits

1,000Free / month
10,000Pro / month
100,000Enterprise / month

Limits are tracked per API key. Public endpoints (/api/scores, /api/scores/postcode/:postcode, /api/properties/postcode/:postcode, /api/properties/boroughs, /api/properties/postcodes) do not require a key. Authenticated endpoints (/api/properties/search, /api/properties, /api/commute/*) require a key with the right scope.

Code Examples

const response = await fetch('https://api.localpinned.co.uk/api/scores/postcode/WC1', {
  headers: {
    'x-api-key': 'YOUR_API_KEY',
    'Content-Type': 'application/json'
  }
});

const data = await response.json();
console.log(data.scores.overall); // 81
import requests

response = requests.get(
    'https://api.localpinned.co.uk/api/scores/postcode/WC1',
    headers={'x-api-key': 'YOUR_API_KEY'}
)

data = response.json()
print(data['scores']['overall'])  # 81
<?php
$ch = curl_init('https://api.localpinned.co.uk/api/scores/postcode/WC1');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
  'x-api-key: YOUR_API_KEY',
  'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
$data = json_decode($response, true);
echo $data['scores']['overall']; // 81
package main

import (
    "fmt"
    "net/http"
    "io"
)

func main() {
    req, _ := http.NewRequest("GET", "https://api.localpinned.co.uk/api/scores/postcode/WC1", nil)
    req.Header.Set("x-api-key", "YOUR_API_KEY")
    resp, _ := http.DefaultClient.Do(req)
    body, _ := io.ReadAll(resp.Body)
    fmt.Println(string(body))
}
curl -X GET https://api.localpinned.co.uk/api/scores/postcode/WC1 \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json"

Error Codes

StatusMeaningHow to fix
200OKRequest succeeded.
400Bad RequestCheck query parameters or request body.
401UnauthorizedInclude a valid x-api-key header.
403ForbiddenInvalid API key or insufficient scope.
404Not FoundPostcode or resource does not exist.
429Rate LimitedReduce request rate or upgrade your plan.
500Server ErrorRetry later or contact support.

Questions?

Get help with integration, custom plans, or volume discounts.

Book a meeting