← Retour au blogue
EN FR

API de permis de construction canadiens : guide pour développeurs

Chaque municipalité canadienne publie ses permis de construction séparément, dans son propre format. Toronto utilise CKAN. Calgary et Edmonton, Socrata. Vancouver, ArcGIS. Certaines villes publient des fichiers Excel. Aucune ne s'entend sur les noms de champs, les formats de dates ou les catégories de permis.

BuildData normalise 3 219 264 permis provenant de 57 villes en un seul schéma REST, géocode 81 % des enregistrements avec des coordonnées lat/lng, et met à jour les données chaque jour. Ce guide couvre l'authentification, les points d'accès, des exemples de requêtes et les décisions de conception utiles à connaître avant de commencer.

Ce que contient la base de données

Tous les enregistrements partagent le même schéma, quelle que soit leur ville d'origine. Le champ permit_type_canonical regroupe les appellations locales (permis de bâtir, construction neuve, rénovation, etc.) en six catégories stables :

La rénovation domine (42,3 %), suivie de la nouvelle construction (26,1 %). Les agrandissements (10,8 %) et les démolitions (3,1 %) sont également couverts. 81,7 % des enregistrements sont géocodages à l'aide de la Base de données des adresses ouvertes de Statistique Canada.

Les 10 villes les plus importantes par volume :

  • Montréal : 550 842
  • Calgary : 487 541
  • Toronto : 240 648
  • Edmonton : 239 904
  • Winnipeg : 158 800
  • Laval : 152 632
  • Brampton : 142 651
  • Sudbury : 114 888
  • Victoria : 107 338
  • Ottawa : 82 996

Authentification

Tous les points d'accès sont accessibles via RapidAPI. Deux en-têtes sont requis à chaque requête :

bash
# En-têtes requis pour chaque requête
X-RapidAPI-Key: VOTRE_CLE_API
X-RapidAPI-Host: builddata-canadian-construction-data-api.p.rapidapi.com

Niveau gratuit : 100 requêtes/jour. Niveau Pro : 10 000 requêtes/jour à 29 $/mois.

Points d'accès

L'API compte cinq points d'accès. La spécification OpenAPI 3.0.3 complète est disponible à builddata.ca/openapi.json et peut être importée directement dans Postman, Insomnia ou tout autre outil compatible.

Surface de l'API
  • GET
    /permit
    Recherche de permis. Filtres : municipality, permit_type_canonical, status_canonical, q (texte), issued_after, issued_before, lat/lng/radius_km. Pagination par curseur.
  • GET
    /permit/stats
    Statistiques agregées. group_by : permit_type_canonical, status_canonical, municipality. Filtre par période.
  • GET
    /permit/{record_id}
    Enregistrement individuel par identifiant stable.
  • GET
    /zone
    Zone d'urbanisme à une coordonnée donnée (lat/lng). Retourne le code de zone et la description.

Exemples de requêtes

Permis de nouvelle construction à Montréal depuis 2024

curl
curl -G "https://builddata-canadian-construction-data-api.p.rapidapi.com/permit" \
  --data-urlencode "municipality=montreal" \
  --data-urlencode "permit_type_canonical=new_construction" \
  --data-urlencode "issued_after=2024-01-01" \
  --data-urlencode "sort_by=date" \
  --data-urlencode "limit=20" \
  -H "X-RapidAPI-Key: VOTRE_CLE_API" \
  -H "X-RapidAPI-Host: builddata-canadian-construction-data-api.p.rapidapi.com"

Recherche de proximité (dans un rayon de 2 km)

curl
curl -G "https://builddata-canadian-construction-data-api.p.rapidapi.com/permit" \
  --data-urlencode "lat=45.5017" \
  --data-urlencode "lng=-73.5673" \
  --data-urlencode "radius_km=2" \
  --data-urlencode "limit=50" \
  -H "X-RapidAPI-Key: VOTRE_CLE_API" \
  -H "X-RapidAPI-Host: builddata-canadian-construction-data-api.p.rapidapi.com"

Pagination par curseur (pour les agents et les pipelines)

Chaque réponse de liste inclut un champ next_cursor. Passez-le comme paramètre cursor dans la requête suivante. Les curseurs sont stables et sans état.

python
import requests

BASE = "https://builddata-canadian-construction-data-api.p.rapidapi.com"
HEADERS = {
    "X-RapidAPI-Key": "VOTRE_CLE_API",
    "X-RapidAPI-Host": "builddata-canadian-construction-data-api.p.rapidapi.com",
}

params = {"municipality": "calgary", "permit_type_canonical": "new_construction", "limit": 100}
records = []

while True:
    r = requests.get(BASE + "/permit", headers=HEADERS, params=params)
    data = r.json()
    records.extend(data["results"])
    if not data.get("next_cursor"):
        break
    params["cursor"] = data["next_cursor"]

