Developer Documentation

Integrate SIFTPROP's property report generation into your applications with our REST API.

Authentication

All API requests require authentication using an API key:

Authorization: Bearer YOUR_API_KEY

Get your API key from the Agency Dashboard.

Property API (v1)

GET/api/v1/property?postcode=B14+7TQ

Search properties by postcode or address

Query Parameters

postcodeUK postcode to search
addressFull or partial address search

Response

successboolean
dataArray of property objects with EPC data
metaTier and rate limit info

Example

Request

curl -X GET "https://siftprop.com/api/v1/property?postcode=B14+7TQ" \
  -H "X-API-Key: sk_live_xxxx"

Response

{
  "success": true,
  "data": {
    "properties": [
      {
        "address": "123 High Street, Birmingham",
        "postcode": "B14 7TQ",
        "currentRating": "B",
        "potentialRating": "A",
        "bedrooms": 3,
        "floorArea": 85
      }
    ]
  },
  "meta": { "tier": "startup", "requests_remaining": 9995 }
}
GET/api/v1/property/:id/history

Get sold price history for a property

Response

successboolean
property_idProperty identifier
historyArray of {date, price, type} objects

Example

Request

curl -X GET "https://siftprop.com/api/v1/property/lmk_123456/history" \
  -H "X-API-Key: sk_live_xxxx"

Response

{
  "success": true,
  "property_id": "lmk_123456",
  "history": [
    {"date": "2025-12-15", "price": 285000, "type": "Semi-Detached"},
    {"date": "2025-09-10", "price": 270000, "type": "Semi-Detached"},
    {"date": "2024-06-22", "price": 250000, "type": "Semi-Detached"}
  ]
}
GET/api/v1/market/:postcode

Get market trends for a postcode area

Response

successboolean
postcodeInput postcode
market_trendsAverage price, price changes, transactions, days on market
price_segmentsPrice breakdown by property type

Example

Request

curl -X GET "https://siftprop.com/api/v1/market/B14" \
  -H "X-API-Key: sk_live_xxxx"

Response

{
  "success": true,
  "postcode": "B14",
  "market_trends": {
    "avg_price": 325000,
    "price_change_12m": 4.2,
    "transactions_12m": 142,
    "avg_days_on_market": 34
  }
}
POST/api/v1/reports/generate

Generate a property report (async)

Request Body

addressProperty address
postcodeUK postcode
include_epcInclude EPC data (boolean)
include_market_analysisInclude market analysis (boolean)

Response

successboolean
report_idUnique report identifier
statusprocessing/completed/failed
check_status_urlURL to check status

Example

Request

curl -X POST "https://siftprop.com/api/v1/reports/generate" \
  -H "X-API-Key: sk_live_xxxx" \
  -H "Content-Type: application/json" \
  -d '{"address": "123 High Street", "postcode": "B14 7TQ"}'

Response

{
  "success": true,
  "report_id": "rpt_abc123",
  "status": "processing",
  "check_status_url": "/api/v1/reports/rpt_abc123/status"
}
GET/api/v1/reports/:id/status

Check report generation status

Response

successboolean
report_idReport identifier
statusprocessing | completed | failed
download_urlPDF download URL when completed

Example

Request

curl -X GET "https://siftprop.com/api/v1/reports/rpt_abc123/status" \
  -H "X-API-Key: sk_live_xxxx"

Response

GET/api/v1/keys

List your API keys

Response

successboolean
keysArray of API key objects with usage stats
POST/api/v1/keys

Create a new API key

Request Body

nameName for the key
tierfree | startup | growth | enterprise

Example

Request

curl -X POST "https://siftprop.com/api/v1/keys" \
  -H "X-API-Key: sk_live_xxxx" \
  -d '{"name": "My App", "tier": "startup"}'

Response

{
  "success": true,
  "key": {
    "id": "key_123",
    "name": "My App",
    "key": "sk_live_xxxxxxxxxxxxx",
    "tier": "startup",
    "requests_limit": 10000
  }
}
POST/api/v1/webhooks

Subscribe to webhooks (startup tier+)

Request Body

urlWebhook endpoint URL
eventsArray of events: report.complete, price.change, epc.update

Example

Request

curl -X POST "https://siftprop.com/api/v1/webhooks" \
  -H "X-API-Key: sk_live_xxxx" \
  -d '{"url": "https://yourapp.com/webhook", "events": ["report.complete"]}'

Response

{
  "success": true,
  "webhook": {
    "id": "wh_123",
    "url": "https://yourapp.com/webhook",
    "secret": "whsec_xxxx"
  }
}

Bulk Reports

POST/api/bulk-reports

Create a new bulk report generation job

Request Body

propertiesArray of { address, postcode } objects
brandingOptional branding configuration object

Response

successboolean
jobIdstring
totalPropertiesnumber
estimatedCompletionMinutesnumber

Example

Request

curl -X POST https://siftprop.com/api/bulk-reports \
  -H "Content-Type: application/json" \
  -d '{"properties": [{"address": "123 High Street", "postcode": "SW1A 1AA"}]}'

Response

