The official EODHD Node.js/TypeScript library gives you a single, typed client for every EODHD API — historical prices, fundamentals, real-time WebSocket streaming, options, news, screener, macro indicators, and more. It covers 150,000+ tickers across 70+ exchanges, ships with built-in retry logic, rate-limit handling, and works in Node.js, Deno, Bun, and modern browsers.
Note that different datasets are available depending on your subscription plan. Core APIs such as end-of-day prices, fundamentals, and news are included in standard plans, while advanced features like real-time WebSocket streaming, US options, S&P Global indices, PRAAMS analytics, and ESG data are provided by third-party vendors through the EODHD Marketplace and require a separate purchase. Check the pricing page and individual Marketplace product pages to see what is included in your plan.
Installation
npm install eodhd
The package has zero runtime dependencies. For WebSocket streaming in Node.js, install the optional ws peer dependency:
npm install ws
Quick Start
import { EODHDClient } from 'eodhd';
const client = new EODHDClient({ apiToken: 'YOUR_API_TOKEN' });
// Get historical end-of-day prices
const prices = await client.eod('AAPL.US', { from: '2024-01-01', to: '2024-12-31' });
console.log(prices[0]);
// { date: '2024-01-02', open: 187.15, high: 188.44, low: 183.89, close: 185.64, adjusted_close: 184.53, volume: 82488700 }
// Get live (delayed) stock price
const quote = await client.realTime('AAPL.US');
console.log(`${quote.code}: $${quote.close} (${quote.change_p}%)`);
// Search for stocks
const results = await client.search('Tesla', { limit: 5 });
You can also set the EODHD_API_TOKEN environment variable instead of passing it directly:
export EODHD_API_TOKEN=your_token_here
// Token is read from EODHD_API_TOKEN automatically
const client = new EODHDClient({});
Configuration
| Option | Type | Default | Description |
|---|---|---|---|
| apiToken | string | EODHD_API_TOKEN env var | Your EODHD API token |
| baseUrl | string | https://eodhd.com/api | API base URL |
| timeout | number | 30000 | Request timeout in milliseconds |
| maxRetries | number | 2 | Retry attempts on 429/5xx errors (0 to disable) |
| logger | Logger | undefined | Custom logger; or set EODHD_LOG=debug for console output |
const client = new EODHDClient({
apiToken: 'YOUR_API_TOKEN',
timeout: 60000, // 60 seconds
maxRetries: 3, // retry up to 3 times on transient errors
});
Historical & Price Data
End-of-Day Prices
Fetch daily, weekly, or monthly OHLCV data for any ticker. The ticker format is SYMBOL.EXCHANGE (e.g. AAPL.US, VOD.LSE, BTC-USD.CC).
const eod = await client.eod('AAPL.US', {
from: '2024-01-01',
to: '2024-12-31',
period: 'd', // 'd' (daily), 'w' (weekly), 'm' (monthly)
order: 'a', // 'a' (ascending), 'd' (descending)
});
Intraday Data
const intraday = await client.intraday('AAPL.US', {
interval: '5m', // '1m', '5m', '1h'
from: '1704067200',
to: '1704153600',
});
Live (Delayed) Prices
Get the latest 1-minute OHLCV bar with a 15-20 minute delay. Supports multiple tickers in a single request.
// Single ticker
const live = await client.realTime('AAPL.US');
// Multiple tickers in one call
const liveMulti = await client.realTime('AAPL.US', { s: 'MSFT.US,GOOG.US' });
US Extended Delayed Quotes
Batch delayed quotes for US equities with bid/ask, last trade, 52-week extremes, market cap, P/E, dividends, and more. See the Live API docs for the full field list.
const usQuotes = await client.usQuoteDelayed({ s: 'AAPL,MSFT,GOOG' });
Bulk EOD Data
Download end-of-day prices for an entire exchange in a single request.
const bulkUs = await client.bulkEod('US', { date: '2024-12-31' });
Dividends, Splits & Market Cap
// Historical dividends
const dividends = await client.dividends('AAPL.US', { from: '2020-01-01' });
// Historical splits
const splits = await client.splits('AAPL.US');
// Historical market capitalization
const marketCap = await client.historicalMarketCap('AAPL.US', { from: '2024-01-01' });
Fundamentals
Retrieve full company fundamentals — general info, financial statements, valuation metrics, earnings, and more. You can filter specific sections to reduce payload size.
// Full company fundamentals
const fundamentals = await client.fundamentals('AAPL.US');
// Filter specific sections
const general = await client.fundamentals('AAPL.US', { filter: 'General' });
const financials = await client.fundamentals('AAPL.US', { filter: 'Financials' });
// Bulk fundamentals for an exchange
const bulkFund = await client.bulkFundamentals('US', { symbols: 'AAPL,MSFT,GOOG' });
// Company logo (PNG or SVG)
const logoPng = await client.logo('AAPL.US'); // returns ArrayBuffer
const logoSvg = await client.logoSvg('AAPL.US'); // returns ArrayBuffer
Calendar Events
Access upcoming and historical earnings, IPOs, splits, and dividends through the calendar API.
// Upcoming earnings
const earnings = await client.calendar.earnings({
from: '2025-03-01',
to: '2025-03-31',
symbols: 'AAPL.US,MSFT.US',
});
// Earnings trends
const trends = await client.calendar.trends({ symbols: 'AAPL.US,MSFT.US' });
// Upcoming IPOs
const ipos = await client.calendar.ipos({ from: '2025-03-01', to: '2025-06-01' });
// Upcoming splits
const calSplits = await client.calendar.splits({ from: '2025-03-01', to: '2025-06-01' });
News & Sentiment
// Financial news for a ticker
const news = await client.news({ s: 'AAPL.US', limit: 10 });
// Filter by topic tag
const techNews = await client.news({ t: 'technology', limit: 20 });
// Sentiment data over time
const sentiment = await client.sentiments({ s: 'AAPL.US', from: '2025-01-01' });
// Trending keywords from financial news
const weights = await client.newsWordWeights({
s: 'AAPL.US',
'filter[date_from]': '2025-01-01',
'filter[date_to]': '2025-01-31',
});
Technical Indicators
Calculate over 20 technical indicators directly through the API: SMA, EMA, WMA, MACD, RSI, Stochastic, Bollinger Bands, ADX, ATR, CCI, SAR, and more.
const sma = await client.technical('AAPL.US', {
function: 'sma',
period: 50,
from: '2025-01-01',
order: 'a',
});
const rsi = await client.technical('AAPL.US', {
function: 'rsi',
period: 14,
from: '2025-01-01',
});
const bbands = await client.technical('AAPL.US', {
function: 'bbands',
period: 20,
from: '2025-01-01',
});
Screening & Search
// Stock screener with financial filters
const screened = await client.screener({
sort: 'market_capitalization.desc',
filters: JSON.stringify([['market_capitalization', '>', 1000000000]]),
limit: 10,
});
// Search stocks, ETFs, funds, bonds, indices, crypto
const results = await client.search('Apple', {
limit: 10,
type: 'stock', // 'all', 'stock', 'etf', 'fund', 'bond', 'index', 'crypto'
});
// ID mapping (ISIN, CUSIP, FIGI, LEI, CIK)
const mapped = await client.idMapping({ 'filter[isin]': 'US0378331005' });
Exchanges
// List all supported exchanges
const exchanges = await client.exchanges.list();
// Get tickers for an exchange
const tickers = await client.exchanges.symbols('US', { type: 'common_stock' });
// Exchange details with trading hours
const details = await client.exchanges.details('US');
// Symbol change history
const changes = await client.exchanges.symbolChangeHistory({ from: '2024-01-01' });
Macro & Economic Data
// Macroeconomic indicators (GDP, inflation, unemployment, etc.)
const gdp = await client.macroIndicator('USA', { indicator: 'gdp_current_usd' });
const inflation = await client.macroIndicator('USA', { indicator: 'inflation_consumer_prices_annual' });
// Economic events calendar
const events = await client.economicEvents({
from: '2025-03-01',
to: '2025-03-31',
country: 'US',
});
US Treasury Rates
const bills = await client.treasury.billRates({ from: '2025-01-01' });
const yields = await client.treasury.yieldRates({ from: '2025-01-01' });
const longTerm = await client.treasury.longTermRates({ from: '2025-01-01' });
const realYield = await client.treasury.realYieldRates({ from: '2025-01-01' });
WebSocket (Real-Time Streaming)
Stream real-time market data via WebSocket. Four feeds are available: us (US trades), us-quote (US quotes), forex, and crypto. The client auto-reconnects with exponential backoff on connection loss.
const ws = client.websocket('us', ['AAPL', 'TSLA', 'MSFT']);
ws.on('data', (tick) => {
console.log(`${tick.s}: $${tick.p} x${tick.v} @ ${new Date(tick.t)}`);
});
ws.on('error', (err) => console.error(err));
ws.on('close', () => console.log('Disconnected'));
ws.on('reconnectFailed', () => console.log('All reconnect attempts exhausted'));
// Subscribe/unsubscribe dynamically
ws.subscribe(['GOOG']);
ws.unsubscribe(['TSLA']);
// Close when done
ws.close();
WebSocket options:
| Option | Type | Default | Description |
|---|---|---|---|
| maxReconnectAttempts | number | 5 | Maximum reconnection attempts before giving up |
| reconnectInterval | number | 3000 | Base interval in milliseconds between reconnect attempts |
const ws = client.websocket('forex', ['EURUSD', 'GBPUSD'], {
maxReconnectAttempts: 10,
reconnectInterval: 5000,
});
Marketplace APIs
Access third-party data providers through the EODHD Marketplace: Unicorn Bay (options, S&P Global indices, tick data, logos), Trading Hours, PRAAMS (investment analytics), and InvestVerte (ESG data).
US Tick-Level Data
const ticks = await client.ticks({ s: 'AAPL', from: 1704067200, to: 1704070800 });
US Options (Unicorn Bay)
// List underlying symbols with options data
const symbols = await client.marketplace.unicornbay.options.underlyingSymbols({
'page[limit]': 100,
});
// Options contracts
const contracts = await client.marketplace.unicornbay.options.contracts({
'filter[underlying_symbol]': 'AAPL',
'filter[type]': 'call',
'filter[exp_date_from]': '2025-06-01',
'page[limit]': 50,
});
// Options EOD data
const optionsEod = await client.marketplace.unicornbay.options.eod({
'filter[underlying_symbol]': 'AAPL',
'filter[exp_date_eq]': '2025-06-20',
});
S&P Global Indices (Unicorn Bay)
// List all S&P/Dow Jones indices
const indices = await client.marketplace.unicornbay.spglobal.list();
// Index components (current)
const components = await client.marketplace.unicornbay.spglobal.components('GSPC.INDX');
// Historical components
const historical = await client.marketplace.unicornbay.spglobal.components('GSPC.INDX', {
historical: true,
from: '2024-01-01',
to: '2024-12-31',
});
Trading Hours
const markets = await client.marketplace.tradinghours.markets();
const details = await client.marketplace.tradinghours.details({ market: 'US.NASDAQ' });
const status = await client.marketplace.tradinghours.status({ market: 'US.NASDAQ' });
const lookup = await client.marketplace.tradinghours.lookup({ 'filter[symbol]': 'AAPL' });
Investment Analytics (PRAAMS)
// Equity risk scoring
const equityRisk = await client.marketplace.praams.analyseEquityByTicker('AAPL.US');
// Bond analysis
const bondAnalysis = await client.marketplace.praams.analyseBond('US912828Z880');
// Smart equity screener
const equities = await client.marketplace.praams.exploreEquity(
{ skip: 0, take: 20 },
{ regions: ['North America'], sectors: ['Technology'] },
);
ESG Data (InvestVerte)
const companies = await client.marketplace.investverte.companies();
const esg = await client.marketplace.investverte.esg('AAPL.US', { year: 2024 });
const countryEsg = await client.marketplace.investverte.country('US');
const sectorEsg = await client.marketplace.investverte.sector('Technology');
Error Handling
The SDK provides a structured error hierarchy. All API errors extend EODHDError with status code, error code, and retryability information. Transient errors (429, 5xx) are automatically retried with exponential backoff.
| Error Class | When | Retryable |
|---|---|---|
| EODHDError | Base class for all API errors | Depends on status code |
| EODHDAuthError | Invalid or missing API token (401/403) | No |
| EODHDRateLimitError | Rate limit exceeded (429) | Yes |
| EODHDNetworkError | Network connectivity issues | Yes |
| EODHDTimeoutError | Request exceeded timeout | Yes |
import {
EODHDClient,
EODHDError,
EODHDAuthError,
EODHDRateLimitError,
} from 'eodhd';
try {
const data = await client.eod('INVALID.XX');
} catch (err) {
if (err instanceof EODHDRateLimitError) {
console.log('Rate limited, retry after:', err.retryAfter);
} else if (err instanceof EODHDAuthError) {
console.log('Check your API token');
} else if (err instanceof EODHDError) {
console.log(err.statusCode); // HTTP status code
console.log(err.code); // 'auth_error' | 'rate_limit' | 'network_error' | ...
console.log(err.retryable); // boolean
}
}
TypeScript Support
The library is written in TypeScript with strict mode enabled. All methods, parameters, and responses are fully typed — you get autocompletion and compile-time checks out of the box.
import {
EODHDClient,
EodDataPoint,
RealTimeQuote,
SearchResult,
FundamentalsData,
NewsArticle,
} from 'eodhd';
const client = new EODHDClient({ apiToken: 'YOUR_API_TOKEN' });
const prices: EodDataPoint[] = await client.eod('AAPL.US');
const quote: RealTimeQuote = await client.realTime('AAPL.US');
const results: SearchResult[] = await client.search('Apple');
const fund: FundamentalsData = await client.fundamentals('AAPL.US');
const news: NewsArticle[] = await client.news({ s: 'AAPL.US' });
Requirements
| Requirement | Details |
|---|---|
| Node.js | >= 20 (uses native fetch) |
| Deno / Bun | Supported out of the box |
| Browsers | Modern browsers with fetch support |
| WebSocket (Node.js) | Optional ws package (browsers use native WebSocket) |
| Module format | ESM and CommonJS dual-published |
| Tree-shaking | Supported (sideEffects: false) |
API Coverage
The SDK provides typed methods for every EODHD API endpoint:
| Category | Methods |
|---|---|
| Historical & Price Data | eod, intraday, realTime, usQuoteDelayed, bulkEod, dividends, splits, historicalMarketCap, ticks |
| Fundamentals | fundamentals, bulkFundamentals, logo, logoSvg |
| Calendar | calendar.earnings, calendar.trends, calendar.ipos, calendar.splits, calendar.dividends |
| News & Sentiment | news, sentiments, newsWordWeights |
| Technical Indicators | technical (SMA, EMA, RSI, MACD, Bollinger Bands, and 15+ more) |
| Screening & Search | screener, search, idMapping |
| Exchanges | exchanges.list, exchanges.symbols, exchanges.details, exchanges.symbolChangeHistory |
| Macro & Economic | macroIndicator, economicEvents |
| Treasury | treasury.billRates, treasury.yieldRates, treasury.longTermRates, treasury.realYieldRates |
| Corporate Actions | insiderTransactions |
| CBOE Europe | cboe.indices, cboe.index |
| WebSocket | websocket (us, us-quote, forex, crypto feeds) |
| Marketplace | Unicorn Bay (options, S&P indices, tick data, logos), Trading Hours, PRAAMS, InvestVerte |
| User | user |