PlanWatch API

A stable, versioned read contract for Irish planning data — built for agents.

Read access to PlanWatch.ie's dataset of Irish planning applications — 500,000+ applications across all 31 planning authorities, refreshed nightly from the National Planning Application Database, An Coimisiún Pleanála and local authority portals.

v1 is the contract: fields are added, never removed or renamed. Breaking changes mean a v2 with 90 days' deprecation notice. Best-effort service, no SLA.

The envelope

Every response — success or error — uses the same shape:

{
  "data": { ... },
  "meta": {
    "attribution": "Data © Irish planning authorities, via PlanWatch.ie — see https://planwatch.ie/data-sources.html",
    "docs": "https://planwatch.ie/api.html"
  },
  "error": null
}

On an error, data is null and error is an object with a code and a message. Codes: bad_request, unauthorized, invalid_api_key, not_found, quota_exceeded, too_many_requests, error.

meta.attribution is present on every response. When you send a key (or on the keyless taster), meta.usage reports today's quota position. List endpoints add total, showing, limit and offset to meta.

Authentication

The API works with no key — a keyless taster of 100 calls/day per IP. To raise the quota, send a free API key in the X-API-Key header:

curl -H "X-API-Key: pw_live_xxx" \
  "https://planwatch.ie/api/v1/applications?q=extension&authority=Fingal%20County%20Council"

You can also pass the key as a query parameter: ?api_key=pw_live_xxx. Keys are free — create one on your Settings page, no card needed.

Quotas

Your daily quota is derived from your plan and resets at midnight (Irish time). Every 429 carries a Retry-After header — the seconds until reset.

AccessDaily callsAgent intelligence
Keyless (per IP)100
Free key1,000
Starter5,000
Pro25,000Yes — rates, rankings, benchmarks
TeamNegotiatedYes

Fetching /api/v1/openapi.json is unmetered — it's how agents discover the API.

Privacy is structural. Applicant name and address do not exist on any v1 schema. Serialization is whitelist-only, so they can't leak through a forgotten filter. Architect, agent and planner names are professional-capacity data and are included.

Endpoints

All endpoints are GET under the /api/v1 base.

GET/applications

Full-text and/or filtered search — requires at least a query or one filter. Reference numbers (e.g. 24/449, F24A/0123) are detected and matched exactly first.

ParamDescription
qFree-text query or a planning reference number.
authorityAuthority name, e.g. Fingal County Council (all or omitted = every authority).
decisionsComma-separated outcome buckets: granted, refused, further_info, withdrawn, invalid, pending.
application_typee.g. PERMISSION, RETENTION, OUTLINE PERMISSION. Comma-separated for multiple.
dev_typeDevelopment type, e.g. Residential, Commercial.
after / beforeReceived on/after / on/before a date (YYYY-MM-DD).
all_time1 = filter-only search with no date window.
has_fitrue = only applications with a further-information request.
has_appealtrue = only applications with an An Coimisiún Pleanála appeal.
architectFilter by architect/agent name (fuzzy match).
sortnewest (default), oldest, or decided.
limitPage size (default 50, max 200).
offsetPage offset (default 0).
GET /api/v1/applications?q=house%20extension&authority=Dublin%20City%20Council&decisions=granted&limit=2
{
  "data": [
    {
      "id": "Dublin City Council_24003",
      "application_number": "24003",
      "authority": "Dublin City Council",
      "address": "3 Elm Rd, Dublin 5",
      "description": "Demolition of shed and construction of dwelling",
      "status": "GRANTED",
      "decision": "Grant Permission",
      "application_type": "PERMISSION",
      "received_date": "2024-05-20",
      "decision_date": "2024-08-20",
      "link": "https://planning.dublin.ie/24003",
      "architect_name": "Smith & Associates Architects"
    }
  ],
  "meta": {
    "attribution": "Data © Irish planning authorities, via PlanWatch.ie — see https://planwatch.ie/data-sources.html",
    "total": 1, "showing": 1, "limit": 2, "offset": 0
  },
  "error": null
}

Every field is always present; unknown values are null. Dates are ISO-8601 (YYYY-MM-DD).

GET/applications/{id}

id is the stable PlanWatch ID from search results, e.g. Fingal County Council_FW24A/0123. Returns the full record: everything in the search summary plus dev_type, planner_name, conditions_count and abp_link. Where a national Building Control notice matched, it also includes commencement_date, completion_date, bcn_status and a building_control object of building facts (notice ref, units, floor area) — no personal data. Unknown ID → 404 not_found.

GET/nearby

Applications near a point, ordered by distance.

ParamDescription
latLatitude (required).
lngLongitude (required).
radiusRadius in metres (default 1000, max 10000).
monthsOnly applications received in the last N months.
limitPage size (default 20, max 100).
GET /api/v1/nearby?lat=53.3498&lng=-6.2603&radius=2000&limit=20

Each item is a compact application record plus distance_m. meta includes total, center and radius_m.

GET/authorities

All 31 planning authorities. No parameters. Each item: authority, slug, total_applications, earliest_received_date, latest_received_date. Use slug with the stats endpoint.

GET/authorities/{slug}/stats

slug comes from GET /authorities (e.g. fingal, dublin-city). Returns authority, slug, total_applications, pending, avg_decision_days, fi_rate_percent and applications_last_year. Unknown slug → 404.

GET/agents/{id}

id is the agent entity ID (from agent links on planwatch.ie or search results' architect data). Basic profile — name, website, volume, coverage, activity — is available on any tier. Full intelligence (success/FI/appeal rates, processing days, quality score, benchmarks) requires a Pro key; without one those fields are null and intelligence_locked is true.

GET/openapi.json

The full OpenAPI 3.1 document. Unmetered.

Attribution & licence

Upstream data is CC-BY-flavoured; consumers inherit the obligation. Carry through the meta.attribution string in anything you build with the data. Individual queries and derived analysis with attribution are fine; bulk redistribution of the dataset is not licensedcontact us for that. See data sources & licensing.

Get a key

API keys are free — every plan, including Free, can hold one. A free key raises your quota from 100 keyless calls/day to 1,000, and is the difference between an agent's first call working and getting rate-limited.

Create an API key