Commercial Ownership API

Find the company that owns a commercial property in England and Wales, with its Companies House profile and people with significant control

REST API
JSON Responses
API Key Authentication

Commercial ownership API overview

Send a non-domestic EPC certificate number, a UPRN, or an address and postcode. The API returns the matched non-domestic EPC, the company that owns the property in HM Land Registry's UK companies (CCOD) and overseas companies (OCOD) datasets, and the Companies House profile and current people with significant control (PSCs) for each owner company.

  • Non-domestic EPC fields: rating, band, property type, building environment, main heating fuel, floor area and dates
  • Land Registry titles: title number, tenure, property address, and each owner's name, company number, category and address
  • Companies House: company status, type, incorporation date, SIC codes and registered office
  • Current PSCs: individuals, corporate entities and legal persons
  • Match method and confidence for the EPC and for the ownership lookup

Coverage is England and Wales. The Land Registry ownership datasets do not include Scotland.

Authentication

All requests to the Commercial Ownership 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

Never expose your API key in client-side code. Always make API calls from your server-side application to protect your credentials.

Commercial ownership API endpoint

GET/api/v1/property/commercial-ownership

Find the owner of a commercial property

Base URL

https://propertyinsights.co.uk/api/v1/property/commercial-ownership

Query Parameters

Provide exactly one of certificate_number, uprn, or address with postcode. Any other combination returns a 400 error.

ParameterTypeDescription
certificate_numberstringNon-domestic EPC certificate number. Up to 40 letters, digits or hyphens. Use on its own.
uprnstringUnique Property Reference Number, 1 to 12 digits. Use on its own.
addressstringProperty address, up to 200 characters. Use with postcode.
postcodestringUK postcode for the address. Use with address.

Credits

This lookup needs 10 credits available before it runs, and charges 0, 2 or 10 credits depending on what it finds.

ResultCredits charged
Nothing found: no EPC and no owner0
An EPC or an owner, but no Companies House data2
Companies House data returned for at least one owner10

If your account has fewer than 10 credits left, the request is refused with a 402 error before any lookup runs.

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 headerMeaning
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.

When credits run out

If your balance is lower than the cost of a request, the API returns HTTP 402 and charges nothing. The error includes the credits needed, your balance and a link to change plan.

{
  "statusCode": 402,
  "statusMessage": "Payment Required",
  "data": {
    "success": false,
    "error": {
      "code": "INSUFFICIENT_CREDITS",
      "message": "This request costs 35 API credits. Upgrade your plan or wait for your monthly refresh: https://propertyinsights.co.uk/billing",
      "required": 35,
      "available": 12,
      "upgradeUrl": "https://propertyinsights.co.uk/billing"
    }
  }
}

Response Format

{
  "success": true,
  "data": {
    "epc": {
      "certificateNumber": "0000-0000-0000-0000-0001",
      "uprn": "100000000001",
      "assetRating": 62,
      "assetRatingBand": "C",
      "propertyType": "Retail/Financial and Professional Services",
      "buildingEnvironment": "Heating and Natural Ventilation",
      "mainHeatingFuel": "Natural Gas",
      "floorArea": 240,
      "lodgementDate": "2023-05-01",
      "validUntil": "2033-04-30"
    },
    "ownership": [
      {
        "titleNumber": "ZZ000001",
        "tenure": "Freehold",
        "propertyAddress": "Unit 4, Example Trading Estate, Exampletown (ZZ1 1ZZ)",
        "ownerType": "uk",
        "multipleAddress": false,
        "owners": [
          {
            "name": "EXAMPLE PROPERTIES LIMITED",
            "companyNumber": "00000001",
            "category": "Limited Company or Public Limited Company",
            "address": "1 Example Road, Exampletown, ZZ1 1ZZ"
          }
        ]
      }
    ],
    "companies": {
      "00000001": {
        "status": "ok",
        "profile": {
          "companyNumber": "00000001",
          "name": "EXAMPLE PROPERTIES LIMITED",
          "status": "active",
          "type": "ltd",
          "incorporatedOn": "2010-01-01",
          "sicCodes": ["68209"],
          "registeredOffice": {
            "addressLine1": "1 Example Road",
            "addressLine2": null,
            "locality": "Exampletown",
            "region": null,
            "postalCode": "ZZ1 1ZZ",
            "country": "England"
          }
        },
        "pscs": [
          {
            "kind": "individual",
            "name": "Ms Example Person",
            "naturesOfControl": ["ownership-of-shares-75-to-100-percent"],
            "notifiedOn": "2016-04-06",
            "countryOfResidence": "England"
          }
        ]
      }
    },
    "match": {
      "epc": { "method": "certificate_number", "confidence": 100, "ambiguous": false, "truncated": false },
      "ownership": { "method": "fuzzy", "confidence": 80, "ambiguous": false, "truncated": false }
    }
  }
}

