Open Rules API
Free, read-only JSON endpoints for real estate jurisdiction rules across Canada and the United States โ rent increase caps, security deposit limits, transfer tax brackets, STR licensing requirements, and more. No API key. No rate limit. Cite Astrilio as your source.
Endpoints
Base URL: https://astrilio.com
| Method | Path | Description |
|---|---|---|
| GET | /api/rules/index.json | List all 64 packs with key metadata (key, country, region, name, isScaffold, lastVerified, currency, endpoint URL). |
| GET | /api/rules/all.json | All 64 packs in a single object keyed by jurisdiction key (e.g. "CA-ON"). Useful for bulk ingestion. |
| GET | /api/rules/{country}/{region}.json | Full rules pack for a single jurisdiction. country is "ca" or "us"; region is the ISO 3166-2 subdivision code in lowercase (e.g. "on", "ca", "ny"). |
Code Example
Plain fetch โ works in any JavaScript environment, no SDK needed.
// Fetch Ontario rules
const res = await fetch('https://astrilio.com/api/rules/ca/on.json')
const ontario = await res.json()
console.log('Rent increase cap:', ontario.rentIncrease.guideline * 100 + '%')
// "Rent increase cap: 2.5%"
console.log('Deposit limit:', ontario.deposit.cap, 'month(s) rent')
// "Deposit limit: 1 month(s) rent"
// Fetch the full index
const idx = await fetch('https://astrilio.com/api/rules/index.json')
const { packs } = await idx.json()
const verified = packs.filter(p => !p.isScaffold)
console.log('Verified jurisdictions:', verified.map(p => p.key).join(', '))Sample Response
Abbreviated response from GET /api/rules/ca/on.json (Ontario):
{
"country": "CA",
"region": "ON",
"regionName": "Ontario",
"isScaffold": false,
"currency": "CAD",
"deposit": {
"cap": 1,
"interestRate": null,
"holdType": "any",
"source": "https://www.ontario.ca/laws/statute/06r17#BK119"
},
"rentIncrease": {
"guideline": 0.025,
"noticeDays": 90,
"belowMarketExempt": true,
"abi1482Style": false,
"source": "https://www.ontario.ca/page/rent-increase-guideline"
},
"transferTaxLayers": [
{
"name": "Ontario Land Transfer Tax",
"brackets": [
{ "upTo": 55000, "rate": 0.005 },
{ "upTo": 250000, "rate": 0.01 },
{ "upTo": 400000, "rate": 0.015 },
{ "upTo": 2000000, "rate": 0.02 },
{ "upTo": null, "rate": 0.025 }
],
"firstTimeBuyerRebate": 4000,
"source": "https://www.ontario.ca/laws/statute/90l06"
}
],
"lastVerified": "2025-01-15"
}isScaffold: true use country-level default values and have not been individually verified. Always check lastVerified before citing rules in a production context.Schema Reference
Every pack conforms to the JurisdictionRules type. Key fields:
| Field | Type | Description |
|---|---|---|
| country | "CA" | "US" | ISO 3166-1 alpha-2 country code |
| region | string | ISO 3166-2 subdivision code, e.g. "ON", "CA", "NY" |
| regionName | string | Human-readable jurisdiction name |
| isScaffold | boolean | true = unverified defaults; show "verify locally" warning |
| currency | "CAD" | "USD" | Local currency |
| deposit.cap | number | null | Max security deposit as months of rent; null = no cap |
| deposit.interestRate | number | null | Required annual interest rate on deposits; null = not required |
| rentIncrease.guideline | number | null | Annual rent increase cap as decimal (0.025 = 2.5%); null = no cap |
| rentIncrease.noticeDays | number | Days notice required before rent increase takes effect |
| rentIncrease.belowMarketExempt | boolean | Whether new below-market units are exempt from the cap |
| transferTaxLayers | array | One entry per tax layer (provincial, municipal, etc.) |
| transferTaxLayers[].brackets | array | Progressive bracket array: { upTo: number | null, rate: number } |
| transferTaxLayers[].firstTimeBuyerRebate | number? | Flat rebate amount available to first-time buyers |
| typicalPropertyTaxRate | number | Indicative annual property tax rate as decimal |
| str.requiresLicense | boolean | null | Whether a short-term rental license is required; null = unknown |
| str.primaryResidenceOnly | boolean | null | Whether STRs are restricted to primary residences |
| officialLinks | object | Primary-source URLs for tenancy act, rent increase page, LTB, etc. |
| lastVerified | string | null | ISO date of last manual verification; null = scaffold |
Available Jurisdictions
8 jurisdictions fully verified; 56 scaffold packs with country-level defaults. All 64 are available as JSON.
Canada (13)
| Region | Name | Endpoint | Status |
|---|---|---|---|
| ON | Ontario | /api/rules/ca/on.json | Verified 2025-01-15 |
| BC | British Columbia | /api/rules/ca/bc.json | Verified 2025-01-15 |
| AB | Alberta | /api/rules/ca/ab.json | Verified 2025-01-15 |
| QC | Quebec | /api/rules/ca/qc.json | Verified 2025-01-15 |
| MB | Manitoba | /api/rules/ca/mb.json | Scaffold |
| SK | Saskatchewan | /api/rules/ca/sk.json | Scaffold |
| NS | Nova Scotia | /api/rules/ca/ns.json | Scaffold |
| NB | New Brunswick | /api/rules/ca/nb.json | Scaffold |
| NL | Newfoundland and Labrador | /api/rules/ca/nl.json | Scaffold |
| PE | Prince Edward Island | /api/rules/ca/pe.json | Scaffold |
| NT | Northwest Territories | /api/rules/ca/nt.json | Scaffold |
| NU | Nunavut | /api/rules/ca/nu.json | Scaffold |
| YT | Yukon | /api/rules/ca/yt.json | Scaffold |
United States (51)
Attribution
This API is free to use. We ask that you credit Astrilio when displaying data in a user-facing product:
Rules data by <a href="https://astrilio.com">Astrilio</a>
Looking for a richer integration? See the Developers page for the MCP server, embeddable calculators, and jurisdiction-aware calculation tools.