biquote API Reference

Real-time market data API for BIST, Forex, and Cryptocurrency — REST endpoints and live WebSocket streaming via SignalR.

Base URL & Authentication

BASE URL https://biquote.io

All REST endpoints are prefixed with /api. The API is publicly accessible with no authentication required for read-only endpoints.

ℹ️
All responses are in JSON format. CORS is enabled for browser clients. Admin endpoints require an X-Api-Key header.

Error Handling

The API uses standard HTTP status codes:

CodeMeaning
200Success
400Bad Request — missing or invalid parameters
404Not Found — symbol or resource doesn't exist
500Server Error
Error Response
{
  "message": "No tick data available for 'INVALIDXYZ'"
}

Ticks

Access real-time and historical tick data (bid, ask, last price, volume) for any active symbol.

GET /api/{symbol} Latest tick for a symbol

Returns the most recent tick data for the specified symbol.

Path Parameters
NameTypeRequiredDescription
symbol string required Symbol name (e.g. EURUSD, GARAN, BTCUSD)
bash
curl https://biquote.io/api/EURUSD
javascript
const res = await fetch('https://biquote.io/api/EURUSD');
const tick = await res.json();
console.log(tick.bid, tick.ask);
python
import requests
tick = requests.get('https://biquote.io/api/ticks/EURUSD').json()
print(tick['bid'], tick['ask'])
json
{
  "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"
}
GET /api/latest Latest ticks for multiple symbols

Returns the latest tick for multiple symbols in a single request.

Query Parameters
NameTypeRequiredDescription
symbols string[] required One or more symbol names. Repeat parameter for multiple: ?symbols=EURUSD&symbols=GARAN
bash
curl "https://biquote.io/api/latest?symbols=EURUSD&symbols=GARAN&symbols=BTCUSD"
GET /api/{symbol}/history Historical tick data

Returns historical tick records for a symbol, newest first.

Parameters
NameTypeRequiredDefaultDescription
symbol string required Symbol name
count integer optional 100 Number of ticks to return (1–1000)
bash
curl "https://biquote.io/api/EURUSD/history?count=50"
GET /api/active List of active symbols with tick data

Returns all symbols that currently have live tick data, including metadata.

bash
curl https://biquote.io/api/active
Response
[
  {
    "name": "EURUSD",
    "description": "Euro vs US Dollar",
    "type": "Forex",
    "exchange": "Forex",
    "source": "MT5"
  },
  {
    "name": "GARAN",
    "description": "Garanti Bankası",
    "type": "Stock",
    "exchange": "BIST",
    "source": "MTX"
  }
]

Symbols

Query symbol metadata — name, description, type, exchange, and data source.

GET /api/symbols Get all symbols (with filters)
Query Parameters
NameTypeRequiredDescription
source string optional MT5 or MATRIKS
type string optional Forex, Stock, Crypto, Index, Commodity
exchange string optional Filter by exchange (e.g. BIST)
bash
# All BIST stocks
curl "https://biquote.io/api/symbols?type=Stock&exchange=BIST"

# All MT5 symbols
curl "https://biquote.io/api/symbols?source=MT5"
GET /api/symbols/search Search symbols by name or description
Query Parameters
NameTypeRequiredDescription
q string required Search query — matches name and description
bash
curl "https://biquote.io/api/symbols/search?q=garanti"
GET /api/symbols/{name} Get a single symbol by name
bash
curl https://biquote.io/api/symbols/EURUSD

Market Statistics

Top gainers and losers across all asset classes with configurable time periods.

GET /api/market/gainers Top gaining symbols
Query Parameters
NameTypeDefaultDescription
typestringForex, Stock, Crypto, etc.
exchangestringFilter by exchange
limitinteger10Number of results (1–100)
periodstring1D1H, 4H, 1D, 1W
bash
# Top 5 BIST stock gainers today
curl "https://biquote.io/api/market/gainers?type=Stock&exchange=BIST&limit=5&period=1D"
Response
{
  "period": "1D",
  "items": [
    {
      "symbol": "GARAN",
      "description": "Garanti Bankası",
      "lastPrice": 94.50,
      "changePercent": 4.25,
      "changeAmount": 3.85,
      "volume": 28400000
    }
  ]
}
GET /api/market/losers Top losing symbols

Same parameters as /api/market/gainers — returns symbols sorted by largest percentage decline.

