Skip to main content
Skip to main content

EODHD Connector

Building multi-asset charts with deep end-of-day history across global exchanges? The EODHD connector wraps the EODHD API and implements the same DataAdapter contract as Finnhub and Massive.

Loading chart…

Use the controls above to switch asset class, symbol, and timeframe. This docs demo routes requests through /api/eodhd so your API token stays on the server.

Standalone demo

Full-page version with sample code: EODHD live demo.

API token required

EODHD requires an API token in production. Store it in EODHD_API_KEY and run the adapter on your server or behind a proxy — never ship the token in a browser bundle. For local docs demos, the proxy falls back to the built-in demo key when EODHD_API_KEY is not set.

Free tier vs intraday

EODHD's free plan includes end-of-day OHLCV (about one year of history). Intraday (1m, 5m, 1h) requires a paid plan — the demo API token supports intraday for sample tickers only (AAPL, TSLA, VTI, AMZN, EUR/USD, BTC-USD).

What you get

FeatureDetails
StocksUS and global tickers (AAPLAAPL.US)
ForexMajor pairs (EUR/USDEURUSD.FOREX)
CryptoPairs like BTC-USDBTC-USD.CC
EOD history/api/eod/ with period=d|w|m
Intraday/api/intraday/ at 1m, 5m, 1h (paid / demo)
Live ticks/api/real-time/ (15–20 min delay for stocks) + REST polling

Perfect for wealth apps, portfolio analytics, and global equity charts.

EODHD vs Finnhub / Massive / Twelve Data

EODHDFinnhubMassiveTwelve Data
Symbol formatAAPL.US, EURUSD.FOREXAAPL, OANDA:EUR_USDAAPL, C:EURUSDEUR/USD
EOD depth150k+ tickers, decades USLimited on freeStrong US focusMulti-asset
Intraday1m/5m/1h (paid)Broader on paidNative aggsNative
Free tierEOD only (~1 year)Quotes; candles paidTrialdemo key
Best forGlobal EOD + fundamentals pathFundamentals-rich fintechUS multi-asset RTQuick demo

Licensing

TierTypical use
FreeDevelopment, EOD bars (1 year)
PaidIntraday, real-time WebSocket, production display

Check EODHD pricing before shipping to end users.

Install

npm install @efixdata/exeria-chart @efixdata/connector-eodhd

Quick start

import { createChart } from "@efixdata/exeria-chart";
import { EodhdAdapter } from "@efixdata/connector-eodhd";

const connector = new EodhdAdapter({
apiKey: process.env.EODHD_API_KEY!,
});

const chart = createChart({
container: document.getElementById("chart")!,
dataAdapter: connector,
});

chart.init();

await chart.loadData("AAPL", { interval: "1d", limit: 500 });
await chart.loadData("EUR/USD", { interval: "1d", limit: 500 });
await chart.loadData("BTC-USD", { interval: "1d", limit: 500 });

chart.subscribeToUpdates("AAPL", (tick) => {
console.log(tick.price ?? tick.c);
});

Symbol formats

AssetInput examplesEODHD symbol
StockAAPL, MSFTAAPL.US, MSFT.US
ForexEUR/USD, EURUSDEURUSD.FOREX
CryptoBTC-USD, BTC/USDBTC-USD.CC

Supported intervals

ExeriaEODHD API
1m, 5m, 1hIntraday (interval=1m|5m|1h)
1d, 1w, 1MEnd-of-day (period=d|w|m)

15m, 30m, 2h, and 4h are not supported natively.

Configuration

const connector = new EodhdAdapter({
apiKey: process.env.EODHD_API_KEY!,
baseUrl: "https://eodhd.com/api",
defaultStockExchange: "US",
pollIntervalMs: 5000,
requestTimeout: 10000,
maxRetries: 3,
onError: (error) => console.error("EODHD error:", error),
});

Next.js API route (browser-safe pattern)

// app/api/market/ohlcv/route.ts
import { EodhdAdapter } from "@efixdata/connector-eodhd";
import { NextResponse } from "next/server";

const connector = new EodhdAdapter({
apiKey: process.env.EODHD_API_KEY!,
});

export async function GET(request: Request) {
const { searchParams } = new URL(request.url);
const symbol = searchParams.get("symbol") ?? "AAPL";
const interval = searchParams.get("interval") ?? "1d";
const limit = Number(searchParams.get("limit") ?? "500");

await connector.initialize({});
const candles = await connector.getHistoricalData(symbol, { interval, limit });

return NextResponse.json({ candles });
}

Limits to know

TopicLimit
Free EOD~1 year of daily history
Intraday windows120d (1m), 600d (5m), 7200d (1h) per request
Rate limitsPlan-dependent (100k calls/day on paid tiers)
BrowserUse a backend proxy; do not expose api_token client-side

What is next?