Backfill a full history
Page through all the history, save it to a file and resume if it stops.
Read the guide →Get the latest price and daily or one minute history for 13 commodity futures through REST or MCP. Each series is the front month contract, so prices step on roll days.
curl --request GET \
--url "https://api.narwhalapi.com/v1/futures/CL/price" \
--header "Authorization: Bearer $NARWHAL_API_KEY"{
"id": "CL",
"name": "WTI Crude Oil",
"exchange": "NYMEX",
"currency": "USD",
"unit": "usd_per_barrel",
"price": "102.11",
"market_session": "open",
"timestamp": "2026-10-29T18:38:00Z",
"stale": false
}/v1/futuresList every futures contract we price, with its name, category, exchange, currency and unit.
futureslist of objectEvery contract we price, each with its id, name, category, exchange, currency and unit.
/v1/futures/{id}/priceGet the latest price of one contract.
idrequiredFutures id: the exchange's root code, for example CL, GC, ES or 6E. Any case. The series is the continuous front month, not adjusted: there is a gap in it on each roll day.
idstringThe root code, such as CL.
namestringThe official name of the contract.
exchangestringThe exchange where the contract trades.
currencystringThe currency of the price.
unitstringWhat the price is per, such as usd_per_barrel or index_point.
pricestringThe last price of the front month contract, as a decimal string.
market_sessionone of open, closedopen while the contract trades by its published hours, otherwise closed.
timestampdate-timeWhen the price was valid, in UTC with whole seconds.
stalebooleanTrue when the contract is open and its price is more than 15 minutes old. A closed contract is never stale.
delayedalways truePresent as true only when the price is 15 minutes late (Free plan).
/v1/futures/pricesGet the latest prices of up to 50 contracts in one call.
idsrequiredComma-separated ids, at most 50 after duplicates are removed. Each id follows the same rules as the single-price route. One call is counted for each id that returns a price.
priceslist of objectOne entry for each id that returned a price, with the fields of a single price.
errorslist of objectIds that returned no price, each with the code not_found. They are not counted against your quota.
/v1/futures/{id}/barsGet daily or one minute bars of one contract, oldest first. Prices are raw front month prices, so they step on roll days.
idrequiredFutures id: the exchange's root code, for example CL, GC, ES or 6E. Any case. The series is the continuous front month, not adjusted: there is a gap in it on each roll day.
intervaloptional1d (one bar per trading day, dated by the day it belongs to) or 1m (one-minute bars, Basic and Pro only; kept for 12 months). Anything else is 400 invalid_interval.
startoptionalFirst bar. 1d: a date (YYYY-MM-DD), inclusive; left out means the oldest bar your plan reaches. 1m: a UTC time (YYYY-MM-DDTHH:MM:SSZ, or a date for 00:00 UTC), inclusive; left out means one day before end.
endoptionalLast bar. 1d: a date, inclusive; left out means the latest finished day. 1m: a UTC time, exclusive; left out means now, or five days after start. At most 5 days between start and end for 1m (400 range_too_large).
cursoroptionalnext_cursor of the previous page, with the same parameters.
idstringThe root code, such as CL.
currencystringThe currency of the price.
startstringSent only when your plan moved the start of the range forward.
endstringSent only on Free daily bars, when the 15 minute delay shortened the range.
barslist of objectThe bars, oldest first. Each has timestamp, open, high, low and close, and no volume.
next_cursorstringPass it back to read the next page. Null on the last page.
Page through all the history, save it to a file and resume if it stops.
Read the guide →Run a small script once a day and append the result to a CSV.
Read the guide →Cache responses by data type and tell a rate limit from a used-up quota.
Read the guide →Prices and history for 29 futures through REST and MCP
Explore the API →Gold, silver, platinum and palladium spot prices, plus WTI, Brent and copper reference prices.
Explore the API →Levels and history for 18 indices through REST and MCP
Explore the API →Free to start. Paid plans add more history and higher limits.
See pricing →13 contracts. Energy: WTI crude oil, Henry Hub natural gas, RBOB gasoline and NY Harbor ULSD. Metals: gold, silver, platinum and copper. Grains: corn, wheat and soybeans. Livestock: live cattle and lean hogs.
The spot API quotes gold in many currencies, and silver, platinum and palladium in US dollars. Commodity futures are the front month contract in US dollars, in the contract's own unit. Gold futures (GC) and gold spot (XAU) are different prices.
Each series is the front month contract, joined end to end and not adjusted. When the front month changes, the series moves to the next contract and the price steps to that contract's price. CL stepped by about 4 dollars on 19 October 2026. Prices and bars show the step as it traded, so do not read it as a move of one day. That is also why a futures price has no previous close or change: across a roll, a change would be false.
Each answer carries a unit. CL is usd_per_barrel, NG is usd_per_mmbtu, RB and HO are usd_per_gallon, GC, SI and PL are usd_per_troy_ounce and HG is usd_per_pound. Grains are cent_per_bushel and livestock is cent_per_pound, so those prices are in cents, not dollars.
Free prices are 15 minutes late and carry delayed: true. Basic and Pro prices are live. Daily bars go back to April 2017: Free gets the last 12 months, Basic 5 years and Pro the full history.
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.
Create a free key and call the API from your own code.