All APIs

Crypto API for live and historical pair prices

Get crypto pair prices and price history through REST or MCP, with one account quota and a Bearer key on every request. Prices are decimal strings with up to 8 significant digits.

First request

Quickstart →
curl --request GET \
  --url "https://api.narwhalapi.com/v1/crypto/BTC-USD/price" \
  --header "Authorization: Bearer $NARWHAL_API_KEY"
Example response Illustrative response · not a live request
{
  "pair": "BTC-USD",
  "base": "BTC",
  "quote": "USD",
  "price": "68250.5",
  "change_24h": "812.4",
  "change_24h_percent": "1.2",
  "timestamp": "2026-10-26T15:42:00Z",
  "stale": false
}

Endpoints

GETCrypto pairs we price/v1/crypto/pairs
GETLatest price of one crypto pair/v1/crypto/{pair}/price
GETLatest prices for up to 50 crypto pairs/v1/crypto/prices
GETPrice bars of one crypto pair/v1/crypto/{pair}/bars

Crypto coverage and access

Pairs and quotes

About 40 pairs are priced against USD, EUR and GBP. Use BTC-USD or ETH-EUR; ids accept any case or a slash, and answers return canonical pairs.

Price access

Free stock, ETF and crypto prices are delayed 15 minutes. Basic and Pro get live crypto prices and 24-hour change; Free omits 24-hour change.

Trading and freshness

Crypto trades all day and has no market session. Prices are stale when over 5 minutes old or refresh fails; prices and bars have no volume field.

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.

The pair list is included on every plan and contains pairs Narwhal prices. A pair is listed while it trades at least once every 30 seconds and dropped when it falls below once every 2 minutes. Daily bars cover the last 12 months on Free, last 5 years on Basic and full history on Pro. One-minute bars require Basic or Pro within the plan's history limit. Batch price calls accept up to 50 ids.

Response fields

pair
Canonical pair returned with the coin and quote currency.
base
Ticker of the coin in the requested crypto pair.
quote
Quote currency used for every price in the response.
price
Last price as a decimal string, with up to 8 significant digits.
change_24h
Price change over 24 hours, derived from percentage change; omitted on Free or when unknown.
change_24h_percent
Change over 24 hours in percent; 1.5 means 1.5%. Omitted with change_24h.
timestamp
Time the price was valid, in UTC with whole seconds.
stale
True when the price is over 5 minutes old or could not be refreshed.
delayed
Present as true only when a price carries the Free plan delay.

Explore related pages

Crypto API reference

Read pair and price routes, with response fields and daily bar timing.

Read the reference →

Plans and monthly quotas

Compare monthly request quotas and history limits, including paid access to 24-hour change.

See pricing →

Stocks API for listed stocks

Listed stock prices and company data through REST and MCP

Explore the API →

Funds API for ETF prices and mutual fund NAVs

ETF prices and daily mutual fund net asset values

Explore the API →

Common questions

How do daily crypto bars work?

Each daily bar covers one UTC day and appears at 00:00 UTC, with Free bars following after the plan's price delay. Today's partial bar is never shown, and end is returned when the 15 minute delay cuts your range.

How much crypto price history can I request?

Free includes daily bars for the last 12 months. Basic covers the last 5 years and Pro has full history; both paid plans include one-minute bars within those limits. When your plan cuts older rows, start returns the first date served.

What does the 24-hour change represent?

On Basic and Pro, change_24h is price minus the price 24 hours earlier, calculated from the 24-hour percentage change. The percentage field uses 1.5 to mean 1.5%. Both change fields are omitted on Free and whenever the change is unknown.

How do pair ids and batch calls work?

A pair id joins the coin and quote currency with a dash, such as BTC-USD. Any case works, and a slash is accepted. Batch calls accept up to 50 ids and count one call per id that returns a price.