Methodology
How the numbers on this site are collected, checked, and published — including what we do when something goes wrong.
Which lenders are included
We collect from the following lenders' own public rate pages. We do not use comparison or aggregator websites as a source, and we do not accept paid placement.
CIBC
Fixed-rate closed mortgages (FRCM) only, from CIBC's public product-rates API. Variable products use separate product codes and are not collected yet.
Official rate pageNational Bank of Canada
Reads the product feed embedded in the page's own HTML (the rendered table is an unresolved template). Quebec-specific fields exist but currently match the national ones.
Official rate pageRBC
Label->code map read from static HTML; values read from RBC's own public rates API. Fixed rates only — variable rates are quoted as a spread off a prime rate that the API does not expose.
Official rate pageScotiabank
Posted rates only, from Scotiabank's public daily rate feed. Promotional/variable feed is not collected because its published APR and footnote disagree.
Official rate pageTD
Reads the same public endpoint TD's own rate page POSTs to. Plain mortgages only; Home Equity FlexLine (FLT*) products are excluded.
Official rate page
Lenders we cannot currently collect
BMO
DISABLED: www.bmo.com silently drops this collector's requests host-wide (TLS completes, then zero bytes; robots.txt is unreachable too). Needs an official feed or documented permission before it can be enabled. No BMO rates are published.
We would rather show nothing for a lender than show a number we cannot stand behind. A lender missing from the table has not been judged in any way — it simply means we have no permitted, reliable way to read its published rates.
Where the numbers come from
Every rate is read from the lender's own website. In practice, most major Canadian banks no longer put rates in their page HTML — the page loads a public data feed in the browser and fills the table in afterwards. Where that is the case, we read the same public feed the bank's own page uses. Where a rate genuinely is in the HTML, we parse the HTML.
We identify ourselves with a descriptive user agent, keep requests infrequent, and do not attempt to bypass authentication, CAPTCHAs, access controls, rate limits, or bot protection. If a lender does not permit automated access, we treat that as a final answer.
Collection frequency
Collection runs automatically twice a day, timed around Canadian business hours (08:00 and 17:00 Toronto time). A run only results in a published update if the data materially changed — see “What ‘last updated’ means” below.
Validation and anomaly detection
Every collected record must pass all of the following before it is published:
- The lender, source URL, province code, rate type and term must all be present and valid.
- The source URL must belong to that lender's own official domain.
- The advertised rate must be a finite number inside a plausible band (currently 0.5% to 15%).
- Its identifier must be reproducible from the product's own fields, so the same product keeps the same identity between runs.
- No two products may share an identifier. If two conflicting records collide, both are dropped rather than picking one arbitrarily.
- A rate that moves by more than 1.5 percentage points against the previous value is treated as suspicious. The collector is re-run once to confirm; if the move persists it is rejected and the previous value is kept, on the basis that a jump that large is far more likely to be a broken parser than a real repricing.
A record that fails validation is dropped and reported — never silently corrected.
What happens when collection fails
Lenders redesign their websites without warning, and a parser that worked yesterday can break today. The rule we follow is that a failure must never look like news:
- Each lender is collected independently; one failing does not stop the others.
- If a lender's collector fails, its previously published rates are kept exactly as they were, and its “last updated” date does not move.
- A product is only ever recorded as withdrawn when a collector succeeded and explicitly no longer lists it. A parser failure never removes products, and never writes history.
- If every collector fails, nothing is published at all and the run is reported as failed.
Provincial availability
Mortgage availability and pricing can vary by province. Our data model records whether a product is offered nationally or only in specific provinces.
In practice, the lenders we currently collect publish a single national rate table with no province selector, so their products are recorded as nationally available and shown with Ontario as the default view. That reflects what the lenders publish — not a guarantee that every product is offered on identical terms in every province. Confirm with the lender.
Advertised rates are not personalised offers
Everything on this site is an advertised rate: the number the lender publishes to the general public. It is not a quote, and it is not an offer to you.
What you are actually offered depends on the lender's underwriting — your credit history, income and its stability, down payment, the property itself, and whether the mortgage is insured. Some advertised rates require conditions that not every borrower meets. A lower advertised rate can also turn out to be more expensive overall once conditions, prepayment terms and fees are taken into account.
Where a lender publishes both a posted rate and a discounted “special” rate, we show the special rate as the advertised rate and keep the posted rate alongside it.
Calculation assumptions
The calculator follows the Canadian convention: interest on a fixed-rate mortgage is compounded semi-annually, not in advance, as required by section 6 of the Interest Act. A quoted 5% is a nominal annual rate compounded twice a year, so the monthly rate is (1 + 0.05/2)1/6 − 1, not 5%/12. Using the US-style monthly convention would overstate every payment.
- Interest is compounded semi-annually, not in advance — the Canadian convention for fixed-rate mortgages.
- The interest rate stays the same for the entire amortization. In reality your mortgage is re-priced at each renewal, and variable rates move.
- Payments are made in full and on time, with no prepayments and no missed payments.
- Property taxes, condo fees, mortgage default insurance premiums, legal fees and other closing costs are not included.
- Accelerated payments are modelled as the monthly payment divided by two (bi-weekly) or four (weekly), which pays down the mortgage faster than the nominal schedule.
Variable-rate mortgages are compounded monthly in practice; we apply the same semi-annual convention to every rate, so a variable-rate result is a close approximation rather than the lender's exact figure. Calculator results are estimates, not lender quotes.
What “last updated” means
The “last material update” against a product is the last time that product's data changed — its advertised rate, posted rate, APR, cash back, term, rate type, open/closed status, availability, or conditions.
It is deliberately notthe last time we checked. We check twice a day, and a check that finds no change leaves the date alone. So an older date means “this rate has been stable since then”, not “this data is stale”. The date in the footer records when the dataset as a whole last changed.