> ## Documentation Index
> Fetch the complete documentation index at: https://docs.northaxiumdata.ca/llms.txt
> Use this file to discover all available pages before exploring further.

# Building Permits

> Retrieve a list of commercial, residential, and industrial building permits issued across Canada.

Get a standardized list of building permits aggregated from municipalities, filterable by municipality, text search, permit metadata, and update window.

### Query Parameters

<ParamField query="limit" type="integer" default="100">
  Maximum number of permits to return per request. Default: `100`. Upper bound depends on your plan tier. Example: `25`.
</ParamField>

<ParamField query="offset" type="integer" default="0">
  Number of records to skip for pagination. Example: `50`.
</ParamField>

<ParamField query="municipality" type="string">
  Filter permits by issuing municipality slug. Comma-separated values are accepted. Example: `toronto, calgary`.
</ParamField>

<ParamField query="q" type="string">
  Partial match across the permit search surface, including address, neighbourhood, work description, raw and canonical permit type, building type, and applicant or contractor names where available. Example: `123 King St`.
</ParamField>

<ParamField query="permit_type" type="string">
  One of `new_construction`, `renovation`, `addition`, `demolition`, `change_of_use`, or `other`. Example: `new_construction`.
</ParamField>

<ParamField query="permit_type_raw" type="string">
  Partial match on the municipality's raw permit type or class text. Example: `New Building`.
</ParamField>

<ParamField query="status" type="string">
  One of `issued`, `in_review`, `completed`, `cancelled`, or `expired`. Example: `issued`.
</ParamField>

<ParamField query="building_type" type="string">
  Partial match on the normalized building or property type text. Example: `residential`.
</ParamField>

<ParamField query="neighbourhood" type="string">
  Partial match on neighbourhood, ward, or district text where available. Example: `Annex`.
</ParamField>

<ParamField query="applicant" type="string">
  Partial match on `applicant_name`. Example: `Smith Construction`.
</ParamField>

<ParamField query="contractor" type="string">
  Partial match on `contractor_name`. Example: `Smith Construction`.
</ParamField>

<ParamField query="issued_after" type="string">
  ISO 8601 start date. Example: `2023-01-01`.
</ParamField>

<ParamField query="issued_before" type="string">
  ISO 8601 end date. Example: `2023-12-31`.
</ParamField>

<ParamField query="updated_after" type="string">
  ISO 8601 start date for the record's `last_updated` timestamp. Example: `2024-01-01`.
</ParamField>

<ParamField query="updated_before" type="string">
  ISO 8601 end date for the record's `last_updated` timestamp. Example: `2024-12-31`.
</ParamField>

<ParamField query="sort_by" type="string" default="date">
  One of `date`, `issued_date`, `application_date`, `updated`, `last_updated`, `published`, `value`, or `distance`. `distance` requires `lat`, `lng`, and `radius_km`. Example: `date`.
</ParamField>

<Note>
  For polling or incremental syncs, use `sort_by=last_updated&sort_order=desc` with `updated_after` set to your last successful sync timestamp.
</Note>

<ParamField query="sort_order" type="string" default="desc">
  Either `asc` or `desc`. Example: `desc`.
</ParamField>

<ParamField query="lat" type="number">
  Latitude for proximity search. Must be provided with `lng` and `radius_km`. Example: `43.6532`.
</ParamField>

<ParamField query="lng" type="number">
  Longitude for proximity search. Must be provided with `lat` and `radius_km`. Example: `-79.3832`.
</ParamField>

<ParamField query="radius_km" type="number">
  Radius in kilometres for proximity search. Must be between `0.1` and `100`. Example: `5`.
</ParamField>

<RequestExample>
  ```bash cURL theme={null}
  curl "https://api.northaxiumdata.ca/api/v1/permits?municipality=toronto&permit_type_raw=demolition&sort_by=updated&limit=10" \
    -H "X-API-Key: <your-api-key>"
  ```

  ```python Python theme={null}
  import requests

  url = "https://api.northaxiumdata.ca/api/v1/permits"
  headers = {"X-API-Key": "<your-api-key>"}
  params = {
      "limit": 10,
      "municipality": "toronto",
      "permit_type_raw": "demolition",
      "sort_by": "updated"
  }

  response = requests.get(url, headers=headers, params=params)
  print(response.json())
  ```

  ```javascript Node.js theme={null}
  const fetch = require('node-fetch');

  const url = new URL('https://api.northaxiumdata.ca/api/v1/permits');
  url.search = new URLSearchParams({
    limit: '10',
    municipality: 'toronto',
    permit_type_raw: 'demolition',
    sort_by: 'updated'
  });

  fetch(url, {
    headers: {
      'X-API-Key': '<your-api-key>'
    }
  })
    .then(res => res.json())
    .then(json => console.log(json));
  ```
</RequestExample>

### Proximity search example

Find all permits within 2km of a coordinate:

