# Canada Building Permits Scraper – 14 Cities, Construction Leads (`loudtzu/canada-building-permits`) Actor

Building permits from 14 Canadian cities' official open data in one run: Halifax, Calgary, Edmonton, Winnipeg, Mississauga, Kitchener, Victoria, Surrey and more. Filter by date, value and type.

- **URL**: https://apify.com/loudtzu/canada-building-permits.md
- **Developed by:** [LOUDTZU TZULOUD](https://apify.com/loudtzu) (community)
- **Categories:** Real estate, Lead generation, Business
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$3.00 / 1,000 permits

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Canada Building Permits Scraper – Construction Leads from 14 Cities

**Canada building permits from 14 cities in one run and one table:** Halifax, Calgary, Edmonton, Winnipeg, Mississauga, Oakville, Burlington, Kitchener, Waterloo, Kingston, Victoria, Surrey, Delta and Maple Ridge. Everything comes from each city's official open data, with `city`, `province`, `source` and `licence` on every row. Use it as a building permits API for Canada, for construction leads, new construction projects, renovation activity and housing-supply research.

**Not covered yet: Toronto, Vancouver and Montreal.** If you need those cities, this Actor does not have them today (some other Store Actors do, see the comparison below).

Pick your cities, an issue-date range, a project-value range and text filters, and get the newest permits first.

### Default search

If you start a run without changing anything, it fetches **Halifax, Calgary and Mississauga, 100 newest permits in total** (split 34 / 33 / 33, about $0.30), with no date, value or text filters. The Console form is pre-filled the same way.

### What you get

- Permit number, permit type, work type and status
- Issue date (plus application, completion and expiry dates where the city publishes them)
- Estimated construction value in CAD (where published)
- Units created, storeys and floor area for cities that publish them
- `source` and `licence` on every row (official open data, attribution included)

Missing values are `null`, never `0`. A project value, floor area, storey count or map point of 0 in the city data means "not recorded", so it is returned as `null`. Unit counts keep a real 0 (for example "0 new units"). Money and areas are rounded to 2 decimals.

Privacy: owner, applicant and contractor names, street addresses and free-text descriptions are **not** exported (the same rules as our single-city permit Actors).

### Example output

One real row from a test run on Oct 29, 2026 (Calgary):

```json
{
  "city": "Calgary",
  "province": "Alberta",
  "provinceCode": "AB",
  "permitNumber": "BP2025-23210",
  "permitType": "Residential Improvement Project",
  "permitCategory": "Building",
  "permitClass": "1110 - Below Grade Suite",
  "permitClassGroup": "Secondary Suites",
  "useCategory": "Residential",
  "workType": "Alteration",
  "workClassGroup": "Improvement",
  "workCategory": "Existing",
  "status": "Issued Permit",
  "applicationDate": "2025-12-04",
  "issuedDate": "2026-10-28",
  "completedDate": null,
  "estimatedValueCad": 34932,
  "residentialUnits": 1,
  "areaSqft": null,
  "communityCode": "WHL",
  "neighbourhood": "WEST HILLHURST",
  "latitude": 51.06,
  "longitude": -114.1,
  "futureDate": false,
  "source": "https://data.calgary.ca/Business-and-Economic-Activity/Building-Permits/c2es-76ed",
  "licence": "Contains information licensed under the Open Government Licence – City of Calgary. (v2.1) Licence: https://data.calgary.ca/stories/s/Open-Calgary-Terms-of-Use/u45n-7awa"
}
```

Fields beyond the common ones differ by city, because each city publishes different columns.

### Input

| Field | What it does |
|---|---|
| `cities` | One or more of: halifax, kitchener, oakville, mississauga, burlington, waterloo, kingston, victoria, surrey, delta, maple-ridge, calgary, edmonton, winnipeg |
| `dateFrom` / `dateTo` | Issue-date range, YYYY-MM-DD (Delta: completion date, see below) |
| `minValue` / `maxValue` | Estimated project value in CAD |
| `permitType`, `workType`, `status`, `keyword` | Text filters (contains, not case-sensitive) |
| `maxItems` | Total permits across all cities, newest first. Default 100, up to 50,000 |
| `maxItemsPerCity` | Optional limit for each city, up to 50,000 |

**How `maxItems` and `maxItemsPerCity` work together.** `maxItems` is the total for the whole run. It is split evenly across the cities you pick (rounded up, in the order you list them). If a city has fewer matching permits than its share, the unused part passes on to the cities after it. Cities skipped because of a filter (see below) get no share. `maxItemsPerCity`, if you set it, is an extra limit: a city never returns more than `maxItemsPerCity` or its share, whichever is smaller. Example: 4 cities, `maxItems` 100 → 25 each; with `maxItemsPerCity` 10 → at most 10 each, 40 in total.

**Max charge per run.** If you set a maximum charge for the run and it is reached, the run stops, keeps (and charges) what it saved, and the status message says "stopped at the max charge per run you set" and lists the cities it never reached. The `ERRORS` record gets a `charge_cap` entry with the same list.

An empty city list, a blank or unknown city name, a whitespace-only filter, a bad date or a bad number stops the run before any request, with a clear message and an `ERRORS` record, and nothing is charged. Unknown input keys are ignored with a warning in the log. If no permit matches, the run fails and nothing is charged.

**Value filters.** `minValue` and `maxValue` are applied by the city's server in the 12 cities that publish a project value, and checked again on every row before it is saved, so a row outside your range is never returned or charged. Permits with no value recorded (blank or 0) are left out when you set either value filter. Delta and Winnipeg publish no project value, so they are skipped when you set one.

**Delta dates.** Delta publishes no issue date, only a completion date. When you set `dateFrom` or `dateTo`, Delta is still searched but on `completedDate` (permits completed in your range, not issued in it), `issuedDate` stays `null`, and the run log, the status message and the `ERRORS` record (type `warning`) say so.

**When a city is skipped.** A city is skipped (not queried, nothing charged for it) only when it has no column for a filter you set. That happens in exactly these cases:

| Filter you set | Skipped cities |
|---|---|
| `minValue` or `maxValue` | Delta, Winnipeg |
| `workType` | Kingston, Victoria, Delta; Halifax unless `workType` is exactly New Building, Addition or Renovation |
| `status` | Surrey, Edmonton |

`dateFrom`, `dateTo`, `permitType` and `keyword` never skip a city. Each skip is named in the run log, listed in the status message and added to the `ERRORS` record (type `skipped`). The other cities still run. If every city you picked is skipped, the run fails and nothing is charged.

### Permit-type and work-type words by city

The text filters match the city's own words, and the words differ a lot between cities. The most common values, read from each city's data on Oct 29, 2026 (Kitchener and Oakville: most common since 2024):

| City | `permitType` values | `workType` values |
|---|---|---|
| Halifax | Residential Building Permit; Mixed Use & Commercial Building Permit | New Building, Renovation, Addition (exact) |
| Kitchener | Residential Building Permit, Residential Building (House), Industrial/Commercial/Institutional Building Permit, Residential Alteration, Plumbing, Permanent Sign Permits, Non-Residential Alteration, Residential Accessory (1 or 2 units), Residential Building (Multi), Mixed Use Building Permit | New Construction, Alterations / Improvements to Building, Addition to Building, Interior Finish, "New, Addition or Alteration", Single Dwelling Converted to Multiple Dwelling, Alteration |
| Oakville | House - Part 9 - Detached House, Single Family Detached Dwelling, Row or Town House, House - Part 9 - Town House, House - Part 3 - Town House Row, House - Part 9 - Semi detached dwelling, Bldg over 5000 sqft F2, Deck | Alteration/repair OR Alteration/finish to an existing building, New Const., New Construction, Alt./Improve, Addition to an existing building, Addition, Demolition |
| Mississauga | RESIDENTIAL, COMMERCIAL, INDUSTRIAL, PUBLIC | ALTERATION TO EXISTING BLDG, NEW BUILDING, ADDITION AND ALTERATION, DEMOLITION, FASCIA SIGN, OTHER |
| Burlington | SO Other Single Detached Dwelling, SF New Single Detached Dwelling, M9 Multi-Res (Part 9), M3 Multi-Res (Part 3), CP Commercial, IP Industrial, PL Plumbing | Renovation (No ZC Reqd), New, Renovation, Addition, Demolition -Building |
| Waterloo | Residential Building Permit, Residential Building, Non Residential Building Permit, Residential Accessory | New, InteriorWork, ExteriorWork, Addition, Demolition |
| Kingston | Alteration or Renovation, New Construction, Addition, Plumbing, Deck, Accessory Structure, Demolition, Sign | – (no column) |
| Victoria | Building Permit (BP), Electrical Permit (EP), Plumbing Permit (PP), Sign Permit (SP) | – (no column) |
| Surrey | Single Family, Single Family (Secondary Suite), Garden Suite, Townhouse, Duplex, Offices, Retail, Warehouse | New, Tenant Improvement, Addition, Renovation, Demolition |
| Delta | RESIDENTIAL, MULTI-RESIDENTIAL, COMMERCIAL, PLUMBING PERMIT, DEMOLITION - RESIDENTIAL | – (no column) |
| Maple Ridge | Building Permit, Electrical Permit, Gas Permit, Plumbing Permit, Sprinkler Permit, Sign | New, Addition, Renovation, Replace, Basement Finish |
| Calgary | Residential Improvement Project, Single Construction Permit, Commercial / Multi Family Project, Demolition | New, Alteration, Addition, Demolition, Repair |
| Edmonton | Home Improvement; Single, Semi-detached & Rowhousing; House Combination; Commercial Final; Other Miscellaneous Building | (01) New, (01) Building - New, (02) Addition, (03) Interior Alterations, (99) Demolition |
| Winnipeg | Housing, Multi-Residential, Accessory Structures, Office, Retail, Sign | Construct New, Construct Addition, Interior Alteration, Develop Lower Level, Demolish |

**`permitType` "Residential" returns 0 permits in Oakville, Burlington, Kingston, Victoria and Edmonton** (checked live on Oct 29, 2026), because those cities don't use that word (use "Dwelling", "House", "Multi-Res", "Home Improvement" and so on). In Surrey it matches only 3 permits (type "Club, Residential"), and in Maple Ridge only an old, unused "Temporary Residential Use (Do Not Use)" type, so use "Single Family", "Townhouse" or "Building Permit" there. In Kitchener and Waterloo it also matches "Non-Residential …" types. **Kingston and Victoria have no residential permit type at all:** Kingston's types describe the work (use `permitType` "New Construction", "Addition" or "Alteration or Renovation"), and Victoria's describe the trade (use "Building Permit (BP)"); neither says whether the building is a home. For new homes across cities, `workType` "New" is the most portable filter.

### Pricing

Pay per result: $0.003 per permit on every Apify plan, no start fee. 100 permits cost $0.30.

### How it compares (Apify Store, Oct 29, 2026)

Prices per permit as listed on each Actor's Apify Store page on Oct 29, 2026, one row per Apify plan. They may change; check the Store page before you buy. We are **not** the cheapest option on every plan, and **we do not cover Toronto, Vancouver or Montreal, which some of these Actors do.**

| Actor | Apify plan | Price per permit | Start fee per run | Cities |
|---|---|---|---|---|
| **This Actor** | Free | $0.003 | none | 14 Canadian cities (listed above) |
| **This Actor** | Bronze | $0.003 | none | 14 Canadian cities (listed above) |
| **This Actor** | Silver | $0.003 | none | 14 Canadian cities (listed above) |
| **This Actor** | Gold | $0.003 | none | 14 Canadian cities (listed above) |
| **This Actor** | Platinum | $0.003 | none | 14 Canadian cities (listed above) |
| **This Actor** | Diamond | $0.003 | none | 14 Canadian cities (listed above) |
| truenorthdata/canada-building-permits | Free | $0.005 | $0.005 | 5 cities: Toronto, Vancouver, Calgary, Edmonton, Montréal |
| truenorthdata/canada-building-permits | Bronze | $0.005 | $0.005 | 5 cities: Toronto, Vancouver, Calgary, Edmonton, Montréal |
| truenorthdata/canada-building-permits | Silver | $0.005 | $0.005 | 5 cities: Toronto, Vancouver, Calgary, Edmonton, Montréal |
| truenorthdata/canada-building-permits | Gold | $0.005 | $0.005 | 5 cities: Toronto, Vancouver, Calgary, Edmonton, Montréal |
| truenorthdata/canada-building-permits | Platinum | $0.005 | $0.005 | 5 cities: Toronto, Vancouver, Calgary, Edmonton, Montréal |
| truenorthdata/canada-building-permits | Diamond | $0.005 | $0.005 | 5 cities: Toronto, Vancouver, Calgary, Edmonton, Montréal |
| plotpointtech/building-permits-feed | Free | $0.004 | $0.00005 | 13 US/CA cities; Canada: Calgary, Edmonton |
| plotpointtech/building-permits-feed | Bronze | $0.0034 | $0.00005 | 13 US/CA cities; Canada: Calgary, Edmonton |
| plotpointtech/building-permits-feed | Silver | $0.003 | $0.00005 | 13 US/CA cities; Canada: Calgary, Edmonton |
| plotpointtech/building-permits-feed | Gold | $0.00248 | $0.00005 | 13 US/CA cities; Canada: Calgary, Edmonton |
| plotpointtech/building-permits-feed | Platinum | $0.00248 | $0.00005 | 13 US/CA cities; Canada: Calgary, Edmonton |
| plotpointtech/building-permits-feed | Diamond | $0.00248 | $0.00005 | 13 US/CA cities; Canada: Calgary, Edmonton |
| openpermits/building-permits-canada-us | Free | $0.0035 | $0.00005 | 8 US/CA cities; Canada: Calgary, Edmonton, Toronto, Vancouver |
| openpermits/building-permits-canada-us | Bronze | $0.0035 | $0.00005 | 8 US/CA cities; Canada: Calgary, Edmonton, Toronto, Vancouver |
| openpermits/building-permits-canada-us | Silver | $0.0035 | $0.00005 | 8 US/CA cities; Canada: Calgary, Edmonton, Toronto, Vancouver |
| openpermits/building-permits-canada-us | Gold | $0.0035 | $0.00005 | 8 US/CA cities; Canada: Calgary, Edmonton, Toronto, Vancouver |
| openpermits/building-permits-canada-us | Platinum | $0.0035 | $0.00005 | 8 US/CA cities; Canada: Calgary, Edmonton, Toronto, Vancouver |
| openpermits/building-permits-canada-us | Diamond | $0.0035 | $0.00005 | 8 US/CA cities; Canada: Calgary, Edmonton, Toronto, Vancouver |
| chorelet/building-permits-scraper | Free | $0.001 | $0.00005 | 10 US/CA cities; Canada: Calgary, Edmonton, Winnipeg |
| chorelet/building-permits-scraper | Bronze | $0.0009 | $0.00005 | 10 US/CA cities; Canada: Calgary, Edmonton, Winnipeg |
| chorelet/building-permits-scraper | Silver | $0.0008 | $0.00005 | 10 US/CA cities; Canada: Calgary, Edmonton, Winnipeg |
| chorelet/building-permits-scraper | Gold | $0.0007 | $0.00005 | 10 US/CA cities; Canada: Calgary, Edmonton, Winnipeg |
| chorelet/building-permits-scraper | Platinum | $0.0007 | $0.00005 | 10 US/CA cities; Canada: Calgary, Edmonton, Winnipeg |
| chorelet/building-permits-scraper | Diamond | $0.0007 | $0.00005 | 10 US/CA cities; Canada: Calgary, Edmonton, Winnipeg |
| themineworks/building-permits-construction-leads | Free | $0.001 | $0.01 | 12 US/CA cities; Canada: Edmonton |
| themineworks/building-permits-construction-leads | Bronze | $0.0009 | $0.01 | 12 US/CA cities; Canada: Edmonton |
| themineworks/building-permits-construction-leads | Silver | $0.00075 | $0.01 | 12 US/CA cities; Canada: Edmonton |
| themineworks/building-permits-construction-leads | Gold | $0.0006 | $0.01 | 12 US/CA cities; Canada: Edmonton |
| themineworks/building-permits-construction-leads | Platinum | $0.0006 | $0.01 | 12 US/CA cities; Canada: Edmonton |
| themineworks/building-permits-construction-leads | Diamond | $0.0006 | $0.01 | 12 US/CA cities; Canada: Edmonton |
| gaelasao/planning-data-au-nz-fr | Free | $0.005 | $0.00005 | US, Canada, Ireland, France, NSW, NZ; Canada: Calgary, Edmonton, Winnipeg |
| gaelasao/planning-data-au-nz-fr | Bronze | $0.005 | $0.00005 | US, Canada, Ireland, France, NSW, NZ; Canada: Calgary, Edmonton, Winnipeg |
| gaelasao/planning-data-au-nz-fr | Silver | $0.0045 | $0.00005 | US, Canada, Ireland, France, NSW, NZ; Canada: Calgary, Edmonton, Winnipeg |
| gaelasao/planning-data-au-nz-fr | Gold | $0.004 | $0.00005 | US, Canada, Ireland, France, NSW, NZ; Canada: Calgary, Edmonton, Winnipeg |
| gaelasao/planning-data-au-nz-fr | Platinum | $0.004 | $0.00005 | US, Canada, Ireland, France, NSW, NZ; Canada: Calgary, Edmonton, Winnipeg |
| gaelasao/planning-data-au-nz-fr | Diamond | $0.004 | $0.00005 | US, Canada, Ireland, France, NSW, NZ; Canada: Calgary, Edmonton, Winnipeg |
| steadfetch/building-permits-extractor | Free | $0.004 | $0.00005 | 4 US/CA cities; Canada: Calgary |
| steadfetch/building-permits-extractor | Bronze | $0.004 | $0.00005 | 4 US/CA cities; Canada: Calgary |
| steadfetch/building-permits-extractor | Silver | $0.0036 | $0.00005 | 4 US/CA cities; Canada: Calgary |
| steadfetch/building-permits-extractor | Gold | $0.0032 | $0.00005 | 4 US/CA cities; Canada: Calgary |
| steadfetch/building-permits-extractor | Platinum | $0.0032 | $0.00005 | 4 US/CA cities; Canada: Calgary |
| steadfetch/building-permits-extractor | Diamond | $0.0032 | $0.00005 | 4 US/CA cities; Canada: Calgary |
| shimon_ben-el/canadian-building-permits | Free | $0.015 | $0.00005 | 2 cities: Calgary, Edmonton |
| shimon_ben-el/canadian-building-permits | Bronze | $0.015 | $0.00005 | 2 cities: Calgary, Edmonton |
| shimon_ben-el/canadian-building-permits | Silver | $0.015 | $0.00005 | 2 cities: Calgary, Edmonton |
| shimon_ben-el/canadian-building-permits | Gold | $0.015 | $0.00005 | 2 cities: Calgary, Edmonton |
| shimon_ben-el/canadian-building-permits | Platinum | $0.015 | $0.00005 | 2 cities: Calgary, Edmonton |
| shimon_ben-el/canadian-building-permits | Diamond | $0.015 | $0.00005 | 2 cities: Calgary, Edmonton |

Single-city Actors also exist, several cheaper per permit than this one for their one city, for example scrapingmonkey's Toronto and Vancouver scrapers ($0.003 on Free, $0.001 on Bronze and above), pink_comic's Calgary and Edmonton leads ($0.002) and a free Edmonton Actor (acid-base). Start fees are charged once per run (per GB of memory). Choose this Actor if you want the 14 cities above in one consistent table; choose another if you need Toronto, Vancouver or Montreal.

### FAQ

**Which Canadian cities are covered?** 14 cities in Nova Scotia, Ontario, British Columbia, Alberta and Manitoba (list above). Toronto, Vancouver and Montreal are not covered yet. Ask in Issues for your city.

**How fresh is the data?** Each run queries the city's live open data portal, so you get whatever the city has published, usually updated daily or weekly.

**Can I get construction leads for new homes only?** Yes: set `workType` to `New` (Halifax: `New Building`) and, optionally, `minValue`. Kingston, Victoria and Delta have no work-type column and are skipped with that filter; for them use `permitType` (Kingston "New Construction", Delta "RESIDENTIAL").

**Does it include owner or contractor names?** No. Personal names, addresses and descriptions are left out on purpose.

**Can I export to CSV or Excel?** Yes, from the dataset tab (CSV, Excel, JSON), or through the Apify API, n8n, Make or Zapier.

**Is this legal to use commercially?** Yes. Every city's licence or terms allow commercial reuse. The conditions differ a little by city (see the licence notes below). Keep the `licence` field when you republish, and do not imply that any city endorses your product.

### Sources and licences

| City | Source | Licence / credit |
|---|---|---|
| Halifax, NS | https://data-hrm.hub.arcgis.com/ (PPL\&C Building Permits) | Contains information licenced under the Open Government Licence—Halifax (https://data-hrm.hub.arcgis.com/pages/open-data-licence) |
| Kitchener, ON | https://open-kitchenergis.opendata.arcgis.com/datasets/KitchenerGIS::building-permits | Contains information licensed under the Open Government Licence – City of Kitchener (https://www.kitchener.ca/en/council-and-city-administration/open-data-licence.aspx) |
| Oakville, ON | https://portal-exploreoakville.opendata.arcgis.com/ | Contains information licensed under the Open Government Licence — Town of Oakville (https://www.oakville.ca/town-hall/plans-strategies/open-data/open-data-licence/) |
| Mississauga, ON | https://data.mississauga.ca/ | Contains information licensed under the City of Mississauga Open Data Terms of Use (https://mississauga.maps.arcgis.com/sharing/rest/content/items/961c790805c14d8da258ec91bf4117e3/data) |
| Burlington, ON | https://opendata.burlington.ca/ | Contains information licensed under the City of Burlington Open Data Terms of Use (https://opendata.burlington.ca/opendata-terms-of-use/City%20of%20Burlington%20-%20Open%20Data%20Terms%20of%20Use.pdf) |
| Waterloo, ON | https://data.waterloo.ca/ | Contains information provided by the City of Waterloo under licence (Waterloo Open Data User Licence: https://data.waterloo.ca/pages/open-data-licence) |
| Kingston, ON | https://opendatakingston.cityofkingston.ca/ | Contains information licensed under the Open Data Licence – City of Kingston (https://www.cityofkingston.ca/media/wtpgpkb0/gis_license_opendata.pdf) |
| Victoria, BC | https://opendata.victoria.ca/ | Contains information licensed under the City of Victoria Open Data Licence (https://opendata.victoria.ca/pages/open-data-licence) |
| Surrey, BC | https://opendata-surrey.hub.arcgis.com/ | Contains information licensed under the Open Government License – City of Surrey. Licence: https://opendata-surrey.hub.arcgis.com/pages/55089a19491a4fe59a41e059fd8af708 |
| Delta, BC | https://opendata-deltabc.hub.arcgis.com/ | Contains information licensed under the Open Government Licence – Delta (https://www.delta.ca/Open-Government-Licence) |
| Maple Ridge, BC | https://www.arcgis.com/home/item.html?id=4e1c48a9c95d482199513d7a826d2ac8 | Contains information licensed under the Open Government Licence – Maple Ridge (https://www.mapleridge.ca/terms-use) |
| Calgary, AB | https://data.calgary.ca/Business-and-Economic-Activity/Building-Permits/c2es-76ed | Contains information licensed under the Open Government Licence – City of Calgary. (v2.1) Licence: https://data.calgary.ca/stories/s/Open-Calgary-Terms-of-Use/u45n-7awa |
| Edmonton, AB | https://data.edmonton.ca/Urban-Planning-Economy/General-Building-Permits/24uj-dj8v | Contains information licensed under the Open Government Licence – City of Edmonton. Licence: https://data.edmonton.ca/stories/s/City-of-Edmonton-Open-Data-Terms-of-Use/msh8-if28 |
| Winnipeg, MB | https://data.winnipeg.ca/Development-Approvals-Building-Permits-Inspections/Detailed-Building-Permit-Data/it4w-cpf4 | Contains information licensed under the Open Government Licence – Winnipeg. Licence: https://data.winnipeg.ca/open-data-licence |

### Licence notes

- **Attribution:** every row carries the city's credit line and licence link in `licence`. Halifax, Kitchener, Oakville, Victoria, Surrey, Delta, Maple Ridge, Kingston, Calgary (v2.1), Edmonton and Winnipeg require that credit when you use or republish the data.
- **Mississauga and Burlington:** reuse, commercial use and redistribution are allowed. Credit is optional (the City may ask you to remove it). If you redistribute the data, include the City's Terms of Use (or their URL) and make recipients bound by them.
- **Waterloo:** credit is optional. If you give credit, use "Contains information provided by the City of Waterloo under licence". Do not misrepresent the data or its source.
- **Kingston:** the City takes no responsibility for the accuracy of the data.
- **Maple Ridge:** the City's Terms of Use also apply.
- **Personal information:** none of these licences cover personal information or city names, crests, logos or official marks.
- **No endorsement:** this Actor is independent. It does not use city names, crests, logos or official marks as branding and does not suggest official status or endorsement by any city.

### Privacy

Owner, applicant and contractor names (including Maple Ridge's contractor field, since some contractors are sole traders), street addresses, parcel IDs and free-text work descriptions are not exported. Where a city publishes them, postal codes are cut to the first 3 characters and map points are rounded to about 1 km. Any phone number or email address that appears in a text field is replaced with `[removed]`. The output is reduced, not anonymous: a permit number can be looked up in city records and may relate to a property.

# Actor input Schema

## `cities` (type: `array`):

Which cities to pull permits from. Each row in the output has city and province columns.

## `dateFrom` (type: `string`):

Only permits issued on or after this date. Leave empty for no lower limit. Delta publishes no issue date, so for Delta this filters on the completion date (the log warns).

## `dateTo` (type: `string`):

Only permits issued on or before this date. For Delta this filters on the completion date.

## `minValue` (type: `integer`):

Only permits with an estimated construction value at or above this. Permits with no value recorded (blank or 0) are left out when you set a value filter. Delta and Winnipeg publish no value, so they are skipped when you set this.

## `maxValue` (type: `integer`):

Only permits with an estimated construction value at or below this. Permits with no value recorded (blank or 0) are left out. Delta and Winnipeg publish no value, so they are skipped when you set this.

## `permitType` (type: `string`):

Text match (contains, not case-sensitive) on the city's permit type. The words differ by city: see the README table. 'Residential' matches nothing in Oakville, Burlington, Kingston, Victoria, Surrey and Edmonton.

## `workType` (type: `string`):

Text match on work type, e.g. New, Addition, Alteration. Halifax accepts exactly: New Building, Addition, Renovation. Kingston, Victoria and Delta have no work-type column and are skipped when you set this.

## `status` (type: `string`):

Text match on permit status, e.g. Issued, Closed. Surrey and Edmonton have no status column and are skipped when you set this.

## `keyword` (type: `string`):

Searches each city's permit number and type/description-like fields.

## `maxItems` (type: `integer`):

Total permits across all cities (default 100, up to 50,000). Split evenly between the cities you pick; a city that has fewer matches passes its unused share on to the next cities.

## `maxItemsPerCity` (type: `integer`):

Optional upper limit for each city, newest first. A city never gets more than this or its share of 'Max permits in total', whichever is smaller.

## Actor input object example

```json
{
  "cities": [
    "halifax",
    "calgary",
    "mississauga"
  ],
  "maxItems": 100
}
```

# Actor output Schema

## `permits` (type: `string`):

All permits returned by the run, shown in the 'overview' table view of the default dataset.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "cities": [
        "halifax",
        "calgary",
        "mississauga"
    ],
    "maxItems": 100
};

// Run the Actor and wait for it to finish
const run = await client.actor("loudtzu/canada-building-permits").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "cities": [
        "halifax",
        "calgary",
        "mississauga",
    ],
    "maxItems": 100,
}

# Run the Actor and wait for it to finish
run = client.actor("loudtzu/canada-building-permits").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "cities": [
    "halifax",
    "calgary",
    "mississauga"
  ],
  "maxItems": 100
}' |
apify call loudtzu/canada-building-permits --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,loudtzu/canada-building-permits"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/kaIamVgvUdWIpjdH3/builds/GUqsognftlqr3P0PD/openapi.json
