REST API
Predictable civic data over HTTP.
Free atomic endpoints require no account. Every response follows a shared schema and identifies its publisher, dataset and freshness.
Free atomic endpoints
GET /v1/resolve/E15%202NE GET /v1/fire/E15%202NE GET /v1/census/E15%202NE GET /v1/crime/E15%202NE GET /v1/roads/E15%202NE GET /v1/flood/E15%202NE GET /v1/ptal/E15%202NE GET /v1/noise/E15%202NE GET /v1/air-quality/E15%202NE GET /v1/planning/E15%202NE GET /v1/planning-applications/E15%202NE?radius_metres=1000&date_from=2025-01-01&date_to=2025-12-31 GET /v1/property-sales/E15%202NE GET /v1/epc/E15%202NE?building_number=192 GET /v1/property-price-per-area/E15%202NE?building_number=192 GET /v1/deprivation/E15%202NE GET /v1/council-tax/E15%202NE GET /v1/connectivity/E15%202NE GET /v1/income/E15%202NE GET /v1/radon/E15%202NE GET /v1/uprn/100023336956 GET /v1/property-tribunals/E15%202NE?building_number=192 GET /v1/nearby/food_hygiene/E15%202NE GET /v1/nearby/school/E15%202NE GET /v1/nearby/care_provider/E15%202NE GET /v1/nearby/gp_practice/E15%202NE GET /v1/nearby/pharmacy/E15%202NE GET /v1/nearby/station/E15%202NE GET /v1/nearby/open_space/E15%202NE GET /v1/history/crime/E05013924?from=2025-01-01&to=2025-12-31 GET /v1/sources
Radius and historical-period parameters are bounded. Anonymous calls are rate limited at the edge, and deterministic results are cached.
EPC and property-context routes preserve publisher limitations: floor area is assessor-reported, price-per-area requires an exact address join, council tax never guesses a property band, and connectivity is a postcode fixed-broadband aggregate with separately dated local-authority mobile figures. Income is an MSOA model estimate, radon is an indicative 1 km grid result and Open UPRN is coordinate-only. The live OpenAPI specification is authoritative for deployment availability.
Paid composed endpoints
GET /v1/area/E15%202NE GET /v1/area/E05013924 GET /v1/area/E09000025 GET /v1/area/E02006997 POST /v1/compare
Area profiles accept a postcode, ward code, local-authority code or MSOA code. A comparison accepts two to five identifiers of one type. These routes accept a subscribed Bearer API key with remaining allowance or x402 per-call payment. Access never enters the civic-data domain layer.
Developer keys are self-service: sign in by email, subscribe through Stripe Checkout, then create and revoke keys or inspect composed usage in the dashboard. A new key is displayed once; store it in your secret manager.
Change alerts
Subscription-key holders can register a London postcode, a 100–5,000 metre radius and planning application and/or flood-warning watches. Civic checks each official source once on its normal cadence and fans matching events out to HTTPS webhooks; it never polls once per subscriber.
POST /v1/alerts/subscriptions
GET /v1/alerts/subscriptions/{id}
DELETE /v1/alerts/subscriptions/{id}
GET /v1/alerts/deliveries/{id} Send Authorization: Bearer <subscription-key>. A webhook contains a delivery ID and retrieval URL only; the final cited event is retrieved with the same key.
Rate-limit headers
Free responses carry the IETF RateLimit and RateLimit-Policy fields plus RateLimit-Limit, RateLimit-Remaining, RateLimit-Reset and the legacy X-RateLimit-* names. A refused request returns HTTP 429 with Retry-After.
RateLimit-Policy: "free-anonymous";q=50;w=3600 RateLimit: "free-anonymous";r=49;t=3599
Errors
Errors are JSON { "error": { "code", "message", "request_id" } } and mirror the code in X-Civic-Error-Code. Unknown paths return a 404 with recovery links. Every operation in the OpenAPI document has a unique operationId, a description and typed request and response schemas, so it can be loaded directly as a tool definition.
Machine discovery
The homepage advertises the API using RFC 8288 response links. Agents can also load the RFC 9727 API catalog, agent capability catalog and authentication guide directly. OAuth metadata is intentionally absent because Civic Data uses anonymous access, opaque subscription API keys and x402, not OAuth.