EOX forward curves, straight into your models
The same curves, volatilities and correlations as your EOD files, on demand: pick the curves, tenors and dates you want, in Excel, Python or anything that speaks HTTPS. Full history is included with your subscription.
Get started
EOX emailed you a personal key starting eox_. It's tied to you and your subscription, so
keep it private and don't share it.
Paste it in the box below, or run the one-line test. You'll see the datasets your subscription includes.
The Excel add-in is the quickest. Python and plain HTTPS give you everything else.
Or from a terminal (Windows PowerShell, Mac or Linux):
curl -H "X-API-Key: YOUR_KEY" https://api.eoxlive.com/v1/me
How the data is organised
| Term | Meaning |
|---|---|
| Dataset | One EOD file, such as power or natural_gas. You can use the
datasets in your subscription; the full list is below. |
| Curve | One code within a dataset, such as power BXO or natural gas AA. The
parameter name differs by dataset (market_code, location_code, ...). Use
/v1/<dataset>/curves to browse them. |
| Tenor | Either a rolling tenor (time_key=M01-M24, Q11-Q14, C01)
or a fixed contract (contract=Jan_2027,Calendar_2028). Ranges expand. |
| Curve date | The date a curve was published. Requests default to the latest; pass
date=2026-09-30 for an earlier one, or use /history for many dates. |
| Field | The number you want: mid (default), bid, ask, and others
per dataset. |
Excel add-in
Works in Excel for Windows (Microsoft 365), Mac and the web.
Install
The add-in is one small file, EOX_Excel_AddIn.xml. Choose the option that fits how your Excel is managed. You only install it once: improvements reach you automatically.
Option 1: your IT team deploys itrecommended for companies
Most company-managed Excel installations don't let users add add-ins themselves. Send your IT team this note:
Please deploy the EOX Market Data Excel add-in to me (and anyone else who uses EOX data):
Microsoft 365 admin center > Settings > Integrated apps > Upload custom apps >
Office Add-in > "Provide link to manifest file":
https://api.eoxlive.com/addin/manifest.xml
Assign it to the users who need it. It works in Excel for Windows, Mac and the web.
Once deployed, EOX Data appears on the Home tab by itself, usually within a few hours (Microsoft says up to 24).
Option 2: Excel on the webno IT needed
- Download EOX_Excel_AddIn.xml.
- Open any workbook in Excel on the web (office.com), then go to Home › Add-ins › More Add-ins.
- On the My Add-ins tab click Upload My Add-in (top right), choose the file and click Upload.
Option 3: Excel desktop, from a shared foldertechnical users
If your Trust Center settings aren't locked and you can use a network share:
- Put EOX_Excel_AddIn.xml in a shared folder, for example
\\YOURPC\EOXAddin(sharing a folder on your own PC needs admin rights). - In Excel: File › Options › Trust Center › Trust Center Settings › Trusted Add-in Catalogs. Enter the
folder's network address (the
\\server\folderform, not a drive letter), click Add catalog, tick Show in Menu, click OK and restart Excel. - Home › Add-ins › More Add-ins (or Insert › My Add-ins) › Shared Folder tab › EOX Market Data › Add.
Sign in
Click EOX Data on the Home tab, open Account, paste your key and click Save and test. Then type
=EOX. in any cell to see the functions.
Functions
| Function | Returns |
|---|---|
=EOX.PRICE(dataset, code, tenor, [field], [date], [filters]) | One number. |
=EOX.CURVE(dataset, codes, [tenors], [field], [date], [filters], [headers]) |
A grid that spills: tenors down, curves across. codes can be a range of cells. |
=EOX.HISTORY(dataset, codes, tenor, [start], [end], [field], [filters], [headers]) |
Dates down, curves across. Format the first column as a date. |
=EOX.DATES(dataset, [count]) | The latest curve date, or the last count dates. |
=EOX.PRICE("power","BXO","M01")
=EOX.PRICE("power","BXO","Jan_2027","bid")
=EOX.CURVE("power","BXO,JZP","M01-M24")
=EOX.CURVE("natural_gas",A2:A10,"M01-M12",,"2026-09-30")
=EOX.HISTORY("power","BXO","M01",TODAY()-90)
=EOX.PRICE("correlations","PN","1",,,"days=45;nymex_basis=NYMEX")
Leave an argument empty with two commas. filters takes name=value pairs separated
by ;. Results are cached for 5 minutes; Refresh all EOX formulas in the pane fetches new values.
The pane's Insert tab lets you browse curves and drop them in without typing formulas, or load a whole EOD
file onto a new sheet.
Excel template (no add-in)
If you can't install add-ins, EOX_API_Template.xlsx uses Power Query: enter your key on the Request sheet, fill in the request, and use Data › Refresh All. Your key is sent as a header and never appears in a URL. The query on its own: EOX_PowerQuery.m.
Python
Install the eoxlive package (Python 3.9+; it brings requests and pandas):
pip install https://api.eoxlive.com/downloads/eoxlive-1.0.0-py3-none-any.whl
from eoxlive import EOX
eox = EOX("YOUR_KEY") # or set the EOX_API_KEY environment variable
eox.datasets(subscribed_only=True) # what your key includes
eox.curve("power", "BXO,JZP", "M01-M24") # latest curves (DataFrame)
eox.curve("power", ["BXO", "JZP"], "M01-M24", layout="wide", field="mid") # tenors x curves grid
eox.history("natural_gas", "AA", "Jan_2027", start="2015-01-01") # any length of history
eox.price("power", "BXO", "M01") # one number
eox.file("power") # today's full EOD file
eox.files("power", start="2026-10-01", ext="xlsx") # the delivered Excel / CSV files
eox.download("EOD_PW_20261023_1430.xlsx", "C:/EOX") # one file, exactly as delivered
eox.download_all("power", "C:/EOX/power", start="2026-01-01", ext="xlsx") # a whole set
Rate limits and brief outages are retried automatically, and long histories are fetched in chunks for
you. Upgrade later with pip install --upgrade and the new link. The older single-file client,
eox.py, still works.
Any language (REST)
Every request is an HTTPS GET to https://api.eoxlive.com with your key in the X-API-Key
header. Responses are JSON by default; add format=csv for CSV in the EOD file layout.
| Endpoint | Returns |
|---|---|
/v1/me | Your account, trial status and the datasets you can use. |
/v1/datasets | Every dataset with its parameters and whether you're subscribed. |
/v1/<dataset>/file | The EOD file for a date, exactly as emailed: same header, columns and formats. A drop-in replacement for your current file loader. |
/v1/<dataset>/curve | One curve date, narrowed to the curves, tenors and filters you ask for. |
/v1/<dataset>/history | The same selection across many dates. The curve parameter is required; the default window is the last year. |
/v1/<dataset>/curves | The curve catalogue for a date, with descriptions. |
/v1/<dataset>/dates | Published curve dates, newest first. |
# the latest power file, exactly as delivered
curl -H "X-API-Key: YOUR_KEY" -o power.csv "https://api.eoxlive.com/v1/power/file"
# two curves, first 24 months, as a grid
curl -H "X-API-Key: YOUR_KEY" "https://api.eoxlive.com/v1/power/curve?market_code=BXO,JZP&time_key=M01-M24&layout=wide&format=csv"
# one contract's history this year
curl -H "X-API-Key: YOUR_KEY" "https://api.eoxlive.com/v1/natural_gas/history?market_code=AA&contract=Jan_2027&start=2026-01-01&format=csv"
# PowerShell
$h = @{ "X-API-Key" = "YOUR_KEY" }
Invoke-RestMethod -Headers $h "https://api.eoxlive.com/v1/me"
Invoke-WebRequest -Headers $h "https://api.eoxlive.com/v1/power/file" -OutFile power.csv
Choosing what comes back
| Parameter | Example | Notes |
|---|---|---|
| curves | market_code=BXO,JZP | The parameter name per dataset is in the dataset list. |
| rolling tenors | time_key=M01-M24, M01,Q11-Q14,C01 | Ranges expand. |
| fixed contracts | contract=Jan_2027,Calendar_2028 | Best for history. |
| contract window | contract_from=2027-01-01&contract_to=2027-12-01 | Every contract starting in 2027. |
| descriptive filters | iso=PJM&peak_hour=ON_PEAK&term=Month | Each dataset has its own. |
| dates | date=2026-09-30; history: start=, end= | date
defaults to the latest. |
| shape | layout=wide&value=bid | long (default): one row per curve per
tenor. wide: a grid of one field. |
| format | format=csv | CSV streams every row in one response. JSON returns pages of up to
10,000 rows (limit=) with a next_cursor; pass it back as cursor= until it's null. |
Unknown or misspelt parameters are rejected with a 422 rather than silently ignored. The interactive API reference lists every parameter per dataset and lets you try requests (click Authorize and paste your key).
Datasets
Click a dataset for its parameters. Your subscription is by complex; full history is included.
/v1/me shows which ones your key can use. Contact EOX to add a complex.
natural_gasNatural Gas Forwards
Curve parameter: market_code Tenor parameters:
contract, time_key
Fields (for value= and Excel's field argument): mid, bid, ask, fp
Endpoints: /v1/natural_gas/dates, /v1/natural_gas/curve, /v1/natural_gas/file, /v1/natural_gas/curves, /v1/natural_gas/history
| Parameter | What it takes |
|---|---|
contract | Contracts, comma-separated, e.g. Jan_2027,Calendar_2028 |
time_key | Tenors, comma-separated, ranges allowed: M01-M24, M01,Q11-Q14,C01 |
market_code | Curves, comma-separated |
region | Comma-separated, e.g. NYMEX Settlement |
market | Comma-separated market names |
term | Contract terms, comma-separated, e.g. Month,Calendar |
powerPower Forwards
Curve parameter: market_code Tenor parameters:
contract, time_key
Fields (for value= and Excel's field argument): mid, bid, ask, atc, hr
Endpoints: /v1/power/dates, /v1/power/curve, /v1/power/file, /v1/power/curves, /v1/power/history
| Parameter | What it takes |
|---|---|
contract | Contracts, comma-separated, e.g. Jan_2027,Calendar_2028 |
time_key | Tenors, comma-separated, ranges allowed: M01-M24, M01,Q11-Q14,C01 |
market_code | Curves, comma-separated, e.g. NNG,JZP |
iso | Comma-separated, e.g. PJM,ERCOT |
market | Comma-separated market names |
peak_hour | Comma-separated, e.g. ON_PEAK |
term | Comma-separated: Month, Calendar, Q1, Q2, Q3, Q4, Winter, Spring, Summer |
refined_productsRefined Products Forwards
Curve parameter: location_code Tenor parameters:
contract, time_key
Fields (for value= and Excel's field argument): mid, bid, ask
Endpoints: /v1/refined_products/dates, /v1/refined_products/curve, /v1/refined_products/file, /v1/refined_products/curves, /v1/refined_products/history
| Parameter | What it takes |
|---|---|
contract | Contracts, comma-separated, e.g. Jan_2027,Calendar_2028 |
time_key | Tenors, comma-separated, ranges allowed: M01-M24, M01,Q11-Q14,C01 |
location_code | Curves, comma-separated |
location | Comma-separated location names |
term | Contract terms, comma-separated, e.g. Month,Calendar |
nglNGL Forwards
Curve parameter: location_code Tenor parameters:
contract, time_key
Fields (for value= and Excel's field argument): mid, bid, ask
Endpoints: /v1/ngl/dates, /v1/ngl/curve, /v1/ngl/file, /v1/ngl/curves, /v1/ngl/history
| Parameter | What it takes |
|---|---|
contract | Contracts, comma-separated, e.g. Jan_2027,Calendar_2028 |
time_key | Tenors, comma-separated, ranges allowed: M01-M24, M01,Q11-Q14,C01 |
location_code | Curves, comma-separated |
location | Comma-separated location names |
term | Contract terms, comma-separated, e.g. Month,Calendar |
natural_gas_volNatural Gas Implied Volatility
Curve parameter: location_code Tenor parameters:
contract_num, contract_month
Fields (for value= and Excel's field argument): mid, bid, ask
Endpoints: /v1/natural_gas_vol/dates, /v1/natural_gas_vol/curve, /v1/natural_gas_vol/file, /v1/natural_gas_vol/curves, /v1/natural_gas_vol/history
| Parameter | What it takes |
|---|---|
contract_num | Tenors, ranges allowed: M01-M12 |
contract_month | Contract month(s), YYYY-MM-DD |
location_code | Curves, comma-separated |
type | Comma-separated, e.g. ATM - $1.00 |
type_code | Comma-separated |
basis | Comma-separated |
call_put | CALL, PUT, ... |
power_volPower Implied Volatility
Curve parameter: market_code Tenor parameters:
contract, time_key
Fields (for value= and Excel's field argument): mid_vol_lamda, bid_vol_ewma, ask_vol_30_day, mid_quote_20_day, bid_quote_10_day, ask_quote_5_day
Endpoints: /v1/power_vol/dates, /v1/power_vol/curve, /v1/power_vol/file, /v1/power_vol/curves, /v1/power_vol/history
| Parameter | What it takes |
|---|---|
contract | Contract month(s), YYYY-MM-DD |
time_key | Tenors, comma-separated, ranges allowed: M01-M24, M01,Q11-Q14,C01 |
market_code | Curves, comma-separated |
market | Comma-separated market names |
impl_quote_hist | Comma-separated, e.g. OTM_PUT |
atm_diff | Comma-separated |
crudeCrude Oil Forwards
Curve parameter: location_code Tenor parameters:
contract, time_key
Fields (for value= and Excel's field argument): mid, bid, ask
Endpoints: /v1/crude/dates, /v1/crude/curve, /v1/crude/file, /v1/crude/curves, /v1/crude/history
| Parameter | What it takes |
|---|---|
contract | Contracts, comma-separated, e.g. Jan_2027,Calendar_2028 |
time_key | Tenors, comma-separated, ranges allowed: M01-M24, M01,Q11-Q14,C01 |
location_code | Curves, comma-separated |
location | Comma-separated location names |
term | Contract terms, comma-separated, e.g. Month,Calendar |
heat_ratesHeat Rates
Curve parameter: market_code Tenor parameters:
contract, time_key
Fields (for value= and Excel's field argument): basis_mid, basis_bid, basis_ask, nymex_mid, atc_basis, atc_nymex
Endpoints: /v1/heat_rates/dates, /v1/heat_rates/curve, /v1/heat_rates/file, /v1/heat_rates/curves, /v1/heat_rates/history
| Parameter | What it takes |
|---|---|
contract | Contracts, comma-separated, e.g. Jan_2027,Calendar_2028 |
time_key | Tenors, comma-separated, ranges allowed: M01-M24, M01,Q11-Q14,C01 |
market_code | Curves, comma-separated |
iso | Comma-separated ISOs |
market | Comma-separated market names |
peak_hour | Comma-separated, e.g. ON_PEAK |
gas_hub | Comma-separated, e.g. ALGONQUIN |
correlationsCorrelations
Curve parameter: market_code Tenor parameters:
contract, time_key
Fields (for value= and Excel's field argument): correlation_coef
Endpoints: /v1/correlations/dates, /v1/correlations/curve, /v1/correlations/file, /v1/correlations/curves, /v1/correlations/history
| Parameter | What it takes |
|---|---|
contract | Contract month(s), YYYY-MM-DD |
time_key | Tenor number(s), e.g. 1-12 |
market_code | Curves, comma-separated |
market | Comma-separated market names |
nymex_basis | NYMEX or Basis |
days | Lookback window(s) in days, e.g. 45 |
cfdCFD Forwards
Curve parameter: product Tenor parameters:
contract, time_key
Fields (for value= and Excel's field argument): price
Endpoints: /v1/cfd/dates, /v1/cfd/curve, /v1/cfd/file, /v1/cfd/curves, /v1/cfd/history
| Parameter | What it takes |
|---|---|
contract | Contracts, comma-separated, e.g. Jan_2027,Calendar_2028 |
time_key | Tenors, comma-separated, ranges allowed: M01-M24, M01,Q11-Q14,C01 |
product | Comma-separated, e.g. Brent_Futures,Dated_Brent,CFD |
coalCoal Forwards
Curve parameter: location_code Tenor parameters:
contract, time_key
Fields (for value= and Excel's field argument): mid, bid, ask
Endpoints: /v1/coal/dates, /v1/coal/curve, /v1/coal/file, /v1/coal/curves, /v1/coal/history
| Parameter | What it takes |
|---|---|
contract | Contracts, comma-separated, e.g. Jan_2027,Calendar_2028 |
time_key | Tenors, comma-separated, ranges allowed: M01-M24, M01,Q11-Q14,C01 |
location_code | Curves, comma-separated |
location | Comma-separated location names |
term | Contract terms, comma-separated, e.g. Month,Calendar |
freightFreight Forwards
Curve parameter: location_code Tenor parameters:
contract, time_key
Fields (for value= and Excel's field argument): mid, bid, ask
Endpoints: /v1/freight/dates, /v1/freight/curve, /v1/freight/file, /v1/freight/curves, /v1/freight/history
| Parameter | What it takes |
|---|---|
contract | Contracts, comma-separated, e.g. Jan_2027,Calendar_2028 |
time_key | Tenors, comma-separated, ranges allowed: M01-M24, M01,Q11-Q14,C01 |
location_code | Curves, comma-separated |
location | Comma-separated location names |
term | Contract terms, comma-separated, e.g. Month,Calendar |
eu_gas_powerEU Gas and Power Forwards
Curve parameter: location_code Tenor parameters:
contract, time_key
Fields (for value= and Excel's field argument): mid, bid, ask, spark
Endpoints: /v1/eu_gas_power/dates, /v1/eu_gas_power/curve, /v1/eu_gas_power/file, /v1/eu_gas_power/curves, /v1/eu_gas_power/history
| Parameter | What it takes |
|---|---|
contract | Contracts, comma-separated, e.g. Jan_2027,Calendar_2028 |
time_key | Tenors, comma-separated, ranges allowed: M01-M24, M01,Q11-Q14,C01 |
location_code | Curves, comma-separated |
location | Comma-separated location names |
region | Comma-separated region values |
peak | Comma-separated peak values |
g_p | Comma-separated g p values |
term | Contract terms, comma-separated, e.g. Month,Calendar |
ag_softsAG & Softs Forwards
Curve parameter: location_code Tenor parameters:
contract, time_key
Fields (for value= and Excel's field argument): mid, bid, ask
Endpoints: /v1/ag_softs/dates, /v1/ag_softs/curve, /v1/ag_softs/file, /v1/ag_softs/curves, /v1/ag_softs/history
| Parameter | What it takes |
|---|---|
contract | Contracts, comma-separated, e.g. Jan_2027,Calendar_2028 |
time_key | Tenors, comma-separated, ranges allowed: M01-M24, M01,Q11-Q14,C01 |
location_code | Curves, comma-separated |
location | Comma-separated location names |
product | Comma-separated product values |
category | Comma-separated category values |
term | Contract terms, comma-separated, e.g. Month,Calendar |
power_20yrPower Forwards (20-year) with Power Forwards
Curve parameter: market_code Tenor parameters:
contract, time_key
Fields (for value= and Excel's field argument): mid, bid, ask, atc, hr
Endpoints: /v1/power_20yr/dates, /v1/power_20yr/curve, /v1/power_20yr/file, /v1/power_20yr/curves, /v1/power_20yr/history
| Parameter | What it takes |
|---|---|
contract | Contracts, comma-separated, e.g. Jan_2027,Calendar_2028 |
time_key | Tenors, comma-separated, ranges allowed: M01-M24, M01,Q11-Q14,C01 |
market_code | Curves, comma-separated, e.g. NNG,JZP |
iso | Comma-separated, e.g. PJM,ERCOT |
market | Comma-separated market names |
peak_hour | Comma-separated, e.g. ON_PEAK |
term | Comma-separated: Month, Calendar, Q1, Q2, Q3, Q4, Winter, Spring, Summer |
natural_gas_20yrNatural Gas Forwards (20-year) with Natural Gas Forwards
Curve parameter: market_code Tenor parameters:
contract, time_key
Fields (for value= and Excel's field argument): mid, bid, ask, fp
Endpoints: /v1/natural_gas_20yr/dates, /v1/natural_gas_20yr/curve, /v1/natural_gas_20yr/file, /v1/natural_gas_20yr/curves, /v1/natural_gas_20yr/history
| Parameter | What it takes |
|---|---|
contract | Contracts, comma-separated, e.g. Jan_2027,Calendar_2028 |
time_key | Tenors, comma-separated, ranges allowed: M01-M24, M01,Q11-Q14,C01 |
market_code | Curves, comma-separated |
region | Comma-separated, e.g. NYMEX Settlement |
market | Comma-separated market names |
term | Contract terms, comma-separated, e.g. Month,Calendar |
power_vol_pjmPower Vol Surface - PJM with Power Implied Volatility
Curve parameter: location Tenor parameters:
contract_num, contract_month
Fields (for value= and Excel's field argument): moneyness, risk_free, future, call, put, mid, call_prem, put_prem, call_sett, put_sett
Endpoints: /v1/power_vol_pjm/dates, /v1/power_vol_pjm/curve, /v1/power_vol_pjm/file, /v1/power_vol_pjm/curves, /v1/power_vol_pjm/history
| Parameter | What it takes |
|---|---|
contract_num | Tenors, ranges allowed: M01-M12 |
contract_month | Contract month(s), YYYY-MM-DD |
location | Comma-separated, e.g. PJM |
strike | Comma-separated strikes, e.g. Fut,64.5 |
power_vol_pmxPower Vol Surface - PMX with Power Implied Volatility
Curve parameter: location Tenor parameters:
contract_num, contract_month
Fields (for value= and Excel's field argument): moneyness, risk_free, future, call, put, mid, call_prem, put_prem, call_sett, put_sett
Endpoints: /v1/power_vol_pmx/dates, /v1/power_vol_pmx/curve, /v1/power_vol_pmx/file, /v1/power_vol_pmx/curves, /v1/power_vol_pmx/history
| Parameter | What it takes |
|---|---|
contract_num | Tenors, ranges allowed: M01-M12 |
contract_month | Contract month(s), YYYY-MM-DD |
location | Comma-separated, e.g. PJM |
strike | Comma-separated strikes, e.g. Fut,64.5 |
Download EOD files
Every EOD file you subscribe to, today's and the full history, in the same CSV and Excel formats as your email and FTP delivery. No FTP client needed.
Open the file browserSign in with your API key, pick a complex and a date, download.
Automating downloads
The same files are available to scripts. /v1/files lists them (newest first) and
/v1/files/<name> downloads one. Follow the redirect: the file comes from secure storage through a
link that expires after a couple of minutes.
# list this month's power files
curl -H "X-API-Key: YOUR_KEY" "https://api.eoxlive.com/v1/files?complex=power&start=2026-10-01"
# download one (-L follows the redirect, -O keeps the file name)
curl -L -O -J -H "X-API-Key: YOUR_KEY" "https://api.eoxlive.com/v1/files/EOD_PW_20261023_1430.xlsx"
# PowerShell: today's latest power Excel file
$h = @{ "X-API-Key" = "YOUR_KEY" }
$f = (Invoke-RestMethod -Headers $h "https://api.eoxlive.com/v1/files?complex=power&ext=xlsx&limit=1").data[0]
Invoke-WebRequest -Headers $h "https://api.eoxlive.com$($f.url)" -OutFile $f.name
Limits and errors
| Code | Meaning | What to do |
|---|---|---|
| 401 | Missing, wrong, revoked or expired key | Check the key; contact EOX if your trial has ended. |
| 403 | That dataset isn't in your subscription | /v1/me lists what's included. |
| 404 | Nothing published for that date | Use /dates to find valid dates. |
| 422 | A bad parameter, or a request too large for one call | Read detail in the response;
it says what to change. |
| 429 | Too many requests | Wait the number of seconds in Retry-After, then retry. |
| 503 | Temporarily busy or unavailable | Retry after Retry-After. |
- Rate limit: a per-user number of requests per minute, shown in
/v1/me. One CSV request for a whole curve set is far kinder than many single-value requests. - History: without
start, the last year. CSV and wide requests cover up to about 10 years each; split longer spans into several date ranges. - Wide grids: up to 100,000 rows. If a cell would need two numbers (for example on vol tables), the error names the filter to add.
- When data updates: curves appear once the day's EOD files are published.
Help
Questions, more datasets or a new key: curves@eoxlive.com. If you think your key has been exposed, tell us and we'll replace it; the old one stops working within a minute.