Real endpoints, predictable responses, RESO-aligned schemas. Built on PostGIS, Elasticsearch, and Meilisearch — designed to drop into any product that needs Canadian location intelligence, from MLS infrastructure and brokerage CRMs to insurance platforms and urban analytics tools.
# Enrich an address with the full Neighbourly graph $ curl https://api.neighbourly.io/v1/address \ -H "Authorization: Bearer $NEIGHBOURLY_KEY" \ -d "q=147 Maple Crescent, Toronto" → 200 OK { "address": { "full_addr": "147 Maple Crescent, Toronto, ON", "neighbourhood": "Riverdale", "city": "Toronto", "province": "Ontario", "fsa": "M4K", "lat": 43.6712, "lng": -79.3501 }, "layers": ["geo", "demo", "permits", "energy"], "_links": { "permits": "/v1/permits?address_id=8421", "energy": "/v1/energy?address_id=8421", "demographics": "/v1/demographics/find?fsa=M4K" } }
Authenticate, query, paginate. The whole API follows the same pattern, so once you know one endpoint, you know all of them.
Sign up, generate a scoped key from your dashboard, and pass it on every request as a Bearer token. Keys are environment-scoped (dev / prod) and revocable at any time.
Submit any Canadian address — we normalize it, resolve the full geographic hierarchy, and return links to every available data layer for that location.
Follow the _links from any response to drill into permits, demographics, environmental data, or energy. HATEOAS-style — discoverable from anywhere.
Every endpoint returns predictable JSON, follows REST conventions, and includes _links to related resources. Click a category to explore.
Six nested levels of Canadian geography — Country, Province, County, Upper-Tier Municipality, Lower-Tier Municipality, Neighbourhood — each with full MultiPolygon boundaries (SRID 4326), bounding boxes, and centroids.
Spatial queries powered by PostGIS and Elasticsearch. Find anything inside a viewport, intersect boundaries, resolve coordinates to a hierarchy in a single call.
Sub-100ms typeahead powered by Meilisearch. Includes ~100 street-type synonym mappings (Rd / Road / Rte / etc.) so partial inputs resolve cleanly.
MLS-format listings, agents, offices, and the Sutton Homebase enrichment layer. ES-backed for viewport bbox queries plus property-attribute filtering across ~80 listing fields.
Building permit data normalized across 20 Canadian cities. Filterable by source, type, status, cost, and date — Meilisearch-indexed for fast multi-filter queries.
Aquatic resources, wildlife management, public lands, recreation. Pre-computed boundary GeoJSON at three LODs and pre-joined hierarchy ID arrays for fast viewport queries.
Census-derived demographic profiles keyed by Forward Sortation Area. Includes computed-percentage helpers for homeownership, age distribution, and education / employment breakdowns.
Verified utility data via Green Button partnerships. Structured outputs: efficiency score, monthly cost projection, and neighbourhood benchmark. Useful for listing enrichment, mortgage underwriting, and energy analytics. Available on Professional and Enterprise tiers.
Two authentication modes for two use cases. Rate limits scale with your tier. Errors come back with structured JSON, not HTML.
Bearer-token authentication for server-side use, OAuth 2.0 for delegated user access (e.g., when a user's data is being accessed on their behalf).
Limits scale with your plan tier. We return standard X-RateLimit-* headers on every response so you can plan ahead. Retry budget guidance is included in error responses.
# Authenticated request GET /v1/address?q=147+Maple Authorization: Bearer nbk_prod_*** → 200 OK · Response headers: X-RateLimit-Limit: 600 X-RateLimit-Remaining: 587 X-RateLimit-Reset: 1746567890 X-Request-Id: "req_a1b2c3d4..." # When you exceed the limit → 429 Too Many Requests { "error": { "code": "rate_limit_exceeded", "message": "Tier limit: 600 req/min", "retry_after": 23, "upgrade_url": "https://..." } } # Webhooks: HMAC verification X-Neighbourly-Signature: sha256=a1b2... X-Neighbourly-Timestamp: 1746567890
Official libraries handle auth, retries, pagination, and typed responses. Or use any HTTP client — the API is plain REST.
When your product depends on us, we depend on us. Real numbers, not promises — and a public status page so you can verify them.
Sign up takes 60 seconds. Sandbox keys come with full access to all endpoints — same data, same shape as production. When you're ready, swap to a production key.