Stamp Duty Land Tax (SDLT) API
Calculate UK stamp duty land tax for residential and commercial properties with the latest 2026 rates
Overview
The Stamp Duty Land Tax (SDLT) API provides accurate calculations for stamp duty taxes on property purchases in England and Northern Ireland using the latest 2026 rates. Our API handles all buyer types, surcharges, and property types with detailed breakdown calculations.
This API provides:
- Residential property SDLT calculations with 2026 rates
- Commercial property SDLT calculations
- First-time buyer relief calculations
- Additional property surcharge (5%)
- Non-UK resident surcharge (2%)
- Detailed breakdown by tax bands
Current 2026 SDLT Rates:
Residential Property
- Up to £125,000: 0%
- £125,001 - £250,000: 2%
- £250,001 - £925,000: 5%
- £925,001 - £1.5m: 10%
- Above £1.5m: 12%
Commercial Property
- Up to £150,000: 0%
- £150,001 - £250,000: 2%
- Above £250,000: 5%
This API is ideal for:
- Conveyancing software requiring automated SDLT calculations
- Estate agents providing purchase cost estimates
- Mortgage brokers calculating total transaction costs
- Property investment platforms showing tax implications
- Financial advisors and accountants
- Property portals displaying stamp duty costs
Important Note
These calculations are based on current SDLT rates for England and Northern Ireland. Scotland and Wales have different land transaction taxes. Always verify with HMRC for legal purposes.
Authentication
All requests to the SDLT 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/
Calculate SDLT
/sdlt/calculate
Calculate stamp duty land tax for a property purchase including all applicable surcharges and detailed breakdown by tax bands.
Request Parameters
POST /sdlt/calculate
Send parameters as JSON in the request body.
| Parameter | Required | Type | Description |
|---|---|---|---|
| propertyType | Required | String | Either "residential" or "commercial" |
| propertyPrice | Required | Number | Purchase price in GBP (e.g., 500000) |
| firstTimeBuyer | Optional | Boolean | True if first-time buyer (residential only). Defaults to false. |
| higherRate | Optional | Boolean | True if additional property purchase (residential only). Defaults to false. |
| ukResident | Optional | Boolean | False if non-UK resident (residential only). Defaults to true. |
Default Values: If you omit optional parameters, the API will assume: firstTimeBuyer=false, higherRate=false, ukResident=true.
Non-UK Resident: You're considered a non-UK resident if you haven't been present in the UK for at least 183 days during the 12 months before the property purchase.
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": {
// Response data varies by endpoint
},
"error": {
"code": string,
"message": string
} // Only present if success is false
}Successful SDLT Calculation Response
{
"success": true,
"data": {
"propertyPrice": 500000,
"propertyType": "residential",
"firstTimeBuyer": true,
"higherRate": false,
"ukResident": true,
"stampDuty": 10000,
"breakdown": [
{
"band": "£0 - £300,000",
"rate": "0%",
"amount": 0
},
{
"band": "£300,000 - £500,000",
"rate": "5.0%",
"amount": 10000
}
],
"surcharges": {
"additionalProperty": 0,
"nonUkResident": 0
}
}
}Response Fields
| Field | Type | Description |
|---|---|---|
| stampDuty | Number | Total SDLT amount in GBP |
| breakdown | Array | Detailed breakdown by tax bands |
| surcharges | Object | Additional surcharges applied (residential only) |
Examples
Example 1: Standard Residential Property
POST https://propertyinsights.co.uk/api/v1/sdlt/calculate
Content-Type: application/json
X-API-Key: your_api_key_here
{
"propertyType": "residential",
"propertyPrice": 295000,
"firstTimeBuyer": false,
"higherRate": false,
"ukResident": true
}Result: £4,750 SDLT (£0 + £2,500 + £2,250)
Example 2: First-Time Buyer
POST https://propertyinsights.co.uk/api/v1/sdlt/calculate
Content-Type: application/json
X-API-Key: your_api_key_here
{
"propertyType": "residential",
"propertyPrice": 450000,
"firstTimeBuyer": true,
"higherRate": false,
"ukResident": true
}Result: £7,500 SDLT (first-time buyer relief applied)
Example 3: Additional Property + Non-UK Resident
POST https://propertyinsights.co.uk/api/v1/sdlt/calculate
Content-Type: application/json
X-API-Key: your_api_key_here
{
"propertyType": "residential",
"propertyPrice": 400000,
"firstTimeBuyer": false,
"higherRate": true,
"ukResident": false
}Result: £38,000 SDLT (base £10,000 + 5% additional property + 2% non-UK resident)
Example 4: Commercial Property
POST https://propertyinsights.co.uk/api/v1/sdlt/calculate
Content-Type: application/json
X-API-Key: your_api_key_here
{
"propertyType": "commercial",
"propertyPrice": 275000
}Result: £3,250 SDLT (£0 + £2,000 + £1,250)
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_PROPERTY_TYPE | Property type parameter is required |
| 400 | MISSING_PROPERTY_PRICE | Property price parameter is required |
| 400 | INVALID_PROPERTY_TYPE | Property type must be "residential" or "commercial" |
| 400 | INVALID_PROPERTY_PRICE | Property price must be a positive number |
| 500 | CALCULATION_ERROR | Internal calculation error occurred |
| 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": "INVALID_PROPERTY_TYPE",
"message": "Property type must be \"residential\" or \"commercial\"."
}
}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]
Need Help?
If you need assistance with implementation or have questions about the SDLT API, our support team is here to help.