Skip to main content
Skip to main content

Data Connectors (API)

A Data Connector is an npm package that fetches market data for you. The chart talks to it through one TypeScript interface: DataAdapter.

This page is the type reference. For install steps and examples, see Data connectors.

Loading chart…

Mental model

sequenceDiagram
participant App
participant Chart
participant Adapter as DataAdapter
participant API as Exchange API

App->>Chart: setDataAdapter(adapter)
App->>Chart: loadData("BTCUSDT", options)
Chart->>Adapter: getHistoricalData
Adapter->>API: REST
API-->>Adapter: candles
Adapter-->>Chart: Candle[]
App->>Chart: subscribeToUpdates
Chart->>Adapter: subscribeToUpdates
Adapter-->>Chart: Tick stream

Your app never parses raw exchange JSON — the adapter returns Candle[] and Tick objects the chart already understands.

Import types

import type {
Candle,
Tick,
DataAdapter,
LoadDataOptions,
} from "@efixdata/exeria-chart";

import { intervalFromSymbol, milisFromIntervalSymbol } from "@efixdata/exeria-chart";

DataAdapter — the contract

Every connector must implement:

interface DataAdapter {
initialize(config: Record<string, unknown>): Promise<void>;
getHistoricalData(symbol: string, options: LoadDataOptions): Promise<Candle[]>;
getCurrentPrice(symbol: string): Promise<Tick>;
subscribeToUpdates(
symbol: string,
callback: (update: Tick) => void,
): () => void;
disconnect(): Promise<void>;
}

Method guide

MethodWhen it runsYour job as connector author
initialize(config)Once at startupRead API keys, base URL, timeouts
getHistoricalData(symbol, options)User opens chart / changes intervalReturn candles oldest → newest
getCurrentPrice(symbol)Optional spot checkLatest price as Tick
subscribeToUpdates(symbol, callback)Live modePush ticks; return unsubscribe function
disconnect()App teardownClose sockets, clear state

The symbol is always passed separately — ticks do not need to repeat it inside every update.

ChartInstance connector methods

The chart wraps the adapter with convenience methods:

MethodWhat it does
setDataAdapter(adapter)Attach connector (constructor option or later)
loadData(symbol, options)Calls getHistoricalDatasetMainSeriesData
subscribeToUpdates(symbol, callback?)Starts live stream → appendTick
unsubscribeFromUpdates()Stops stream
getCurrentPrice()Tick | null from last update
const chart = createChart({ container, dataAdapter: connector });
chart.init();

await chart.loadData("BTCUSDT", { interval: "1h", limit: 1000 });

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

Full ChartInstance list: ChartInstance.

LoadDataOptions

interface LoadDataOptions {
interval: string; // required — e.g. "1h", "1d", "1w"
from?: Date;
to?: Date;
limit?: number;
}
FieldMeaning
intervalTimeframe symbol — chart resolves via intervalFromSymbol()
from / toOptional date range
limitMax candles when no date range (most recent N)
await chart.loadData("ETHUSDT", {
interval: "4h",
limit: 500,
});

await chart.loadData("AAPL", {
interval: "1d",
from: new Date("2024-01-01"),
to: new Date("2024-12-31"),
});

Common interval symbols: "1m", "5m", "1h", "4h", "1d", "1w", "1M".

const interval = intervalFromSymbol("1h");
// { symbol: "1h", milis: 3600000 }

Candle (historical bar)

Same type as setMainSeriesData():

interface Candle {
o: number; // open
h: number; // high
l: number; // low
c: number; // close
stamp: number; // Unix time in milliseconds
v?: number; // volume (optional)
}

Rules connectors should follow:

  • stamp must be unique per bar for a symbol+interval
  • Sort ascending by stamp
  • Use numbers, not strings, for OHLC

Details: Data model.

Tick (live update)

Same type as appendTick():

interface Tick {
stamp: number;
o?: number;
h?: number;
l?: number;
c?: number;
v?: number;
price?: number;
}
Tick shapeChart behavior
Has o, h, l, cUpsert current candle
Only price or cAppend price update to form/update bar

Guide: Realtime updates.

Built-in connectors

PackageDoc
@efixdata/connector-binanceBinance · live demo
@efixdata/connector-bybitBybit · live demo
@efixdata/connector-okxOKX · live demo
@efixdata/connector-krakenKraken · live demo
@efixdata/connector-kucoinKuCoin · live demo
@efixdata/connector-coinbaseCoinbase · live demo
@efixdata/connector-gateGate.io · live demo
@efixdata/connector-ccxtCCXT (multi-exchange) · live demo
@efixdata/connector-twelve-dataTwelve Data · live demo
@efixdata/connector-finageFinage · live demo
@efixdata/connector-finnhubFinnhub · live demo
@efixdata/connector-eodhdEODHD · live demo
@efixdata/connector-massiveMassive · live demo
@efixdata/connector-coingeckoCoinGecko · live demo

Build your own connector

Implement DataAdapter, publish an npm package, then:

chart.setDataAdapter(new MyAdapter());
await chart.loadData("MY_SYMBOL", { interval: "1h", limit: 300 });

Checklist: Overview → build your own.

Quick troubleshooting

ProblemCheck
loadData throwsinitialize() called? Symbol valid for provider?
Candles out of orderSort ascending by stamp
Live bar jumpsTick missing stamp or duplicate stamps
Switch symbol stuckunsubscribeFromUpdates() before new loadData
Type not foundImport from @efixdata/exeria-chart, not from adapter

What is next?