12 endpoints
https://api.blave.orgapi-key + secret-key em toda requisiçãoAPI plan or Blave Agent plan/studio/market/twfutures/ohlcv/<symbol>/<schema> | Nome | Descrição | Valores permitidos | Padrão |
|---|---|---|---|
symbolstring · pathObrigatório | Contrato contínuo do vencimento mais próximo | TXF (台指期), MXF (小台) ou um id de futuro de ação listado por ohlcv/symbols (sem diferenciar maiúsculas de minúsculas) | |
schemastring · pathObrigatório | Tamanho da barra | 1m, 5m, 15m, 30m, 60m, 1d | |
startstring · query | Primeiro dia | YYYY-MM-DD | end − o intervalo máximo do schema |
endstring · query | Último dia | YYYY-MM-DD | hoje (UTC) |
Intervalo máximo por requisição (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 | Unidade | Descrição |
|---|---|---|---|
ts | string | UTC ISO | Horário de abertura da barra |
open / high / low / close | float | pontos do índice (preço, para futuros de ações) | Preços |
volume | int | contratos (口) | Volume |
| Status | Corpo | Quando |
|---|---|---|
| 400 | {"error": "Invalid symbol. Allowed: [...]"} | Símbolo sem cobertura |
| 400 | {"error": "Invalid schema. Allowed: [...]"} | Schema inválido |
| 400 | {"error": "Invalid date format. Use YYYY-MM-DD"} | Data malformada |
| 400 | {"error": "date_range_too_large", "message": "...", "max_days": <n>} | Intervalo acima do limite |
| 503 | mensagem de erro | Fonte de dados temporariamente indisponível |
TXF, MXF e futuros de ações): o dia de liquidação mensal — a 3ª quarta-feira, ou o dia de negociação seguinte quando essa quarta-feira não tem pregão — pertence ao vencimento que expira durante o dia inteiro. Ele negocia até o fechamento das 13:30 de Taipei, nenhuma barra é marcada entre 13:31 e 14:59 de Taipei nesse dia, e a série passa a ser o vencimento seguinte a partir da sessão noturna das 15:00. A barra 1d do dia de liquidação é a do vencimento que expira, então o fechamento dela é o último negócio desse contrato às 13:30.ohlcv/<symbol>/export/<year> em vez de JSON em blocos.200 com [].MXF e CAF, pedidos com tudo até a data da requisição, voltaram ambos com uma última barra de meses atrás. Leia data[-1]["ts"].1d trazem o componente de hora 16:00:00+00:00 (00:00 de Taipei), não a meia-noite UTC — tire a data de ts em vez de presumir que o timestamp está alinhado à data.1d e para o intradiário; a do MXF é para 1d. Os futuros de ações começam conforme o contrato — CAF tem barras 1d pelo menos desde 2016-09-18./studio/market/twfutures/ohlcv/symbols Nenhum.
symbols = requests.get(f"{BASE_URL}/studio/market/twfutures/ohlcv/symbols" , headers=headers, timeout=30).json()["data"]{"data": ["CDF", "DHF", "MXF", "TXF", ...]} — símbolos aceitos por ohlcv, ohlcv/export e bid_ask_vol: TXF, MXF, mais o subconjunto de futuros de ações escolhido por liquidez que tem cobertura por minuto (a maioria dos 231 futuros de ações não tem cobertura).
Apenas os erros comuns.
/studio/market/twfutures/ohlcv/<symbol>/export/<year> | Nome | Descrição | Valores permitidos | Padrão |
|---|---|---|---|
symbolstring · pathObrigatório | Símbolo | Como em ohlcv/symbols | |
yearint · pathObrigatório | Ano civil | 2014 – ano corrente |
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, um arquivo parquet (<SYMBOL>_<year>_1m.parquet) com as colunas ts, open, high, low, close, volume (barras de 1m).
| Status | Corpo | Quando |
|---|---|---|
| 400 | {"error": "Invalid symbol. Allowed: [...]"} | Símbolo sem cobertura |
| 400 | {"error": "Invalid year. Allowed: 2014-<current>"} | Ano fora do intervalo |
| 404 | {"error": "no_data", "message": "No 1m data on disk for <symbol> in <year>"} | Sem arquivo |
ohlcv/<symbol>/1m, sob a mesma regra de rolagem do dia de liquidação (nenhuma barra marcada entre 13:31 e 14:59 de Taipei no dia de liquidação mensal)./studio/market/twfutures/bid_ask_vol/<symbol> | Nome | Descrição | Valores permitidos | Padrão |
|---|---|---|---|
symbolstring · pathObrigatório | Símbolo | TXF, MXF (ambos verificados e retornam dados); outros ids de ohlcv/symbols não foram testados | |
startstring · query | Primeiro dia | YYYY-MM-DD | end − 31 dias |
endstring · query | Último dia; end − start ≤ 31 dias | YYYY-MM-DD | hoje (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": [...]}, linhas de 1 minuto, sessões diurna e noturna.
| Campo | Tipo | Unidade | Descrição |
|---|---|---|---|
ts | string | UTC ISO | Horário de abertura da barra |
bid_vol | int | contratos | 內盤 — negócios executados no bid (iniciados pelo vendedor) |
ask_vol | int | contratos | 外盤 — negócios executados no ask (iniciados pelo comprador) |
total_vol | int | contratos | Total, incluindo ticks não classificados |
| Status | Corpo | Quando |
|---|---|---|
| 400 | {"error": "Invalid symbol. Allowed: [...]"} | Símbolo sem cobertura |
| 400 | {"error": "Invalid date format. Use YYYY-MM-DD"} | Data malformada |
| 400 | {"error": "date_range_too_large", "message": "...", "max_days": 31} | Intervalo acima de 31 dias |
| 503 | mensagem de erro | Fonte de dados temporariamente indisponível |
ohlcv: no dia de liquidação mensal não há linhas entre o fechamento das 13:30 de Taipei do vencimento que expira e a abertura noturna das 15:00; a partir da sessão noturna, as linhas são do vencimento seguinte./studio/market/twfutures/daily/<futures_id> | Nome | Descrição | Valores permitidos | Padrão |
|---|---|---|---|
futures_idstring · pathObrigatório | Produto | 2–6 letras, sem diferenciar maiúsculas de minúsculas — p. ex. TX, MTX, TMF, TE, TF, ou um id de futuro de ação (p. ex. CDF) | |
startstring · query | Primeira data | YYYY-MM-DD | 1998-07-01 |
endstring · query | Última data | YYYY-MM-DD | hoje |
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": [...]}; várias linhas por dia (cada mês de vencimento × sessão de negociação).
| Campo | Descrição |
|---|---|
date, futures_id | Dia, produto |
contract_date | Mês de vencimento (contratos de spread contêm /) |
open / max / min / close | Preços (max = máxima, min = mínima) |
spread / spread_per | Variação / variação % |
volume | Contratos |
settlement_price | Preço de ajuste |
open_interest | Contratos em aberto |
trading_session | position (regular) ou after_market (noturna) |
| Status | Corpo | Quando |
|---|---|---|
| 400 | {"error": "Invalid futures_id"} | Falha na verificação de formato |
| 404 | {"error": "No data found for futures_id: <id>"} | Sem dados |
| 503 | {"error": "Upstream rate limit. Please retry shortly."} | Cota do upstream esgotada |
TX / MTX / TMF vem da publicação oficial da TAIFEX.TX é o produto mais antigo; os outros começam depois (CDF é um futuro de ação)./studio/market/twfutures/stock_futures/batch/daily | Nome | Descrição | Valores permitidos | Padrão |
|---|---|---|---|
futures_idsstring · queryObrigatório | Ids | Ids de futuros de ações separados por vírgula, ≤ 250 | |
startstring · query | Primeira data | YYYY-MM-DD | 1998-07-01 |
endstring · query | Última data | YYYY-MM-DD | hoje |
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 cuja busca falhou (tente novamente); um id ausente de ambos realmente não tem dados.
| Status | Corpo | Quando |
|---|---|---|
| 400 | {"error": "futures_ids parameter required"} | Ausente |
| 400 | {"error": "futures_ids exceeds max 250 per request"} | Ids demais |
| 400 | {"error": "Invalid stock futures_id(s): [...]"} | Algum id não é um futuro de ação |
| 503 | {"error": "Stock futures symbol list temporarily unavailable. Please retry shortly."} | Lista de símbolos indisponível |
/studio/market/twfutures/institutional/<futures_id> | Nome | Descrição | Valores permitidos | Padrão |
|---|---|---|---|
futures_idstring · pathObrigatório | Produto | Futuros de índice — TX, MTX, TMF, TE, TF (todos verificados e retornam dados); futuros de ações não são suportados | |
startstring · query | Primeira data | YYYY-MM-DD | 2018-06-05 |
endstring · query | Última data | YYYY-MM-DD | hoje |
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 linhas por dia (自營商 / 投信 / 外資).
| Campo | Descrição |
|---|---|
date, futures_id | Dia, produto |
institutional_investors | Tipo de investidor |
long_deal_volume / long_deal_amount | Negócios comprados (contratos / mil TWD) |
short_deal_volume / short_deal_amount | Negócios vendidos |
long_open_interest_balance_volume / long_open_interest_balance_amount | OI comprado |
short_open_interest_balance_volume / short_open_interest_balance_amount | OI vendido |
| Status | Corpo | Quando |
|---|---|---|
| 400 | {"error": "Invalid futures_id"} | Falha na verificação de formato |
| 404 | {"error": "institutional data not available for stock futures (<id>)"} | Futuro de ação |
| 404 | mensagem de erro | Sem dados |
| 503 | limite de requisições do upstream / lista de símbolos indisponível | Tente novamente mais tarde |
*_amount é em mil TWD — inferido pela magnitude, não declarado pelo upstream, mas a aritmética confirma: uma linha de TX com long_open_interest_balance_amount 722870036 sobre ..._volume 78292 dá 9,233 por contrato, e um contrato TX é índice × 200, então 9,233 mil ÷ 200 ≈ 46,160 pontos do índice, que é onde o índice estava sendo negociado naquele dia. Lido como TWD, ficaria 1,000× pequeno demais./studio/market/twfutures/large_traders/<futures_id> | Nome | Descrição | Valores permitidos | Padrão |
|---|---|---|---|
futures_idstring · pathObrigatório | Produto | Futuros de índice, p. ex. TX; futuros de ações não são suportados | |
startstring · query | Primeira data | YYYY-MM-DD | 1998-07-01 |
endstring · query | Última data | YYYY-MM-DD | hoje |
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 linhas por dia (contract_type: semana / mês corrente / todos).
| Campo | Descrição |
|---|---|
date, futures_id, name, contract_type | Dia, produto, nome do produto, escopo do contrato |
buy_top5_trader_open_interest / buy_top10_trader_open_interest (+ _per) | OI comprado dos 5 / 10 maiores traders (contratos, % do mercado) |
sell_top5_trader_open_interest / sell_top10_trader_open_interest (+ _per) | OI vendido dos 5 / 10 maiores traders |
buy_top5_specific_open_interest / buy_top10_specific_open_interest (+ _per) | OI comprado das 5 / 10 maiores pessoas jurídicas específicas |
sell_top5_specific_open_interest / sell_top10_specific_open_interest (+ _per) | OI vendido das 5 / 10 maiores pessoas jurídicas específicas |
market_open_interest | OI total do mercado |
| Status | Corpo | Quando |
|---|---|---|
| 400 | {"error": "Invalid futures_id"} | Falha na verificação de formato |
| 404 | {"error": "large_traders data not available for stock futures (<id>)"} | Futuro de ação |
| 404 | mensagem de erro | Sem dados |
| 503 | limite de requisições do upstream / lista de símbolos indisponível | Tente novamente mais tarde |
/studio/market/twfutures/option/institutional/<option_id> | Nome | Descrição | Valores permitidos | Padrão |
|---|---|---|---|
option_idstring · pathObrigatório | Produto de opção | TXO (2–6 letras aceitas) | |
startstring · query | Primeira data | YYYY-MM-DD | 2018-06-05 |
endstring · query | Última data | YYYY-MM-DD | hoje |
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 linhas por dia (3 tipos de investidor × call / put). Campos: date, option_id, call_put (買權 / 賣權), institutional_investors e os mesmos campos long_* / short_* de volume / valor de negócios e de contratos em aberto dos institucionais em futuros.
400 {"error": "Invalid option_id"}; 404 sem dados; 503 limite de requisições do upstream.
/studio/market/twfutures/option/large_traders/<option_id> | Nome | Descrição | Valores permitidos | Padrão |
|---|---|---|---|
option_idstring · pathObrigatório | Produto de opção | TXO (2–6 letras aceitas) | |
startstring · query | Primeira data | YYYY-MM-DD | 1998-07-01 |
endstring · query | Última data | YYYY-MM-DD | hoje |
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 linhas por dia (call / put × semana / mês corrente / todos). Campos: date, option_id, name, put_call, contract_type e os mesmos campos de contratos em aberto dos 5 / 10 maiores traders e das pessoas jurídicas específicas dos grandes traders de futuros, mais market_open_interest.
400 {"error": "Invalid option_id"}; 404 sem dados; 503 limite de requisições do upstream.
/studio/market/twfutures/option/pcr | Nome | Descrição | Valores permitidos | Padrão |
|---|---|---|---|
startstring · query | Primeira data | YYYY-MM-DD | 2001-12-24 |
endstring · query | Última data | YYYY-MM-DD | hoje |
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": [...]}, uma linha por dia de negociação.
| Campo | Unidade | Descrição |
|---|---|---|
date | — | Dia de negociação |
put_volume / call_volume | contratos | Volume de put / call |
volume_pcr | % | Razão put/call de volume |
put_oi / call_oi | contratos | Contratos em aberto de put / call |
oi_pcr | % | Razão put/call de contratos em aberto (買賣權未平倉量比率) |
pcr | % | Igual a oi_pcr (mantido por compatibilidade) |
404 sem dados; 503 armazenamento não está pronto ou limite de requisições do upstream.
/studio/market/twfutures/carrying_cost/<identity> Estimativa da Blave para o custo médio da posição líquida de uma instituição em futuros do TAIEX, com o PnL não realizado e o realizado. Uma estimativa feita a partir de agregados diários, não as execuções reais da instituição.
Método:
scope=all), ou apenas TX (scope=tx).| Nome | Descrição | Valores permitidos | Padrão |
|---|---|---|---|
identitystring · pathObrigatório | 外資 / 投信 / 自營商 | foreign, investment_trust, dealer | |
startstring · query | Primeira data de negociação, inclusive | YYYY-MM-DD | 2023-10-18 (histórico inteiro) |
endstring · query | Última data de negociação, inclusive | YYYY-MM-DD | hoje |
scopestring · query | all = TX + MTX + TMF em contratos equivalentes a TX; tx = apenas 大台 (a base que a maioria dos sites taiwaneses divulga) | all, tx | all |
O livro-razão sempre é calculado desde o início do histórico armazenado; start / end apenas recortam a janela, então o mesmo dia tem os mesmos valores qualquer que seja a janela pedida.
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": [...]}, uma linha por dia de negociação, da mais antiga → para a mais recente; "stale": true é adicionado apenas quando a cópia do servidor está atrás do último dia publicado pela TAIFEX (a linha mais recente pode estar faltando).
| Campo | Tipo | Unidade | Descrição |
|---|---|---|---|
date | string | — | Dia de negociação (Taipei) |
net_open_interest | float | Contratos equivalentes a TX | OI comprado − vendido (negativo = líquido vendido) |
net_open_interest_change | float | contratos | Variação em relação ao dia de negociação anterior |
cost | float | null | pontos do índice | Custo médio ponderado da posição líquida; null quando zerada |
txf_close | float | null | pontos do índice | Fechamento da sessão diurna do vencimento mais próximo do TX (o contrato que expira é ignorado no dia de liquidação) |
mark_price | float | null | pontos do índice | Avaliação da posição pela TAIFEX, aos preços de ajuste |
unrealized_pnl | int | TWD | (marcação − custo) × contratos líquidos × 200 |
realized_pnl | int | TWD | Realizado desde cycle_start; volta a 0 em cada dia de liquidação |
total_pnl | int | TWD | unrealized_pnl + realized_pnl |
cycle_start | string | — | O dia de liquidação que abriu o ciclo atual |
| Status | Corpo | Quando |
|---|---|---|
| 400 | {"error": "Invalid identity. Allowed: ['dealer', 'foreign', 'investment_trust']"} | Identidade desconhecida |
| 400 | {"error": "Invalid scope. Allowed: ['all', 'tx']"} | Escopo desconhecido |
| 400 | {"error": "Invalid start date, expected YYYY-MM-DD"} (ou end) / {"error": "start must not be after end"} | Data inválida / intervalo invertido |
| 503 | {"error": "Market data is not ready on this server. Please retry later."} | Armazenamento não está pronto — tente novamente mais tarde, nunca leia isso como "sem posição" |
| 500 | {"error": "Internal error"} | Erro inesperado do servidor |
scope=tx).