<RequestExample>
  ```bash cURL theme={null}
  curl "https://api.northaxiumdata.ca/api/v1/permits?lat=43.6532&lng=-79.3832&radius_km=2&permit_type=new_construction&sort_by=distance" \
    -H "X-API-Key: <your-api-key>"
  ```

  ```python Python theme={null}
  import requests

  url = "https://api.northaxiumdata.ca/api/v1/permits"
  headers = {"X-API-Key": "<your-api-key>"}
  params = {
      "lat": 43.6532,
      "lng": -79.3832,
      "radius_km": 2,
      "permit_type": "new_construction",
      "sort_by": "distance"
  }

  response = requests.get(url, headers=headers, params=params)
  print(response.json())
  ```

  ```javascript Node.js theme={null}
  const fetch = require('node-fetch');

  const url = new URL('https://api.northaxiumdata.ca/api/v1/permits');
  url.search = new URLSearchParams({
    lat: '43.6532',
    lng: '-79.3832',
    radius_km: '2',
    permit_type: 'new_construction',
    sort_by: 'distance'
  });

  fetch(url, { headers: { 'X-API-Key': '<your-api-key>' } })
    .then(res => res.json())
    .then(json => console.log(json));
  ```
</RequestExample>

### Proximity search example

Find all permits within 2km of a coordinate:

<RequestExample>
  ```bash cURL theme={null}
  curl "https://api.northaxiumdata.ca/api/v1/permits?lat=43.6532&lng=-79.3832&radius_km=2&permit_type=new_construction&sort_by=distance" \
    -H "X-API-Key: <your-api-key>"
  ```

  ```python Python theme={null}
  import requests

  url = "https://api.northaxiumdata.ca/api/v1/permits"
  headers = {"X-API-Key": "<your-api-key>"}
  params = {
      "lat": 43.6532,
      "lng": -79.3832,
      "radius_km": 2,
      "permit_type": "new_construction",
      "sort_by": "distance"
  }

  response = requests.get(url, headers=headers, params=params)
  print(response.json())
  ```

  ```javascript Node.js theme={null}
  const fetch = require('node-fetch');

  const url = new URL('https://api.northaxiumdata.ca/api/v1/permits');
  url.search = new URLSearchParams({
    lat: '43.6532',
    lng: '-79.3832',
    radius_km: '2',
    permit_type: 'new_construction',
    sort_by: 'distance'
  });

  fetch(url, { headers: { 'X-API-Key': '<your-api-key>' } })
    .then(res => res.json())
    .then(json => console.log(json));
  ```
</RequestExample>

### Proximity search example

Find all permits within 2km of a coordinate:

<RequestExample>
  ```bash cURL theme={null}
  curl "https://api.northaxiumdata.ca/api/v1/permits?lat=43.6532&lng=-79.3832&radius_km=2&permit_type=new_construction&sort_by=distance" \
    -H "X-API-Key: <your-api-key>"
  ```

  ```python Python theme={null}
  import requests

  url = "https://api.northaxiumdata.ca/api/v1/permits"
  headers = {"X-API-Key": "<your-api-key>"}
  params = {
      "lat": 43.6532,
      "lng": -79.3832,
      "radius_km": 2,
      "permit_type": "new_construction",
      "sort_by": "distance"
  }

  response = requests.get(url, headers=headers, params=params)
  print(response.json())
  ```

  ```javascript Node.js theme={null}
  const fetch = require('node-fetch');

  const url = new URL('https://api.northaxiumdata.ca/api/v1/permits');
  url.search = new URLSearchParams({
    lat: '43.6532',
    lng: '-79.3832',
    radius_km: '2',
    permit_type: 'new_construction',
    sort_by: 'distance'
  });

  fetch(url, { headers: { 'X-API-Key': '<your-api-key>' } })
    .then(res => res.json())
    .then(json => console.log(json));
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "data": [
      {
        "record_id": "BP-2023-88123",
        "municipality": "toronto",
        "province": "ON",
        "permit_number_raw": "23 123456 BLD 00",
        "source_reference": "23 123456 BLD 00",
        "issued_date": "2023-05-15",
        "permit_type": "new_construction",
        "permit_type_raw": "New Building",
        "estimated_cost": 4500000.00,
        "work_description": "New construction of office building",
        "applicant_name": null,
        "contractor_name": "Example Construction Ltd.",
        "zoning_raw": null,
        "last_updated": "2026-04-16T12:34:56"
      }
    ],
    "meta": {
      "total": 1,
      "limit": 10,
      "offset": 0,
      "municipality": "toronto",
      "sort_by": "last_updated",
      "sort_order": "desc",
      "proximity": null
    }
  }
  ```

  ```json 400 theme={null}
  {
    "error": {
      "code": "BAD_REQUEST",
      "message": "Invalid parameter value."
    }
  }
  ```

  ```json 401 theme={null}
  {
    "error": {
      "code": "UNAUTHORIZED",
      "message": "Missing API key. Pass your key in the X-API-Key header."
    }
  }
  ```

  ```json 404 theme={null}
  {
    "error": {
      "code": "NOT_FOUND",
      "message": "The requested resource was not found."
    }
  }
  ```

  ```json 429 theme={null}
  {
    "error": {
      "code": "RATE_LIMITED",
      "message": "Monthly request limit exceeded."
    }
  }
  ```
</ResponseExample>
