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.
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 :
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 : 100 requêtes/jour. Niveau Pro : 10 000 requêtes/jour à 29 $/mois.
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.
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"
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"
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")
{
"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.
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.
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
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.
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.
lat et lng à null ; ils sont retournés normalement dans les requêtes sans filtre de proximité.
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.
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