Fields

  • epc is the matched non-domestic EPC, or null. It leaves out the EPC register's address and postcode. The address shown is the Land Registry title's propertyAddress.
  • ownership lists every Land Registry title at the best match. ownerType is uk (CCOD) or overseas (OCOD). Overseas owners also have countryIncorporated.
  • companies is always present and is an empty object when no company was looked up. It is keyed by company number, matching the numbers in ownership. Each entry has a status of ok, not_found, rate_limited or error. profile and pscs are null unless the status is ok. Companies House data is cached for up to 30 days.
  • pscs lists current PSCs only. Each has a kind: individual, corporate, legal_person or super_secure (details withheld by Companies House).
  • Individual PSCs show only name, nature of control, notified date, country of residence and kind. There is no date of birth, nationality or address.
  • Corporate and legal person PSCs show name, registration number, legal form, nature of control and notified date.

Matching and confidence

match.epc and match.ownership each have method, confidence (0 to 100), ambiguous and truncated.

  • When you send a certificate_number or uprn, the ownership lookup uses the matched EPC's address. If you send an address, your address is used for ownership.
  • Matches below a confidence of 60, including ambiguous or truncated ones, are returned in ownership with their flags set, but they are not looked up at Companies House, so companies is empty. They cost 2 credits.
  • ambiguous is true when the best matches describe different addresses. truncated is true when a postcode had too many records to check them all. Both lower the confidence.
  • A title that covers several addresses (multipleAddress) caps the confidence at 70.
  • Overseas owners are looked up at Companies House only when their registration number starts with OE, FC or BR. Other overseas numbers are home-country numbers and are not looked up.

What it does not cover

  • Asset managers and managing agents. The owner is the registered proprietor at HM Land Registry, which is often a holding company.
  • Contact details and email addresses.
  • Company officers such as directors and secretaries. Only people with significant control are returned.
  • Properties owned by individuals. The Land Registry company datasets list company owners only.
  • Scotland.

Examples

Look up by address and postcode

curl -X GET "https://propertyinsights.co.uk/api/v1/property/commercial-ownership?address=Unit%204%2C%20Example%20Trading%20Estate%2C%20Exampletown&postcode=ZZ1%201ZZ" \
  -H "x-api-key: YOUR_API_KEY"

Look up by UPRN

curl -X GET "https://propertyinsights.co.uk/api/v1/property/commercial-ownership?uprn=100000000001" \
  -H "x-api-key: YOUR_API_KEY"

Look up by EPC certificate number

curl -X GET "https://propertyinsights.co.uk/api/v1/property/commercial-ownership?certificate_number=0000-0000-0000-0000-0001" \
  -H "x-api-key: YOUR_API_KEY"

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 CodeError CodeDescription
400INVALID_INPUTProvide exactly one of certificate_number, uprn, or address with postcode
400INVALID_CERTIFICATE_NUMBERcertificate_number must be up to 40 letters, digits or hyphens
400INVALID_UPRNuprn must be 1 to 12 digits
400MISSING_ADDRESSaddress is required with postcode
400MISSING_POSTCODEpostcode is required with address
400INVALID_ADDRESSaddress must be 200 characters or fewer
400INVALID_POSTCODEpostcode must be a valid UK postcode
401AUTHENTICATION_REQUIREDValid API key is required
402INSUFFICIENT_CREDITSNot enough API credits remaining to perform operation
500DATABASE_ERRORError accessing database - please try again
500INTERNAL_SERVER_ERRORAn unexpected error occurred

Error Response Format

{
  "success": false,
  "error": {
    "code": "INVALID_INPUT",
    "message": "Provide exactly one of certificate_number, uprn, or address with postcode."
  }
}

Need Help?

If you have questions about the Commercial Ownership API or need help with implementation, contact our team.

Contact Support