Documentation menu
Endpoints
List applications
/api/v1/applicationsSearch and list planning applications by council, postcode and radius, keyword, status and dates.
Returns applications matching every filter you give (filters combine with AND). With no filters it lists every application.
Results come in the order applications were added to Planning Signal, oldest first, and that order never changes, so paging with cursor is stable even while new applications arrive.
Each application returned uses one record, unless you already received it this period.
- Access: All plans, including the free demo.
- Records: one per application returned, free if already returned this period. See records and allowances.
- MCP: the
search_applicationstool calls this endpoint. See MCP for developers.
Parameters
| Parameter | Type | Description |
|---|---|---|
q | string | Case-insensitive text matched anywhere in the description or the address. |
authority | string | Council name, exactly as /api/v1/authorities lists it (case-insensitive).An unknown name returns an empty list, not an error. |
postcode | string | UK postcode at the centre of a radius search. Use with radius_m.400 bad_request if the postcode cannot be located. |
radius_m | integer 100-20,000Default: 1000 | Radius around postcode in metres. Ignored without postcode.Values outside 100 to 20,000 are clamped to that range. |
since | date (YYYY-MM-DD) | Only applications with start_date on or after this date.400 bad_request unless YYYY-MM-DD. |
until | date (YYYY-MM-DD) | Only applications with start_date on or before this date.400 bad_request unless YYYY-MM-DD. |
decided_since | date (YYYY-MM-DD) | Only applications with decided_date on or after this date (so only decided ones).400 bad_request unless YYYY-MM-DD. |
state | string | Only applications with this app_state (case-insensitive). Refusals are Rejected.Values: Undecided, Permitted, Conditions, Rejected, Withdrawn, Appeal, Unresolved, ReferredAny other value matches nothing and returns an empty list. |
limit | integer 1-100Default: 20 | Page size, 1 to 100. Defaults to 20.Missing, zero or non-numeric values use 20; values above 100 are treated as 100. |
cursor | string | next_cursor from the previous page, passed back exactly as returned (cur_...).400 bad_request if altered, or if it came from another endpoint. |
Example request
curl "https://planningsignal.co.uk/api/v1/applications?authority=Camden&since=2026-09-14&limit=2" \
-H "Authorization: Bearer ps_live_your_key_here"Example response
Shown with the fields a demo or Starter key receives. Pro, Leads and National keys also get the contact fields and conditions_url (see fields).
{
"data": [
{
"id": "pa_3kTq9ZxV1bN7cR2mW8yLpA",
"reference": "2026/4417/P",
"authority": "Camden",
"address": "14 Fitzjohn's Avenue, London",
"postcode": "NW3 5NA",
"description": "Erection of a single storey rear extension and loft conversion with rear dormer.",
"app_type": "Full",
"app_state": "Undecided",
"decision": null,
"start_date": "2026-09-14",
"decided_date": null,
"lat": 51.5512,
"lng": -0.1765,
"url": "https://planning.example-council.gov.uk/application/2026-4417-P",
"docs_url": null,
"case_officer": "J. Patel",
"attribution": null
},
{
"id": "pa_0Hs4Ue8kLq2TzW7mB1xYcV",
"reference": "2026/4452/P",
"authority": "Camden",
"address": "Flat 3, 88 Belsize Park Gardens, London",
"postcode": "NW3 4NG",
"description": "Replacement of timber sash windows with double-glazed timber sash windows to front elevation.",
"app_type": "Householder",
"app_state": "Undecided",
"decision": null,
"start_date": "2026-09-16",
"decided_date": null,
"lat": 51.5481,
"lng": -0.1663,
"url": "https://planning.example-council.gov.uk/application/2026-4452-P",
"docs_url": null,
"case_officer": "R. Okafor",
"attribution": null
}
],
"next_cursor": "cur_5RbJ8uYc3XeN1qGh6tZkWo"
}Pass next_cursor back as cursor for the next page; it is null on the last page. See pagination.
Errors
| Status | code | When |
|---|---|---|
| 400 | bad_request | Bad date, unlocatable postcode or altered cursor. |
| 401 | unauthorized | Missing, invalid or revoked key. |
| 429 | rate_limited | Over 60 requests a minute. |
| 429 | records_exhausted | No new record fits in your remaining allowance. |
| 500 | server_error | Something failed on our side. Retry shortly. |
Every error has the same JSON shape: { "error": "...", "code": "..." }, with extra fields on some codes. Full bodies are on rate limits and errors.
Questions? Contact us, or see the help centre.