> ## Documentation Index
> Fetch the complete documentation index at: https://docs.redbark.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Get Account Details

> Retrieve live interest rates, fees, and features for one or more accounts

<Info>
  The REST API is in **beta**. This endpoint's response shape may change.
</Info>

Returns rich detail for the specified accounts: interest rates, fees, and features. This data is fetched directly from the banking provider on each request and is not stored on Redbark servers. The [List Accounts](/api-reference/accounts) endpoint stays a fast metadata read; use this endpoint when you need rates or fees.

## Request

```
GET /v1/account-details
```

### Headers

| Header          | Required | Description           |
| --------------- | -------- | --------------------- |
| `Authorization` | Yes      | `Bearer YOUR_API_KEY` |

Trialing customers retain full API access.

### Query parameters

| Parameter    | Type     | Required | Description                                                                                                                              |
| ------------ | -------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------- |
| `accountIds` | `string` | Yes      | Comma-separated list of account UUIDs. The list is deduplicated server-side, and the 100-account cap is checked **after** deduplication. |

<Info>
  Use the [List Accounts](/api-reference/accounts) endpoint to get account IDs. This endpoint is **banking only**. Mixing a brokerage `accountId` into the request fails the **entire** request, not per-account. To tell banking and brokerage accounts apart, join each account's `connectionId` to [List Connections](/api-reference/connections) and check the connection's `category`; route brokerage IDs to [`/v1/holdings`](/api-reference/holdings).
</Info>

## Response

