▶ API · v1 · STABLE

One REST API. Six data layers. Every Canadian address.

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.

REST · JSON OAuth 2.0 + API Keys 99.9% UPTIME CANADIAN HOSTING
~ curl example
# 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"
  }
}
Get started

From zero to enriched address in three calls.

Authenticate, query, paginate. The whole API follows the same pattern, so once you know one endpoint, you know all of them.

STEP 01 · AUTHENTICATE

Get your API key

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.

# Set once in your environment $ export NEIGHBOURLY_KEY="nbk_prod_..." # Then on every request: Authorization: Bearer $NEIGHBOURLY_KEY
STEP 02 · ENRICH

Send your first query

Submit any Canadian address — we normalize it, resolve the full geographic hierarchy, and return links to every available data layer for that location.

GET /v1/address?q=147+Maple+Crescent → Returns normalized address + hierarchy + available layers
STEP 03 · DEEPEN

Fetch the layers you need

Follow the _links from any response to drill into permits, demographics, environmental data, or energy. HATEOAS-style — discoverable from anywhere.

GET /v1/permits?address_id=8421 GET /v1/energy?address_id=8421 GET /v1/demographics/find?fsa=M4K
Endpoint reference

All 50+ endpoints, grouped by what they do.

Every endpoint returns predictable JSON, follows REST conventions, and includes _links to related resources. Click a category to explore.

CATEGORIES

Geographic Hierarchy

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.

GET /v1/country List countries
GET /v1/province List provinces
GET /v1/district List districts
GET /v1/city List cities
GET /v1/neighbourhood List neighbourhoods
GET /v1/address Look up addresses
GET /v1/where_am_i Reverse geocode by lat/lng

Search & Viewport

Spatial queries powered by PostGIS and Elasticsearch. Find anything inside a viewport, intersect boundaries, resolve coordinates to a hierarchy in a single call.

GET /v1/search/by_viewport Boundaries in viewport
GET /v1/search/by_viewport_es ES-backed viewport
GET /v1/search/addresses_by_viewport Address points in viewport
GET /v1/search/{level} Search at hierarchy level
GET /v1/search/location Universal search
GET /v1/find/boundary_by_id/{id} Boundary geometry by ID

Typeahead

Sub-100ms typeahead powered by Meilisearch. Includes ~100 street-type synonym mappings (Rd / Road / Rte / etc.) so partial inputs resolve cleanly.

GET /v1/location_typeahead/search Universal typeahead
GET /v1/location_typeahead/address/{id} Address by ID
GET /v1/location_typeahead/neighbourhood/{id} Neighbourhood by ID
GET /v1/location_typeahead/city/{id} City by ID
GET /v1/location_typeahead/province/{id} Province by ID
GET /v1/location_typeahead/district/{id} District by ID
GET /v1/location_by_slug/{full_slug} Slug-based routing

Real Estate

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.

GET /v1/search/listing Listings by viewport & filters
GET /v1/find/listing/{id} Single listing
GET /v1/search/agent Agents (fuzzy name match)
GET /v1/find/agent/{id} Single agent + Sutton data
GET /v1/search/office Offices (geo + fuzzy)
GET /v1/find/office/{id} Single office
GET /v1/sutton/offices Sutton-enriched offices
POST /v1/sutton-update Webhook (HMAC auth)

Permits

Building permit data normalized across 20 Canadian cities. Filterable by source, type, status, cost, and date — Meilisearch-indexed for fast multi-filter queries.

GET /v1/search/permits Permit search with filters
GET /v1/search/permits_by_viewport Permits in a bounding box
GET /v1/statistics/boundary_by_id/{id} Permit aggregates by area

Environment & Spatial

Aquatic resources, wildlife management, public lands, recreation. Pre-computed boundary GeoJSON at three LODs and pre-joined hierarchy ID arrays for fast viewport queries.

GET /v1/lake_boundary Lake boundaries + GeoJSON
GET /v1/bathymetry_line Lake depth contours
GET /v1/aquatic_resource_area Thermal regime, fish species
GET /v1/fish_stock Stocking events
GET /v1/fishing_access_point Public fishing access
GET /v1/wildlife_managment_unit WMU boundaries
GET /v1/crown_land Crown land + classification
GET /v1/fisheries_management_zone FMZ boundaries
GET /v1/bait_management_zone BMZ boundaries (EN/FR)
GET /v1/public_campground Campground locations
GET /v1/trail Trail networks

Demographics

Census-derived demographic profiles keyed by Forward Sortation Area. Includes computed-percentage helpers for homeownership, age distribution, and education / employment breakdowns.

GET /v1/demographics/find Demographics by FSA / location
GET /v1/demographics/ltm Lower-tier municipality demographics

Energy NEW

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.

GET /v1/energy/{address_id} Energy data for address
GET /v1/energy/benchmark Neighbourhood benchmark
POST /v1/energy/consent Submit homeowner consent
GET /v1/energy/coverage Coverage by region
Auth & rate limits

Designed to be predictable in production.

Two authentication modes for two use cases. Rate limits scale with your tier. Errors come back with structured JSON, not HTML.

Authentication

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).

  • API Keys — for server-to-server, with scoped permissions and per-environment isolation
  • OAuth 2.0 — for user-context flows where end-user consent is required
  • Webhook HMAC — inbound webhooks verified via SHA-256 signature in headers
  • IP allowlists — available on Enterprise for additional infrastructure controls

Rate limits & retries

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.

  • Starter — 60 requests/min, burst to 120
  • Professional — 600 requests/min, burst to 1,200
  • Enterprise — custom limits, dedicated infrastructure on request
  • Idempotency keys — supported on all write endpoints for safe retries
~ auth + rate-limit headers
# 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
Client libraries

Drop-in clients for the languages your team uses.

Official libraries handle auth, retries, pagination, and typed responses. Or use any HTTP client — the API is plain REST.

JS
JavaScript / TypeScript
● AVAILABLE
Py
Python
● AVAILABLE
Rb
Ruby
● AVAILABLE
Go
Go
◐ BETA
PHP
PHP
◐ BETA
.NET
.NET / C#
○ COMING SOON
Jv
Java
○ COMING SOON
cURL
Plain HTTP
● ALWAYS
Reliability

Engineered for the infrastructure tier of real estate.

When your product depends on us, we depend on us. Real numbers, not promises — and a public status page so you can verify them.

UPTIME SLA
99.9%
Production endpoints, measured monthly. Higher SLAs available on Enterprise contracts.
P50 LATENCY
<120ms
Median response time for typeahead and address queries from Canadian regions.
DATA RESIDENCY
🇨🇦
All Neighbourly data hosted in Canadian data centres. PIPEDA-compliant by default.
VERSIONING
v1
12-month deprecation policy on breaking changes. New features ship behind feature flags.
▶ Start building

Get an API key. Make your first request in under five minutes.

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.