RateGapevery home loan rate lenders publish, compared

The comparison, as JSON

Send one loan. Get back the same answer this site gives: what they pay against what the market would offer, what the gap is worth a year, which lenders would take them, and what moving would cost.

Or ask once for the whole eligibility layer: who each loan is for, and the lender's own words for it.

A$199 a month, including GST

60,000 calls a month. No charge per call. Nothing to meter.

Continuing means you accept the terms below.

Ask for a free key: 500 calls a month, enough to build against.

The rates themselves are free

Every lender publishes its rates under the Consumer Data Right. That data is public. It is not mine, and I do not sell it. Download the whole set, rebuilt every night, free under CC BY 4.0.

What you pay for is the reading of it: the going rate, the fee allowance, which lenders this borrower could actually move to, and what to do about it. Plus who each loan is for, which no lender files and the CSV does not carry.

Fetching the files on a schedule

Checking for a new file costs nothing. Send the file's ETag back as If-None-Match (If-Modified-Since works as well) and, if nothing has changed, you get a 304 and no download. The files are rebuilt once a day, after the 19:30 UTC capture, so the other 287 times you ask today cost nothing on either side. Every page on this site answers the same way.

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"
  }'

Call it from your server. There is no CORS, on purpose: a key in a browser is a key anyone can read.

See the answer
{
  "gapBand": "large_gap",
  "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, "advertisedBelowYou": 91, "lowestAdvertisedEligible": 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"
}

Add ?include=lines to get the full rate table behind the answer. It is large. Most callers never need it.

Who each loan is for

One call. Every restricted product, and the lender's own words for why.

A lender does not file who may take a loan. The Consumer Data Right has a field for it, and it is boilerplate: across 312 sampled products it said OTHER 399 times, and one lender files its first-home-buyer rule under STAFF.

So the real restrictions live in prose. Defence only. Members of that mutual. First home buyers. Not for a self-managed super fund. This site reads them out of the text the lender publishes, and keeps the sentence that said so.

That sentence is the point. Every tag can be checked against the lender's own wording instead of taken on trust.

curl https://rategap.com.au/v1/conditions   -H "Authorization: Bearer $RATEGAP_KEY"
See the answer
{
  "asOf": "2026-09-09T19:30:00.000Z",
  "licence": "Licensed to the subscriber ...",
  "vocabulary": {
    "defence": "defence force only",
    "membership": "members of that mutual or credit union only",
    ...
  },
  "counts": {
    "products": 1929,
    "restricted": 902,
    "tags": 1180,
    "byCondition": { "membership": 479, "package": 198, ... }
  },
  "products": [
    {
      "lender": "ABC",
      "lenderName": "Example Mutual",
      "productId": "abc-123",
      "product": "Defence Home Loan",
      "conditions": [
        {
          "condition": "defence",
          "source": "regex",
          "evidence": "Available to serving and ex-serving members of the ADF."
        }
      ]
    }
  ]
}

Only restricted products are listed. A product that is not there has no restriction this site found — that is the answer, not a gap. The full product list is in the free CSV.

The access field says which of the two answers you got: full or summary.

Where a tag came from

sourceMeans
regexRead out of the lender's published wording by rule. The evidence is their sentence.
nameOnly the product name said so. Weaker, and the evidence is the name itself.

Told apart rather than blended, so you can weigh them differently. The comparison on this site treats both as restrictions.

The words

ConditionMeans
membershipmembers of that mutual or credit union only
occupationrestricted to certain jobs (police, nurses, defence and so on)
defencedefence force only
staffstaff of that lender only
smsffor a self-managed super fund, not a personal loan
non_residentfor borrowers living overseas
first_homefirst home buyers only
greenrequires an energy-efficient home
broker_onlyonly available through a mortgage broker
constructionfor building, not for an existing home
bridgingshort-term, for buying before you sell
low_docfor borrowers who cannot show standard income proof
refinance_onlyonly if you are moving from another lender
packagepart of a bundle carrying a yearly fee
intro_ratea short introductory rate that reverts to a higher one

