# biquote — Real-Time Market Data API > biquote provides live tick data (bid, ask, last price, volume) for BIST stocks, Forex pairs, and Cryptocurrency via REST and WebSocket (SignalR). Data is sourced from MetaTrader 5 (MT5) and Matriks IQ (MTX). No authentication required. ## Base URL https://biquote.io ## OpenAPI Spec (machine-readable) https://biquote.io/swagger/v1/swagger.json ## Interactive Documentation https://biquote.io/docs --- ## REST Endpoints ### Ticks GET /api/{symbol} Returns the latest tick for a single symbol. Path param: symbol (string) — e.g. EURUSD, GARAN, BTCUSD Response fields: symbol, description, bid, ask, last, volume, time (ISO 8601), source, type GET /api/latest?symbols=EURUSD&symbols=GARAN Returns latest ticks for multiple symbols in a single request. Query param: symbols (string[], required) — list of symbol names Response: object keyed by symbol name GET /api/{symbol}/history?count=100 Returns historical tick list for a symbol (newest first). Query param: count (integer, 1-1000, default 100) GET /api/{symbol}/ohlc?interval=1h&limit=100 Returns OHLCV candlestick bars for a symbol. Query params: - interval (string, default "1h") — timeframe: 1m, 5m, 15m, 30m, 1h, 4h, 1d - limit (integer, 1-1000, default 100) — number of bars to return - from (ISO 8601, optional) — start of date range - to (ISO 8601, optional) — end of date range Response: { symbol, interval, bars: [{ openTime, open, high, low, close, volume, tickVolume, isOpen }] } The most recent bar has isOpen: true and is updated on every tick. Data sources: Yahoo Finance (historical bootstrap), MT5 history protocol, real-time tick aggregation. Max 2000 bars stored per symbol/timeframe in Redis. GET /api/active Returns all symbols that currently have live tick data, with metadata (name, description, type, exchange, source). ### Symbols GET /api/symbols Returns full symbol catalog with name, description, type (Stock/Forex/Crypto), exchange, and source. GET /api/symbols/{symbol} Returns metadata for a single symbol. GET /api/symbols/search?q=EUR Searches symbols by name or description. Query param: q (string, required) ### Market Statistics GET /api/market/gainers?limit=10&period=1D Top gaining symbols for the given period. Query params: limit (integer, default 10), period (enum: 1D, 1W, 1M) GET /api/market/losers?limit=10&period=1D Top losing symbols for the given period. GET /api/market/summary Market overview: total symbols, active count, top gainers/losers, last updated timestamp. ### News GET /api/news/market?symbol=AAPL&language=en&country=US&maxResults=10 Market and finance news feed. Optionally filter by stock/forex symbol. Query params: - symbol (string, optional) — filter by symbol name - language (string, default "en") — ISO 639-1 language code - country (string, default "US") — ISO 3166-1 country code - maxResults (integer, 1-50, default 10) Response fields per article: title, description, url, source, publishedAt (ISO 8601), imageUrl --- ## WebSocket / Real-time (SignalR) Hub URL: https://biquote.io/hubs/tick Protocol: SignalR (WebSocket, with automatic fallback to SSE/long-polling) Client library: npm install @microsoft/signalr OR CDN signalr.min.js v8 Client → Server methods: - Subscribe(symbols: string[]) — subscribe to live tick updates - Unsubscribe(symbols: string[]) — stop receiving updates - GetLatestTick(symbol: string) → Tick — one-shot request Server → Client events: - ReceiveTick(tick: Tick) — fired on every market update for subscribed symbols Tick object schema: { "symbol": "EURUSD", "description": "Euro vs US Dollar", "bid": 1.08542, "ask": 1.08558, "last": 1.08550, "volume": 12400, "time": "2026-02-24T10:30:00Z", "source": "MT5", "type": "Forex" } --- ## Error Responses All errors follow the shape: { "message": "..." } HTTP 400 — Bad request (invalid params) HTTP 404 — Symbol not found / no data available HTTP 429 — Rate limit exceeded (if applicable) --- ## Quick Example (JavaScript) ```javascript import * as signalR from '@microsoft/signalr'; const connection = new signalR.HubConnectionBuilder() .withUrl('https://biquote.io/hubs/tick') .withAutomaticReconnect() .build(); connection.on('ReceiveTick', (tick) => { console.log(`${tick.symbol}: bid=${tick.bid} ask=${tick.ask}`); }); await connection.start(); await connection.invoke('Subscribe', ['EURUSD', 'GARAN', 'BTCUSD']); ``` ## Quick Example (REST / Python) ```python import requests # Latest tick tick = requests.get('https://biquote.io/api/EURUSD').json() print(tick['bid'], tick['ask']) # Market news news = requests.get('https://biquote.io/api/news/market', params={'maxResults': 5}).json() for a in news: print(a['title']) ```