TAAPI.IO Manual Candles API
Calculate indicators over a list of provided candles instead of fetching them from an exchange. You must provide your own OHLCV data.
Calculate indicators over a list of provided candles instead of fetching them from an exchange. You must provide your own OHLCV data.
Every API here is available over the APIs.io API and to AI agents over MCP.
One button, every client — Claude, Cursor, VS Code and the rest.
https://apis.io/mcp
find_apisBrowse and filter every API in the catalog.get_api_artifactsOne API's artifacts, grouped by type.get_openapiThe primary OpenAPI for this API.find_similar_apisAPIs that look like this one.apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.resolveTurn a domain, URL or GitHub org into the provider it belongs to.find_cohortsEvery scored population of providers in the catalog.curl "https://apis.io/api/v1/apis/taapi-io:taapi-io-manual-candles-api"
curl "https://apis.io/api/v1/apis?limit=25"
Calls without X-API-Key need no key. Calls with it need a paid plan — get a key.
Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.
A second provider on the same verified email joins the account you already have.
openapi: 3.2.0
info:
title: TAAPI.IO Manual Candles API
version: 2.0.0
description: 'Technical Analysis API providing indicator calculations and OHLCV candle data for crypto and stock markets.
Each indicator is exposed as its own endpoint (`GET /indicator/`) with only the parameters that indicator actually accepts documented.
## Authentication
All endpoints require a valid API key passed as a **Bearer token** in the `Authorization` header:
```
Authorization: Bearer
```
Get your API key at taapi.io.
## Rate Limiting
Requests are rate-limited per API key according to your subscription plan (see taapi.io for plan limits). Limits use a **fixed window**: the window (15 seconds by default) starts with your first request, and the counter resets when it expires.
Every authenticated response includes these headers:
| Header | Meaning |
|--------|---------|
| `X-RateLimit-Limit` | Requests allowed per window |
| `X-RateLimit-Remaining` | Requests left in the current window |
| `X-RateLimit-Reset` | Seconds until the current window resets |
When the limit is exceeded the API returns **HTTP 429** with:
```json
{ "error": "Too Many Requests", "retryAfter": 9 }
```
Wait `retryAfter` seconds before retrying.
## Real-time streaming (WebSocket)
For live indicator updates over a persistent connection, use the **streaming** service on the same domain:
- **WebSocket URL:** `wss://v2.taapi.io/streaming` (or your base URL + `/streaming` if using path-based routing)
- **Health check:** `GET https://v2.taapi.io/streaming/health`
All messages are JSON objects with a `type` field. Streaming uses `interval` (not `timeframe` as in REST); allowed intervals are `1m`, `5m`, `15m` and `1h`. Symbols use the same format as the REST API (`BTCUSDT`, not `BTC/USDT`) and must appear in `GET /exchanges/{exchange}/symbols`.
**Connection flow:**
1. Connect to the WebSocket URL.
2. **Authenticate** — send: `{ "type": "auth", "token": "Bearer " }`
- Response: `{ "type": "auth_ok", "userId": "...", "plan": { "socketSubscriptionsAllowed": 10, "streamThrottleMs": 5000 } }` or `{ "type": "auth_error", "error": "..." }`
3. **Subscribe** to an indicator — send:
`{ "type": "subscribe", "id": "my_rsi", "exchange": "binance", "symbol": "BTCUSDT", "interval": "1m", "indicator": "rsi", "params": { "period": 14 } }`
- Response: `{ "type": "subscribed", "id": "binance_btcusdt_1m_my_rsi", "subscription": "binance:btcusdt:1m", "indicator": "rsi" }`
- The returned `id` is the **scoped id**: `___`, lowercased. Use it to unsubscribe and to read updates.
4. **Receive updates** — the server pushes only values that changed, keyed by scoped id. Values are arrays, as in the REST API:
`{ "type": "update", "subscription": "binance:btcusdt:1m", "data": { "binance_btcusdt_1m_my_rsi": { "value": [41.99], "timestamp": [1793656260] } } }`
5. **Unsubscribe** — send the scoped id: `{ "type": "unsubscribe", "id": "binance_btcusdt_1m_my_rsi" }` → `{ "type": "unsubscribed", "id": "binance_btcusdt_1m_my_rsi" }`
**Other message types:**
- `{ "type": "subscribe_bulk", "exchange": "binance", "symbols": ["BTCUSDT", "ETHUSDT"], "intervals": ["1m"], "indicators": [{ "id": "my_rsi", "name": "rsi", "params": { "period": 14 } }] }` — subscribes every symbol × interval × indicator combination. The server replies `subscribe_bulk_ack`, then `subscribe_bulk_complete` with the `subKeys` registered.
- `{ "type": "unsubscribe_all" }` → `{ "type": "unsubscribed_all", "message": "..." }`
- `{ "type": "list" }` → `{ "type": "subscriptions", "data": { ... } }` (add `"unpack": true` for a flat array)
- `{ "type": "ping" }` → `{ "type": "pong", "timestamp": 1793656260000 }`
- Errors arrive as `{ "type": "error", "error": "..." }`.
Use the same API key (Bearer token) as for the REST API.'
servers:
- url: https://v2.taapi.io
description: Production
- url: http://localhost:8080
description: Local development
security:
- bearerAuth: []
tags:
- name: Manual Candles
description: Calculate indicators over a list of provided candles instead of fetching them from an exchange. You must provide your own OHLCV data.
paths:
/indicator/{indicator}:
post:
tags:
- Manual Candles
summary: Single indicator — manual candles
description: 'Calculate a single indicator from a user-supplied candle array.
Use this endpoint when you have candles from your own data source and want TAAPI to compute indicator values from them — **no exchange, symbol, or timeframe required**.
- Supports both long-form (`open/high/low/close/volume/timestamp`) and short-form (`o/h/l/c/v/t`) candle objects.
- Maximum **500 candles** per request.
- Results are **never cached** — each request is computed fresh.
- All indicator parameters (e.g. `period`, `source`) are passed in the request body alongside the candles, exactly as they would be in a query string on the standard `GET /indicator/:ind` endpoint.
- For reduced request payload size, the short-form notation (`o`, `h`, `l`, `c`, `v`, `t`) is recommended over the full field names (`open`, `high`, `low`, `close`, `volume`, `timestamp`). Both are functionally equivalent.'
operationId: postIndicatorManualCandles
security:
- BearerAuth: []
parameters:
- name: indicator
in: path
required: true
description: Indicator name (e.g. `rsi`, `ema`, `macd`).
schema:
type: string
example: rsi
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- candles
properties:
candles:
type: array
description: Array of OHLCV candles. Maximum 500 candles per request. Both long-form and short-form field names are supported.
maxItems: 500
minItems: 1
items:
type: object
description: A single OHLCV candle. Both long-form (`open/high/low/close/volume/timestamp`) and short-form (`o/h/l/c/v/t`) field names are accepted.
properties:
timestamp:
type: number
description: Unix timestamp in seconds (optional).
t:
type: number
description: Unix timestamp — short-form alias for `timestamp`.
open:
type: number
o:
type: number
description: Short-form alias for `open`.
high:
type: number
h:
type: number
description: Short-form alias for `high`.
low:
type: number
l:
type: number
description: Short-form alias for `low`.
close:
type: number
c:
type: number
description: Short-form alias for `close`.
volume:
type: number
default: 0
v:
type: number
description: Short-form alias for `volume`.
oneOf:
- required:
- open
- high
- low
- close
- required:
- o
- h
- l
- c
example:
t: 1708300800
o: 51200.5
h: 52100
l: 50900.25
c: 51850.75
v: 1234.56
results:
type: integer
default: 1
description: Number of result values to return (most recent first).
example: 1
backtrack:
type: integer
default: 0
description: Number of closed candles to skip from the end before calculating.
example: 0
additionalProperties:
description: Any additional indicator-specific parameters (e.g. `period`, `source`, `fastPeriod`). These are identical to the query-string params accepted by `GET /indicator/:ind`.
examples:
rsi:
summary: RSI with period 14
value:
candles:
- t: 1708300800
o: 51200.5
h: 52100
l: 50900.25
c: 51850.75
v: 1234.56
- t: 1708304400
o: 51850.75
h: 52500
l: 51700
c: 52200
v: 987.32
- t: 1708308000
o: 52200
h: 52800
l: 51900
c: 52600
v: 1100.12
period: 14
results: 1
emaShortForm:
summary: EMA using short-form candle fields
value:
candles:
- t: 1708300800
o: 51200.5
h: 52100
l: 50900.25
c: 51850.75
v: 1234.56
period: 20
results: 1
responses:
'200':
description: Indicator value(s) computed from the supplied candles.
content:
application/json:
schema:
type: object
description: Indicator result. Shape matches the standard `GET /indicator/:ind` response.
properties:
value:
type: array
items:
type: number
timestamp:
type: array
items:
type: number
additionalProperties: true
examples:
rsi:
summary: RSI result
value:
value:
- 58.4
timestamp:
- 1708308000
macd:
summary: MACD result (multi-value)
value:
valueMACD:
- 120.5
valueMACDSignal:
- 115.2
valueMACDHist:
- 5.3
timestamp:
- 1708308000
'400':
description: Validation error — missing candles, invalid candle format, или unknown indicator.
content:
application/json:
schema:
type: object
properties:
error:
type: string
examples:
missingCandles:
summary: No candles supplied
value:
error: '"candles" must be a non-empty array'
tooMany:
summary: Over 500 candles
value:
error: '"candles" exceeds maximum of 500 candles (got 501)'
badField:
summary: Non-numeric OHLC
value:
error: candles[0].open must be a finite number
unknownIndicator:
summary: Unknown indicator
value:
error: 'Unknown indicator: fakeindicator'
'401':
description: Unauthorized — a valid API key must be provided.
content:
application/json:
schema:
type: object
properties:
error:
type: string
'429':
description: Rate limit exceeded.
content:
application/json:
schema:
type: object
properties:
error:
type: string
/bulk-candles:
post:
tags:
- Manual Candles
summary: Bulk — manual candles
description: 'Calculate multiple indicators across one or more constructs, each with its own user-supplied candle array.
Use this endpoint when you have candles from your own data source. Unlike `POST /bulk`, there is **no exchange, symbol, or timeframe** — each construct carries its own `candles` array instead.
- Maximum **500 candles** per construct.
- Maximum constructs per request is plan-dependent (hard cap: 20).
- Both long-form and short-form candle field names are supported.
- Results are **never cached** — each request is freshly computed.
- For reduced request payload size, the short-form notation (`o`, `h`, `l`, `c`, `v`, `t`) is recommended over the full field names (`open`, `high`, `low`, `close`, `volume`, `timestamp`). Both are functionally equivalent.'
operationId: postBulkManualCandles
security:
- BearerAuth: []
requestBody:
required: true
content:
application/json:
schema:
type: object
required:
- constructs
properties:
verbose:
type: boolean
default: false
description: When `true`, each indicator result is wrapped in a metadata envelope (`indicator`, `params`, `result`, `errors`).
constructs:
type: array
minItems: 1
maxItems: 20
description: Array of constructs. Each construct has its own candle array and a set of indicators to compute.
items:
type: object
required:
- id
- candles
- indicators
properties:
id:
type: string
pattern: ^[a-zA-Z0-9_]+$
description: Unique identifier for this construct. Used as the key in the response object. Only alphanumeric characters and underscores are allowed.
example: my_btc
candles:
type: array
description: Array of OHLCV candles. Maximum 500 candles per request. Both long-form and short-form field names are supported.
maxItems: 500
minItems: 1
items:
type: object
description: A single OHLCV candle. Both long-form (`open/high/low/close/volume/timestamp`) and short-form (`o/h/l/c/v/t`) field names are accepted.
properties:
timestamp:
type: number
description: Unix timestamp in seconds (optional).
t:
type: number
description: Unix timestamp — short-form alias for `timestamp`.
open:
type: number
o:
type: number
description: Short-form alias for `open`.
high:
type: number
h:
type: number
description: Short-form alias for `high`.
low:
type: number
l:
type: number
description: Short-form alias for `low`.
close:
type: number
c:
type: number
description: Short-form alias for `close`.
volume:
type: number
default: 0
v:
type: number
description: Short-form alias for `volume`.
oneOf:
- required:
- open
- high
- low
- close
- required:
- o
- h
- l
- c
example:
t: 1708300800
o: 51200.5
h: 52100
l: 50900.25
c: 51850.75
v: 1234.56
indicators:
type: array
minItems: 1
description: List of indicators to compute against this construct's candles.
items:
type: object
required:
- id
- indicator
properties:
id:
type: string
pattern: ^[a-zA-Z0-9_]+$
description: Unique identifier for this indicator within the construct.
example: rsi_14
indicator:
type: string
description: Indicator name (e.g. `rsi`, `ema`, `macd`).
example: rsi
results:
type: integer
default: 1
description: Number of result values to return.
backtrack:
type: integer
default: 0
description: Candles to skip from the end before calculating.
additionalProperties:
description: Any additional indicator-specific parameters (e.g. `period`, `source`).
examples:
singleConstruct:
summary: One construct, two indicators
value:
constructs:
- id: my_btc
candles:
- t: 1708300800
o: 51200.5
h: 52100
l: 50900.25
c: 51850.75
v: 1234.56
- t: 1708304400
o: 51850.75
h: 52500
l: 51700
c: 52200
v: 987.32
indicators:
- id: rsi_14
indicator: rsi
period: 14
results: 1
- id: ema_20
indicator: ema
period: 20
results: 1
multiConstruct:
summary: Two constructs with different candle sets
value:
constructs:
- id: btc_data
candles:
- t: 1708300800
o: 51200.5
h: 52100
l: 50900.25
c: 51850.75
v: 1234.56
indicators:
- id: rsi
indicator: rsi
period: 14
- id: eth_data
candles:
- t: 1708300800
o: 2800
h: 2900
l: 2750
c: 2850
v: 5000
indicators:
- id: ema
indicator: ema
period: 20
verbose:
summary: Verbose output
value:
verbose: true
constructs:
- id: my_btc
candles:
- t: 1708300800
o: 51200.5
h: 52100
l: 50900.25
c: 51850.75
v: 1234.56
indicators:
- id: rsi_14
indicator: rsi
period: 14
responses:
'200':
description: Indicator results keyed by construct id.
content:
application/json:
schema:
type: object
description: Response object keyed by construct `id`. Each value is an object keyed by indicator `id`.
additionalProperties:
type: object
additionalProperties: true
examples:
default:
summary: 'Standard output (verbose: false)'
value:
my_btc:
rsi_14:
value:
- 58.4
timestamp:
- 1708308000
ema_20:
value:
- 51600.3
timestamp:
- 1708308000
verbose:
summary: 'Verbose output (verbose: true)'
value:
my_btc:
rsi_14:
indicator: rsi
params:
period: 14
result:
value:
- 58.4
timestamp:
- 1708308000
errors: []
'400':
description: Validation error.
content:
application/json:
schema:
type: object
properties:
error:
type: string
examples:
missingCandles:
summary: Missing candles
value:
error: 'Construct "my_btc" candles error: "candles" must be a non-empty array'
tooMany:
summary: Too many candles
value:
error: 'Construct "my_btc" candles error: "candles" exceeds maximum of 500 candles (got 501)'
unknownIndicator:
summary: Unknown indicator
value:
error: 'Construct "my_btc" references unknown indicator: fakeindicator'
duplicateId:
summary: Duplicate construct id
value:
error: Duplicate construct id "my_btc". Construct ids must be unique within the request.
'401':
description: Unauthorized.
content:
application/json:
schema:
type: object
properties:
error:
type: string
'429':
description: Plan construct limit exceeded.
content:
application/json:
schema:
type: object
properties:
error:
type: string
example:
error: Too many constructs. Your plan allows 1 construct(s) per bulk-candles request.
components:
securitySchemes:
bearerAuth:
type: http
scheme: bearer
bearerFormat: API key
description: Your TAAPI API key, passed as a Bearer token in the Authorization header.