[Skip to the content](#main)

[RateGap](/)every 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.

      Email for the key

      Continue to payment, A$199 a month

Continuing means you accept [the terms below](#terms).

[Ask for a free key](https://rategap.com.au/#fb):
    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](/data/export/rates-latest.csv),
    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](#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](/data/export/rates-latest.csv).

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

### Where a tag came from

    | `source` | Means |
| --- | --- |
| `regex` | Read out of the lender's published wording by rule. The evidence is their sentence. |
| `name` | Only 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

    | Condition | Means |
| --- | --- |
| `membership` | members of that mutual or credit union only |
| `occupation` | restricted to certain jobs (police, nurses, defence and so on) |
| `defence` | defence force only |
| `staff` | staff of that lender only |
| `smsf` | for a self-managed super fund, not a personal loan |
| `non_resident` | for borrowers living overseas |
| `first_home` | first home buyers only |
| `green` | requires an energy-efficient home |
| `broker_only` | only available through a mortgage broker |
| `construction` | for building, not for an existing home |
| `bridging` | short-term, for buying before you sell |
| `low_doc` | for borrowers who cannot show standard income proof |
| `refinance_only` | only if you are moving from another lender |
| `package` | part of a bundle carrying a yearly fee |
| `intro_rate` | a 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

    | 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. |

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.

    | Value | Means |
| --- | --- |
| `at_or_below_going_rate` | The rate paid is at or below the going rate. |
| `own_lender_advertises_lower` | The current lender advertises a lower rate to new borrowers than this borrower pays. |
| `large_gap` | The gap to the going rate is larger than the size the site treats as worth an application. |
| `moderate_gap` | The gap is real, but smaller than that. A lender can say no to either. |
| `small_gap` | Smaller 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

    | 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. |

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](/privacy) 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.

The other questions

        - [Are you paying more than you need to?](/)
              your rate against every lender publishing one- [How fast should you pay it off?](/paying-it-off)
              term, extra repayments, interest only- [Don't have a loan yet?](/buying)
              what to look at before you pick one- [What does each lender advertise?](/lenders)
              every lender that publishes rates, a page each- [What moved this week?](/market/changes-this-week)
              which lenders changed an advertised rate- [Where do these numbers come from?](/data)
              every published rate, and how fresh it is
