# Mortgage rates

Source: https://help.ruuster.com/api/mortgage-rates

```http
GET https://api.ruuster.com/v1/mortgage/rates
```

Today's national mortgage-rate averages (30- and 15-year fixed, FHA, jumbo, VA and the 10-year Treasury) and the history of one series, from public Federal Reserve data, for market context and payment illustrations.

- Authentication: `x-api-key` and `x-email` headers of an owner or admin
- Rate limit: 120 requests per minute per key

The same numbers the Ruuster Brain's mortgage-rates widget shows, as data. Two kinds of series come back on every call: the **daily** Optimal Blue Mortgage Market Indices (OBMMI), which average the rates locked across lenders each business day and are posted one business day in arrears, and the **weekly** Freddie Mac Primary Mortgage Market Survey (PMMS), published on Thursdays. Both are published by FRED (the St. Louis Fed) with disclosed methodology, so they can be shown to clients with their date and source.

`history` is one series over a trailing window, for a trend line or a "rates over the last year" table. Pick the series with `series`; the default is the daily 30-year conforming index.

These are national averages, not a quote: a borrower's rate depends on credit, points, loan type and the lender's pricing that day. When you put a payment in front of someone, say which rate and date you used.

Not a lookup call. Rates are refreshed hourly; FRED itself updates the daily indices each business day and the survey weekly.

## Query parameters

| Name | Type | Default | Description |
|---|---|---|---|
| `series` | string | `OBMMIC30YF` | The series to return in `history`: `OBMMIC30YF` (30-year fixed, daily), `OBMMIC15YF` (15-year fixed, daily), `OBMMIFHA30YF` (FHA 30-year, daily), `OBMMIJUMBO30YF` (jumbo 30-year, daily), `OBMMIVA30YF` (VA 30-year, daily), `DGS10` (10-year Treasury yield, daily), `MORTGAGE30US` (30-year fixed, weekly survey), `MORTGAGE15US` (15-year fixed, weekly survey) |
| `days` | integer | `90` | Trailing window for `history`, 7 to 400 days |

## Response

| Field | Description |
|---|---|
| `asOf` | `daily` and `weekly`: the newest date in each group of series |
| `daily[]` | One row per daily series: `series`, `label`, `rate` (percent), `date`, `previous`, `previousDate`, `change` (percentage points since the previous reading). `null` when the series had no reading |
| `weekly[]` | The same shape for the two survey series |
| `history` | `series`, `label`, `frequency`, `source`, `days`, `from`, `to`, and `points[]` of `date` and `rate` in the window, oldest first |
| `sources` | Where the daily, weekly and Treasury figures come from |
| `note` | What these averages are and are not |

When FRED is down, each series falls back to its last successfully read figures, which keep their original `date`s, so check the dates before calling a rate "today's". `503 source_unavailable` (with `Retry-After: 60`) only when FRED can't be reached and no saved figures exist; try again in a minute.

## Example request

cURL:

```bash
curl -s "https://api.ruuster.com/v1/mortgage/rates?series=OBMMIC30YF&days=90" \
  -H "x-api-key: $RUUSTER_API_KEY" \
  -H "x-email: $RUUSTER_EMAIL"
```

Node.js:

```javascript
const res = await fetch("https://api.ruuster.com/v1/mortgage/rates?series=OBMMIC30YF&days=90", {
  headers: {
    "x-api-key": process.env.RUUSTER_API_KEY,
    "x-email": process.env.RUUSTER_EMAIL,
  },
});
const body = await res.json();
if (!body.ok) throw new Error(`${body.error.code}: ${body.error.message} (${body.requestId})`);
console.log(body.data);
```

Python:

```python
import os
import requests

res = requests.get(
    "https://api.ruuster.com/v1/mortgage/rates?series=OBMMIC30YF&days=90",
    headers={"x-api-key": os.environ["RUUSTER_API_KEY"], "x-email": os.environ["RUUSTER_EMAIL"]},
    timeout=30,
)
body = res.json()
if not body["ok"]:
    raise RuntimeError(f'{body["error"]["code"]}: {body["error"]["message"]} ({body.get("requestId")})')
print(body["data"])
```

## Example response

```json
{
  "ok": true,
  "data": {
    "asOf": { "daily": "2026-10-13", "weekly": "2026-10-09" },
    "daily": [
      { "series": "OBMMIC30YF", "label": "30-Yr Fixed", "rate": 6.21, "date": "2026-10-13", "previous": 6.24, "previousDate": "2026-10-10", "change": -0.03 },
      { "series": "OBMMIC15YF", "label": "15-Yr Fixed", "rate": 5.58, "date": "2026-10-13", "previous": 5.6, "previousDate": "2026-10-10", "change": -0.02 },
      { "series": "OBMMIFHA30YF", "label": "FHA 30-Yr", "rate": 6.02, "date": "2026-10-13", "previous": 6.05, "previousDate": "2026-10-10", "change": -0.03 },
      { "series": "OBMMIJUMBO30YF", "label": "Jumbo 30-Yr", "rate": 6.4, "date": "2026-10-13", "previous": 6.42, "previousDate": "2026-10-10", "change": -0.02 },
      { "series": "OBMMIVA30YF", "label": "VA 30-Yr", "rate": 5.86, "date": "2026-10-13", "previous": 5.9, "previousDate": "2026-10-10", "change": -0.04 },
      { "series": "DGS10", "label": "10-Yr Treasury", "rate": 4.02, "date": "2026-10-13", "previous": 4.05, "previousDate": "2026-10-10", "change": -0.03 }
    ],
    "weekly": [
      { "series": "MORTGAGE30US", "label": "30-Yr Fixed", "rate": 6.27, "date": "2026-10-09", "previous": 6.3, "previousDate": "2026-10-02", "change": -0.03 },
      { "series": "MORTGAGE15US", "label": "15-Yr Fixed", "rate": 5.6, "date": "2026-10-09", "previous": 5.63, "previousDate": "2026-10-02", "change": -0.03 }
    ],
    "history": {
      "series": "OBMMIC30YF", "label": "30-Yr Fixed", "frequency": "daily",
      "source": "Optimal Blue Mortgage Market Indices (OBMMI), via FRED; posted one business day in arrears",
      "days": 90, "from": "2026-07-16", "to": "2026-10-14",
      "points": [
        { "date": "2026-07-16", "rate": 6.68 },
        { "date": "2026-07-17", "rate": 6.66 },
        { "date": "2026-10-13", "rate": 6.21 }
      ]
    },
    "sources": {
      "daily": "Optimal Blue Mortgage Market Indices (OBMMI), via FRED; rate locks across lenders, posted one business day in arrears",
      "weekly": "Freddie Mac Primary Mortgage Market Survey (PMMS), via FRED; published Thursdays",
      "treasury": "U.S. Treasury 10-year constant-maturity yield (DGS10), via FRED"
    },
    "note": "National averages of rate locks (daily) and lender survey quotes (weekly), not a quote for any borrower: a lender's pricing depends on credit, points, loan type and the day. Use for context and illustrations, and tell the reader the date."
  },
  "meta": { "brokerageId": "4f6c2a9e-8d31-4b57-9a0e-2c7d5e1b8f43", "source": "FRED (fred.stlouisfed.org)" }
}
```
