QVeris
ETF Data API Guide

Free ETF NAV API
Sources, Fields & Python

Find a free ETF NAV API, verify whether it returns true fund NAV rather than market price, and test current or historical data before integration.

FREE ETF NAV API whiteboard showing five steps from choosing an ETF to validating NAV data and using it in an app or AI agent

Free ETF NAV API: what developers actually need

The task

Retrieve official current or historical NAV for the correct fund and share class, with valuation time, publication time, currency, and source.

The key check

Distinguish official NAV from exchange price, bid or ask, intraday indicative value, and a vendor estimate; each answers a different question.

The free-plan check

Verify authentication, request limits, redistribution rights, coverage, delay, and whether NAV history is included.

The output

Preserve raw NAV, per-share currency, valuation policy, revision status, and any comparable market-price timestamp before calculating a premium or discount.

ETF NAV data API fields to verify

NAV is the per-share value of the fund's net assets at a stated valuation time. An ETF's market price can trade above or below that value, so a generic quote endpoint is not automatically an ETF net asset value API. The U.S. SEC Investor.gov definition of NAV is a useful baseline.

The valuation clock matters as much as the number. Official NAV may use closing prices, fair-value adjustments, accrued income and expenses, liabilities, and an official shares-outstanding figure. For international or multi-asset funds, some underlying markets may already be closed when the ETF still trades, so a same-screen comparison can combine observations from different economic times.

Current ETF NAV API fields

Look for NAV value, valuation date or timestamp, currency, identifier, source, and adjustment status. A latest value without its as-of date is difficult to validate.

Historical ETF NAV API fields

Check the available date range, frequency, split or distribution adjustments, missing observations, pagination, and timezone conventions.

NAV, iNAV, and market price

Daily NAV, intraday indicative value (often called iNAV or IIV), and exchange price are related but different. Match the field to the task before integrating it.

Premium and discount calculation

Calculate (market_price / NAV - 1) × 100 only when price and NAV refer to a defensible comparison time and share class. Preserve whether price means last trade, midpoint, closing price, or official market close.

Currency, shares, and corporate actions

Keep NAV currency, trading currency, FX rate and timestamp, per-share denominator, split factor, distribution treatment, and share-class events. A currency conversion or split mismatch can create a false premium or a discontinuity in history.

Publication, revisions, and stale states

Store valuation time, first publication time, provider processing time, retrieval time, and revision ID separately. Missing, estimated, preliminary, corrected, and stale NAV values should be explicit states rather than silently carried forward.

Free ETF NAV API sources to evaluate

Evaluate each source with an ordinary domestic equity ETF, an international ETF whose underlying market closes earlier, a bond fund, a distribution date, a split or share-class event, and a market holiday. Compare value, valuation and publication times, currency, status, revision behavior, and identifier resolution rather than asking only whether a field named nav exists.

Source typeLikely dataVerify before useBest fit
ETF issuerOfficial daily NAV and fund documents.Whether access is a documented API and permits automation.Validating a known issuer's funds.
Market-data providerMulti-issuer current and historical NAV, identifiers, and metadata.Free-tier endpoint access, delay, coverage, limits, and license.Apps that need normalized coverage.
Broker APIMarket data and sometimes indicative ETF NAV fields.Account requirement, entitlements, real-time status, and field meaning.Trading workflows with an existing account.
Regulatory or public datasetFund identifiers, filings, reference records, or delayed disclosures.Whether NAV itself is supplied and how records map to share classes.Research and cross-checking.

How to integrate a free historical ETF NAV API

Keep the provider-specific field mapping outside the calculation. After normalizing a response to the keys used below, this example validates the official NAV observation and calculates a premium or discount only when listing, share class, and currency match.

from datetime import datetime
from decimal import Decimal, InvalidOperation

import requests


def parse_time(value: str) -> datetime:
    parsed = datetime.fromisoformat(value.replace("Z", "+00:00"))
    if parsed.tzinfo is None:
        raise ValueError("timestamps must include a timezone")
    return parsed


def fetch_json(endpoint: str, params: dict, headers: dict) -> dict:
    response = requests.get(
        endpoint, params=params, headers=headers, timeout=(5, 20)
    )
    response.raise_for_status()
    return response.json()