bash
curl "https://biquote.io/api/market/losers?type=Crypto&limit=10&period=1H"

News

Financial news feed aggregated from multiple sources. Filter by symbol, language and country.

GET /api/news/market Market & finance news

Returns market and finance related news. Optionally filter by stock symbol.

Query Parameters
NameTypeDefaultDescription
symbolstringOptional symbol to filter news (e.g. AAPL, GARAN)
languagestringenLanguage code (en, tr, de…)
countrystringUSCountry code (US, TR, GB…)
maxResultsinteger10Number of articles (1–50)
bash
# All market news
curl "https://biquote.io/api/news/market"

# Filtered by symbol
curl "https://biquote.io/api/news/market?symbol=AAPL&maxResults=5"
javascript
const res = await fetch('https://biquote.io/api/news/market?symbol=GARAN&language=tr&country=TR');
const news = await res.json();
news.forEach(a => console.log(a.title, a.publishedAt));
python
import requests
news = requests.get(
    'https://biquote.io/api/news/market',
    params={'symbol': 'GARAN', 'language': 'tr', 'country': 'TR', 'maxResults': 10}
).json()
for a in news:
    print(a['title'], a['publishedAt'])
json
[
  {
    "title": "Markets rally as Fed signals rate pause",
    "description": "Wall Street surged on Wednesday after...",
    "url": "https://example.com/article",
    "source": "Reuters",
    "publishedAt": "2026-02-24T09:15:00Z",
    "imageUrl": null
  }
]

OHLC / Candlestick

Retrieve OHLCV candlestick bars for any symbol. Data is sourced from Yahoo Finance (bootstrap), real-time tick aggregation, and MT5 historical feeds. Supports M1 through D1 timeframes with up to 2000 bars per series.

GET /api/{symbol}/ohlc OHLCV candlestick bars

Returns OHLCV bars for the given symbol and timeframe. The most recent (open) bar is prepended with isOpen: true.

Parameters
NameTypeRequiredDefaultDescription
symbol string required Symbol name (e.g. EURUSD, BTCUSD, GARAN)
interval string optional 1h Timeframe: 1m 5m 15m 30m 1h 4h 1d
limit integer optional 100 Number of bars to return (1–1000)
from ISO 8601 optional Start of range, e.g. 2026-01-01T00:00:00Z
to ISO 8601 optional End of range
bash
# Latest 100 hourly bars
curl "https://biquote.io/api/EURUSD/ohlc?interval=1h&limit=100"

# Daily bars for a date range
curl "https://biquote.io/api/BTCUSD/ohlc?interval=1d&from=2026-01-01T00:00:00Z"
javascript
const res = await fetch('https://biquote.io/api/EURUSD/ohlc?interval=1h&limit=200');
const data = await res.json();
// data.bars → array of { openTime, open, high, low, close, volume, tickVolume, isOpen }
const closedBars = data.bars.filter(b => !b.isOpen);
console.log(`${data.symbol} ${data.interval}: ${closedBars.length} bars`);
python
import requests
import pandas as pd

r = requests.get('https://biquote.io/api/EURUSD/ohlc', params={'interval': '1h', 'limit': 500})
data = r.json()
df = pd.DataFrame(data['bars'])
df['openTime'] = pd.to_datetime(df['openTime'])
df = df.set_index('openTime')
print(df[['open','high','low','close']].tail())
json
{
  "symbol": "EURUSD",
  "interval": "1h",
  "bars": [
    {
      "openTime": "2026-02-24T13:00:00Z",
      "open": 1.08521,
      "high": 1.08574,
      "low": 1.08498,
      "close": 1.08542,
      "volume": 0,
      "tickVolume": 340,
      "isOpen": true
    },
    {
      "openTime": "2026-02-24T12:00:00Z",
      "open": 1.08480,
      "high": 1.08530,
      "low": 1.08440,
      "close": 1.08521,
      "volume": 0,
      "tickVolume": 412,
      "isOpen": false
    }
  ]
}
📊
Historical bars are available across all supported timeframes. The current open bar (isOpen: true) reflects live tick aggregation and is updated in real time.

SignalR Hub — Real-time Streaming

Connect to the SignalR hub for live tick data. The hub pushes updates as market data arrives — no polling required.

HUB URL https://biquote.io/hubs/tick
ℹ️
Install the SignalR client: npm install @microsoft/signalr or use the CDN: https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/8.0.0/signalr.min.js

