Skip to content
Documentation menu

Endpoints

List applications

GET
/api/v1/applications

Search 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_applications tool calls this endpoint. See MCP for developers.

Parameters

ParameterTypeDescription
qstringCase-insensitive text matched anywhere in the description or the address.
authoritystringCouncil name, exactly as /api/v1/authorities lists it (case-insensitive).An unknown name returns an empty list, not an error.
postcodestringUK postcode at the centre of a radius search. Use with radius_m.400 bad_request if the postcode cannot be located.
radius_minteger 100-20,000Default: 1000Radius around postcode in metres. Ignored without postcode.Values outside 100 to 20,000 are clamped to that range.
sincedate (YYYY-MM-DD)Only applications with start_date on or after this date.400 bad_request unless YYYY-MM-DD.
untildate (YYYY-MM-DD)Only applications with start_date on or before this date.400 bad_request unless YYYY-MM-DD.
decided_sincedate (YYYY-MM-DD)Only applications with decided_date on or after this date (so only decided ones).400 bad_request unless YYYY-MM-DD.
statestringOnly 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.
limitinteger 1-100Default: 20Page size, 1 to 100. Defaults to 20.Missing, zero or non-numeric values use 20; values above 100 are treated as 100.
cursorstringnext_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

StatuscodeWhen
400bad_requestBad date, unlocatable postcode or altered cursor.
401unauthorizedMissing, invalid or revoked key.
429rate_limitedOver 60 requests a minute.
429records_exhaustedNo new record fits in your remaining allowance.
500server_errorSomething 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.