12 endpoints
https://api.blave.orgapi-key + secret-key en cada solicitudAPI plan or Blave Agent plan/studio/market/twfutures/ohlcv/<symbol>/<schema> | Nombre | Descripción | Valores permitidos | Predeterminado |
|---|---|---|---|
symbolstring · pathObligatorio | Contrato continuo del mes más cercano | TXF (台指期), MXF (小台) o un id de futuro sobre acciones que figure en ohlcv/symbols (sin distinguir mayúsculas de minúsculas) | |
schemastring · pathObligatorio | Tamaño de la vela | 1m, 5m, 15m, 30m, 60m, 1d | |
startstring · query | Primer día | YYYY-MM-DD | end − el rango máximo del schema |
endstring · query | Último día | YYYY-MM-DD | hoy (UTC) |
Rango máximo por solicitud (end − start): 1m 31 d · 5m 62 d · 15m 93 d · 30m 186 d · 60m 365 d · 1d 3650 d.
from datetime import date, timedeltadata = requests.get(f"{BASE_URL}/studio/market/twfutures/ohlcv/TXF/1d" , headers=headers, params={"start": "2024-01-01", "end": "2024-12-31"}, timeout=60).json()["data"]# [{"ts": "2024-01-01 16:00:00+00:00", "open": 17838.0, "high": 17920.0, "low": 17751.0, "close": 17798.0, "volume": 82820},# {"ts": "2024-01-02 16:00:00+00:00", "open": 17793.0, "high": 17817.0, "low": 17507.0, "close": 17546.0, "volume": 149638}, ...]def fetch_txf_chunked(schema, start, end, chunk_days=28): result, cur, end_date = [], date.fromisoformat(start), date.fromisoformat(end) while cur < end_date: chunk_end = min(cur + timedelta(days=chunk_days), end_date) resp = requests.get(f"{BASE_URL}/studio/market/twfutures/ohlcv/TXF/{schema}" , headers=headers, params={"start": cur.isoformat(), "end": chunk_end.isoformat()}, timeout=60) result.extend(resp.json().get("data", [])) cur = chunk_end return result{"symbol", "schema", "data": [...]}.
| Campo | Tipo | Unidad | Descripción |
|---|---|---|---|
ts | string | ISO en UTC | Hora de apertura de la vela |
open / high / low / close | float | puntos del índice (precio en los futuros sobre acciones) | Precios |
volume | int | contratos (口) | Volumen |
| Estado | Cuerpo | Cuándo |
|---|---|---|
| 400 | {"error": "Invalid symbol. Allowed: [...]"} | Símbolo sin cobertura |
| 400 | {"error": "Invalid schema. Allowed: [...]"} | Schema no válido |
| 400 | {"error": "Invalid date format. Use YYYY-MM-DD"} | Fecha mal formada |
| 400 | {"error": "date_range_too_large", "message": "...", "max_days": <n>} | Rango por encima del máximo |
| 503 | mensaje de error | Fuente de datos no disponible temporalmente |
TXF, MXF y futuros sobre acciones por igual): el día de liquidación mensual — el 3.er miércoles, o el siguiente día de negociación cuando ese miércoles no hay mercado — corresponde al mes que vence durante todo el día. Ese contrato se negocia hasta su cierre de las 13:30 (hora de Taipéi), ese día ninguna vela lleva una hora entre las 13:31 y las 14:59 (hora de Taipéi), y la serie pasa al mes siguiente a partir de la sesión nocturna de las 15:00. La vela 1d del día de liquidación es la del mes que vence, por lo que su cierre es la última operación de ese contrato a las 13:30.ohlcv/<symbol>/export/<year> en lugar de JSON por tramos.200 con [].MXF y CAF devolvieron una última vela de varios meses de antigüedad. Lea data[-1]["ts"].1d llevan un componente horario 16:00:00+00:00 (00:00, hora de Taipéi), no la medianoche UTC — tome la fecha de ts en lugar de suponer que la marca de tiempo está alineada con la fecha.1d e intradía; la de MXF es para 1d. Los futuros sobre acciones comienzan según el contrato — CAF tiene velas 1d al menos desde 2016-09-18./studio/market/twfutures/ohlcv/symbols Ninguno.
symbols = requests.get(f"{BASE_URL}/studio/market/twfutures/ohlcv/symbols" , headers=headers, timeout=30).json()["data"]{"data": ["CDF", "DHF", "MXF", "TXF", ...]} — símbolos aceptados por ohlcv, ohlcv/export y bid_ask_vol: TXF, MXF y el subconjunto de futuros sobre acciones, elegido por liquidez, con cobertura por minuto (la mayoría de los 231 futuros sobre acciones no está cubierta).
Solo errores comunes.
/studio/market/twfutures/ohlcv/<symbol>/export/<year> | Nombre | Descripción | Valores permitidos | Predeterminado |
|---|---|---|---|
symbolstring · pathObligatorio | Símbolo | Como en ohlcv/symbols | |
yearint · pathObligatorio | Año natural | 2014 – año en curso |
import ioimport pandas as pdr = requests.get(f"{BASE_URL}/studio/market/twfutures/ohlcv/TXF/export/2024" , headers=headers, timeout=120)raw = pd.read_parquet(io.BytesIO(r.content))raw.index = pd.to_datetime(raw["ts"], utc=True)bars_60m = (raw[["open", "high", "low", "close", "volume"]] .resample("60min") .agg(open=("open", "first"), high=("high", "max"), low=("low", "min"), close=("close", "last"), volume=("volume", "sum")) .dropna(subset=["open"]))application/octet-stream, un archivo parquet (<SYMBOL>_<year>_1m.parquet) con las columnas ts, open, high, low, close, volume (velas de 1m).
| Estado | Cuerpo | Cuándo |
|---|---|---|
| 400 | {"error": "Invalid symbol. Allowed: [...]"} | Símbolo sin cobertura |
| 400 | {"error": "Invalid year. Allowed: 2014-<current>"} | Año fuera de rango |
| 404 | {"error": "no_data", "message": "No 1m data on disk for <symbol> in <year>"} | Sin archivo |
ohlcv/<symbol>/1m, con la misma regla de cambio de contrato del día de liquidación (ninguna vela lleva una hora entre las 13:31 y las 14:59, hora de Taipéi, el día de liquidación mensual)./studio/market/twfutures/bid_ask_vol/<symbol> | Nombre | Descripción | Valores permitidos | Predeterminado |
|---|---|---|---|
symbolstring · pathObligatorio | Símbolo | TXF, MXF (se ha verificado que ambos devuelven datos); otros ids de ohlcv/symbols no se han probado | |
startstring · query | Primer día | YYYY-MM-DD | end − 31 días |
endstring · query | Último día; end − start ≤ 31 días | YYYY-MM-DD | hoy (UTC) |
data = requests.get(f"{BASE_URL}/studio/market/twfutures/bid_ask_vol/TXF" , headers=headers, params={"start": "2026-05-29", "end": "2026-05-29"}, timeout=60).json()["data"]# [{"ts": "2026-05-29 00:45:00+00:00", "bid_vol": 669, "ask_vol": 447, "total_vol": 1156}, ...]{"symbol", "start", "end", "data": [...]}, filas de 1 minuto, sesiones diurna y nocturna.
| Campo | Tipo | Unidad | Descripción |
|---|---|---|---|
ts | string | ISO en UTC | Hora de apertura de la vela |
bid_vol | int | contratos | 內盤 — operaciones ejecutadas al bid (iniciadas por el vendedor) |
ask_vol | int | contratos | 外盤 — operaciones ejecutadas al ask (iniciadas por el comprador) |
total_vol | int | contratos | Total, incluidos los ticks sin clasificar |
| Estado | Cuerpo | Cuándo |
|---|---|---|
| 400 | {"error": "Invalid symbol. Allowed: [...]"} | Símbolo sin cobertura |
| 400 | {"error": "Invalid date format. Use YYYY-MM-DD"} | Fecha mal formada |
| 400 | {"error": "date_range_too_large", "message": "...", "max_days": 31} | Rango de más de 31 días |
| 503 | mensaje de error | Fuente de datos no disponible temporalmente |
ohlcv: el día de liquidación mensual no hay filas entre el cierre de las 13:30 (hora de Taipéi) del mes que vence y la apertura nocturna de las 15:00; a partir de la sesión nocturna, las filas son del mes siguiente./studio/market/twfutures/daily/<futures_id> | Nombre | Descripción | Valores permitidos | Predeterminado |
|---|---|---|---|
futures_idstring · pathObligatorio | Producto | 2–6 letras, sin distinguir mayúsculas de minúsculas — p. ej. TX, MTX, TMF, TE, TF, o un id de futuro sobre acciones (p. ej. CDF) | |
startstring · query | Primera fecha | YYYY-MM-DD | 1998-07-01 |
endstring · query | Última fecha | YYYY-MM-DD | hoy |
data = requests.get(f"{BASE_URL}/studio/market/twfutures/daily/TX" , headers=headers, params={"start": "2026-08-01"}, timeout=60).json()["data"]{"futures_id", "data": [...]}; varias filas por día (cada mes de contrato × sesión de negociación).
| Campo | Descripción |
|---|---|
date, futures_id | Día, producto |
contract_date | Mes del contrato (los contratos de spread contienen /) |
open / max / min / close | Precios (max = máximo, min = mínimo) |
spread / spread_per | Variación / variación % |
volume | Contratos |
settlement_price | Precio de liquidación |
open_interest | Interés abierto |
trading_session | position (regular) o after_market (nocturna) |
| Estado | Cuerpo | Cuándo |
|---|---|---|
| 400 | {"error": "Invalid futures_id"} | Falló la validación de formato |
| 404 | {"error": "No data found for futures_id: <id>"} | Sin datos |
| 503 | {"error": "Upstream rate limit. Please retry shortly."} | Cuota del origen de datos agotada |
TX / MTX / TMF procede de la publicación oficial de TAIFEX.TX es el producto más antiguo; los demás comienzan más tarde (CDF es un futuro sobre acciones)./studio/market/twfutures/stock_futures/batch/daily | Nombre | Descripción | Valores permitidos | Predeterminado |
|---|---|---|---|
futures_idsstring · queryObligatorio | Ids | Ids de futuros sobre acciones separados por comas, ≤ 250 | |
startstring · query | Primera fecha | YYYY-MM-DD | 1998-07-01 |
endstring · query | Última fecha | YYYY-MM-DD | hoy |
body = requests.get(f"{BASE_URL}/studio/market/twfutures/stock_futures/batch/daily" , headers=headers, params={"futures_ids": "CDF,DHF", "start": "2026-08-01"}, timeout=120).json(){"data": {"<futures_id>": [...rows as /daily...]}, "failed": [...]}. failed = ids cuya obtención falló (reintentar); un id que no aparece en ninguno de los dos realmente no tiene datos.
| Estado | Cuerpo | Cuándo |
|---|---|---|
| 400 | {"error": "futures_ids parameter required"} | Falta |
| 400 | {"error": "futures_ids exceeds max 250 per request"} | Demasiados |
| 400 | {"error": "Invalid stock futures_id(s): [...]"} | Algún id no es un futuro sobre acciones |
| 503 | {"error": "Stock futures symbol list temporarily unavailable. Please retry shortly."} | Lista de símbolos no disponible |
/studio/market/twfutures/institutional/<futures_id> | Nombre | Descripción | Valores permitidos | Predeterminado |
|---|---|---|---|
futures_idstring · pathObligatorio | Producto | Futuros sobre índices — TX, MTX, TMF, TE, TF (se ha verificado que todos devuelven datos); no se admiten futuros sobre acciones | |
startstring · query | Primera fecha | YYYY-MM-DD | 2018-06-05 |
endstring · query | Última fecha | YYYY-MM-DD | hoy |
data = requests.get(f"{BASE_URL}/studio/market/twfutures/institutional/TX" , headers=headers, params={"start": "2026-08-01"}, timeout=60).json()["data"]{"futures_id", "data": [...]}, 3 filas por día (自營商 / 投信 / 外資).
| Campo | Descripción |
|---|---|
date, futures_id | Día, producto |
institutional_investors | Tipo de inversor |
long_deal_volume / long_deal_amount | Operaciones largas (contratos / miles de TWD) |
short_deal_volume / short_deal_amount | Operaciones cortas |
long_open_interest_balance_volume / long_open_interest_balance_amount | OI largo |
short_open_interest_balance_volume / short_open_interest_balance_amount | OI corto |
| Estado | Cuerpo | Cuándo |
|---|---|---|
| 400 | {"error": "Invalid futures_id"} | Falló la validación de formato |
| 404 | {"error": "institutional data not available for stock futures (<id>)"} | Futuro sobre acciones |
| 404 | mensaje de error | Sin datos |
| 503 | rate limit del origen de datos / lista de símbolos no disponible | Reintentar más tarde |
*_amount está en miles de TWD — deducido de la magnitud, el origen de datos no lo indica, pero la aritmética lo respalda: una fila de TX con long_open_interest_balance_amount 722870036 sobre ..._volume 78292 da 9,233 por contrato, y un contrato TX es índice × 200, de modo que 9,233 miles ÷ 200 ≈ 46,160 puntos del índice, que es donde cotizaba el índice ese día. Leído como TWD sería 1,000× demasiado pequeño./studio/market/twfutures/large_traders/<futures_id> | Nombre | Descripción | Valores permitidos | Predeterminado |
|---|---|---|---|
futures_idstring · pathObligatorio | Producto | Futuros sobre índices, p. ej. TX; no se admiten futuros sobre acciones | |
startstring · query | Primera fecha | YYYY-MM-DD | 1998-07-01 |
endstring · query | Última fecha | YYYY-MM-DD | hoy |
data = requests.get(f"{BASE_URL}/studio/market/twfutures/large_traders/TX" , headers=headers, params={"start": "2026-08-01"}, timeout=60).json()["data"]{"futures_id", "data": [...]}, 3 filas por día (contract_type: semanal / mes en curso / todos).
| Campo | Descripción |
|---|---|
date, futures_id, name, contract_type | Día, producto, nombre del producto, alcance del contrato |
buy_top5_trader_open_interest / buy_top10_trader_open_interest (+ _per) | OI largo de los 5 / 10 mayores operadores (contratos, % del mercado) |
sell_top5_trader_open_interest / sell_top10_trader_open_interest (+ _per) | OI corto de los 5 / 10 mayores operadores |
buy_top5_specific_open_interest / buy_top10_specific_open_interest (+ _per) | OI largo de las 5 / 10 mayores personas jurídicas específicas |
sell_top5_specific_open_interest / sell_top10_specific_open_interest (+ _per) | OI corto de las 5 / 10 mayores personas jurídicas específicas |
market_open_interest | OI total del mercado |
| Estado | Cuerpo | Cuándo |
|---|---|---|
| 400 | {"error": "Invalid futures_id"} | Falló la validación de formato |
| 404 | {"error": "large_traders data not available for stock futures (<id>)"} | Futuro sobre acciones |
| 404 | mensaje de error | Sin datos |
| 503 | rate limit del origen de datos / lista de símbolos no disponible | Reintentar más tarde |
/studio/market/twfutures/option/institutional/<option_id> | Nombre | Descripción | Valores permitidos | Predeterminado |
|---|---|---|---|
option_idstring · pathObligatorio | Producto de opciones | TXO (se aceptan 2–6 letras) | |
startstring · query | Primera fecha | YYYY-MM-DD | 2018-06-05 |
endstring · query | Última fecha | YYYY-MM-DD | hoy |
data = requests.get(f"{BASE_URL}/studio/market/twfutures/option/institutional/TXO" , headers=headers, params={"start": "2026-08-01"}, timeout=60).json()["data"]{"option_id", "data": [...]}, 6 filas por día (3 tipos de inversor × call / put). Campos: date, option_id, call_put (買權 / 賣權), institutional_investors, y los mismos campos long_* / short_* de volumen / importe de operaciones y de interés abierto que en los institucionales de futuros.
400 {"error": "Invalid option_id"}; 404 sin datos; 503 rate limit del origen de datos.
/studio/market/twfutures/option/large_traders/<option_id> | Nombre | Descripción | Valores permitidos | Predeterminado |
|---|---|---|---|
option_idstring · pathObligatorio | Producto de opciones | TXO (se aceptan 2–6 letras) | |
startstring · query | Primera fecha | YYYY-MM-DD | 1998-07-01 |
endstring · query | Última fecha | YYYY-MM-DD | hoy |
data = requests.get(f"{BASE_URL}/studio/market/twfutures/option/large_traders/TXO" , headers=headers, params={"start": "2026-08-01"}, timeout=60).json()["data"]{"option_id", "data": [...]}, 6 filas por día (call / put × semanal / mes en curso / todos). Campos: date, option_id, name, put_call, contract_type, y los mismos campos de interés abierto de los 5 / 10 mayores operadores y de las personas jurídicas específicas que en los grandes operadores de futuros, más market_open_interest.
400 {"error": "Invalid option_id"}; 404 sin datos; 503 rate limit del origen de datos.
/studio/market/twfutures/option/pcr | Nombre | Descripción | Valores permitidos | Predeterminado |
|---|---|---|---|
startstring · query | Primera fecha | YYYY-MM-DD | 2001-12-24 |
endstring · query | Última fecha | YYYY-MM-DD | hoy |
data = requests.get(f"{BASE_URL}/studio/market/twfutures/option/pcr" , headers=headers, params={"start": "2024-01-01", "end": "2024-12-31"}, timeout=60).json()["data"]# [{"date": "2024-01-02", "put_volume": 309583, "call_volume": 404231, "volume_pcr": 76.59,# "put_oi": 263673, "call_oi": 246495, "oi_pcr": 106.97, "pcr": 106.97},# {"date": "2024-01-03", "put_volume": 622854, "call_volume": 729547, "volume_pcr": 85.38,# "put_oi": 177203, "call_oi": 178062, "oi_pcr": 99.52, "pcr": 99.52}, ...]{"data": [...]}, una fila por día de negociación.
| Campo | Unidad | Descripción |
|---|---|---|
date | — | Día de negociación |
put_volume / call_volume | contratos | Volumen de put / call |
volume_pcr | % | Ratio put/call de volumen |
put_oi / call_oi | contratos | Interés abierto de put / call |
oi_pcr | % | Ratio put/call de interés abierto (買賣權未平倉量比率) |
pcr | % | Igual que oi_pcr (se mantiene por compatibilidad) |
404 sin datos; 503 almacén no disponible todavía o rate limit del origen de datos.
/studio/market/twfutures/carrying_cost/<identity> Estimación de Blave del costo medio de la posición neta en futuros del TAIEX de una institución, con su PnL no realizado y realizado. Es una estimación a partir de agregados diarios, no las ejecuciones reales de la institución.
Método:
scope=all), o solo TX (scope=tx).| Nombre | Descripción | Valores permitidos | Predeterminado |
|---|---|---|---|
identitystring · pathObligatorio | 外資 / 投信 / 自營商 | foreign, investment_trust, dealer | |
startstring · query | Primera fecha de negociación, inclusive | YYYY-MM-DD | 2023-10-18 (todo el historial) |
endstring · query | Última fecha de negociación, inclusive | YYYY-MM-DD | hoy |
scopestring · query | all = TX + MTX + TMF en contratos equivalentes a TX; tx = solo 大台 (la base que cita la mayoría de los sitios taiwaneses) | all, tx | all |
El libro de posiciones siempre se calcula desde el inicio del historial almacenado; start / end solo recortan la ventana, de modo que un mismo día tiene los mismos valores sea cual sea la ventana solicitada.
body = requests.get(f"{BASE_URL}/studio/market/twfutures/carrying_cost/foreign" , headers=headers, params={"start": "2026-10-06"}, timeout=60).json()rows = body["data"]# Live capture 2026-10-07 (scope=all):# {"identity": "foreign", "scope": "all", "data": [# {"date": "2026-10-06", "net_open_interest": -78570.7, "net_open_interest_change": -3923.5,# "cost": 46527.57, "txf_close": 50060.0, "mark_price": 50088.51,# "unrealized_pnl": -55957022956, "realized_pnl": -5893982992, "total_pnl": -61851005948,# "cycle_start": "2026-09-16"},# {"date": "2026-10-07", "net_open_interest": -78435.8, "net_open_interest_change": 134.9,# "cost": 46527.57, "txf_close": 49979.0, "mark_price": 49974.38,# "unrealized_pnl": -54070636128, "realized_pnl": -5988669182, "total_pnl": -60059305310,# "cycle_start": "2026-09-16"}]}gap = rows[-1]["txf_close"] - rows[-1]["cost"] # points the market is above (+) / below (−) their cost{"identity", "scope", "data": [...]}, una fila por día de negociación, de la más antigua → a la más reciente; "stale": true se añade solo cuando la copia del servidor va por detrás del último día publicado por TAIFEX (puede faltar la fila más reciente).
| Campo | Tipo | Unidad | Descripción |
|---|---|---|---|
date | string | — | Día de negociación (hora de Taipéi) |
net_open_interest | float | Contratos equivalentes a TX | OI largo − corto (negativo = neto corto) |
net_open_interest_change | float | contratos | Variación respecto al día de negociación anterior |
cost | float | null | puntos del índice | Costo medio ponderado de la posición neta; null cuando no hay posición |
txf_close | float | null | puntos del índice | Cierre de la sesión diurna del TX del mes más cercano (el día de liquidación se omite el contrato que vence) |
mark_price | float | null | puntos del índice | Valoración de TAIFEX de la posición, a precios de liquidación |
unrealized_pnl | int | TWD | (mark − costo) × contratos netos × 200 |
realized_pnl | int | TWD | Realizado desde cycle_start; se reinicia a 0 cada día de liquidación |
total_pnl | int | TWD | unrealized_pnl + realized_pnl |
cycle_start | string | — | El día de liquidación que abrió el ciclo actual |
| Estado | Cuerpo | Cuándo |
|---|---|---|
| 400 | {"error": "Invalid identity. Allowed: ['dealer', 'foreign', 'investment_trust']"} | Identidad desconocida |
| 400 | {"error": "Invalid scope. Allowed: ['all', 'tx']"} | Alcance desconocido |
| 400 | {"error": "Invalid start date, expected YYYY-MM-DD"} (o end) / {"error": "start must not be after end"} | Fecha no válida / rango invertido |
| 503 | {"error": "Market data is not ready on this server. Please retry later."} | Almacén no disponible todavía — reintentar más tarde; nunca debe leerse como «sin posición» |
| 500 | {"error": "Internal error"} | Error inesperado del servidor |
scope=tx).