The comparison, as JSON
Send one loan. Get back the same answer this site gives.
What they pay, against what the market would offer them. What the gap is worth a year. Which lenders would take them. What moving would cost.
A$199 a month, including GST
60,000 calls a month. No charge per call. Nothing to meter.
The rates themselves are free
Every lender publishes its rates under the Consumer Data Right. That data is public. It is not ours, and we do not sell it.
Download the whole set. It is rebuilt every night, free, under CC BY 4.0.
What you pay for here is the reading of it. The benchmark. The fee allowance. Which lenders this borrower could actually move to. What to do about it.
A call
curl -X POST https://rategap.com.au/v1/compare \
-H "Authorization: Bearer YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"balance": 650000,
"rate": 6.9,
"years": 25,
"propertyValue": 850000,
"purpose": "OWNER_OCCUPIED",
"repayment": "PRINCIPAL_AND_INTEREST"
}'
And the answer
{
"action": "move",
"rate": {
"paying": 6.9,
"effective": 6.9,
"feeState": "UNKNOWN",
"benchmark": 6.0992,
"anchor": 6.09,
"feeAllowance": 0.0092,
"surplus": 0,
"belowAnchor": false
},
"gapPoints": { "backBook": 0, "switching": 0.8008 },
"dollarsPerYear": { "backBook": 0, "switching": 5204.78 },
"ownLender": null,
"market": { "pool": 118, "eligible": 96, "cheaperThanYou": 91, "cheapestEligible": 5.64 },
"targets": [
{
"lender": "coral-coast",
"lenderName": "Coral Coast Bank",
"product": "Sharp Variable Home Loan",
"rate": 5.64,
"comparisonRate": 5.68,
"annualFee": 0,
"upfrontFees": 350,
"conditions": [],
"link": "https://example.com/rates"
}
],
"switchCosts": {
"ownDischarge": null,
"dischargeBand": [250, 500],
"upfrontBand": [250, 1930],
"total": [650, 2830]
},
"asOf": "2026-09-09T19:50:00Z"
}
What you send
| Field | Default | Meaning |
|---|---|---|
balance | required | What is still owed, in dollars. |
rate | required | The rate being paid now, as a percentage. Anything above 25 is refused: that is a typo, not a mortgage. |
years | 25 | Years remaining on the loan. |
propertyValue | null | What the property is worth. Leave it out and the LVR is unknown. Every lender then looks open, which usually overstates the choice. |
purpose | OWNER_OCCUPIED | Or INVESTMENT. |
repayment | PRINCIPAL_AND_INTEREST | Or INTEREST_ONLY. |
rateType | VARIABLE | Or FIXED. If FIXED, send fixedExpiry too, or the term cannot be priced. |
fixedExpiry | null | ISO date the fixed term ends. |
annualFee | null | The ongoing fee, if it is known. null means unknown. That is not the same as 0, which is a stated fact. |
needsOffset | false | Whether an offset account is required. |
lender | null | The current lender, if known. This unlocks the back-book comparison: what that lender advertises to new borrowers. |
The action field
This is the one most callers want. It says what to do.
| Value | Means |
|---|---|
sharp | At or below the benchmark. Nothing to do. |
own | Ring the current lender. They advertise better than this borrower is paying, and a call cannot be refused. An application can. |
move | The gap is worth an application. |
ask | Real, but small. A phone call usually recovers this much. |
hold | Smaller than lenders commonly discount for asking. |
When it says no
| Status | Why |
|---|---|
| 400 | The request could not be read. The reply names the field and what was wrong. |
| 401 | No key, or an unknown one. |
| 402 | The subscription was cancelled. |
| 422 | Understood, but unanswerable. Either the balance exceeds the property value, or there are too few comparable loans. |
| 429 | Over the monthly limit, or too many calls from one address in an hour. |
What it will not do
It will not tell anyone what to do with their money. It reports what lenders publish, and what the arithmetic says about it. Acting on that is advice. Advice needs a licence, and this does not have one.
It also keeps nothing. The loan figures you send are used to answer the call, then dropped. That is the same promise the privacy page makes for the site. All we record is which key called, and when.