Client → Server Methods

SEND Subscribe Subscribe to symbol(s)

Subscribe to one or more symbols. You'll receive a ReceiveTick event for each update.

ParameterTypeDescription
symbolsstring[]Array of symbol names
javascript
await connection.invoke('Subscribe', ['EURUSD', 'GARAN', 'BTCUSD']);
SEND Unsubscribe Unsubscribe from symbol(s)
javascript
await connection.invoke('Unsubscribe', ['EURUSD']);
INVOKE GetLatestTick Request a single tick
javascript
const tick = await connection.invoke('GetLatestTick', 'EURUSD');
console.log(tick.bid, tick.ask);

Server → Client Events

ON ReceiveTick Live tick update

Fired whenever a subscribed symbol receives new market data.

javascript
connection.on('ReceiveTick', (tick) => {
  console.log(`${tick.symbol}: bid=${tick.bid} ask=${tick.ask}`);
});

Quick Start

Full example — connect, subscribe, and receive live prices in the browser.

javascript
import * as signalR from '@microsoft/signalr';

const connection = new signalR.HubConnectionBuilder()
    .withUrl('https://biquote.io/hubs/tick')
    .withAutomaticReconnect()
    .build();

// Listen for live ticks
connection.on('ReceiveTick', (tick) => {
    console.log(`[${tick.symbol}] bid: ${tick.bid}  ask: ${tick.ask}`);
});

// Connect and subscribe
await connection.start();
await connection.invoke('Subscribe', ['EURUSD', 'GARAN', 'BTCUSD']);
python
import requests

# REST: Get latest tick
tick = requests.get('https://biquote.io/api/EURUSD').json()
print(f"EURUSD bid={tick['bid']}  ask={tick['ask']}")

# REST: Top gainers today
gainers = requests.get(
    'https://biquote.io/api/market/gainers',
    params={'limit': 5, 'period': '1D'}
).json()
for item in gainers['items']:
    print(f"{item['symbol']}: +{item['changePercent']:.2f}%")
csharp
// Install: dotnet add package Microsoft.AspNetCore.SignalR.Client
using Microsoft.AspNetCore.SignalR.Client;

var connection = new HubConnectionBuilder()
    .WithUrl("https://biquote.io/hubs/tick")
    .WithAutomaticReconnect()
    .Build();

connection.On<object>("ReceiveTick", tick =>
{
    Console.WriteLine($"Tick received: {tick}");
});

await connection.StartAsync();
await connection.InvokeAsync("Subscribe", new[] { "EURUSD", "GARAN" });
python
import requests
import pandas as pd

# Fetch 500 hourly EURUSD candles
r = requests.get('https://biquote.io/api/EURUSD/ohlc', params={'interval': '1h', 'limit': 500})
data = r.json()

df = pd.DataFrame(data['bars'])
df['openTime'] = pd.to_datetime(df['openTime'])
df = df.set_index('openTime').sort_index()

# Drop the still-open bar
df = df[~df['isOpen']]

print(df[['open','high','low','close','tickVolume']].tail(10))

# Example: simple moving average
df['sma20'] = df['close'].rolling(20).mean()
print(df[['close','sma20']].tail(5))

Data Models

Tick

  • symbolstringSymbol name (e.g. EURUSD)
  • descriptionstringHuman-readable name
  • bidnumberBest bid price
  • asknumberBest ask price
  • lastnumberLast traded price
  • volumenumberVolume at last price
  • timestring (ISO 8601)Tick timestamp (UTC)
  • sourcestringData source: MT5 or MTX
  • typestringAsset type: Forex, Stock, Crypto, etc.

Symbol

  • namestringSymbol ticker
  • descriptionstringFull name
  • typestringForex / Stock / Crypto / Index / Commodity
  • exchangestringExchange name (e.g. BIST, Forex)
  • sourcestringData provider: MT5 or MATRIKS

OhlcBar

  • openTimestring (ISO 8601)Bar open timestamp (UTC)
  • opennumberOpening price
  • highnumberHighest price in the bar
  • lownumberLowest price in the bar
  • closenumberClosing price (last tick if bar is open)
  • volumeintegerReal volume (0 for Forex)
  • tickVolumeintegerNumber of ticks in the bar
  • isOpenbooleantrue for the current unfinished bar; updated on every tick