Area Sold Prices API
Complete sold price history for any UK postcode area, with filtering by postcode, street, property type, price range, and pagination
Overview
The Area Sold Prices API provides access to the complete Land Registry Price Paid dataset for any UK postcode area. Unlike the radius-based Sold Prices API, this endpoint queries directly from our database of millions of property transactions, supporting pagination, street-level filtering, and comprehensive query options.
Data included in the response:
- Individual sold prices — full address, price, date, property type, new build status, estate type (freehold/leasehold), street, town, district, and county
- Summary statistics — total results, average price, median price, price range, and breakdown by property type
- Pagination — offset-based pagination for iterating through large result sets
This API is ideal for:
- Bulk analysis of sold prices across an entire postcode area
- Market research tools comparing areas or streets
- Property investment analysis with granular filtering
- Data pipelines requiring paginated access to sold price data
- Street-level price analysis within an area
How is this different from the Sold Prices API? The Sold Prices API uses a radius-based search around a postcode via the Land Registry SPARQL endpoint. This Area Sold Prices API queries our complete local database of Land Registry Price Paid records by postcode area, offering higher result limits, pagination, and street-level filtering.
Authentication
All requests to the Area Sold Prices API require authentication using an API key. You can obtain your API key from your PropertyInsights dashboard after subscribing to an API plan.
Include your API key in the request header as follows:
X-API-Key: your_api_key_here
Security Warning
Endpoints
Base URL
https://propertyinsights.co.uk/api/v1/
Get Area Sold Prices
/area/sold-prices
Returns sold prices for a postcode area with optional filtering by postcode, street, property type, price range, and new build status. Supports pagination via offset and limit parameters.
Request Parameters
| Parameter | Required | Type | Description |
|---|---|---|---|
| area | Required* | String | Postcode area code (e.g. "SW1", "M1", "BS8") |
| postcode | Required* | String | Full UK postcode (e.g. "SW1A 1AA"). Area is inferred and results are filtered to this exact postcode. |
| street | Optional | String | Street name filter (partial match, case-insensitive) |
| months | Optional | Integer | Lookback period in months (default: 24, max: 360) |
| limit | Optional | Integer | Maximum results to return (default: 100, max: 500) |
| offset | Optional | Integer | Pagination offset (default: 0) |
| type | Optional | String | Property type: D (Detached), S (Semi-Detached), T (Terraced), F (Flat), O (Other) |
| minPrice | Optional | Integer | Minimum sold price filter in GBP |
| maxPrice | Optional | Integer | Maximum sold price filter in GBP |
| newBuild | Optional | Boolean | Filter to new builds only when set to true |
* Either area or postcode is required. If postcode is provided, the area is extracted automatically and results are filtered to that exact postcode. You can combine area with street for street-level analysis within an area.
Billing details in the response
Successful chargeable JSON responses include a top-level billing object. The endpoint examples on this page focus on the endpoint-specific data, so this repeated block may not be shown in every example.
"billing": {
"mode": "prepaid",
"creditsCharged": 1,
"creditsRemaining": 1999,
"creditsRefreshAt": "2026-08-14T09:30:00.000Z"
}| Field or header | Meaning |
|---|---|
| billing.creditsCharged X-Credits-Charged | Credits charged by this call. Failed and non-chargeable calls return 0 in the header. |
| billing.creditsRemaining X-Credits-Remaining | The credit balance after the call. |
| billing.creditsRefreshAt X-Credits-Refresh-At | The next monthly credit refresh as an ISO 8601 timestamp. Trial and non-renewing balances return null and omit the header. |
All authenticated API-key calls expose the billing headers, including validation errors and zero-credit status or management requests. Only successful chargeable JSON responses add the billing object to the response body.
Response Format
The response is returned in JSON format with the following structure:
{
"success": true,
"data": {
"area": "SW1",
"postcode": null,
"street": null,
"period": "24 months",
"totalResults": 1250,
"returned": 100,
"offset": 0,
"summary": {
"averagePrice": 850000,
"medianPrice": 725000,
"priceRange": { "min": 150000, "max": 5200000 },
"byPropertyType": {
"D": { "count": 45, "avgPrice": 1200000 },
"S": { "count": 120, "avgPrice": 650000 },
"T": { "count": 310, "avgPrice": 580000 },
"F": { "count": 775, "avgPrice": 420000 }
}
},
"properties": [ ... ]
}
}properties (array)
Each item represents a single property sale from the Land Registry.
{
"address": "12 High Street, London, SW1A 1AA",
"postcode": "SW1A 1AA",
"price": 750000,
"date": "2025-06-15",
"propertyType": "T",
"newBuild": false,
"estateType": "Freehold",
"street": "High Street",
"town": "London",
"district": "Westminster",
"county": "Greater London"
}Property Type Codes
| Code | Property Type |
|---|---|
| D | Detached |
| S | Semi-Detached |
| T | Terraced |
| F | Flat/Maisonette |
| O | Other |
Examples
Basic Area Query
GET https://propertyinsights.co.uk/api/v1/area/sold-prices?area=SW1
Full Postcode Query
GET https://propertyinsights.co.uk/api/v1/area/sold-prices?postcode=SW1A%201AA
Street-Level Search
GET https://propertyinsights.co.uk/api/v1/area/sold-prices?area=SW1&street=High%20Street&type=T
Filtered with Pagination
GET https://propertyinsights.co.uk/api/v1/area/sold-prices?area=M1&type=F&minPrice=100000&maxPrice=300000&limit=50&offset=100
cURL Example
curl -X GET \ "https://propertyinsights.co.uk/api/v1/area/sold-prices?area=BS8&months=12&type=D&limit=50" \ -H "x-api-key: YOUR_API_KEY"
Error Handling
The API uses standard HTTP status codes to indicate the success or failure of requests.
| Code | Error Code | Description |
|---|---|---|
| 400 | MISSING_AREA_OR_POSTCODE | Either area or postcode parameter is required |
| 400 | INVALID_AREA | Invalid postcode area format |
| 400 | INVALID_PROPERTY_TYPE | Property type must be D, S, T, F, or O |
| 401 | UNAUTHORIZED | API key is missing or invalid |
| 402 | INSUFFICIENT_CREDITS | Insufficient API credits to process this request |
| 500 | DATABASE_ERROR | An error occurred while querying sold prices |
Error Response Example
{
"success": false,
"error": {
"code": "MISSING_AREA_OR_POSTCODE",
"message": "Either area or postcode parameter is required"
}
}Need Help?
If you need assistance with implementation or have questions about the API, our support team is here to help.