All APIs

Funds API for ETF prices and mutual fund NAVs

Get prices and price history for ETFs and mutual funds, with search and profiles on every plan. Each request needs a Bearer key; REST and MCP share one account quota.

First request

Quickstart →
curl --request GET \
  --url "https://api.narwhalapi.com/v1/funds/ARCX:SPY/price" \
  --header "Authorization: Bearer $NARWHAL_API_KEY"
Example response Illustrative response · not a live request
{
  "id": "ARCX:SPY",
  "symbol": "SPY",
  "currency": "USD",
  "price": "578.12",
  "previous_close": "576.40",
  "change": "1.72",
  "change_percent": "0.30",
  "volume": "61230500",
  "market_session": "open",
  "timestamp": "2026-10-26T15:42:00Z",
  "stale": false,
  "type": "etf"
}

Endpoints

GETSearch ETFs and mutual funds by ticker or name/v1/funds/search
GETProfile of one fund/v1/funds/{id}
GETLatest price of one fund/v1/funds/{id}/price
GETLatest prices for up to 50 funds/v1/funds/prices
GETPrice bars of one fund/v1/funds/{id}/bars
GETDistributions of one fund/v1/funds/{id}/distributions

Fund types and access

ETF listing ids

Use an ETF listing id such as ARCX:SPY. A bare US ticker such as SPY also works when it names one US listing.

Mutual fund values

Use FUND:VFIAX for a mutual fund. Its daily net asset value appears in nav, with previous_nav and date; mutual fund values are never delayed.

Price access

Free stock, ETF and crypto prices are delayed 15 minutes. Basic and Pro get live ETF prices; delayed answers carry delayed: true and omit day volume.

Plan quotas

Free is $0 for 5,000 requests a month. Basic is $59 a month for 100,000; Pro is $149 a month for 1,000,000. Free permits commercial use.

Daily bars and past distributions cover the last 12 months on Free, last 5 years on Basic and full history on Pro. Paid plans include one-minute ETF bars within their history limits. Mutual funds have no one-minute bars; requests return 400 invalid_interval. Their daily bars use NAV for open, high, low and close, with no volume. Batch price calls accept up to 50 ids and count one call per id that returns a price.

Response fields

id
Canonical listing id returned for the requested fund.
symbol
Ticker used for this fund on its exchange.
currency
Currency for every price field, with pence converted to pounds.
price
Last ETF price, returned as a string in currency.
previous_close
Previous session's close, omitted when that value is unknown.
change
ETF: price minus previous_close; mutual fund: nav minus previous_nav. Left out when the earlier value is unknown.
change_percent
Percentage change from previous_close for ETFs or previous_nav for mutual funds; 1.5 means 1.5%. Omitted when the earlier value is unknown.
volume
Shares traded today, omitted when unknown and always omitted from delayed answers.
market_session
Exchange state at timestamp: pre, open, post or closed; only US exchanges have pre and post.
timestamp
Time the price was valid, in UTC with whole seconds.
stale
ETF prices: refresh failed or over 15 minutes old while open; NAV beyond next business day.
delayed
Present as true only when a price carries the Free plan delay.
type
Identifies the response as etf or mutual_fund for the requested fund.
nav
Net asset value per share, returned in currency for mutual funds.
previous_nav
Previous day's net asset value, omitted when that value is unknown.
date
Day the mutual fund NAV applies to, formatted as YYYY-MM-DD.

Explore related pages

Funds API reference

Read fund search and price routes, with field definitions for ETF prices and mutual fund NAVs.

Read the reference →

Plans and monthly quotas

Compare monthly request quotas and history limits, with live ETF prices on Basic and Pro.

See pricing →

Stocks API for listed stocks

Listed stock prices and company data through REST and MCP

Explore the API →

Crypto API for live and historical pair prices

Crypto pair prices and history through REST and MCP

Explore the API →

Common questions

How do ETF prices differ from mutual fund NAVs?

An ETF returns a traded price. A mutual fund returns one end-of-day net asset value in nav, with previous_nav and date. Read type for etf or mutual_fund. NAVs are never delayed and become stale once older than the next business day. ETF prices are never stale when the exchange is closed.

What happens when I use the wrong kind of id?

ETF ids use the exchange code and ticker, such as ARCX:SPY; mutual fund ids use FUND followed by a colon and ticker. A stock id on a fund route returns 404 not_found. A fund id on a stock route redirects to the fund route with a 301.

How far back can I request fund history?

Free covers the last 12 months, Basic the last 5 years and Pro full history for daily bars and past distributions. If your plan cuts older rows, start returns the first date served. The kind field on a distribution is omitted until sources provide it.

How are fund price requests counted?

REST and MCP use one account and monthly request quota, and every request needs a Bearer key. A batch accepts up to 50 fund ids and counts one call per id that returns a price.