Account details may be served from a short-lived server-side cache for up to 15 minutes; see [Caching](/api-reference/overview#caching) for purge and opt-out behaviour. Returned in the order the provider responds, not guaranteed to match the input order. Join back to [List Accounts](/api-reference/accounts) on `accountId` for the account name, type, and institution. Accounts the provider returns no detail for are silently omitted from `data`, so don't assume one entry per requested ID.

```json theme={null}
{
  "data": [
    {
      "accountId": "a1b2c3d4-e5f6-7890-a1b2-c3d4e5f67890",
      "productName": "Life Savings Account",
      "depositRate": "0.0419",
      "depositRates": [
        {
          "rateType": "BONUS",
          "rate": "0.0419",
          "calculationFrequency": "P1D",
          "applicationFrequency": "P1M",
          "additionalInfo": "Deposit $50 each month and make no withdrawals to earn the bonus rate",
          "tiers": [
            { "name": "Balance tier", "unitOfMeasure": "DOLLAR", "minimumValue": 0, "maximumValue": 250000 }
          ]
        }
      ],
      "lendingRate": null,
      "lendingRates": [],
      "fees": [
        { "name": "Monthly account fee", "feeType": "PERIODIC", "amount": "5.00", "currency": "AUD" }
      ],
      "features": [
        { "featureType": "NO_ACCOUNT_FEES" }
      ],
      "loanDetails": null
    },
    {
      "accountId": "c3d4e5f6-a7b8-9012-c3d4-e5f6a7b89012",
      "productName": "Basic Home Loan",
      "depositRate": null,
      "depositRates": [],
      "lendingRate": "0.0589",
      "lendingRates": [
        { "rateType": "VARIABLE", "rate": "0.0589", "comparisonRate": "0.0592", "loanPurpose": "OWNER_OCCUPIED" }
      ],
      "fees": [],
      "features": [],
      "loanDetails": {
        "loanEndDate": "2052-03-01",
        "repaymentType": "PRINCIPAL_AND_INTEREST",
        "repaymentFrequency": "P1M",
        "nextInstalmentDate": "2026-07-01",
        "minInstalmentAmount": "2340.18",
        "minInstalmentCurrency": "AUD",
        "originalLoanAmount": "650000.00",
        "originalLoanCurrency": "AUD",
        "originalStartDate": "2022-03-01",
        "offsetAccountEnabled": true
      }
    }
  ]
}
```

### Account detail object

| Field          | Type             | Description                                                                          |
| -------------- | ---------------- | ------------------------------------------------------------------------------------ |
| `accountId`    | `string`         | UUID of the account (matches IDs from the accounts endpoint)                         |
| `productName`  | `string \| null` | The bank's product name (e.g. "Life Savings Account")                                |
| `depositRate`  | `string \| null` | Headline interest rate on deposit balances, as a **fraction** (`"0.0419"` = 4.19%)   |
| `depositRates` | `array`          | Fully described deposit rates (see below). Empty when the bank reports none          |
| `lendingRate`  | `string \| null` | Headline interest rate charged on lending balances, as a fraction                    |
| `lendingRates` | `array`          | Fully described lending rates. Empty when not applicable                             |
| `fees`         | `array`          | Fees and charges on the account. Empty when the bank reports none                    |
| `features`     | `array`          | Account features. Empty when the bank reports none                                   |
| `loanDetails`  | `object \| null` | Loan arrangement detail (see below). Only present on loan accounts; `null` otherwise |

<Warning>
  Rates are **fractions, not percentages**. `"0.0419"` means 4.19%. Multiply by 100 to display.

  All rate, fee, and feature fields are **frequently empty or `null`**. Population comes from the Australian CDR standard and varies widely by bank. Many data holders don't supply rates on the account, so always handle the absent case.
</Warning>

### Deposit / lending rate object

| Field                  | Type     | Description                                                                                                               |
| ---------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------- |
| `rateType`             | `string` | Deposit: `FIXED`, `VARIABLE`, `BONUS`, `INTRODUCTORY`, etc. Lending: `FIXED`, `VARIABLE`, `INTRODUCTORY`, `PENALTY`, etc. |
| `rate`                 | `string` | The rate as a fraction                                                                                                    |
| `comparisonRate`       | `string` | *(lending only)* Comparison rate as a fraction                                                                            |
| `calculationFrequency` | `string` | How often the rate is applied to the balance, as an ISO 8601 duration (e.g. `P1D`)                                        |
| `applicationFrequency` | `string` | How often the calculated amount is credited or debited, as an ISO 8601 duration (e.g. `P1M`)                              |
| `interestPaymentDue`   | `string` | *(lending only)* When payments are due (e.g. `IN_ARREARS`)                                                                |
| `loanPurpose`          | `string` | *(lending only)* `OWNER_OCCUPIED` or `INVESTMENT`                                                                         |
| `additionalValue`      | `string` | Context whose meaning depends on `rateType` (e.g. an introductory period)                                                 |
| `additionalInfo`       | `string` | Human-readable notes (e.g. bonus-rate conditions)                                                                         |
| `tiers`                | `array`  | Balance or term tiers where the rate varies (see below)                                                                   |

### Rate tier object

| Field                   | Type     | Description                              |
| ----------------------- | -------- | ---------------------------------------- |
| `name`                  | `string` | Display name for the tier                |
| `unitOfMeasure`         | `string` | `DOLLAR`, `PERCENT`, `MONTH`, or `DAY`   |
| `minimumValue`          | `number` | Lower bound of the tier (inclusive)      |
| `maximumValue`          | `number` | Upper bound. Absent means no upper bound |
| `rateApplicationMethod` | `string` | `PER_TIER` or `WHOLE_BALANCE`            |
| `additionalInfo`        | `string` | Human-readable notes                     |

### Fee object

| Field              | Type     | Description                                                       |
| ------------------ | -------- | ----------------------------------------------------------------- |
| `name`             | `string` | Name of the fee                                                   |
| `feeType`          | `string` | `PERIODIC`, `TRANSACTION`, `WITHDRAWAL`, `DEPOSIT`, `EVENT`, etc. |
| `amount`           | `string` | Fixed fee amount, if any                                          |
| `balanceRate`      | `string` | Fee as a fraction of the balance, if any                          |
| `transactionRate`  | `string` | Fee as a fraction of a transaction, if any                        |
| `accruedRate`      | `string` | Fee as a fraction of accrued interest, if any                     |
| `accrualFrequency` | `string` | How often the fee accrues, as an ISO 8601 duration                |
| `currency`         | `string` | Fee currency (assumes `AUD` if absent)                            |
| `additionalValue`  | `string` | Context whose meaning depends on `feeType`                        |
| `additionalInfo`   | `string` | Human-readable notes                                              |

### Feature object

| Field             | Type     | Description                                                          |
| ----------------- | -------- | -------------------------------------------------------------------- |
| `featureType`     | `string` | e.g. `CARD_ACCESS`, `OVERDRAFT`, `CASHBACK_OFFER`, `NO_ACCOUNT_FEES` |
| `additionalValue` | `string` | Context whose meaning depends on `featureType`                       |
| `additionalInfo`  | `string` | Human-readable notes                                                 |

### Loan details object

Present only on loan accounts (`loanDetails` is `null` for all other account types). Amounts are decimal strings; dates are RFC3339 dates (`2030-06-01`); frequencies are ISO 8601 durations (`P1M`).

| Field                   | Type      | Description                                                        |
| ----------------------- | --------- | ------------------------------------------------------------------ |
| `loanEndDate`           | `string`  | Date the loan is due to be repaid in full                          |
| `repaymentType`         | `string`  | `PRINCIPAL_AND_INTEREST` or `INTEREST_ONLY`                        |
| `repaymentFrequency`    | `string`  | Required repayment frequency (ISO 8601 duration)                   |
| `nextInstalmentDate`    | `string`  | Next date an instalment is required                                |
| `minInstalmentAmount`   | `string`  | Minimum amount of the next instalment                              |
| `minInstalmentCurrency` | `string`  | Currency of the instalment (assumes `AUD` if absent)               |
| `maxRedraw`             | `string`  | Maximum redrawable amount. Absent means redraw is not available    |
| `maxRedrawCurrency`     | `string`  | Currency of `maxRedraw`                                            |
| `minRedraw`             | `string`  | Minimum redraw amount                                              |
| `minRedrawCurrency`     | `string`  | Currency of `minRedraw`                                            |
| `originalLoanAmount`    | `string`  | Original loan value, if known                                      |
| `originalLoanCurrency`  | `string`  | Currency of `originalLoanAmount`                                   |
| `originalStartDate`     | `string`  | Original start date of the loan                                    |
| `offsetAccountEnabled`  | `boolean` | `true` if one or more offset accounts are configured for this loan |

<Info>
  The IDs of any offset accounts are not exposed. `offsetAccountEnabled` tells you whether an offset arrangement exists.
</Info>

## Error responses

Errors use the standard envelope `{ "error": { "message": string, "code"?: string, "details"?: string[] } }`. The optional `code` field is set for the structured cases below. Clients should branch on `code` rather than parsing `message`.

| Status | `code`                        | When                                                                                                                                                                                                    |
| ------ | ----------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `400`  | `invalid_params`              | `accountIds` is present but empty after trimming (e.g. `accountIds=,,`). A missing or empty `accountIds` param instead fails schema validation and returns `Invalid request parameters` with no `code`. |
| `400`  | `too_many_accounts`           | More than 100 accounts requested (checked after deduplication)                                                                                                                                          |
| `400`  | `wrong_endpoint_for_category` | Any requested account ID belongs to a brokerage or documents connection                                                                                                                                 |
| `404`  | *(none)*                      | One or more accounts not found, or do not belong to you                                                                                                                                                 |
| `501`  | *(none)*                      | An account belongs to a provider that does not expose account detail                                                                                                                                    |
| `503`  | *(none)*                      | Banking provider temporarily unavailable. Retry later.                                                                                                                                                  |

## Examples

### Basic request

```bash theme={null}
curl -H "Authorization: Bearer YOUR_API_KEY" \
  "https://api.redbark.com/v1/account-details?accountIds=a1b2c3d4-e5f6-7890-a1b2-c3d4e5f67890,c3d4e5f6-a7b8-9012-c3d4-e5f6a7b89012"
```

### Python: print the savings rate per account

```python theme={null}
import requests

API_KEY = "YOUR_API_KEY"

# Get account IDs first
accounts_resp = requests.get(
    "https://api.redbark.com/v1/accounts",
    headers={"Authorization": f"Bearer {API_KEY}"},
)
account_ids = [a["id"] for a in accounts_resp.json()["data"]]

# Fetch details for all accounts in one call
resp = requests.get(
    "https://api.redbark.com/v1/account-details",
    headers={"Authorization": f"Bearer {API_KEY}"},
    params={"accountIds": ",".join(account_ids)},
)

for d in resp.json()["data"]:
    if d["depositRate"] is not None:
        print(f"{d['accountId']}: {float(d['depositRate']) * 100:.2f}% p.a.")
    else:
        print(f"{d['accountId']}: no rate reported by the bank")
```

### JavaScript

```javascript theme={null}
const API_KEY = "YOUR_API_KEY";
const BASE = "https://api.redbark.com";

// Get account IDs first
const accountsResp = await fetch(`${BASE}/v1/accounts`, {
  headers: { Authorization: `Bearer ${API_KEY}` },
});
const { data: accounts } = await accountsResp.json();
const accountIds = accounts.map((a) => a.id).join(",");

// Fetch details
const resp = await fetch(`${BASE}/v1/account-details?accountIds=${accountIds}`, {
  headers: { Authorization: `Bearer ${API_KEY}` },
});
const { data: details } = await resp.json();

for (const d of details) {
  const rate = d.depositRate;
  console.log(
    rate ? `${d.accountId}: ${(Number(rate) * 100).toFixed(2)}%` : `${d.accountId}: no rate reported`,
  );
}
```
