
Congress Stock Trades Scraper
scrape.ly/store/querystone/congress-trades-scraperNewsBusiness
4 monthly users

Scrape UK planning applications from 400+ councils in England, Scotland, Wales and Northern Ireland. Search by council, region, postcode radius, reference, keyword or agent; filter by size, status, type and date. Get address, description, decision, dates, agent, dwellings, coordinates and council portal links.
Get planning applications from 400+ UK planning authorities in England, Scotland, Wales and Northern Ireland in one structured dataset: site address, proposal, size, decision, dates, planning agent, dwellings, coordinates and a direct link to the council's own portal page. Search by council, region, postcode radius, reference, keyword or agent. No login, no API key, pay only for the applications you get.
Croydon, Leeds, London), or a postcode with a radius, or both. Leave both empty to search the whole UK.| Field | What it does |
|---|---|
councils | Councils, regions, counties or national parks. Empty = whole UK. |
postcode / radiusKm | Radius search around a UK postcode or latitude, longitude, nearest first. |
references | Specific applications by council reference or planit.org.uk link (the run then returns only those). |
maxResults | Total applications to save (0 = all). |
searchText | Words in the description; supports "phrases", or and -exclude. |
developer | Words in the agent or applicant company and address. |
appSize, appState, appTypes | Size band, decision status and application type. |
dateField, daysBack, dateFrom, dateTo | Which date to filter on and the window. |
maxResultsPerCouncil, includeSubAreas | Per-council cap; whether regions and counties include their councils. |
{
"councils": ["Croydon", "Manchester"],
"appSize": ["Large", "Medium"],
"appState": ["Permitted"],
"daysBack": 90,
"maxResults": 20
}
Radius search for major schemes awaiting a decision:
{
"postcode": "EC2A 4NE",
"radiusKm": 3,
"appSize": ["Large"],
"appState": ["Undecided"],
"daysBack": 180,
"maxResults": 100
}
One row per planning application.
| Field | Description |
|---|---|
council, reference | Planning authority and its application reference |
address, postcode, latitude, longitude | Site location (distanceKm on radius searches) |
description | The proposal |
appSize, appState, appType | Size band, decision status, type |
decidedDate, startDate | Decision date and date received or validated |
agentCompany, agentAddress, agentTel | Planning agent, where the council publishes it |
applicantCompany, applicantAddress | Applicant, where published |
dwellings | Proposed homes, where stated |
portalUrl, docsUrl, commentUrl | The council's own pages for the application |
planitUrl, planitId | The PlanIt record |
decision, decidedBy, status, applicationType | The council's own wording |
targetDecisionDate, permissionExpiresDate, wardName, nDocuments, nComments, ... | Every other field the council publishes |
Example (trimmed):
{
"council": "Croydon",
"reference": "26/01598/GPDO",
"address": "2 - 8 Altyre Road Croydon CR9 2LG",
"postcode": "CR9 2LG",
"description": "Change of use from commercial (Use Class E) to residential (Use Class C3) to provide 112 flats under Schedule 2, Part 3, Class MA ... and associated works.",
"appType": "Outline",
"appSize": "Large",
"appState": "Permitted",
"decidedDate": "2026-09-03",
"startDate": "2026-06-02",
"agentCompany": "Brooks Murray Architects",
"agentAddress": "41 Tabernacle Street London EC2A 4AA GB",
"dwellings": 112,
"latitude": 51.374426,
"longitude": -0.092161,
"portalUrl": "https://publicaccess3.croydon.gov.uk/online-applications/applicationDetails.do?keyVal=TFZRRHJLMKD00&activeTab=summary",
"planitUrl": "https://www.planit.org.uk/planapplic/Croydon/26/01598/GPDO/",
"planitId": "Croydon/26/01598/GPDO",
"decision": "Approved (prior approvals only)",
"decidedBy": "Delegated Business Meeting",
"applicationType": "Prior Appvl - Class E to (dwellings) C3",
"wardName": "Addiscombe West",
"targetDecisionDate": "2026-07-29",
"permissionExpiresDate": "2031-09-03",
"nDocuments": 108,
"nComments": 10,
"docsUrl": "https://publicaccess3.croydon.gov.uk/online-applications/applicationDetails.do?activeTab=documents&keyVal=TFZRRHJLMKD00",
"scrapedAt": "2026-10-22T00:40:52.727Z"
}
You pay $15.00 per 1,000 applications ($0.015 per application saved), plus a small platform usage charge for compute and proxy traffic. Example: 1,000 applications cost about $15.00 in results plus well under $0.01 of usage (a 1,000-application test run used $0.003). Searches that find nothing cost nothing for results. Set a maximum charge per run and the scraper stops cleanly when it is reached.
Is it legal? Planning registers are public records that councils publish by law. The data comes from PlanIt, a free aggregator of those registers. Check your own use (for example, direct marketing rules) before contacting people.
Do I need a login, API key or proxy? No. The scraper uses datacenter proxies by default and moves to UK residential addresses by itself if PlanIt refuses requests.
How many results can I get? As many as match: set Max results to 0 for all. Large searches page through PlanIt until the end; very wide date windows are split automatically so PlanIt's 45-second query limit is not hit.
Why do very large runs take longer? PlanIt is a free service and limits how fast one user can download. The scraper fetches the first ~2,400 applications straight away, then paces itself and waits whenever PlanIt asks it to. In our test 7,500 applications took about half an hour before PlanIt asked for a 15-minute pause, so allow roughly an hour for 10,000. The default run timeout is 2 hours, and the scraper stops cleanly before the timeout with everything found so far saved.
Why is a field empty? Councils publish different fields. Agent company appears on about 30–40% of applications and agent address on about half, applicant names are not copied by PlanIt (open portalUrl for them), and some councils do not publish postcodes or dwelling counts.
Which council names work? Short names (Croydon), full names (London Borough of Croydon), PlanIt area ids, regions (London, North West), nations (Scotland) and national parks. Unknown names are skipped with suggestions in the run log.
Can I schedule it or use the API? Yes. Schedule weekly runs with dateField: "changed" and daysBack: 7 to get every new or updated application, and read results through the API or integrations.
decision and status.or, -word).Every field below can be set in the run form, passed through the API, or saved as a task. Unset fields fall back to the defaults shown.
councilsarrayOptionalCouncils or regions
UK planning authorities to search, e.g. 'Croydon', 'Tower Hamlets', 'Leeds', 'Edinburgh', 'Cardiff', 'Belfast'. Regions, nations and national parks work too ('London', 'Scotland', 'Peak District'), and a county such as 'Kent' includes its district councils. Leave empty (and Postcode empty) to search every council in the UK.
postcodestringOptionalPostcode (radius search)
A full UK postcode such as 'EC2A 4NE', or 'latitude, longitude' (e.g. '51.5256, -0.0836'). Finds applications within the radius below, nearest first. Combine it with Councils to stay inside one council.
radiusKmnumberOptionaldefault 5Radius (km)
Search radius around the postcode, in kilometres. Used only with a postcode.
referencesarrayOptionalApplication references or links
Look up specific applications by the council's reference (e.g. '26/02659/NMA') or a planit.org.uk application link. When references are given, the run returns only those applications: Councils then just picks the right council for a reference used by several councils, and the date, size and status filters do not apply.
maxResultsintegerOptionaldefault 20Max results
How many applications to save in total. 0 saves every matching application. There is no upper cap: large runs page through PlanIt until the limit or the end of the results.
Narrow the search. All filters are optional and combine with each other.
searchTextstringOptionalDescription keywords
Words to find in the application description (and its type, status and decision). Quote a phrase ("solar panel"), use 'or' between alternatives and a dash to exclude a word (-tree).
developerstringOptionalAgent or applicant company
Words to find in the agent or applicant company and address, e.g. 'Savills' or 'Barratt'. Same syntax as description keywords.
appSizearrayOptionalApplication size
Large = major developments (10+ dwellings or 1,000+ sqm). Medium = other applications involving several dwellings or larger works. Small = householder and other minor applications. Leave empty for every size.
appStatearrayOptionalDecision status
Leave empty for every status. Permitted = approved; Conditions = approved with conditions imposed; Undecided = still awaiting a decision.
appTypesarrayOptionalApplication type
Leave empty for every type.
dateFieldenumOptionaldefault "auto"Date to filter on
Which date 'Days back' and the date range apply to. Automatic uses the decision date, or the date received when only 'Undecided' is selected.
daysBackintegerOptionaldefault 90Days back
Only applications whose date (above) is within this many days of today. 0 = no limit. Ignored when 'Date from' is set.
dateFromstringOptionalDate from
Start of a fixed date range (YYYY-MM-DD). Overrides 'Days back'.
dateTostringOptionalDate to
End of a fixed date range (YYYY-MM-DD). Empty = today.
maxResultsPerCouncilintegerOptionaldefault 0Max results per council
Cap for each council or region in Councils, so one busy council cannot use up 'Max results'. 0 = no per-council cap.
includeSubAreasbooleanOptionaldefault trueInclude councils inside a region or county
On: 'London' or 'Kent' also returns the applications of the councils inside it. Off: only the area's own applications (for an English county, minerals, waste and schools).
proxyConfigurationobjectOptionaldefault {"useScrapelyProxy":true,"scrapelyProxyGroups":["DATACENTER…Proxy configuration
Datacenter proxies work well for PlanIt. Each request address is limited by PlanIt, so the run spreads requests over several addresses and moves to UK residential addresses by itself if it is refused repeatedly.
Every run writes its results to a dataset. Preview it in the dashboard, then export it or read it through the API.
| Field | Type | Description |
|---|---|---|
| council | string | null | Planning authority (PlanIt area name), e.g. 'Croydon'. |
| reference | string | null | Council application reference, e.g. '26/02659/NMA'. |
| address | string | null | Site address. |
| postcode | string | null | Site postcode. |
| description | string | null | Proposal description as submitted to the council. |
| appType | string | null | Type: Full, Outline, Amendment, Conditions, Heritage, Trees, Advertising, Telecoms or Other. |
| appSize | string | null | Size band: Large, Medium or Small. |
| appState | string | null | Decision status: Permitted, Conditions, Undecided, Rejected, Withdrawn, Referred, Unresolved or Other. |
| decidedDate | string | null | Decision date (YYYY-MM-DD); empty while undecided. |
| startDate | string | null | Date received or validated (YYYY-MM-DD). |
| consultedDate | string | null | Date the consultation expired (YYYY-MM-DD). |
| agentCompany | string | null | Planning agent or architect firm, where the council publishes it. |
| agentAddress | string | null | Agent address, where published. |
| agentTel | string | null | Agent phone number, where published. |
| applicantCompany | string | null | Applicant company, where published. |
| applicantAddress | string | null | Applicant address, where published. |
| dwellings | number | null | Number of proposed dwellings, where stated. |
| latitude | number | null | Site latitude (WGS84). |
| longitude | number | null | Site longitude (WGS84). |
| distanceKm | number | null | Distance from the radius-search centre, in km (radius searches only). |
| portalUrl | string | null | The application on the council's own planning portal. |
| planitUrl | string | null | The application on planit.org.uk. |
| planitId | string | null | UK-wide unique id (council/reference). |
| uid | string | null | Identifier the application was first listed under. |
| altId | string | null | Alternative identifier, where any. |
| associatedIds | array | null | References of related applications mentioned in the description. |
| applicationType | string | null | The council's own application type text. |
| status | string | null | The council's own status text. |
| decision | string | null | The council's decision text. |
| decidedBy | string | null | How it was decided (delegated, committee...). |
| wardName | string | null | Electoral ward. |
| parish | string | null | Parish, where applicable. |
| dateReceived | string | null | Date received. |
| dateValidated | string | null | Date validated. |
| targetDecisionDate | string | null | Target decision date. |
| decisionIssuedDate | string | null | Date the decision notice was issued. |
| permissionExpiresDate | string | null | Date the permission expires. |
| nDocuments | number | null | Documents on the council portal. |
| nComments | number | null | Public comments. |
| nConstraints | number | null | Planning constraints on the site. |
| nStatutoryDays | number | null | Statutory determination period in days. |
| docsUrl | string | null | The application's documents tab on the council portal. |
| commentUrl | string | null | The page to comment on the application. |
| mapUrl | string | null | The application's map tab on the council portal. |
| planningPortalId | string | null | Planning Portal submission id (PP-...). |
| lastScraped | string | null | When PlanIt last checked the council site. |
| lastChanged | string | null | When the PlanIt record last changed. |
| scrapedAt | string | null | When this row was saved (UTC). |
You pay for the events the actor reports, such as each result or page it produces. Platform usage is included in the event prices.
| Event | Charged when | Price |
|---|---|---|
| Planning application | One saved planning application with all fields the council publishes. | $0.015 |
Run this actor from your own code. Swap in your API token and the examples work as-is.
import { ScrapelyClient } from 'scrapely-client'
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN })
// Start the actor and wait for the run to finish.
const run = await client.actor('cornerledger/uk-planning-scraper').call({
"councils": [
"Croydon",
"Manchester"
],
"radiusKm": 5,
"maxResults": 20,
"appSize": [
"Large",
"Medium"
],
"appState": [
"Permitted"
],
"daysBack": 90,
"proxyConfiguration": {
"useScrapelyProxy": true,
"scrapelyProxyGroups": [
"DATACENTER"
]
}
})
// Read the dataset the run produced.
const { items } = await client.dataset(run.defaultDatasetId).listItems()
console.log(items)Tokens live in your account settings. Keep them server-side: a token carries the full permissions of your account.
Connect the Scrape.ly MCP server once and your agent can run this actor as a tool. Pick your tool:
Fetch scrape.ly/agents.md and run cornerledger/uk-planning-scraperPaste into Claude Code, Codex, Cursor or any AI agent. It signs you in once in the browser.
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp?tools=actors,runs,storage,docs&actors=cornerledger/uk-planning-scraper"
}
}
}No key in the file: your client opens the browser to sign you in the first time it connects.
Inputs the developer prepared for common jobs. Open one to see its input, then copy it to your account to run it as-is or adjust it.
Large and medium schemes permitted or pending around a London postcode, nearest first, with distance in km.
Every council in the UK: large schemes (10+ homes or 1,000+ sqm) approved in the last 30 days.
All Scottish councils and national parks, applications mentioning solar in the last year.
Large and medium applications awaiting a decision, received in the last 180 days.
Fetch specific applications by council reference or planit.org.uk link.

Scrape Google Maps places for any search term and city, with no code or with one API call. A real run, its output, its log and its exact cost, plus the limits and the legal side.
Read the article
Paste an Amazon search or product URL into a ready-made Actor and get one row per product with price, ASIN, rating and review count. This guide covers the no-code steps, the API, ZIP code pricing, a real run and its cost.
Read the article
Scrape Google search results by query and country and get each results page as JSON: organic results with positions, People Also Ask and related searches. Run it without code or from Python, with a real run, the cost per page and Google's terms.
Read the articleScrape.ly gives you the infrastructure, the tooling, and the team to extract, process, and operationalize web data at any scale. Setup takes minutes. The advantage lasts forever.