Skip to main content
Skip to main content

Twelve Data Connector

Building forex charts (EUR/USD, GBP/USD) or multi-asset fintech apps? The Twelve Data connector wraps the Twelve Data API and implements the same DataAdapter contract as Binance and Kraken.

Loading chart…

Use the controls above to switch forex pair and timeframe. This docs demo routes requests through /api/twelve-data so your API key stays on the server.

Standalone demo

Full-page version with sample code: Twelve Data live demo.

API key required

Unlike public crypto connectors, Twelve Data requires an API key in production. Store it in TWELVE_DATA_API_KEY and run the adapter on your server or behind a proxy — never ship the key in a browser bundle. The docs demo uses a server-side proxy (defaults to Twelve Data demo key when unset).

What you get

FeatureDetails
ForexMajors, minors, exotics (EUR/USD, USD/JPY, …)
Multi-assetSame API also covers stocks, crypto, ETFs
HistoryOHLCV via /time_series
Live ticksWebSocket price stream
SymbolsAccepts EUR/USD, EUR-USD, EURUSD

Perfect for forex dashboards, wealth apps, and multi-asset prototypes.

Twelve Data vs crypto connectors

Twelve DataBinance / Kraken
Asset classForex, stocks, cryptoCrypto spot
API keyRequiredNot required (public endpoints)
Live transportWebSocketWebSocket
Best forFX + multi-asset backendsBrowser crypto charts

Licensing

TierTypical use
Free / BasicDevelopment, personal testing
PaidProduction apps with external display

Free tiers are not a substitute for a production license when end users see the data. Check Twelve Data pricing and attribution guidelines.

Install

npm install @efixdata/exeria-chart @efixdata/connector-twelve-data

Minimal example (Node.js)

import { createChart } from "@efixdata/exeria-chart";
import { TwelveDataAdapter } from "@efixdata/connector-twelve-data";

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

const chart = createChart({
container,
dataAdapter: connector,
});

chart.init();

await chart.loadData("EUR/USD", {
interval: "1h",
limit: 500,
});

chart.subscribeToUpdates("EUR/USD", (tick) => {
console.log("Last price:", tick.price ?? tick.c);
});

Step by step

1 — Get an API key

Sign up at twelvedata.com, generate a key, and store it securely:

export TWELVE_DATA_API_KEY=your_key_here

2 — Create the connector

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

3 — Attach to the chart

const chart = createChart({ container, dataAdapter: connector });
chart.init();

4 — Load history

await chart.loadData("EUR/USD", {
interval: "1h",
limit: 500,
});
OptionMeaning
interval"1m", "1h", "1d", "1w", "1M" (mapped to Twelve Data intervals)
limitRecent N candles (outputsize, max 5000)
from / toOptional ISO date range

5 — Go live

chart.subscribeToUpdates("EUR/USD");

Uses Twelve Data WebSocket price events. On free tiers, WebSocket symbol limits may apply.

6 — Clean up

chart.unsubscribeFromUpdates();
await connector.disconnect();
SymbolMarket
EUR/USDEuro / US Dollar
GBP/USDBritish Pound / US Dollar
USD/JPYUS Dollar / Japanese Yen
USD/CHFUS Dollar / Swiss Franc
AUD/USDAustralian Dollar / US Dollar

Compact forms (EURUSD, EUR-USD) are normalized automatically.

Next.js API route (browser-safe pattern)

// app/api/forex/ohlcv/route.ts
import { TwelveDataAdapter } from "@efixdata/connector-twelve-data";
import { NextResponse } from "next/server";

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

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

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

return NextResponse.json({ candles });
}

Your frontend can call /api/forex/ohlcv or wrap responses in a custom DataAdapter that proxies your API.

Configuration

const connector = new TwelveDataAdapter({
apiKey: process.env.TWELVE_DATA_API_KEY!,
baseUrl: "https://api.twelvedata.com",
wsUrl: "wss://ws.twelvedata.com/v1/quotes/price",
requestTimeout: 10000,
maxRetries: 3,
onError: (error) => console.error("Twelve Data error:", error),
});

Limits to know

TopicLimit
API creditsPlan-specific; /time_series costs more than /price
Rate limitsFree tier is low (~8 req/min); cache history server-side
Forex hoursMarket trades 24/5; weekend shows last available quote
BrowserUse a backend proxy; do not expose apiKey client-side
WebSocketPaid plans unlock more concurrent symbols

What is next?