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

# Planning Applications

> Rezonings, variances, and subdivisions across Canadian municipalities.

Planning applications cover discretionary land-use decisions that require municipal review. They include rezonings, variances, subdivisions, and related applications. These records provide an early signal of major land-use change before building permits are issued.

The dataset contains more than 11,800 records from Calgary, Ottawa, and Victoria. It refreshes automatically from official municipal sources.

## List planning applications

```
GET /api/v1/planning-applications
```

### Query parameters

<ParamField query="limit" type="integer" default="100">
  Maximum records to return. The upper bound is `500`.
</ParamField>

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

<ParamField query="municipality" type="string">
  One or more comma-separated city slugs: `calgary`, `ottawa`, or `victoria`.
</ParamField>

<ParamField query="q" type="string">
  Partial match across application number, address, description, neighbourhood, ward, and zoning text.
</ParamField>

<ParamField query="application_number" type="string">
  Partial match on the municipality's application number. `application` is accepted as an alias.
</ParamField>

<ParamField query="application_category" type="string">
  One of `rezoning`, `official_plan_amendment`, `variance`, `subdivision`, `site_plan`, `development_permit`, `outline_plan`, `road_closure`, or `other`. `category` is accepted as an alias.
</ParamField>

<ParamField query="status" type="string">
  One of `submitted`, `under_review`, `approved`, `refused`, `withdrawn`, `appealed`, `completed`, or `unknown`.
</ParamField>

<ParamField query="applied_after" type="string">
  Inclusive ISO 8601 application-date start. Example: `2025-01-01`.
</ParamField>

<ParamField query="applied_before" type="string">
  Inclusive ISO 8601 application-date end. Example: `2025-12-31`.
</ParamField>

<ParamField query="decision_after" type="string">
  Inclusive ISO 8601 decision-date start.
</ParamField>

<ParamField query="decision_before" type="string">
  Inclusive ISO 8601 decision-date end.
</ParamField>

<ParamField query="lat" type="number">
  Latitude for proximity search. Provide with `lng` and `radius_km`.
</ParamField>

<ParamField query="lng" type="number">
  Longitude for proximity search. Provide with `lat` and `radius_km`.
</ParamField>

<ParamField query="radius_km" type="number">
  Search radius in kilometres, from `0.1` to `100`.
</ParamField>

<ParamField query="sort_by" type="string" default="applied_date">
  One of `applied`, `applied_date`, `decision`, `decision_date`, `status_date`, `updated`, `last_updated`, or `distance`. `distance` requires a complete proximity query.
</ParamField>

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

<RequestExample>
  ```bash cURL theme={null}
  curl "https://api.northaxiumdata.ca/api/v1/planning-applications?municipality=calgary&application_category=rezoning&applied_after=2025-01-01&limit=25" \
    -H "X-API-Key: <your-api-key>"
  ```

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

  response = requests.get(
      "https://api.northaxiumdata.ca/api/v1/planning-applications",
      headers={"X-API-Key": "<your-api-key>"},
      params={
          "municipality": "calgary",
          "application_category": "rezoning",
          "applied_after": "2025-01-01",
          "limit": 25,
      },
  )
  print(response.json())
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "data": [
      {
        "record_id": "calgary:LOC2025-0012",
        "municipality": "calgary",
        "province": "AB",
        "application_number": "LOC2025-0012",
        "source_reference": "LOC2025-0012",
        "application_type_raw": "Land Use Amendment",
        "application_category": "rezoning",
        "status_raw": "Application in Progress",
        "status": "under_review",
        "description": "Land use redesignation application",
        "address": "500 4 Street SW, Calgary, AB",
        "neighbourhood": "Downtown Commercial Core",
        "ward": "7",
        "from_zoning": "CC-X",
        "proposed_zoning": "DC",
        "applied_date": "2025-01-10",
        "decision_date": null,
        "status_date": "2025-01-10",
        "lat": 51.0482,
        "lng": -114.0703,
        "source_updated_at": "2025-01-13T15:30:00",
        "last_updated": "2026-07-13T06:20:00",
        "distance_km": null
      }
    ],
    "meta": {
      "total": 1,
      "limit": 25,
      "offset": 0,
      "municipality": "calgary",
      "sort_by": "applied_date",
      "sort_order": "desc",
      "proximity": null
    }
  }
  ```

  ```json 400 theme={null}
  {
    "error": {
      "code": "BAD_REQUEST",
      "message": "application_category must be one of: development_permit, official_plan_amendment, other, outline_plan, rezoning, road_closure, site_plan, subdivision, variance."
    }
  }
  ```

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

### Response fields

| Field                             | Type      | Description                                      |
| --------------------------------- | --------- | ------------------------------------------------ |
| `record_id`                       | string    | Stable NorthAxium record identifier              |
| `municipality`                    | string    | City slug                                        |
| `province`                        | string    | Province abbreviation                            |
| `application_number`              | string    | Municipality application number where published  |
| `application_type_raw`            | string    | Source application type text                     |
| `application_category`            | string    | Normalized land-use category                     |
| `status_raw`                      | string    | Source status text                               |
| `status`                          | string    | Normalized application status                    |
| `address`                         | string    | Site address where published                     |
| `description`                     | string    | Application description where published          |
| `neighbourhood` / `ward`          | string    | Location context where published                 |
| `from_zoning` / `proposed_zoning` | string    | Existing and proposed zoning where published     |
| `applied_date`                    | date      | Date the application was filed                   |
| `decision_date`                   | date      | Decision date where published                    |
| `status_date`                     | date      | Status effective date where published            |
| `lat` / `lng`                     | number    | Application location coordinates where published |
| `source_updated_at`               | timestamp | Publisher update timestamp where available       |
| `last_updated`                    | timestamp | NorthAxium record update timestamp               |

## Detail and statistics

Retrieve one record by `record_id`:

```
GET /api/v1/planning-applications/{record_id}
```

The detail endpoint adds `property_identifier` and `source_url` when the municipality publishes them.

Get grouped record counts:

```
GET /api/v1/planning-applications/stats?group_by=municipality
```

The `group_by` parameter accepts `municipality`, `province`, `application_category`, `status`, `applied_year`, or `decision_year`. List filters such as `municipality`, `application_category`, and date ranges also apply to statistics.

For a city-by-city availability table, see [Municipal Intelligence Coverage](/permits/coverage).
