# UK Solar & Heat Pump Planning Lead Monitor (`barking_wisdom/uk-solar-heat-pump-planning-lead-monitor`) Actor

Find UK planning-application leads for solar, heat pump, roofing, retrofit and home-improvement installers.

- **URL**: https://apify.com/barking\_wisdom/uk-solar-heat-pump-planning-lead-monitor.md
- **Developed by:** [Влад](https://apify.com/barking_wisdom) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-usage

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## UK Solar & Heat Pump Planning Lead Monitor

Find UK planning-application leads for solar PV, heat pumps, roofing, retrofit and energy-efficiency installers.

The Actor reads public planning data, scores applications by installer relevance and outputs spreadsheet-ready lead rows. It is designed for sales teams and lead-generation teams that need project-intent signals without collecting personal contact data.

### What It Does

- Fetches public planning applications from the official Planning Data API by default.
- Optionally crawls public council planning search/list pages supplied by the user.
- Matches installer keywords such as `solar panels`, `photovoltaic`, `PV`, `PV array`, `air source heat pump`, `ground source heat pump`, `roof works`, `retrofit` and `energy efficiency`.
- Classifies leads as `solar_pv`, `heat_pump`, `roofing` and/or `retrofit`.
- Emits only rows that meet the configured relevance score and lead-type filters.
- Deduplicates rows within each run and across scheduled runs when `emitOnlyNew` is enabled.

### Safe Data Posture

Planning records can include personal data. This Actor intentionally does not output applicant names, phone numbers or emails. It outputs planning reference, proposal summary, council/source identifiers, dates, score and the public source URL.

Use the data for legitimate B2B planning, research and installer lead triage. Do not use it for harassment, spam, doxxing or attempts to bypass source access controls.

### Input Example

```json
{
  "sourcePreset": "planning-data-api",
  "keywords": [
    "solar panels",
    "photovoltaic",
    "pv",
    "air source heat pump",
    "ground source heat pump",
    "retrofit"
  ],
  "leadTypes": ["solar_pv", "heat_pump", "retrofit"],
  "maxRecords": 200,
  "minScore": 5,
  "emitOnlyNew": false
}
````

For custom council pages:

```json
{
  "sourcePreset": "custom",
  "startUrls": [
    {
      "url": "https://example-council.gov.uk/planning/search",
      "sourceName": "Example Council planning search",
      "councilName": "Example Council",
      "region": "South West"
    }
  ],
  "leadTypes": ["solar_pv", "heat_pump"],
  "minScore": 5
}
```

### Output Example

```json
{
  "leadId": "8f6b...",
  "leadType": "solar_pv",
  "country": "UK",
  "region": "England",
  "councilName": "organisation-entity:109",
  "planningAuthorityEntity": "109",
  "applicationRef": "23/00002/FUL",
  "proposal": "Erection of a single storey extension with flat roof to rear and PV installation to pitched roof",
  "status": "decision issued",
  "submittedDate": "2025-05-30",
  "decisionDate": "2023-05-09",
  "sourceName": "Planning Data API - planning applications",
  "applicationUrl": "https://www.planning.data.gov.uk/entity/10000000000",
  "matchedKeywords": ["pv"],
  "leadTypes": ["solar_pv", "roofing"],
  "score": 13,
  "firstSeenAt": "2026-07-02T00:00:00.000Z"
}
```

### Local Development

```powershell
npm install
npm test
npm run check
npm start
```

Local runs use Apify local storage and do not require Apify cloud auth.

### Pricing

This Actor uses pay-per-event pricing with event name `qualified_lead`.

- Price: `$0.05` per qualified lead
- Pricing start: `2026-07-17T00:00:00Z`
- Platform rule: Apify requires pricing changes to be scheduled at least two weeks ahead, so runs before that date may execute without paid event charges.

### Limitations

- The official Planning Data API is still a public-data feed and can be incomplete.
- Council pages vary widely; custom source parsing may need per-council adjustments.
- This Actor identifies planning-intent signals, not verified contact details or guaranteed sales opportunities.
- It does not provide legal advice on planning, GDPR or marketing outreach.

# Actor input Schema

## `sourcePreset` (type: `string`):

Built-in public source group to crawl or fetch.

## `startUrls` (type: `array`):

Public council planning list pages to crawl when using the custom preset. API users may include optional sourceName, councilName, region, and adapter fields.

## `keywords` (type: `array`):

Solar, heat pump, roofing, retrofit and home-improvement terms used for matching.

## `leadTypes` (type: `array`):

Optional lead type filters. Empty means all lead types.

## `lookbackDays` (type: `integer`):

Only emit applications updated or decided within this many days when dates are available.

## `maxRecords` (type: `integer`):

Hard cap for official Planning Data API records fetched in one run.

## `maxPagesPerSource` (type: `integer`):

Hard cap to control cost and source impact for custom council pages.

## `minScore` (type: `integer`):

Minimum score required before a planning application is emitted.

## `emitOnlyNew` (type: `boolean`):

Enable for scheduled monitoring to avoid re-emitting leads already seen in previous runs. Leave disabled for sample/default Store runs so the dataset is not empty.

## `proxyConfiguration` (type: `object`):

Proxy settings. Public MVP defaults to no Apify proxy.

## Actor input object example

```json
{
  "sourcePreset": "planning-data-api",
  "startUrls": [],
  "keywords": [
    "solar panels",
    "solar pv",
    "photovoltaic",
    "pv",
    "pv array",
    "air source heat pump",
    "ground source heat pump",
    "heat pump",
    "roof works",
    "roof alteration",
    "retrofit",
    "energy efficiency"
  ],
  "leadTypes": [
    "solar_pv",
    "heat_pump",
    "roofing",
    "retrofit"
  ],
  "lookbackDays": 365,
  "maxRecords": 200,
  "maxPagesPerSource": 5,
  "minScore": 5,
  "emitOnlyNew": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("barking_wisdom/uk-solar-heat-pump-planning-lead-monitor").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("barking_wisdom/uk-solar-heat-pump-planning-lead-monitor").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call barking_wisdom/uk-solar-heat-pump-planning-lead-monitor --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=barking_wisdom/uk-solar-heat-pump-planning-lead-monitor",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "UK Solar & Heat Pump Planning Lead Monitor",
        "description": "Find UK planning-application leads for solar, heat pump, roofing, retrofit and home-improvement installers.",
        "version": "0.1",
        "x-build-id": "2pGrbe87O4IGyXbPD"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/barking_wisdom~uk-solar-heat-pump-planning-lead-monitor/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-barking_wisdom-uk-solar-heat-pump-planning-lead-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/barking_wisdom~uk-solar-heat-pump-planning-lead-monitor/runs": {
            "post": {
                "operationId": "runs-sync-barking_wisdom-uk-solar-heat-pump-planning-lead-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/barking_wisdom~uk-solar-heat-pump-planning-lead-monitor/run-sync": {
            "post": {
                "operationId": "run-sync-barking_wisdom-uk-solar-heat-pump-planning-lead-monitor",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "sourcePreset"
                ],
                "properties": {
                    "sourcePreset": {
                        "title": "Source preset",
                        "enum": [
                            "planning-data-api",
                            "custom"
                        ],
                        "type": "string",
                        "description": "Built-in public source group to crawl or fetch.",
                        "default": "planning-data-api"
                    },
                    "startUrls": {
                        "title": "Custom public planning URLs",
                        "type": "array",
                        "description": "Public council planning list pages to crawl when using the custom preset. API users may include optional sourceName, councilName, region, and adapter fields.",
                        "default": [],
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "keywords": {
                        "title": "Keywords",
                        "type": "array",
                        "description": "Solar, heat pump, roofing, retrofit and home-improvement terms used for matching.",
                        "default": [
                            "solar panels",
                            "solar pv",
                            "photovoltaic",
                            "pv",
                            "pv array",
                            "air source heat pump",
                            "ground source heat pump",
                            "heat pump",
                            "roof works",
                            "roof alteration",
                            "retrofit",
                            "energy efficiency"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "leadTypes": {
                        "title": "Lead types",
                        "type": "array",
                        "description": "Optional lead type filters. Empty means all lead types.",
                        "default": [
                            "solar_pv",
                            "heat_pump",
                            "roofing",
                            "retrofit"
                        ],
                        "items": {
                            "type": "string"
                        }
                    },
                    "lookbackDays": {
                        "title": "Lookback days",
                        "minimum": 1,
                        "maximum": 3650,
                        "type": "integer",
                        "description": "Only emit applications updated or decided within this many days when dates are available.",
                        "default": 365
                    },
                    "maxRecords": {
                        "title": "Max official API records",
                        "minimum": 1,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Hard cap for official Planning Data API records fetched in one run.",
                        "default": 200
                    },
                    "maxPagesPerSource": {
                        "title": "Max pages per source",
                        "minimum": 1,
                        "maximum": 50,
                        "type": "integer",
                        "description": "Hard cap to control cost and source impact for custom council pages.",
                        "default": 5
                    },
                    "minScore": {
                        "title": "Minimum relevance score",
                        "minimum": 1,
                        "maximum": 30,
                        "type": "integer",
                        "description": "Minimum score required before a planning application is emitted.",
                        "default": 5
                    },
                    "emitOnlyNew": {
                        "title": "Emit only new leads",
                        "type": "boolean",
                        "description": "Enable for scheduled monitoring to avoid re-emitting leads already seen in previous runs. Leave disabled for sample/default Store runs so the dataset is not empty.",
                        "default": false
                    },
                    "proxyConfiguration": {
                        "title": "Proxy configuration",
                        "type": "object",
                        "description": "Proxy settings. Public MVP defaults to no Apify proxy.",
                        "default": {
                            "useApifyProxy": false
                        }
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
