Permit Data API · v1 · 31 cities · JSON

Canadian permit data,
one API call away.

Build issued permits, contractor intelligence, and pre-permit signals directly into your product. Stable, versioned REST endpoints. Authenticate with a single API key.

Base URL · https://api.sitewire.ca/v1

Authentication

Every request must include your secret key in the X-API-Key header. Keys are issued from your dashboard and start with sw_live_. Treat them like passwords, use them server-side only, never in browser code.

curl -H "X-API-Key: sw_live_YOUR_KEY" \
  "https://api.sitewire.ca/v1/permits?city=calgary&min_value=1000000&limit=20"

Endpoints

GET
/v1/permits

List permits with filters (city, value, type, date, status). Paginated.

GET
/v1/permits/{permitnumber}

Full lifecycle/timeline for a single permit.

GET
/v1/contractors/{name}

Every permit tied to a named contractor.

GET
/v1/stats

Aggregate counts and values by neighbourhood and work type.

GET
/v1/cities

All covered cities with permit counts and latest dates.

GET
/v1/usage

Your plan, calls used this month, quota, and reset date.

GET
/v1/health

Unauthenticated health probe for uptime monitoring.

Interactive OpenAPI reference available at /openapi.json.

Response shape

Every list endpoint returns the same envelope: a data array, a pagination block, and a meta block with your live quota.

{
  "data": [
    {
      "permitnumber": "BP-2026-04512",
      "address": "4512 Dunbar St",
      "city": "vancouver",
      "typeofwork": "New Construction",
      "projectvalue": 2400000,
      "issuedate": "2026-05-15",
      "buildingcontractor": "Acme Construction Ltd"
    }
  ],
  "pagination": { "limit": 20, "offset": 0, "total": 184, "next_offset": 20, "has_more": true },
  "meta": { "plan": "api_growth", "calls_this_month": 312, "call_limit": 100000, "resets_on": "2026-07-01" }
}

Rate limits & plans

Plans are metered by monthly call volume. Every response carries X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-Reset. Exceed your quota and you'll get a 429 until it resets on the 1st of the month.

PlanMonthly callsPipeline signalsPrice
API Starter10,000 / moNone$49/mo
API Growth100,000 / moIncluded$199/mo
API Scale1,000,000 / moIncluded$699/mo

Quickstart

JavaScript

const res = await fetch(
  "https://api.sitewire.ca/v1/permits?city=toronto&status=pipeline",
  { headers: { "X-API-Key": process.env.SITEWIRE_API_KEY } }
);
const { data, pagination, meta } = await res.json();
console.log(data.length, "permits ·", meta.call_limit - meta.calls_this_month, "calls left");

Python

import requests

r = requests.get(
    "https://api.sitewire.ca/v1/permits",
    headers={"X-API-Key": "sw_live_YOUR_KEY"},
    params={"city": "vancouver", "days_back": 30, "limit": 50},
)
r.raise_for_status()
for permit in r.json()["data"]:
    print(permit["address"], permit["projectvalue"])

Start building in minutes.

Generate a key, make your first call, and pull Canadian permit data straight into your stack.

Get your API key