# Fund Metrics

> Returns all metrics for a fund in a single paginated response, with the latest observation per metric name.

`GET https://api.bavest.co/v2/funds/metrics`

Group: Funds. Route id: `v2_funds_metrics`. Included in: Pro, Growth.

## Description

Returns all metrics for a fund in a single paginated response, with the
latest observation per metric name.

Metric groups:
- NAV: latest net asset value per share in the quoted currency
- AUM: total fund assets under management, aggregated across all share
  classes of the fund
- Cumulative returns: YTD, 1M, 3M, 6M, 1Y, 3Y, 5Y, 10Y and since
  inception, in percent
- Annualized returns: 3Y, 5Y, 10Y and since inception, in percent
- Calendar year returns: `calendar_year_return_YYYY`, in percent
- Risk and cost metrics: volatility, Sharpe ratio, beta, alpha, information
  ratio, tracking error, max drawdown, TER, ongoing charges and SRI

Coverage varies by metric and fund. NAV and AUM cover most of the fund
universe. Performance returns are backfilled progressively and may be
unavailable for individual funds. The `date` field of each item states
the observation date of that value.

Use `fields` to select specific metrics by `metricId` or `metricName`.
The endpoint `/v2/funds/metrics/names` returns all valid metric names.

## Authentication

Send your API key in the `x-api-key` header on every request. No key yet? Sign up at https://dashboard.bavest.co/sign-up (free trial). The examples read the key from the `BAVEST_API_KEY` environment variable.

## Parameters

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| `isin` | query | string | yes | Fund ISIN code (e.g., `DE0009848119`) Example `DE0009848119`. |
| `fields` | query | string | no | Comma-separated list of metric names to include in the response. Valid names are served by `/v2/funds/metrics/names`. Example when explicitly filtering: `nav,aum,cumulative_return_5y,annualized_return_5y`. |
| `limit` | query | integer (int32) | no | Maximum number of metrics to return per page (default 50, max 200) Default `50`. |
| `offset` | query | integer (int32) | no | Number of results to skip for pagination (default 0) Default `0`. |

## Response

200 Successful response (`application/json`).

| Field | Type | Always present | Description |
|---|---|---|---|
| `data` | object | no |  |
| `data.latestDate` | string (date) \| null | no | Most recent observation date across all metrics. Example: `2026-08-31`. |
| `data.metrics` | array of FundMetricItem | no |  |
| `data.metrics[].metricId` | string | yes | Machine-readable metric identifier (lowercase, e.g. nav, cumulative_return_1y) Example: `cumulative_return_1y`. |
| `data.metrics[].metricName` | string | yes | Metric name as stored in the database (lowercase, identical to metricId) Example: `cumulative_return_1y`. |
| `data.metrics[].date` | string (date) | no | Observation date of this metric value. Example: `2026-08-31`. |
| `data.metrics[].value` | number (double) \| null | yes | Metric value. Null when no value is available. Example: `12.4`. |
| `data.metrics[].valid` | boolean | yes | Whether the metric carries a value (false when value is null) Example: `true`. |
| `data.metrics[].unit` | string | no | Unit of measurement (MetricUnitModel value, uppercase) One of `CURRENCY`, `PERCENTAGE`, `RATIO`, `NUMERIC`. Example: `PERCENTAGE`. |
| `data.metrics[].currency` | string \| null | no | Currency code if the metric is currency-denominated (null for percentages) Example: `EUR`. |
| `meta` | ResponseMeta | no | Response metadata for paginated endpoints. Offset pagination returns `page`/`pageSize`/`totalPages`/`totalCount`; cursor pagination returns `pageSize`/`hasMore`/`nextCursor` and `totalCount` only when known. |
| `meta.time` | integer | no | Server-side processing time in milliseconds. Example: `17`. |
| `meta.parameters` | object | no | Echo of the request parameters the endpoint resolved. |
| `meta.page` | integer | no | Current page number (offset pagination) Example: `1`. |
| `meta.pageSize` | integer | no | Number of results per page. Example: `50`. |
| `meta.totalPages` | integer | no | Total number of pages (offset pagination) Example: `2`. |
| `meta.totalCount` | integer | no | Total number of results across all pages. Example: `100`. |
| `meta.hasMore` | boolean | no | Whether more results follow (cursor pagination) |
| `meta.nextCursor` | string \| null | no | Cursor for the next page (cursor pagination), null on the last page. |

## Example request

```bash
curl 'https://api.bavest.co/v2/funds/metrics?isin=DE0009848119' \
  -H "x-api-key: $BAVEST_API_KEY"
```

## Example response

```json
{
  "data": {
    "latestDate": "2026-08-31",
    "metrics": [
      {
        "metricId": "aum",
        "metricName": "aum",
        "value": 24552928300,
        "date": "2026-07-31",
        "valid": true,
        "unit": "CURRENCY",
        "currency": "EUR"
      },
      {
        "metricId": "nav",
        "metricName": "nav",
        "value": 176.61,
        "date": "2026-08-31",
        "valid": true,
        "unit": "CURRENCY",
        "currency": "EUR"
      }
    ]
  },
  "meta": {
    "page": 1,
    "pageSize": 50,
    "totalPages": 1,
    "totalCount": 49,
    "parameters": {
      "isin": "DE0009848119",
      "limit": "50"
    },
    "time": 1177
  }
}
```

## Errors

| Status | Meaning |
|---|---|
| 400 | Invalid request parameters. Returned when required query parameters are missing, have invalid types, or violate constraints (e.g., providing both symbol and isin when they are mutually exclusive). |
| 401 | Missing or invalid API key. |
| 404 | Resource not found. |
| 429 | Rate limit exceeded. Retry after the `Retry-After` header interval. |
| 500 | An unexpected error occurred on the server. If the issue persists, contact support with the X-Request-Id header value. |
| 502 | Upstream data provider returned an error or is temporarily unavailable. Retry after a short delay. |
| 503 | Bavest cannot read its data store right now. The security may well have data; retry after the `Retry-After` header interval. |
| 504 | The request timed out waiting for a response from the upstream data provider. This may occur for complex queries or during peak load. |
| default | An unexpected error occurred on the server. If the issue persists, contact support with the X-Request-Id header value. |

- `403` from the gateway: the API key is invalid or switched off.
- `429` with message `Limit Exceeded`: the monthly quota of the key is used up. With `Too Many Requests`: the key is throttled, or this route is not in the key's plan. Wait for `Retry-After` when it is sent.

## Links

- HTML page: https://dashboard.bavest.co/docs/v2_funds_metrics
- OpenAPI: https://dashboard.bavest.co/openapi.json (YAML: https://dashboard.bavest.co/openapi.yaml)
- Authentication: https://dashboard.bavest.co/docs/authentication.md
- MCP server for AI agents: https://dashboard.bavest.co/docs/mcp.md
- All routes: https://dashboard.bavest.co/llms.txt
