Multiple Constructs
The POST /bulk endpoint lets you calculate multiple technical indicators across multiple assets in a single round-trip. Constructs are processed in parallel — one candle fetch per asset, with all indicators sharing the same candle set.
Plan requirements
Plan-based construct limits vary by subscription — see the pricing page for your plan’s specific allowance.
The absolute hard caps, regardless of plan, are 20 constructs per request and 20 indicators per construct.
How it works
A construct is one combination of exchange + symbol + timeframe + indicators. Each construct requires a unique id, and each indicator within it also requires a unique id. These IDs become the keys in the response object.
POST https://v2.taapi.io/bulk
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
Example: multiple indicators on one asset
{
"constructs": [
{
"id": "btc_1h",
"exchange": "bybit",
"symbol": "BTCUSDT",
"timeframe": "1h",
"indicators": [
{ "id": "rsi", "indicator": "rsi" },
{ "id": "macd", "indicator": "macd" },
{ "id": "ema_200", "indicator": "ema", "period": 200 }
]
}
]
}
Response:
{
"btc_1h": {
"rsi": { "value": [62.34], "timestamp": [1708300800] },
"macd": { "value": [2.31], "timestamp": [1708300800] },
"ema_200": { "value": [49200.50], "timestamp": [1708300800] }
}
}
Example: same indicator, multiple timeframes
{
"constructs": [
{
"id": "btc_1m",
"exchange": "binance",
"symbol": "BTCUSDT",
"timeframe": "1m",
"indicators": [{ "id": "rsi", "indicator": "rsi" }]
},
{
"id": "btc_15m",
"exchange": "binance",
"symbol": "BTCUSDT",
"timeframe": "15m",
"indicators": [{ "id": "rsi", "indicator": "rsi" }]
},
{
"id": "btc_1h",
"exchange": "binance",
"symbol": "BTCUSDT",
"timeframe": "1h",
"indicators": [{ "id": "rsi", "indicator": "rsi" }]
}
]
}
Example: multiple symbols
{
"constructs": [
{
"id": "btc_1h",
"exchange": "binance",
"symbol": "BTCUSDT",
"timeframe": "1h",
"indicators": [{ "id": "rsi", "indicator": "rsi" }]
},
{
"id": "eth_1h",
"exchange": "binance",
"symbol": "ETHUSDT",
"timeframe": "1h",
"indicators": [{ "id": "rsi", "indicator": "rsi" }]
},
{
"id": "xrp_1h",
"exchange": "bybit",
"symbol": "XRPUSDT",
"timeframe": "1h",
"indicators": [{ "id": "rsi", "indicator": "rsi" }]
}
]
}
Repeating the same indicator with different parameters
The same indicator can appear more than once within a construct — just give each a unique id:
"indicators": [
{ "id": "ema_fast", "indicator": "ema", "period": 9 },
{ "id": "ema_slow", "indicator": "ema", "period": 50 }
]
Historical values and backtracking
Each indicator in a construct supports results and backtrack independently:
"indicators": [
{ "id": "stochrsi", "indicator": "stochrsi", "results": 3, "backtrack": 1 },
{ "id": "rsi", "indicator": "rsi", "results": 1 }
]
Verbose mode
Add "verbose": true to the request body to include full metadata (indicator name, normalised parameters, and an errors array) in each result:
{
"verbose": true,
"constructs": [ ... ]
}
Verbose response example:
{
"btc_1h": {
"_asset": { "exchange": "bybit", "symbol": "BTCUSDT", "timeframe": "1h" },
"ema_fast": {
"indicator": "ema",
"params": { "period": 9 },
"result": { "value": [49200.5], "timestamp": [1708300800] },
"errors": []
}
}
}
Error handling
If a candle fetch fails for a construct (e.g. invalid symbol), that construct returns immediately with _error set — other constructs are unaffected:
{
"btc_1h": {
"_error": "Failed to fetch candles: 404 Not Found — check exchange, symbol and timeframe parameters",
"rsi": null
}
}
Construct ID rules
- Only alphanumeric characters and underscores (
a-z,A-Z,0-9,_) - Construct IDs must be unique within the request
- Indicator IDs must be unique within their construct
- No two constructs may target the same exchange + symbol + timeframe
Was this page helpful? Send us feedback or open a support ticket.