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.