Documentation menu
Cookbook
OverviewNew permit leadsHighest-value permitsFurnace and rewire permitsPermits near a pointMegaproject pipelineProjects near a siteZoning at an addressEverything at one addressEndpoints
GET/zoneGET/geocodeGET/reverse-geocodeGET/zoningPOST/permit/estimateGET/contractor/statsGET/contractor/coverageGET/contractorGET/propertyGET/address/normalizeGET/opening_soonGET/openingGET/businessGET/business/statsGET/business/coverageGET/contractor/{name_normalized}GET/permitGET/inspectionGET/licenceGET/development_permitGET/planning_applicationGET/assessmentGET/major_projectGET/heritage_statusGET/occupancy_permitGET/permit/statsGET/inspection/statsGET/licence/statsGET/development_permit/statsGET/planning_application/statsGET/assessment/statsGET/major_project/statsGET/heritage_status/statsGET/occupancy_permit/statsGET/permit/coverageGET/inspection/coverageGET/licence/coverageGET/development_permit/coverageGET/planning_application/coverageGET/assessment/coverageGET/major_project/coverageGET/heritage_status/coverageGET/occupancy_permit/coverageGET/permit/{record_id}/historyGET/permit/{record_id}GET/inspection/{record_id}GET/licence/{record_id}GET/development_permit/{record_id}GET/planning_application/{record_id}GET/assessment/{record_id}GET/major_project/{record_id}GET/heritage_status/{record_id}GET/occupancy_permit/{record_id}Every BuildData record at one address
Every record filed against one street address, grouped by dataset, with counts per dataset. Free keys get the counts and an empty records object with a free_tier note; paid keys get the records.
Parameters
| Parameter | Type | Description | |
|---|---|---|---|
address | string | required | Street address, e.g. '3 Briarcliffe Drive'.Canonicalized server-side, so you do not need to know the exact stored form. |
municipality | string | required | Filter to one city by its slug, e.g. 'new_westminster', 'toronto', 'north_vancouver_city'.Exact match. The dataset's /coverage endpoint lists the valid slugs. 'city' is accepted as an alias. |
Request
curl --request GET \
--url 'https://api.builddata.ca/property?address=7236%2010%20Street%20NE&municipality=calgary' \
--header 'X-API-Key: YOUR_API_KEY'import requests
url = "https://api.builddata.ca/property?address=7236%2010%20Street%20NE&municipality=calgary"
headers = {"X-API-Key": "YOUR_API_KEY"}
resp = requests.get(url, headers=headers)
print(resp.json())const res = await fetch("https://api.builddata.ca/property?address=7236%2010%20Street%20NE&municipality=calgary", {
headers: {
"X-API-Key": "YOUR_API_KEY",
},
});
const data = await res.json();
console.log(data);<?php
$ch = curl_init("https://api.builddata.ca/property?address=7236%2010%20Street%20NE&municipality=calgary");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, [
"X-API-Key: YOUR_API_KEY",
]);
echo curl_exec($ch);require "net/http"
require "uri"
uri = URI("https://api.builddata.ca/property?address=7236%2010%20Street%20NE&municipality=calgary")
req = Net::HTTP::Get.new(uri)
req["X-API-Key"] = "YOUR_API_KEY"
res = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) { |h| h.request(req) }
puts res.bodypackage main
import (
"fmt"
"io"
"net/http"
)
func main() {
req, _ := http.NewRequest("GET", "https://api.builddata.ca/property?address=7236%2010%20Street%20NE&municipality=calgary", nil)
req.Header.Add("X-API-Key", "YOUR_API_KEY")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}import java.net.URI;
import java.net.http.*;
HttpRequest req = HttpRequest.newBuilder()
.uri(URI.create("https://api.builddata.ca/property?address=7236%2010%20Street%20NE&municipality=calgary"))
.header("X-API-Key", "YOUR_API_KEY")
.build();
HttpResponse<String> res = HttpClient.newHttpClient()
.send(req, HttpResponse.BodyHandlers.ofString());
System.out.println(res.body());Errors
Every error returns {"detail": "…"}, a sentence naming what was wrong and, where there is one, the fix, plus docs and, when they apply, did_you_mean (the nearest valid value) and valid (the accepted values).
| Status | When |
|---|---|
400 | The request is understood but cannot be served as asked, e.g. offset above 9500, or cursor combined with sort_by=value. The message names the fix. |
403 | Missing or invalid API key; a route that needs a paid plan, called with a free key; or, on a free key, a record first seen inside the last 30 days, asked for by id. The message says which. |
404 | No such endpoint, or no record with that id. |
422 | A parameter is invalid: an unknown city slug, an impossible date, a limit above 500, an unrecognised sort field, or a misspelled parameter name. The message names the parameter and, where there is one, the nearest valid value. |
429 | Rate limit or plan quota exceeded. |
500 | Unexpected server error. |
504 | The query took too long. Narrow it with a municipality or a date range. |
Ready to build?Create a free key and start calling BuildData in minutes. No card required.
Get your API key →