# IRM rate curves

Endpoint reference for the 1delta API. Index: https://docs.1delta.io/llms.txt · every endpoint: https://docs.1delta.io/llms-full.txt

---

### GET /v1/data/lending/irm

- operationId: `irm-rate-curves`
- docs: https://docs.1delta.io/1delta-api/irm-rate-curves/
- markdown: https://docs.1delta.io/1delta-api/irm-rate-curves.md
- tags: Lending (Data)

IRM rate curves

Return sampled borrow and deposit rate curves for one or more markets.

Each curve is a series of `(utilization, borrowRate, depositRate)` points spanning
0% to 100% utilization. Rates are **APR %** (e.g. `5.5` = 5.5% APR).

Supported protocols: `aave`, `aave_v4`, `compound_v2`, `compound_v3`, `morpho` (including Lista), `euler_v2`, `silo`, `fluid`, `gearbox`, `dolomite`.

**Caching:** IRM parameters are quasi-static and cached server-side for 1 hour.
Computed curves are also cached (keyed by market UIDs + data-point count).

**Parameters**

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `marketUids` | query | string | yes | Comma-separated market UIDs, e.g. `AAVE_V3:1:0xa0b8...` |
| `dataPoints` | query | integer | no | Number of curve sample points (1–20, default 20) |

**Response `200`** — Rate curves per market

| Field | Type | Description |
| --- | --- | --- |
| `success` | true |  |
| `data` | object | Informational payload. `null` when the endpoint only builds calldata. |
| `data.count` | integer | Number of markets returned |
| `data.items` | object[] | The result set for this response. |
| `data.items[].marketUid` | string | Unique market identifier (`lenderKey:chainId:address`) |
| `data.items[].protocol` | "aave" \| "aave_v4" \| "compound_v2" \| "compound_v3" \| "morpho" \| "euler_v2" \| … (10 values) | IRM model type |
| `data.items[].lenderKey` | string |  |
| `data.items[].chainId` | string | EVM chain id, as a decimal string. See the `ChainId` schema. |
| `data.items[].underlyingAddress` | string |  |
| `data.items[].marketName` | string |  |
| `data.items[].points` | object[] | Sampled rate curve. Length = dataPoints + 1 (includes u=0 and u=1). |
| `data.items[].points[].utilization` | number | Utilization ratio (0–1) |
| `data.items[].points[].borrowRate` | number | Variable borrow rate (APR %, e.g. 7.67 = 7.67%) |
| `data.items[].points[].depositRate` | number | Deposit/supply rate (APR %, e.g. 3.30 = 3.30%) |
| `actions` | null |  |

**Example response**

```json
{
  "success": true,
  "data": {
    "count": 1,
    "items": [
      {
        "marketUid": "SPARK:100:0x2a22f9c3b484c3629090feed35f17ff8f88f76f0",
        "protocol": "aave",
        "lenderKey": "SPARK",
        "chainId": "100",
        "underlyingAddress": "0x2a22f9c3b484c3629090feed35f17ff8f88f76f0",
        "marketName": "Spark USDC.e",
        "points": [
          {
            "utilization": 0.95,
            "borrowRate": 7.67,
            "depositRate": 3.3
          }
        ]
      }
    ]
  }
}
```

**Response `400`** — Validation error

**Response `429`** — Rate limited. Unauthenticated callers share a per-IP budget; send an `x-api-key` header to lift it. Retry with exponential backoff.

**Response `500`** — Unexpected server error. Safe to retry with backoff.

**Response `502`** — An upstream data source or protocol origin failed (`error.code` is `ORIGIN_FAILED`). `error.details` carries the per-origin status. This is also what a missing or malformed required parameter currently returns, rather than a 400.
