EPC Search API
Search official UK Energy Performance Certificate (EPC) data for residential and non-domestic properties
Overview
The EPC Search API provides comprehensive access to official UK Energy Performance Certificate data for both domestic (residential) and non-domestic (commercial) properties. Our API integrates with the UK Government's official EPC database to deliver accurate, up-to-date energy performance information.
This API provides:
- Current and potential EPC ratings (A-G scale) with numeric efficiency scores
- Comprehensive property details: total floor area, built form, construction age band, tenure
- Component efficiency analysis (walls, roof, windows, main heating, lighting systems)
- Energy consumption estimates and annual cost projections
- Environmental impact indicators including CO2 emissions
- Certificate metadata with LMK keys, lodgement dates, and validity periods
- Support for both single property matches and multiple certificate scenarios
- Complete coverage of England, Wales, and Northern Ireland EPC data
UK EPC Rating Scale:
EPC Ratings
- A: 92-100 (Most efficient)
- B: 81-91 (Very efficient)
- C: 69-80 (Good)
- D: 55-68 (Average)
- E: 39-54 (Below average)
- F: 21-38 (Poor)
- G: 1-20 (Least efficient)
Key Features
- Official government EPC database
- Both domestic and non-domestic properties
- Current and potential energy ratings
- Detailed component efficiency breakdowns
- Energy cost estimates and CO2 emissions
- Fast response times (<1 second typical)
This API is ideal for:
- Property portals displaying comprehensive energy performance data
- Estate agents providing detailed property information to buyers
- Mortgage lenders assessing property energy efficiency for green mortgages
- Property investment analysis platforms evaluating long-term costs
- ESG reporting and sustainability analytics applications
- Lettings platforms ensuring EPC compliance for rental properties
- Energy consultancy firms conducting efficiency assessments
- Government and local authority planning applications
Important Note
EPC data is sourced from the official UK government database. Certificates are valid for 10 years and are required for most property sales and rentals. Always verify certificate validity dates for compliance purposes.
Authentication
All requests to the EPC Search 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/
EPC Search
/epc/search?address={address}&postcode={postcode}&uprn={uprn}Search official EPC data by postcode or UPRN, with an optional address to narrow postcode matches. Returns either a single matching certificate or multiple certificates when several EPC records exist for the same postcode, UPRN or address (e.g., different flats, updated certificates, or both domestic and non-domestic certificates). If no EPC data is found, the API returns a 404 response and no credit is deducted.
Request Parameters
GET /epc/search
Query parameters for EPC data search by postcode or UPRN, with an optional address filter.
| Parameter | Required | Type | Description |
|---|---|---|---|
| address | Optional | String | First line of the property address (e.g., "10 DOWNING STREET"). Alternative parameter name: addressLine1. Omit it to return postcode-level results. |
| postcode | Required unless uprn supplied | String | UK postcode (e.g., "SW1A 2AA") |
| uprn | Optional | String | Unique Property Reference Number. Can be supplied instead of postcode for direct EPC lookup. Only one UPRN can be searched per request. |
Address Matching: Provide the first line of the address exactly as it appears on official documents. If you only have a postcode, omit the address and the API will return postcode-level matches. If no certificates are found for the supplied postcode/address/UPRN, the request returns EPC_NOT_FOUND and is not charged.
Postcode Format: Accepts postcodes with or without spaces. Both "SW1A2AA" and "SW1A 2AA" are valid.
UPRN Lookup: When you have a UPRN, supply uprn directly. A postcode is not required for UPRN-only EPC searches.
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
All API responses are returned in JSON format. The standard response structure is as follows:
{
"success": boolean,
"data": {
"type": "domestic" | "non-domestic",
"result": { /* Single EPC certificate data */ },
"multipleResults": true, /* When multiple properties found */
"count": number,
"results": [ /* Array of latest certificate summaries */ ]
},
"error": {
"code": string,
"message": string
} // Only present if success is false
}Single EPC Certificate Response
{
"success": true,
"data": {
"type": "domestic",
"result": {
"address": "15 Example Street",
"address1": "15 Example Street",
"postcode": "SW1A 1AA",
"current-energy-rating": "C",
"current-energy-efficiency": 70,
"potential-energy-rating": "B",
"potential-energy-efficiency": 82,
"property-type": "House",
"built-form": "Detached",
"construction-age-band": "England and Wales: 1930-1949",
"tenure": "Owner-occupied",
"total-floor-area": "151.0",
"number-habitable-rooms": "6",
"number-heated-rooms": "6",
"energy-consumption-current": 193,
"energy-consumption-potential": 127,
"co2-emissions-current": 5.1,
"co2-emissions-potential": 3.4,
"environment-impact-current": 65,
"environment-impact-potential": 77,
"heating-cost-current": "831",
"heating-cost-potential": "722",
"hot-water-cost-current": "84",
"hot-water-cost-potential": "84",
"lighting-cost-current": "181",
"lighting-cost-potential": "100",
"walls-description": "Cavity wall, filled cavity",
"walls-energy-eff": "Average",
"walls-env-eff": "Average",
"roof-description": "Pitched, 300 mm loft insulation",
"roof-energy-eff": "Very Good",
"roof-env-eff": "Very Good",
"floor-description": "Suspended, no insulation (assumed)",
"windows-description": "Partial double glazing",
"windows-energy-eff": "Poor",
"windows-env-eff": "Poor",
"glazed-type": "double glazing, unknown install date",
"mainheat-description": "Boiler and radiators, mains gas",
"mainheat-energy-eff": "Good",
"mainheat-env-eff": "Good",
"hotwater-description": "From main system",
"hot-water-energy-eff": "Good",
"hot-water-env-eff": "Good",
"lighting-description": "Low energy lighting in 18% of fixed outlets",
"lighting-energy-eff": "Poor",
"lighting-env-eff": "Poor",
"mechanical-ventilation": "natural",
"building-reference-number": "10002861034",
"uprn": "100050926607",
"inspection-date": "2022-05-16",
"lodgement-date": "2022-05-16",
"lodgement-datetime": "2022-05-16 16:17:53",
"transaction-type": "marketed sale",
"lmk-key": "ceb4fa4c0d4ecbd36ed9c623397c82d70675421a809234318d745bffc63d7e23"
}
}
}Multiple EPC Certificates Response
{
"success": true,
"data": {
"type": "domestic",
"multipleResults": true,
"count": 2,
"results": [
{
"address": "15 Example Street",
"address1": "15 Example Street",
"postcode": "SW1A 1AA",
"current-energy-rating": "C",
"current-energy-efficiency": 70,
"potential-energy-rating": "B",
"potential-energy-efficiency": 82,
"property-type": "House",
"built-form": "Detached",
"construction-age-band": "England and Wales: 1930-1949",
"total-floor-area": "151.0",
"energy-consumption-current": 193,
"co2-emissions-current": 5.1,
"heating-cost-current": "831",
"hot-water-cost-current": "84",
"lighting-cost-current": "181",
"lodgement-date": "2022-05-16",
"lmk-key": "ceb4fa4c0d4ecbd36ed9c623397c82d70675421a809234318d745bffc63d7e23"
},
{
"address": "Flat 15 The Grange, 18, Example Street",
"address1": "Flat 15 The Grange",
"postcode": "SW1A 1AA",
"current-energy-rating": "D",
"current-energy-efficiency": 55,
"potential-energy-rating": "D",
"potential-energy-efficiency": 58,
"property-type": "House",
"built-form": "Enclosed End-Terrace",
"construction-age-band": "England and Wales: before 1900",
"total-floor-area": "82.72",
"energy-consumption-current": 363,
"co2-emissions-current": 5.0,
"heating-cost-current": "788",
"hot-water-cost-current": "96",
"lighting-cost-current": "57",
"lodgement-date": "2010-05-07",
"lmk-key": "481565179602010050715463972500538"
}
]
}
}Returns multiple EPC certificates only when the lookup matches different properties. Historic certificates for the same property are collapsed to the latest lodged certificate.
Client integrations must handle both data.result and data.results[]. Duplicate and historic same-property rows are collapsed before the response is returned.
Key Response Fields
| Field | Type | Description |
|---|---|---|
| type | String | Certificate type: "domestic" or "non-domestic". No-data lookups return 404 EPC_NOT_FOUND and are not charged. |
| address / address1 | String | Property address as registered with EPC |
| current-energy-rating | String | Current EPC rating (A-G scale) |
| current-energy-efficiency | Number | Current energy efficiency score (1-100) |
| potential-energy-rating | String | Potential EPC rating with improvements |
| property-type | String | Property type (House, Flat, Maisonette, etc.) |
| built-form | String | Building form (Detached, Semi-detached, Terraced, etc.) |
| construction-age-band | String | Construction period (e.g., "England and Wales: 1930-1949") |
| total-floor-area | String | Total floor area in square meters |
| energy-consumption-current | Number | Annual energy consumption (kWh/m²/year) |
| co2-emissions-current | Number | Current CO2 emissions (tonnes per year) |
| heating-cost-current | String | Annual heating costs in GBP |
| walls/roof/windows-description | String | Detailed descriptions of building components |
| *-energy-eff / *-env-eff | String | Energy and environmental efficiency ratings (Poor to Very Good) |
| lmk-key | String | Unique certificate identifier (Landmark Key) |
| lodgement-date | String | Date certificate was lodged (YYYY-MM-DD) |
| multipleResults | Boolean | True when multiple distinct properties are found for the lookup |
Complete Field List: The API returns 40+ detailed fields including component descriptions, efficiency ratings, cost breakdowns, building characteristics, and environmental impact data. All fields from the official EPC database are included when available.
Examples
Example 1: Single EPC Certificate
GET https://propertyinsights.co.uk/api/v1/epc/search?address=10%20DOWNING%20STREET&postcode=SW1A%202AA X-API-Key: your_api_key_here
{
"success": true,
"data": {
"type": "domestic",
"result": {
"address": "10, DOWNING STREET, LONDON, SW1A 2AA",
"current-energy-rating": "C",
"current-energy-efficiency": 75,
"potential-energy-rating": "B",
"potential-energy-efficiency": 85,
"total-floor-area": 250,
"property-type": "House",
"built-form": "Detached",
"construction-age-band": "1900-1929",
"tenure": "Owner-occupied",
"energy-consumption-current": 180,
"co2-emissions-current": 3.2,
"lighting-cost-current": 45,
"heating-cost-current": 890,
"hot-water-cost-current": 120,
"lmk-key": "0000-0000-0000-0000-0000",
"lodgement-date": "2024-06-10"
}
}
}Returns complete EPC data for a single property with C rating and potential for B rating improvements
Example 2: Multiple EPC Certificates
GET https://propertyinsights.co.uk/api/v1/epc/search?address=BUCKINGHAM%20PALACE&postcode=SW1A%201AA X-API-Key: your_api_key_here
{
"success": true,
"data": {
"type": "non-domestic",
"multipleResults": true,
"count": 3,
"results": [
{
"address": "BUCKINGHAM PALACE, LONDON, SW1A 1AA",
"current-energy-rating": "D",
"current-energy-efficiency": 60,
"potential-energy-rating": "C",
"potential-energy-efficiency": 70,
"lmk-key": "0000-1111-2222-3333-4444",
"lodgement-date": "2023-12-15"
},
{
"address": "BUCKINGHAM PALACE EAST WING, LONDON, SW1A 1AA",
"current-energy-rating": "C",
"current-energy-efficiency": 72,
"potential-energy-rating": "B",
"potential-energy-efficiency": 82,
"lmk-key": "1111-2222-3333-4444-5555",
"lodgement-date": "2024-01-20"
},
{
"address": "BUCKINGHAM PALACE WEST WING, LONDON, SW1A 1AA",
"current-energy-rating": "E",
"current-energy-efficiency": 45,
"potential-energy-rating": "D",
"potential-energy-efficiency": 58,
"lmk-key": "2222-3333-4444-5555-6666",
"lodgement-date": "2023-11-08"
}
]
}
}Returns multiple EPC certificates when several exist for the same address (e.g., different wings of a large building)
Example 3: UPRN Lookup
GET https://propertyinsights.co.uk/api/v1/epc/search?uprn=100041196298 X-API-Key: your_api_key_here
Returns EPC data for a specific UPRN without requiring postcode or address parameters
Example 4: cURL Request
curl -X GET \ 'https://propertyinsights.co.uk/api/v1/epc/search?address=10%20DOWNING%20STREET&postcode=SW1A%202AA' \ -H 'X-API-Key: your_api_key_here'
Example 5: JavaScript (fetch)
const response = await fetch('https://propertyinsights.co.uk/api/v1/epc/search?address=10%20DOWNING%20STREET&postcode=SW1A%202AA', {
headers: {
'X-API-Key': process.env.API_KEY
}
})
const data = await response.json()
if (data.success) {
if (data.data.multipleResults) {
console.log(`Found ${data.data.count} EPC certificates`)
data.data.results.forEach(cert => {
console.log(`${cert.address}: Rating ${cert['current-energy-rating']}`)
})
} else {
console.log(`Single EPC found: Rating ${data.data.result['current-energy-rating']}`)
}
}Error Handling
The API uses standard HTTP response codes and returns detailed error information in JSON format. All errors follow a consistent structure to help you handle them appropriately in your application.
| HTTP Code | Error Code | Description |
|---|---|---|
| 400 | MISSING_PARAMS | Postcode or UPRN parameter is required; address is optional |
| 400 | TOO_MANY_UPRNS | Only one UPRN can be searched per EPC request |
| 404 | EPC_NOT_FOUND | No EPC certificate found for the supplied postcode, address or UPRN |
| 429 | RATE_LIMITED | Too many requests - rate limit exceeded |
| 502 | EPC_LOOKUP_FAILED | Upstream EPC database service error |
| 503 | SERVICE_UNAVAILABLE | EPC service temporarily unavailable |
| 401 | AUTHENTICATION_REQUIRED | Valid API key is required |
| 402 | INSUFFICIENT_CREDITS | Not enough API credits remaining to perform operation |
| 500 | DATABASE_ERROR | Error accessing database - please try again |
| 500 | INTERNAL_SERVER_ERROR | An unexpected error occurred |
Error Response Format
{
"success": false,
"error": {
"code": "EPC_NOT_FOUND",
"message": "No EPC data found for this address"
}
}Rate Limits
API requests are subject to rate limiting based on your subscription plan. The current limits are:
| Plan | Requests per Minute | Requests per Day | Requests per Month |
|---|---|---|---|
| Basic | 10 | 500 | 5,000 |
| Standard | 30 | 2,000 | 30,000 |
| Premium | 100 | 5,000 | 100,000 |
| Enterprise | Custom | Custom | Custom |
When you exceed your rate limit, the API will return a 429 Too Many Requests response. Each response includes the following headers to help you track your usage:
X-RateLimit-Limit: [requests-per-minute limit] X-RateLimit-Remaining: [requests remaining in current window] X-RateLimit-Reset: [timestamp when limit resets]
Performance Note: EPC searches typically complete within 200-500ms, making them suitable for real-time property searches and applications.
Need Help?
If you need assistance with implementation or have questions about the EPC Search API, our support team is here to help.