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.
- Base URL:
https://planwatch.ie/api/v1 - OpenAPI 3.1 spec:
/api/v1/openapi.json - This page as Markdown (agents prefer it):
/api.md
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.
| Access | Daily calls | Agent intelligence |
|---|---|---|
| Keyless (per IP) | 100 | — |
| Free key | 1,000 | — |
| Starter | 5,000 | — |
| Pro | 25,000 | Yes — rates, rankings, benchmarks |
| Team | Negotiated | Yes |
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.
| Param | Description |
|---|---|
q | Free-text query or a planning reference number. |
authority | Authority name, e.g. Fingal County Council (all or omitted = every authority). |
decisions | Comma-separated outcome buckets: granted, refused, further_info, withdrawn, invalid, pending. |
application_type | e.g. PERMISSION, RETENTION, OUTLINE PERMISSION. Comma-separated for multiple. |
dev_type | Development type, e.g. Residential, Commercial. |
after / before | Received on/after / on/before a date (YYYY-MM-DD). |
all_time | 1 = filter-only search with no date window. |
has_fi | true = only applications with a further-information request. |
has_appeal | true = only applications with an An Coimisiún Pleanála appeal. |
architect | Filter by architect/agent name (fuzzy match). |
sort | newest (default), oldest, or decided. |
limit | Page size (default 50, max 200). |
offset | Page 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.
| Param | Description |
|---|---|
lat | Latitude (required). |
lng | Longitude (required). |
radius | Radius in metres (default 1000, max 10000). |
months | Only applications received in the last N months. |
limit | Page 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 licensed — contact 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.