> For the complete documentation index, see [llms.txt](https://synthesys-2.gitbook.io/synthesys-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://synthesys-2.gitbook.io/synthesys-docs/network-overview/api-reference/nav.md).

# NAV

The NAV (Net Asset Value) endpoints surface the price used to value subscription and redemption activity on a share class. NAVs are published by fund administrators on a schedule (daily for most funds, intraday for some) and are immediately visible through the two read endpoints documented here. Distributors and front-ends read the latest NAV on every fund-detail page render and the historical series whenever a chart or reconciliation report is shown.

NAV publication is handled by Synthesys operations in coordination with the fund administrator. From a client integration standpoint, your application only ever **reads** NAVs.

### The NAV record

Every NAV record returned by the read endpoints has the following shape:

| Field          | Type   | Notes                                                                                                                       |
| -------------- | ------ | --------------------------------------------------------------------------------------------------------------------------- |
| `entryId`      | string | Server-generated identifier for the NAV record, derived from the publication timestamp (format `YYYYMMDDHHMMSS`)            |
| `shareClassId` | string | Format `SC######`                                                                                                           |
| `close`        | string | The closing price — the canonical "the NAV is X" value. Returned as a decimal string to avoid floating-point precision loss |
| `open`         | string | Opening price for the period                                                                                                |
| `high`         | string | High for the period                                                                                                         |
| `low`          | string | Low for the period                                                                                                          |
| `currency`     | string | ISO currency code (e.g. `USD`, `EUR`)                                                                                       |
| `volume`       | number | Traded volume for the period                                                                                                |
| `publishedAt`  | number | Epoch ms — when the fund administrator struck this NAV                                                                      |
| `createdAt`    | number | Epoch ms — when this record was written into the API                                                                        |
| `createdBy`    | string | Identifier of the actor that published the record                                                                           |

> Prices are returned as strings rather than numbers to preserve precision. Convert them with a big-decimal library (`decimal.js`, `bignumber.js`, or `decimal.Decimal` in Python) rather than parsing into a native float.

***

### Read live NAV

Get the most recently published NAV record for a share class.

**`GET /funds/shareclass/nav/live`**

#### Query parameters

| Param          | Type   | Required | Description       |
| -------------- | ------ | -------- | ----------------- |
| `shareClassId` | string | Yes      | Format `SC######` |

#### Response

json

```json
{
  "isError": false,
  "errorMsg": "NA",
  "data": {
    "entryId": "20250508120000",
    "shareClassId": "SC000001",
    "close": "1098.0000",
    "open": "1098.0000",
    "high": "1098.0000",
    "low": "1098.0000",
    "currency": "USD",
    "publishedAt": 1761807929692,
    "createdAt": 1761807929700,
    "createdBy": "bo-pricing"
  }
}
```

#### Examples

**curl:**

bash

```bash
curl -s "$BASE/funds/shareclass/nav/live?shareClassId=SC000001" | jq .
```

**Node.js:**

javascript

```javascript
async function getLiveNav(shareClassId) {
  const url = new URL(`${BASE}/funds/shareclass/nav/live`);
  url.searchParams.set('shareClassId', shareClassId);
  const res = await fetch(url);
  const payload = await res.json();
  if (payload.isError) throw new Error(payload.errorMsg);
  return payload.data;
}

const nav = await getLiveNav('SC000001');
console.log(`Live NAV for ${nav.shareClassId}: ${nav.close} ${nav.currency}`);
```

**Python:**

python

```python
def get_live_nav(share_class_id):
    r = requests.get(
        f"{BASE}/funds/shareclass/nav/live",
        params={"shareClassId": share_class_id},
        timeout=10,
    )
    payload = r.json()
    if payload["isError"]:
        raise RuntimeError(payload["errorMsg"])
    return payload["data"]

nav = get_live_nav("SC000001")
print(f"Live NAV for {nav['shareClassId']}: {nav['close']} {nav.get('currency')}")
```

#### Caching

The live endpoint is the obvious candidate for short-TTL caching in front of any user-facing surface. A 5–15 second TTL is usually sufficient — that is well below the cadence at which most NAVs are struck, while still smoothing read traffic by orders of magnitude.

***

### Read NAV history

Get a chronological series of NAV records for a share class — used for charts, reconciliation, and any time-series analysis.

**`GET /funds/shareclass/nav/history`**

#### Query parameters

| Param          | Type   | Required | Description                      |
| -------------- | ------ | -------- | -------------------------------- |
| `shareClassId` | string | Yes      | Format `SC######`                |
| `startDate`    | number | No       | Epoch ms — inclusive lower bound |
| `endDate`      | number | No       | Epoch ms — inclusive upper bound |

#### Behaviour

* With both `startDate` **and** `endDate`: returns entries with `publishedAt` in `[startDate, endDate]`, sorted ascending by `publishedAt`.
* Without a range: returns the **last 100 entries**, sorted ascending by `publishedAt`.
* Passing only one of the two range bounds is treated as the no-range case (last 100). Always pass both or neither.

#### Response

json

```json
{
  "isError": false,
  "errorMsg": "NA",
  "data": [
    {
      "entryId": "20250507120000",
      "shareClassId": "SC000001",
      "close": "1097.6000",
      "currency": "USD",
      "publishedAt": 1761721529692,
      "createdAt": 1761721529700,
      "createdBy": "bo-pricing"
    },
    {
      "entryId": "20250508120000",
      "shareClassId": "SC000001",
      "close": "1098.0000",
      "currency": "USD",
      "publishedAt": 1761807929692,
      "createdAt": 1761807929700,
      "createdBy": "bo-pricing"
    }
  ]
}
```

#### Examples

**curl — last 100 entries:**

bash

```bash
curl -s "$BASE/funds/shareclass/nav/history?shareClassId=SC000001" | jq .
```

**curl — specific range:**

bash

```bash
curl -s "$BASE/funds/shareclass/nav/history?shareClassId=SC000001&startDate=1761000000000&endDate=1762000000000" | jq .
```

**Node.js:**

javascript

```javascript
async function getNavHistory(shareClassId, { startDate, endDate } = {}) {
  const url = new URL(`${BASE}/funds/shareclass/nav/history`);
  url.searchParams.set('shareClassId', shareClassId);
  if (startDate != null) url.searchParams.set('startDate', String(startDate));
  if (endDate   != null) url.searchParams.set('endDate',   String(endDate));

  const res = await fetch(url);
  const payload = await res.json();
  if (payload.isError) throw new Error(payload.errorMsg);
  return payload.data;
}

// Last 100
const recent = await getNavHistory('SC000001');

// Last 30 days
const now = Date.now();
const month = await getNavHistory('SC000001', {
  startDate: now - 30 * 24 * 60 * 60 * 1000,
  endDate: now,
});
```

**Python:**

python

```python
def get_nav_history(share_class_id, start_date=None, end_date=None):
    params = {"shareClassId": share_class_id}
    if start_date is not None and end_date is not None:
        params["startDate"] = start_date
        params["endDate"] = end_date
    r = requests.get(f"{BASE}/funds/shareclass/nav/history", params=params, timeout=10)
    payload = r.json()
    if payload["isError"]:
        raise RuntimeError(payload["errorMsg"])
    return payload["data"]

import time
now = int(time.time() * 1000)
month = get_nav_history("SC000001", start_date=now - 30 * 86400 * 1000, end_date=now)
```

### Patterns

* **Cache `nav/live` aggressively.** A 5–15 second TTL is appropriate for almost every front-end. Beyond that, your investor-facing pages will start showing prices that are visibly stale to anyone watching two tabs.
* **Don't poll `nav/history` for live updates.** It's a time-series read endpoint; polling it on a tight loop will scan more keys than you need. If you need live updates, poll `nav/live` and only hit `nav/history` when the user requests a chart or report.
* **Use the `entryId` as a stable key.** When rendering a NAV time series, use `entryId` as your row key. It's stable, sorted chronologically as a string, and globally unique within a share class.

### Common errors

* **`400` "shareClassId is required"** — query parameter missing.
* **`404` "shareClassId not found"** — the share class doesn't exist in this environment. Verify with `GET /funds/shareclass/:id`.
* **`404` "No NAV published"** — no NAV has been published for this share class yet. Pricing-dependent flows (notably order placement) will produce `nav: -1` until a NAV exists.
* **A history read returns fewer than 100 entries with no range supplied** — the share class simply doesn't have 100 entries yet. This is not an error.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://synthesys-2.gitbook.io/synthesys-docs/network-overview/api-reference/nav.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
