---
title: "Deposit beta (repricing sensitivity) — ΔAPY per 100bps, ALM/IRR model input"
method: POST
path: "/v1/deposit-beta"
tags: ["Data & Analytics"]
---

# Deposit beta (repricing sensitivity) — ΔAPY per 100bps, ALM/IRR model input

`POST /v1/deposit-beta`

## Request

- Base URL: `https://api.rateapi.dev`
- URL: `https://api.rateapi.dev/v1/deposit-beta`
- Auth: API key in header `X-API-Key`

Deposit beta = change in deposit APY per 100bps change in a benchmark/market rate — the core credit-union/bank ALM & interest-rate-risk (IRR) model input. Derived from RateAPI's retained published deposit-rate history in extracted_rates (NOT a new scrape). Per-day segment median deposit APY is regressed (OLS) against the CD top-quartile published-rate move; the slope, expressed per 100bps, is the deposit beta. Returns per-segment beta, implied repricing lag, current APY level, peer min/median/max beta (ranked DESC), sample size (observations + credit unions), and an honest depth/confidence note. SHORT-WINDOW / retention-bounded (~5 months retained) so confidence is `low`; full-cycle beta needs multi-year history (roadmap). `treasury`/`fed_funds` benchmarks are not yet in-platform — v1 degrades to `cd_top_quartile` and discloses it (no error). Deposits quote APY, never APR. Aggregate published rates only — never member/borrower data. Single source of truth for the MCP `get_deposit_beta` tool and the consumer-app /deposit-beta page.

**Authentication required**: Pass your API key in the `X-API-Key` header.

## Request body

- object
  - `product` 'savings' | 'cd' | 'share_certificate' | 'money_market' | 'ira_cd', required: Deposit product (maps to savings_type). Required.
  - `term_months` number: For CD/share_certificate/ira_cd: filter to a specific term (savings_term_months).
  - `state` string: 2-letter US state code; omit for nationwide.
  - `window` '90d' | '180d' | '365d': History lookback window over scraped_at.
  - `group_by` 'overall' | 'state' | 'cu': Segment the beta computation: a single overall figure, per-state, or per-credit-union.
  - `benchmark` 'cd_top_quartile' | 'treasury' | 'fed_funds': Market reference. treasury/fed_funds are not yet in-platform; v1 degrades to cd_top_quartile and discloses the substitution.

## Response `200`

Per-segment deposit beta with peer band, confidence, and depth disclosures.

- object
  - `product` string: Deposit product the beta was computed for.
  - `term_months` number, nullable: Loan term in months.
  - `state` string, nullable: Two-letter US state code.
  - `window` string: How far back the history was measured.
  - `group_by` string: What the segments were grouped by.
  - `benchmark_requested` string: The benchmark series the caller asked to measure against.
  - `benchmark_used` string: The benchmark series actually used, which can differ when the requested one has no in-platform history.
  - `segments` object[]: Ranked DESC by deposit_beta (nulls last).
    - `segment` string: The segment this row describes.
    - `deposit_beta` number, nullable: ΔAPY per 100bps benchmark move.
    - `implied_lag_days` number, nullable: Day offset at which the segment tracks the benchmark most closely, or null when correlation could not be established.
    - `current_apy` number, nullable: Most recent median APY for this segment, or null when it has no recent observations.
    - `n_observations` integer: Daily observations the regression was fitted on.
    - `n_credit_unions` integer: Distinct credit unions contributing to this segment.
    - `r_squared` number, nullable: How much of the segment’s movement the benchmark explains, 0–1, or null when the fit could not be computed.
  - `peer` object: Spread of deposit beta across the segments returned.
    - `min_beta` number, nullable: Lowest deposit beta among the segments, or null when none could be computed.
    - `median_beta` number, nullable: Median deposit beta among the segments, or null when none could be computed.
    - `max_beta` number, nullable: Highest deposit beta among the segments, or null when none could be computed.
  - `history_depth_days` integer: Days of retained deposit history the fit was drawn from.
  - `confidence` 'low' | 'moderate': How much to trust the fit. Retained deposit history spans months rather than a full rate cycle, so this is deliberately never higher than `moderate`.
  - `note` string: Plain-language explanation of what this result means.
  - `disclosures` string[]: Statements that must be shown to a consumer alongside this result.

## Other responses

- `400`: The request was malformed — a missing required field, an unparseable body, or a parameter outside its allowed range. The `error` field names what was wrong; retrying the identical request will fail identically.
- `401`: No API key, or a key that is unknown or disabled. Send it in the `X-API-Key` header. Free keys are issued instantly by POST /keys with an email address. The response carries `WWW-Authenticate` pointing at this host's protected-resource metadata, and the `RateLimit-*` headers describing the Free-tier budget a key issued now would carry (scope `anonymous`) — a rejected request spends none of it, so `Remaining` equals `Limit`.
- `429`: Quota exhausted for the current window. `Retry-After` gives the seconds to wait; `upgradeInfo` explains how to lift the cap. Retrying before the reset will fail again and still counts as a request.

---

[API](https://skmtc.dev/rateapi/apis/rate-api.md) · [All operations](https://skmtc.dev/rateapi/apis/rate-api/llms.txt) · [OpenAPI document](https://skmtc.dev/rateapi/apis/rate-api/revisions/06a6db76995f?raw)
