Stop scraping 68 municipal permit portals
One REST API for Canadian building permits, licences, zoning and inspections. Ten datasets, one schema, joined on one address.
curl "https://api.builddata.ca/permit?municipality=toronto&limit=5" \
-H "X-API-Key: YOUR_KEY"
- 17M records
- 10 datasets
- 68 cities, 9 provinces
- Refreshed daily
Free tier: 100 requests a day, 100 rows a call, no card, everything older than 30 days. Pro: 10,000 requests at 500 rows, today's records included, $49 CAD a month.
Every city publishes differently
Toronto ships one format, Calgary another, Montreal another again. Column names differ, permit types differ, addresses are written every way a clerk can write them, and a portal changes shape without telling anyone. Doing this yourself is not one scraper, it is 68 of them, plus the address matching, plus the mornings they break.
That is the part we run. You get one schema and one key.
One address, every dataset
Records are joined on a normalised address, so a single lookup returns the permits, the licences, the zoning and the inspections for that property. This is the part you cannot get by scraping harder: the cities publish these separately and never key them to each other.
Built for product teams putting Canadian property data in their own app, and for analysts who would rather query than maintain scrapers.
Same filters, whichever dataset
Every endpoint takes the same filters and returns the same envelope, so the code you write for permits already works for licences. Swap /permit for /licence, /zoning, /inspection or any of the ten.
What you can query
What the free tier covers
Almost all of it. Every dataset, every filter, geocoding, contractor profiles and property profiles are on the free tier. One endpoint needs Pro: /permit/estimate, which prices a permit from a model. Matched, deduplicated lead streams are the feeds product rather than an API call. The free tier also returns 100 rows a call rather than 500, so it is sized for evaluating the data rather than pulling it.
Bulk export and a Snowflake share carry the same schema, for loading a whole dataset rather than paging through it. Ask about bulk access.