The same list the site shows a borrower, from the same code.

A free key sees the shape, not the data

Ask with a free key and you get the counts, the vocabulary and the date — how many products carry each restriction, and what every word means. Enough to decide whether this is worth paying for.

The classifications themselves need the subscription. One call is the whole layer, so a free tier that included them would be the product, given away.

This part is not CC BY

The rates are the lenders'. This is not. It is not in their filings, and it is not republishable as a dataset — it is licensed for use inside what you build.

It changes when the nightly capture changes, which is rarely: product wording moves far more slowly than pricing. Keep the ETag and send it back as If-None-Match. A 304 costs you nothing and does not count as a call.

What you send

FieldDefaultMeaning
balancerequiredWhat is still owed, in dollars.
raterequiredThe rate being paid now, as a percentage. Anything above 25 is refused: that is a typo, not a mortgage.
years25Years remaining on the loan.
propertyValuenullWhat the property is worth. Leave it out and the LVR is unknown. Every lender then looks open, which usually overstates the choice.
purposeOWNER_OCCUPIEDOr INVESTMENT.
repaymentPRINCIPAL_AND_INTERESTOr INTEREST_ONLY.
rateTypeVARIABLEOr FIXED. If FIXED, send fixedExpiry too, or the term cannot be priced.
fixedExpirynullISO date the fixed term ends.
annualFeenullThe ongoing fee, if it is known. null means unknown. That is not the same as 0, which is a stated fact.
needsOffsetfalseWhether an offset account is required.
lendernullThe current lender, if known. This unlocks the back-book comparison: what that lender advertises to new borrowers.

Send a value it does not recognise and you get an error naming the field. The borrower's page quietly corrects those instead. A program that sends one has a bug, and answering the wrong question would hide it.

The gapBand field

This is the one most callers want. It says how large the gap is and where it comes from. What to do about it is yours to decide.

ValueMeans
at_or_below_going_rateThe rate paid is at or below the going rate.
own_lender_advertises_lowerThe current lender advertises a lower rate to new borrowers than this borrower pays.
large_gapThe gap to the going rate is larger than the size the site treats as worth an application.
moderate_gapThe gap is real, but smaller than that. A lender can say no to either.
small_gapSmaller than lenders commonly discount for asking.

The site's own headline is worked out from this same value, by the same code. It is not a second opinion worked out for the API.

When it says no

StatusWhy
400The request could not be read. The reply names the field and what was wrong.
401No key, or an unknown one.
402The subscription was cancelled.
422Understood, but unanswerable. Either the balance exceeds the property value, or there are too few comparable loans.
429Over the monthly limit, or too many calls from one address in an hour.

Every reply carries an x-calls-remaining header. A call only counts when you get an answer. A bad request costs you nothing, and neither does a 304.

The 429 is the only one that lifts by itself. It says when, in Retry-After and in a reset field: midnight UTC on the first, because the count is a calendar month and so is the invoice.

What it will not do

It will not tell anyone what to do with their money. It reports what lenders advertise, and what the arithmetic says about it. It does not assess whether any loan suits anyone, and it is not credit assistance or advice.

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 I record is which key called, and when.

One more party sees the request: Cloudflare sits in front of this and keeps short-lived logs of the requests themselves, headers and all. Three days, or seven. Nothing here can opt a single header out of that, and it is worth knowing before you put a key in one.

Terms

  • You are responsible for any licence or authorisation your use of this needs, including under credit and financial services law. This site holds none and does not supply any.
  • Do not present the output to your own customers as this site's recommendation, or as advice about their loan. It describes advertised rates.
  • The figures are rates lenders advertise, read on the date shown. They can be out of date, and a lender can decline to offer one. Check with the lender before relying on a figure.
  • The rates themselves are free under CC BY 4.0, and you must credit RateGap. The derived figures and eligibility readings are this site's own work, and are licensed for use inside what you build. Do not resell them as a competing data service.
  • A key can be withdrawn for misuse, such as sharing it or going round the monthly limit.