{
  "success": true,
  "jobId": "abc-123-def",
  "totalProperties": 1,
  "estimatedCompletionMinutes": 2
}
GET/api/bulk-reports

List all bulk report jobs for the authenticated user

Query Parameters

statusFilter by status: pending, processing, completed, failed

Response

successboolean
jobsArray of job objects

Example

Request

curl -X GET "https://siftprop.com/api/bulk-reports?status=completed" \
  -H "Authorization: Bearer YOUR_API_KEY"

Response

{
  "success": true,
  "jobs": [
    {
      "id": "abc-123-def",
      "status": "completed",
      "totalProperties": 50,
      "processedProperties": 50,
      "failedProperties": 0,
      "createdAt": "2026-03-22T10:00:00Z",
      "completedAt": "2026-03-22T10:15:00Z",
      "downloadUrl": "/api/bulk-reports/abc-123-def/download"
    }
  ]
}
GET/api/bulk-reports/:id/status

Get status of a specific bulk report job

Response

successboolean
jobJob object with progress details

Example

Request

curl -X GET https://siftprop.com/api/bulk-reports/abc-123-def/status

Response

{
  "success": true,
  "job": {
    "id": "abc-123-def",
    "status": "processing",
    "totalProperties": 50,
    "processedProperties": 25,
    "failedProperties": 1,
    "progress": 50
  }
}
GET/api/bulk-reports/:id/download

Download completed reports as ZIP file

Response

ZIP file download

Example

Request

curl -o reports.zip https://siftprop.com/api/bulk-reports/abc-123-def/download

Response

White-Label Branding

GET/api/branding

Get current branding settings

Response

successboolean
brandingBranding configuration object

Example

Request

curl -X GET https://siftprop.com/api/branding

Response

{
  "success": true,
  "branding": {
    "logoUrl": "https://example.com/logo.png",
    "primaryColor": "#1E40AF",
    "secondaryColor": "#3B82F6",
    "companyName": "Acme Properties",
    "contactEmail": "info@acme.co.uk",
    "contactPhone": "+44 20 1234 5678",
    "showWatermark": true
  }
}
POST/api/branding

Update branding settings

Request Body

logoUrlURL to company logo (optional)
primaryColorPrimary brand color (hex)
secondaryColorSecondary brand color (hex)
companyNameCompany name (optional)
contactEmailContact email (optional)
contactPhoneContact phone (optional)
showWatermarkShow SIFTPROP watermark (boolean)

Response

successboolean

Example

Request

curl -X POST https://siftprop.com/api/branding \
  -H "Content-Type: application/json" \
  -d '{
    "logoUrl": "https://example.com/logo.png",
    "primaryColor": "#1E40AF",
    "companyName": "Acme Properties",
    "contactEmail": "info@acme.co.uk",
    "showWatermark": false
  }'

Response

{
  "success": true
}

Code Examples

Python

import requests

# Create bulk job
response = requests.post(
    "https://siftprop.com/api/bulk-reports",
    json={
        "properties": [
            {"address": "123 High Street", "postcode": "SW1A 1AA"},
            {"address": "45 Park Lane", "postcode": "W1K 1PN"}
        ]
    },
    headers={"Authorization": "Bearer YOUR_API_KEY"}
)
job = response.json()
print(f"Job ID: {job['jobId']}")

# Check status
status_response = requests.get(
    f"https://siftprop.com/api/bulk-reports/{job['jobId']}/status",
    headers={"Authorization": "Bearer YOUR_API_KEY"}
)
print(status_response.json())

Node.js

const fetch = require('node-fetch');

async function createBulkJob() {
  const response = await fetch('https://siftprop.com/api/bulk-reports', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json',
      'Authorization': 'Bearer YOUR_API_KEY'
    },
    body: JSON.stringify({
      properties: [
        { address: '123 High Street', postcode: 'SW1A 1AA' },
        { address: '45 Park Lane', postcode: 'W1K 1PN' }
      ]
    })
  });
  
  const job = await response.json();
  console.log('Job ID:', job.jobId);
}

async function checkStatus(jobId) {
  const response = await fetch(
    `https://siftprop.com/api/bulk-reports/${jobId}/status`,
    { headers: { 'Authorization': 'Bearer YOUR_API_KEY' } }
  );
  const status = await response.json();
  console.log(status);
}

API Pricing Tiers

Free

£0/mo

  • ✓ 100 API calls/day
  • ✓ Property search
  • ✓ Market trends
  • ✗ No webhooks
Get Started
Most Popular

Startup

£49/mo

  • ✓ 10,000 API calls/day
  • ✓ Property search
  • ✓ Market trends
  • ✓ 5 webhooks
  • ✓ Report generation
Upgrade

Growth

£149/mo

  • ✓ 50,000 API calls/day
  • ✓ All Startup features
  • ✓ 20 webhooks
  • ✓ Priority support
Upgrade

Enterprise

£499/mo

  • ✓ Unlimited API calls
  • ✓ Unlimited webhooks
  • ✓ Custom data feeds
  • ✓ Dedicated support
  • ✓ SLA guarantee
Contact Sales

Postman Collection

Import our API collection into Postman for easy testing and exploration.