DEV Community

Vadim Zabin
Vadim Zabin

Posted on

Building Permit Leads in Canada: Toronto, Vancouver, Calgary, Edmonton (2026)

Every week, thousands of homeowners and businesses in Toronto, Vancouver, Calgary and Edmonton get building permits approved. Each permit is a public record — an address where someone is about to spend money on construction. Here is how to turn municipal open data into a contractor lead list, with working code and a no-code option.

Why building permits are the best contractor leads

A building permit is the strongest buying signal in the trades industry:

  • A roofing permit means a homeowner is replacing a roof — and probably comparing quotes right now.
  • A new single-family dwelling means a general contractor will need HVAC, electrical, plumbing, landscaping and materials for the next 12 months.
  • A demolition permit often precedes a rebuild — early signal for every trade.
  • High project values identify commercial jobs worth a supplier's attention.

Unlike purchased lead lists, permits are fresh, verified by the city, and include the address, the work description and often the contractor and estimated project cost.

Where the data lives (and what's actually open)

Canada's four largest construction markets all publish permit data through official open-data programs:

City Platform Update cadence Contractor name Project value
Toronto CKAN datastore Daily Yes
Vancouver Opendatasoft API Frequent Yes Yes
Calgary Socrata (SODA) Weekly-ish (can lag) Yes Yes
Edmonton Socrata (SODA) Frequent

All four are published for reuse under open-data licences — no scraping grey zones.

Quick example: pulling Calgary permits with Python

Calgary's dataset is the richest — it includes contractor names, estimated project cost and square footage:

import requests

url = "https://data.calgary.ca/resource/c2es-76ed.json"
params = {
    "$limit": 100,
    "$order": "issueddate DESC",
    "$where": "issueddate >= '2026-05-01T00:00:00.000'",
}
rows = requests.get(url, params=params).json()
for r in rows[:5]:
    print(r["issueddate"][:10], "|", r.get("description"), "|",
          r.get("contractorname"), "|", r.get("estprojectcost"))
Enter fullscreen mode Exit fullscreen mode

Vancouver uses the Opendatasoft Explore API, Toronto a CKAN datastore, Edmonton another Socrata dataset — each with different field names, pagination rules and quirks (Toronto's columns are UPPER_SNAKE, Calgary's dataset can lag a few weeks, Vancouver caps deep pagination).

The hard part: one schema, four cities

If you want leads across cities, you need to normalize four different schemas into one: permit id, type of work, description, address, contractor, project value, dates. Then deduplicate, filter by keyword ("roof", "solar", "pool"), by minimum project value, and set up a scheduler so your sales team gets only new permits every Monday — not the same list twice.

That's a real engineering project. Here is the shortcut.

The no-code option: one API for all four cities

I maintain an Apify Actor that does the normalization, filtering and monitoring:

Building Permits Canada — Toronto, Vancouver, Calgary, Edmonton

Example — roofing leads in Calgary, projects worth $20k+:

{
    "cities": ["calgary"],
    "issuedWithinDays": 14,
    "keywords": ["roof"],
    "minProjectValue": 20000,
    "onlyNewSinceLastRun": true
}
Enter fullscreen mode Exit fullscreen mode

Output — one clean record per permit:

{
    "permitId": "BP2026-11223",
    "city": "Calgary",
    "workClass": "Alteration",
    "description": "REROOF, SOLAR PV INSTALLATION",
    "address": "248 SADDLELAKE DR NE",
    "contractor": "ACME ROOFING LTD",
    "projectValue": 46089.8,
    "issuedDate": "2026-06-28"
}
Enter fullscreen mode Exit fullscreen mode

The onlyNewSinceLastRun flag turns it into a monitoring feed: schedule it weekly on Apify, connect email or Slack, and every Monday you get only the permits that didn't exist last week. Pricing is per record ($5 per 1,000) — a weekly lead list for a single trade in one city typically costs cents.

Export to Excel/CSV works out of the box, so the list can go straight to a sales team or a CRM import.

Use cases beyond lead gen

  • Building-material suppliers: target active job sites by neighbourhood and project value.
  • Equipment rental: new construction permits = upcoming demand for machinery.
  • PropTech and researchers: construction activity by community, month and value.
  • Real estate investors: renovation clusters signal appreciating streets.

FAQ

Is this legal? Yes — all four cities publish permit data through official open-data programs licensed for reuse.

Does it include homeowner contact info? No. Records contain the address, work description, and (in Calgary/Vancouver) the applicant or contractor business name — not personal phone numbers or emails. Door-knocking and direct mail are the standard plays.

Which cities are next? Ottawa and Montréal are on the roadmap — open an issue on the Actor page to vote.

How do I try it free? Apify's free tier includes $5 in credits — roughly a thousand permit records.


Building something with Canadian public data — permits, tenders, registries? I write about turning open data into products. Questions welcome in the comments.

Top comments (0)