From an address to a lot, then to the cadastral plan
Resolve an address or a matricule to a lot number, read the lot record and order the cadastral plan. CAD 0.99 per call excluding Registre fees.
Three calls lead from an address to the cadastral plan: resolve the address to a lot number, read the lot record, then order the plan. The first two read the public datasets built into Données Fonciq (Québec municipal assessment rolls, cadastre). The plan is ordered on your organisation's Registre account.
1. Resolve the address
GET /v1/lots/resolve (scope lots:read) takes address or matricule. It costs CAD 0.99 excluding Registre fees and does not consult the Registre.
curl "https://api.fonciq.ca/v1/lots/resolve?address=100%20rue%20Saint-Paul%20Est%2C%20Montr%C3%A9al" \
-H "Authorization: Bearer $FONCIQ_API_KEY"{
"lots": [
{
"lot": "1234567",
"cadastre": "Cadastre du Québec",
"matricule": "1234-56-7890-1-234-5678",
"role_matched": true
}
]
}role_matched says whether the assessment roll corroborates the lot. An address can return several lots: pick the one you want.
2. Read the lot record
GET /v1/lots/{lot} (scope lots:read) gathers the cadastre, the roll assessment (in cents) and the index rows already kept in registre.entries. It costs CAD 0.99 excluding Registre fees and does not pull a new index.
curl https://api.fonciq.ca/v1/lots/1234567 \
-H "Authorization: Bearer $FONCIQ_API_KEY"{
"lot": "1234567",
"cadastre": { "label": "Cadastre du Québec", "lot": "1234567" },
"assessment": { "year": 2026, "value_cents": 45000000 },
"registre": { "entries": [] }
}format=csv returns the index rows as CSV instead of the record.
3. Order the cadastral plan
POST /v1/plans (scope registre:write) requires lot and an Idempotency-Key header. cadastre defaults to Cadastre du Québec. rf_account_id pins a Registre account; when absent, the default account is used. The response is 200 and does not contain the PDF. It does not promise a live pull. registry_fee_cents is 150 when the Registre is consulted and 0 for a plan already kept. Any cadastre other than Cadastre du Québec fails with 409.
curl -X POST https://api.fonciq.ca/v1/plans \
-H "Authorization: Bearer $FONCIQ_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: 9a8b7c6d-5e4f-4a3b-8c2d-1e0f9a8b7c6d" \
-d '{"lot":"1234567"}'{
"document_type": "plan",
"lot": "1234567",
"cadastre": "Cadastre du Québec",
"registry_fee_cents": 0
}Python
import os, uuid, requests
BASE = "https://api.fonciq.ca"
HEADERS = {"Authorization": f"Bearer {os.environ['FONCIQ_API_KEY']}"}
lots = requests.get(f"{BASE}/v1/lots/resolve", params={"address": "100 rue Saint-Paul Est, Montréal"}, headers=HEADERS).json()["lots"]
lot = lots[0]["lot"]
profile = requests.get(f"{BASE}/v1/lots/{lot}", headers=HEADERS).json()
print(profile["cadastre"]["label"], profile["assessment"]["value_cents"] / 100)
plan = requests.post(
f"{BASE}/v1/plans",
headers={**HEADERS, "Idempotency-Key": str(uuid.uuid4())},
json={"lot": lot},
).json()
print("Registre fee (cents):", plan["registry_fee_cents"])Node
const BASE = 'https://api.fonciq.ca';
const headers = { Authorization: `Bearer ${process.env.FONCIQ_API_KEY}` };
const { lots } = await fetch(
`${BASE}/v1/lots/resolve?address=${encodeURIComponent('100 rue Saint-Paul Est, Montréal')}`,
{ headers },
).then((r) => r.json());
const lot = lots[0].lot;
const profile = await fetch(`${BASE}/v1/lots/${lot}`, { headers }).then((r) => r.json());
console.log(profile.cadastre.label, profile.assessment.value_cents / 100);
const plan = await fetch(`${BASE}/v1/plans`, {
method: 'POST',
headers: { ...headers, 'Content-Type': 'application/json', 'Idempotency-Key': crypto.randomUUID() },
body: JSON.stringify({ lot }),
}).then((r) => r.json());
console.log('Registre fee (cents):', plan.registry_fee_cents);Cost
Each call costs CAD 0.99 excluding Registre fees. For the plan, the CAD 1.50 Registre fee applies only when the Registre is consulted: a plan already kept is returned with no Registre fee. The Registre charges that fee to the account holder, not Fonciq. A fq_test_ key bills nothing.