def premium_discount(nav_row: dict, price_row: dict) -> dict:
    identity = ("fund_id", "share_class", "currency")
    if any(nav_row.get(key) != price_row.get(key) for key in identity):
        raise ValueError("NAV and price identity or currency mismatch")
    if nav_row.get("nav_type") != "official":
        raise ValueError("premium calculation requires official NAV")
    try:
        nav = Decimal(str(nav_row["nav_per_share"]))
        price = Decimal(str(price_row["price"]))
    except (KeyError, InvalidOperation) as exc:
        raise ValueError("invalid NAV or price") from exc
    if nav <= 0 or price <= 0:
        raise ValueError("NAV and price must be positive")

    nav_time = parse_time(nav_row["valuation_time"])
    price_time = parse_time(price_row["observed_at"])
    gap_minutes = abs((price_time - nav_time).total_seconds()) / 60
    return {
        "premium_discount_pct": ((price - nav) / nav) * Decimal("100"),
        "nav_time": nav_time,
        "price_time": price_time,
        "time_gap_minutes": Decimal(str(gap_minutes)),
        "comparison_is_stale": gap_minutes > 60,
    }

Interpret the result with its clock. A calculated 2% premium does not mean the ETF is mispriced when the official NAV is from the previous close, underlying markets are shut, or FX has moved. Set the stale threshold for the fund and use case, then display the two timestamps beside the percentage.

1. Resolve the ETF identifier

Map the user's ticker to a stable identifier and exchange. Tickers can be reused across venues; ISIN, FIGI, or a provider-specific fund ID may be safer.

2. Request a small date range

Start with one known ETF and a short historical window. In Python, send the documented parameters, check the HTTP status, and parse JSON only after a successful response.

3. Validate the response

Confirm identifier, date, currency, frequency, null handling, and whether values are adjusted. Compare at least one observation with the issuer's published NAV.

4. Cache and monitor responsibly

Respect rate limits and licensing. Cache daily NAV where permitted, log the source and as-of time, and treat stale or missing values as explicit states.

5. Align NAV and price before calculating a premium

Select a documented price observation, confirm the same listing and share class, align currency, and record the time gap from official NAV. If underlying markets were closed or the NAV is prior-day, label the result accordingly.

6. Build a revision-aware history

Key observations by fund, share class, valuation date, source, and revision. Preserve preliminary and corrected versions with publication times so research uses only the value available at the simulated moment.

7. Monitor continuity and anomalies

Flag unexplained jumps, unchanged values across expected business days, impossible negative NAV, currency switches, and gaps around splits or distributions. Route anomalies to source review instead of interpolating them automatically.

Use QVeris to find and call ETF NAV capabilities

QVeris can help an agent discover and inspect available financial-data capabilities before calling them. Availability, fields, authentication, pricing, and license still come from the selected provider; QVeris does not create or guarantee ETF NAV data.

  • Open the QVeris provider details for relevant ETF or fund-data capabilities.
  • Inspect input and output schemas, NAV type, currency, valuation policy, publication time, revision state, and license before letting an agent call a capability.
  • Require an explicit fund and share-class identifier, date range, official versus indicative NAV, and freshness tolerance in every tool request.
  • Preserve the provider, raw value, identifier, valuation and publication dates, revision, and validation result with every downstream use.

Free ETF NAV API FAQ

Is there a free API for ETF NAV data?

Some issuers, public datasets, brokers, and data vendors expose free access or limited free tiers. Coverage and terms vary, so verify that NAV endpoints—not only price endpoints—are included.

How do I get historical ETF NAV via API?

Use a documented history endpoint with an ETF identifier plus start and end dates, then verify date, currency, adjustment method, pagination, and missing values.

Is ETF NAV the same as ETF price?

No. NAV is based on fund assets minus liabilities per share at a valuation time; market price is the price at which ETF shares trade on an exchange.

What is the difference between NAV and iNAV?

NAV is normally an official valuation calculated on a schedule. iNAV or IIV is an intraday indicative estimate and can use different inputs or timing.

How is an ETF premium or discount calculated?

It is commonly the percentage difference between a selected market price and NAV. The result is meaningful only when the listing, share class, currency, and comparison times are aligned and disclosed.

Why can an international ETF trade far from its last NAV?

The ETF may still trade after underlying markets have closed, while FX and new information continue moving. The last official NAV can therefore be stale relative to the exchange price without either value being an error.

Should missing NAV values be forward-filled?

Not by default. First identify holidays, publication delays, suspended valuation, feed failures, or fund events. Preserve the missing state; any imputation should be separate, labeled, and excluded from official-value reporting.

Authoritative references and related guides