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,378,722 permis provenant de 60 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 :
# 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 : 25 requêtes/jour. Niveau Pro : 1 000 requêtes/jour à 49 $/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.
-
GET
/permitRecherche de permis. Filtres : municipality, permit_type_canonical, status_canonical, q (texte), issued_after, issued_before, lat/lng/radius_km. Pagination par curseur.
-
GET
/permit/statsStatistiques agregées. group_by : permit_type_canonical, status_canonical, municipality. Filtre par période.
-
GET
/permit/{record_id}Enregistrement individuel par identifiant stable.
-
GET
/zoneZone 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 -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 -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.
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
{
"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 :
/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
lat et lng à null ; ils sont retournés normalement dans les requêtes sans filtre de proximité.
En résumé : 3,4 M de permis, 60 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.
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,4 M de permis de construction canadiens.
Obtenir une clé API gratuite Spécification OpenAPI