print(f"{len(records)} permis récupérés")

Schéma d'un enregistrement

json (permis)
{
  "record_id": "23-123456",
  "municipality": "toronto",
  "address": "123 QUEEN ST W",
  "permit_type": "New Construction",
  "permit_type_canonical": "new_construction",
  "status": "Issued",
  "status_canonical": "issued",
  "issued_date": "2024-03-15",
  "work": "Erect 12-storey mixed-use building",
  "lat": 43.6487,
  "lng": -79.3958,
  "entity_type": "permit"
}

Champs canoniques : permit_type_canonical et status_canonical sont normalisés pour toutes les villes. permit_type et status conservent les valeurs brutes de la source municipale. Utilisez les champs canoniques pour les filtres et les agrégations inter-villes.

Décisions de conception à connaître

Utilisez le curseur, pas l'offset

L'API ne supporte pas la pagination par offset. Chaque réponse retourne next_cursor : passez-le comme paramètre cursor dans la requête suivante. Les curseurs sont stables entre les requêtes, même si de nouveaux enregistrements sont ajoutés entre-temps.

Utilisez /permit/stats pour les questions agregées

Pour répondre à « combien de nouvelles constructions à Calgary en 2024 », utilisez /permit/stats plutôt que de parcourir tous les enregistrements. Le point d'accès retourne les comptes agregés en moins d'une seconde :

bash
/permit/stats?municipality=calgary&permit_type_canonical=new_construction&period=1y

La recherche de proximité fonctionne à travers les villes

Les paramètres lat, lng et radius_km fonctionnent sans spécifier de municipalité. Utile pour les requêtes proches des limites administratives, les corridors de transport ou les zones métropolitaines à cheval sur plusieurs villes.

Recherche plein texte sur les descriptions

Le paramètre q effectue une recherche plein texte sur les champs work et address. Utile pour trouver des projets spécifiques (« piscine », « démolition », un nom de promoteur) plutôt que de filtrer uniquement par type canonique.

Questions fréquentes

Quelles villes sont couvertes ?
57 villes dans 9 provinces : Ontario (28 villes dont Toronto, Ottawa, Hamilton, Kitchener), Québec (Montréal, Laval, Québec, Longueuil, Saint-Jérôme), Alberta (Calgary, Edmonton, Red Deer, Lethbridge, Grande Prairie), Colombie-Britannique (Victoria, Vancouver, Surrey, Burnaby, Richmond et autres), Manitoba (Winnipeg), Saskatchewan (Regina), Nouvelle-Écosse (Halifax), Nouveau-Brunswick (Saint John), Terre-Neuve (St. John's).
À quelle fréquence les données sont-elles mises à jour ?
Les pipelines d'acquisition s'exécutent quotidiennement (minuit UTC) depuis les portails de données ouvertes de chaque ville. La plupart des villes publient de nouveaux permis en temps quasi réel ; le délai entre l'émission et la disponibilité via l'API est généralement de moins de 24 heures.
Comment fonctionne le géocodage ?
Les coordonnées lat/lng proviennent de la Base de données des adresses ouvertes (BDO) de Statistique Canada. 81,7 % des enregistrements sont géocodages (2 631 431 sur 3 219 264). Les enregistrements sans coordonnées ont lat et lng à null ; ils sont retournés normalement dans les requêtes sans filtre de proximité.
Y a-t-il un niveau gratuit ?
Oui. Le niveau Basic est gratuit : 100 requêtes/jour, accès à tous les points d'accès et à toutes les 57 villes. Le niveau Pro est à 29 $/mois pour 10 000 requêtes/jour.
Où trouver la spécification OpenAPI ?
La spécification OpenAPI 3.0.3 est disponible à builddata.ca/openapi.json. Elle inclut tous les paramètres, les schémas de réponse et les exemples. Compatible Postman, Insomnia et tout framework d'appel de fonction LLM.

En résumé : 3,2 M de permis, 57 villes, un seul schéma. Pas d'intégration municipale à écrire, pas de normalisation à faire. Commencez par le niveau gratuit, passez au Pro quand votre pipeline est stable.

Notes méthodologiques : Nombre d'enregistrements au 6 mai 2026 (3 219 264 total, 2 631 431 géocodages). Les types canoniques (permit_type_canonical) : renovation (42,3 %), new_construction (26,1 %), other (14,0 %), addition (10,8 %), change_of_use (3,7 %), demolition (3,1 %). Les pourcentages ne totalisent pas exactement 100 % en raison des arrondis. Géocodage : Base de données des adresses ouvertes, Statistique Canada.

Commencez à interroger 3,2 M de permis de construction canadiens.

Obtenir une clé API gratuite Spécification OpenAPI