Skip to content

swarum/tradingview-api-adapter

Repository files navigation

tradingview-api-adapter

πŸ“Š Real-time market data from TradingView via WebSocket β€” typed, composable, and ergonomic.

import { tv } from 'tradingview-api-adapter'

const client = tv()
const btc = client.symbol('BINANCE:BTCUSDT')

console.log(await btc.price()) // β†’ 72183.99

btc.stream().on('price', ({ price }) => {
  console.log('BTC:', price)
})

await client.disconnect()

Features

  • βœ… Real-time quotes β€” typed lp, bid, ask, ch, chp, volume, and 50+ other fields
  • βœ… Historical candles β€” OHLCV bars at any TradingView timeframe (1m β†’ 1M)
  • βœ… Symbol metadata β€” full SymbolInfo (description, exchange, session hours, …) via one .info() call
  • βœ… Multi-symbol streams β€” Portfolio for ad-hoc collections, Group for named, mutable ones
  • βœ… Auto-reconnect β€” exponential backoff + jitter, automatic session replay
  • βœ… Full TypeScript types β€” QuoteSnapshot<['lp', 'bid']> gives you { lp?: number | null; bid?: number | null }
  • βœ… Async iterator β€” for await (const tick of stream) { ... }
  • βœ… Explicit resource management β€” using client = tv() auto-disconnects
  • βœ… Node + Browser β€” dynamic ws import so browser bundles don't carry Node-only code
  • βœ… Proxy + auth β€” HTTP/SOCKS proxy agent, sessionid/authToken for premium access
  • βœ… Battle-tested β€” 227+ unit tests, integration against a mock WebSocket server, live e2e

Installation

npm install tradingview-api-adapter

Requires Node.js β‰₯ 20. See browser guide for client-side usage.

Quick start

Get a price

import { tv } from 'tradingview-api-adapter'

const client = tv()
const btc = client.symbol('BINANCE:BTCUSDT')

const price = await btc.price()
console.log(`BTC: $${price}`)

await client.disconnect()

Stream live updates

const stream = btc.stream(['lp', 'bid', 'ask', 'ch', 'chp'] as const)

stream.on('price', ({ price }) => console.log(price))
stream.on('change', ({ value, percent }) => console.log(`${value} (${percent}%)`))

// Or use async iteration:
for await (const { data } of stream) {
  console.log(data.lp, data.bid, data.ask)
  if (someCondition) break // ← automatically closes the stream
}

Fetch historical candles

const candles = await btc.candles({ timeframe: '1h', count: 100 })
// β†’ Candle[] with { time, open, high, low, close, volume }

Multi-symbol portfolio

const portfolio = client.symbols([
  'BINANCE:BTCUSDT',
  'BINANCE:ETHUSDT',
  'NASDAQ:AAPL',
])

const prices = await portfolio.prices()
// β†’ { 'BINANCE:BTCUSDT': 72183, 'BINANCE:ETHUSDT': 2200, 'NASDAQ:AAPL': 260 }

portfolio.stream().on('price', ({ symbol, price }) => {
  console.log(`${symbol}: $${price}`)
})

Named groups with live mutation

const crypto = client.createGroup('crypto', ['BINANCE:BTCUSDT', 'BINANCE:ETHUSDT'])

const stream = crypto.stream()
stream.on('price', ({ symbol, price }) => console.log(symbol, price))

// Add a pair β€” active streams pick it up automatically
crypto.add('BINANCE:SOLUSDT')

// Remove a pair β€” active streams stop emitting for it
crypto.remove('BINANCE:ETHUSDT')

// List all registered groups on the client
console.log(client.groups.list) // β†’ ['crypto']

Symbol metadata

const info = await btc.info()
console.log(info.description) // β†’ 'Bitcoin / TetherUS'
console.log(info.exchange) // β†’ 'Binance'
console.log(info.currencyCode) // β†’ 'USDT'
console.log(info.isTradable) // β†’ true

Documentation

Examples

The examples/ directory contains 12 runnable demos:

# File What it shows
01 01-single-price.ts Minimal one-shot price fetch
02 02-streaming.ts Single-symbol stream with price, change events
03 03-multi-symbol.ts Ad-hoc Portfolio
04 04-groups.ts Named Group with live add/remove
05 05-candles-history.ts Historical OHLCV bars
06 06-candles-streaming.ts Live bar ticks (via internal ChartSession)
07 07-symbol-info.ts Full symbol metadata
08 08-async-iterator.ts for await over a stream
09 09-reconnect-resilience.ts Automatic reconnect with backoff
10 10-browser.html Vanilla HTML page via esm.sh CDN
11 11-proxy-node.ts HTTP/SOCKS proxy through an agent
12 12-auth-session.ts Authenticated access with TradingView cookies

Run any of them with npx tsx examples/NN-*.ts. Enable verbose logging via DEBUG=tradingview-adapter:* npx tsx examples/NN-*.ts.

Design principles

This library is a full rewrite of 1.x. The redesign prioritised:

  1. Typed over stringly-typed. QuoteSnapshot<['lp', 'bid']> is { lp?: number | null; bid?: number | null }, not Record<string, any>.
  2. Composable over monolithic. Transport ↔ Protocol ↔ SessionManager ↔ public API are independently testable and swappable.
  3. One socket, many sessions. A single WebSocket connection multiplexes every quote and chart subscription through a shared SessionManager.
  4. Pooled symbols. client.symbol('BTC') always returns the same instance, so overlapping groups dedupe automatically.
  5. No hidden state. Every resource (symbol, stream, group) has an explicit lifecycle.
  6. Browser-safe by construction. ws is loaded through dynamic import() so browser bundlers can drop it.

License

MIT Β© Gerasimenko Oleg

About

πŸ“Š API Adapter for real-time market data as quoted prices and symbol ticker details from Tradingview πŸ“ˆ

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Packages

 
 
 

Contributors