§ Developer API · v1

Build something with our pricing data.

A small, read-only JSON API. The same data the calculator runs on — exposed cleanly so contractors, comparison tools, or homeowners’ spreadsheets can pull live numbers.

The basics

  • Base URL https://deckcosttoronto.com
  • Auth — none. No keys, no signups.
  • Response — JSON. UTF-8. Always wrapped in { version, data }.
  • Caching — endpoints set Cache-Control: public, s-maxage=3600. Cache aggressively.
  • CORS *. Browser-side calls work without a proxy.
  • License CC BY 4.0. Use it commercially, attribute deckcosttoronto.com.

Endpoints

GET/api/v1/pricing

All pricing constants — materials, heights, railings, feature add-ons, stairs, demolition, permit fees, and the calculator's input bounds.

Example

curl https://deckcosttoronto.com/api/v1/pricing

Response (truncated)

{
  "version": "v1",
  "currency": "CAD",
  "taxesIncluded": false,
  "region": "Greater Toronto Area",
  "year": 2026,
  "data": {
    "materials": [
      {
        "id": "pressure_treated",
        "label": "Pressure-treated lumber",
        "perSqFt": { "low": 30, "high": 45 },
        "blurb": "Most affordable. Lasts 15–20 years..."
      },
      ...
    ],
    "heights": [...],
    "railings": [...],
    "features": [...],
    "stairsPerStep": { "low": 180, "high": 320 },
    "demolitionPerSqFt": { "low": 4, "high": 8 },
    "permitCost": { "low": 250, "high": 750 },
    "minProjectFloor": { "low": 4500, "high": 6000 }
  }
}
GET/api/v1/cities

List of all 15 GTA cities the calculator covers. Each entry includes slug, region, population, intro copy, and the local permit note.

Example

curl https://deckcosttoronto.com/api/v1/cities

Response (truncated)

{
  "version": "v1",
  "count": 15,
  "data": [
    {
      "slug": "toronto",
      "name": "Toronto",
      "region": "City of Toronto",
      "population": 2930000,
      "intro": "Toronto's deck market is the busiest...",
      "permitNote": "Most attached decks...",
      "neighbourhoods": ["The Beaches", "Leslieville", ...]
    },
    ...
  ]
}
GET/api/v1/cities/{slug}

Full record for a single city, including local-challenge prose and the sample-build framing used on that city's landing page.

Example

curl https://deckcosttoronto.com/api/v1/cities/toronto

Response (truncated)

{
  "version": "v1",
  "data": {
    "slug": "toronto",
    "name": "Toronto",
    "region": "City of Toronto",
    "population": 2930000,
    "intro": "...",
    "contextNotes": ["...", "...", "..."],
    "permitNote": "...",
    "neighbourhoods": [...],
    "localChallenge": "...",
    "sampleBuildIntro": "..."
  }
}

Versioning

We’ll keep v1 stable. Breaking changes go to v2 at a new path. Additive changes (new fields) may land in v1 without notice — write your client to ignore unknown keys.

Hit a problem?

Email hello@deckcosttoronto.com. If you’re building something interesting, tell us — we may link to it from /changelog.