API de Acciones TW

31 endpoints · Datos de mercado · Fundamentales · Flujo institucional · Otros

Última actualización 2026-10
URL base
https://api.blave.org
Autenticación
Encabezados api-key + secret-key en cada solicitud
Acceso
API plan or Blave Agent plan
Límite de uso
500 solicitudes / 5 min por clave y por IP

Convenciones

  • stock_id — código de TWSE (上市) / TPEx (上櫃), p. ej. 2330, 0050, 00878, 006208. Letras y dígitos (se admiten puntos), ≤ 8 caracteres; en caso contrario, 400 {"error": "Invalid stock_id"}.
  • start / end — YYYY-MM-DD, inclusive. Salvo que un bloque indique lo contrario, no se valida su formato (el filtrado es una comparación de cadenas), por lo que siempre debe enviarse YYYY-MM-DD.
  • Cuota del origen de datos agotada → 503 {"error": "Upstream rate limit. Please retry shortly."} — reintentar más tarde.
  • Para muchas acciones, use batch/<data_type> (≤ 50 ids por llamada); nunca recorra un universo en bucle con un endpoint de una sola acción.

Lista de acciones de Taiwán

GET/studio/market/twstock/list
Datos desde
Instantánea (valores cotizados actualmente)
Actualización
Caché del servidor de 24 h

Parámetros

Ninguno.

Ejemplo

Python
data = requests.get(f"{BASE_URL}/studio/market/twstock/list", headers=headers, timeout=60).json()["data"]# [{"stock_id": "00400A", "name": "主動國泰動能高息", "close": 14.72, "market": "TWSE",#   "industry_code": None, "listing_date": None}, ...]   # 2,392 rows in this response

Respuesta

{"data": [...]}, ~2,400 filas (上市 + 上櫃, incl. ETF; 興櫃 excluido).

CampoTipoDescripción
stock_idstringCódigo
namestringNombre
closefloat | nullÚltimo cierre diario (null cuando el origen de datos no lo tenía, p. ej. negociación suspendida)
marketstringTWSE (上市) o TPEx (上櫃)
industry_codestring | nullCódigo numérico de 產業別 de TWSE/TPEx, tal como se recibe (sin decodificar). null para ETF / valores que no son de empresas. Códigos habituales: 15 航運業, 17 金融保險業, 22 生技醫療業, 24 半導體業, 25 電腦及週邊設備業, 26 光電業, 27 通信網路業, 28 電子零組件業, 29 電子通路業, 30 資訊服務業, 31 其他電子業
listing_datestring | nullYYYY-MM-DD; null para ETF / valores que no son de empresas

Errores

Solo errores comunes (500 si fallan ambos mercados).

Notas

  • Sirve para construir universos. Al muestrear, reparta la muestra entre industrias: los códigos están agrupados por sector, así que un truncado [:N] se concentra en unos pocos sectores.
  • Una lista notablemente más corta que ~2,400 significa que un mercado no se cargó: trátela como un servicio degradado, no como exclusiones de cotización.
  • La caché del servidor baja a 10 minutos cuando un mercado no se cargó.

Información de acciones de Taiwán

GET/studio/market/twstock/info/<stock_id>
Datos desde
Instantánea
Actualización
Caché del servidor de 24 h

Parámetros

NombreDescripciónValores permitidosPredeterminado
stock_id
string · pathObligatorio
CódigoVer convenciones de la categoría

Ejemplo

Python
info = requests.get(f"{BASE_URL}/studio/market/twstock/info/2330", headers=headers, timeout=30).json()["data"]# {"stock_id": "2330", "name": "台積電", "close": 2410.0, "industry_code": "24", "listing_date": "1994-09-05"}

Respuesta

{"stock_id": "<stock_id>", "data": {...}}; data tiene los mismos campos que una fila de /list.

Errores

EstadoCuerpoCuándo
400{"error": "Invalid stock_id"}Falló la validación de formato
404{"error": "Stock not found"}No es un valor cotizado actualmente

Notas

  • Se sirve desde la misma caché que /list.

Precio diario de acciones de Taiwán (sin ajustar)

GET/studio/market/twstock/price/<stock_id>
Datos desde
1994-10-01
Actualización
Diaria, hacia las 14:00 (hora de Taipéi)

Parámetros

NombreDescripciónValores permitidosPredeterminado
stock_id
string · pathObligatorio
Código de acción o ETF cotizado (上市) u OTC (上櫃)Letras/dígitos (se admiten puntos), ≤ 8 caracteres — p. ej. 2330, 0050, 00878, 006208
start
string · query
Primera fecha, inclusiveYYYY-MM-DDhistorial completo
end
string · query
Última fecha, inclusiveYYYY-MM-DDla más reciente disponible

Ejemplo

Python
response = requests.get(f"{BASE_URL}/studio/market/twstock/price/2330", headers=headers, timeout=60)data = response.json()["data"]   # no start/end → full history, 8,069 rows# [{"date": "1994-10-01", "stock_id": "2330", "open": 171.0, "high": 172.0,#   "low": 171.0, "close": 172.0, "spread": 1.0,#   "volume": 1660506, "turnover_value": 284858008, "turnover_count": 684},#  {"date": "1994-10-03", "stock_id": "2330", "open": 172.0, "high": 173.0,#   "low": 171.0, "close": 172.0, "spread": 0.0,#   "volume": 1560000, "turnover_value": 268084000, "turnover_count": 711}, ...]

Respuesta

{"stock_id": "<stock_id>", "data": [ ... ]}, filas en orden ascendente por date.

CampoTipoUnidadDescripción
datestringYYYY-MM-DDDía de negociación
stock_idstring—Código de la acción
open / high / low / closefloatTWDPrecios sin ajustar
spreadfloatTWDVariación respecto al cierre anterior
volumeintacciones (股)Volumen negociado
turnover_valueintTWDImporte negociado
turnover_countintoperaciones (筆)Número de operaciones

Errores

EstadoCuerpoCuándo
400{"error": "Invalid stock_id"}stock_id no supera la validación de formato
404{"error": "No data found for stock_id: <stock_id>"}Código desconocido / sin datos en el origen
503{"error": "Upstream rate limit. Please retry shortly."}Cuota del origen de datos agotada — reintentar más tarde

Notas

  • No se valida el formato de start / end: un valor mal formado filtra por comparación de cadenas en lugar de devolver 400, por lo que siempre debe enviarse YYYY-MM-DD.
  • Use price_adj para backtests de rentabilidad total; este endpoint no está ajustado.
  • Para muchas acciones, use batch/price (≤ 50 ids por llamada) en lugar de llamar a este endpoint en bucle.
  • 1994-10-01 es la fecha más antigua disponible; los códigos que empezaron a cotizar después comienzan más tarde.
  • La fila del mismo día procede de los archivos oficiales de cierre de TWSE / TPEx y aparece tras su publicación (hacia las 14:00, hora de Taipéi).
  • Caché del servidor: 5 minutos.

Precio diario de acciones de Taiwán (ajustado hacia adelante)

GET/studio/market/twstock/price_adj/<stock_id>
Datos desde
1994-10-01 (igual que /price)
Actualización
Diaria

Parámetros

Igual que /price/<stock_id>.

Ejemplo

Python
params = {"start": "2020-01-01", "end": "2024-12-31"}data = requests.get(f"{BASE_URL}/studio/market/twstock/price_adj/2330", headers=headers, params=params, timeout=60).json()["data"]

Respuesta

Misma estructura y mismos campos que /price/<stock_id>; open / high / low / close están ajustados, volume / turnover_* son idénticos a la serie sin ajustar.

Errores

Igual que /price/<stock_id>.

Notas

  • Ajuste hacia adelante (後復權 / 向後調整) por dividendos en efectivo y en acciones: los precios antiguos quedan tal como se negociaron; a partir de cada fecha ex-dividendo los precios se multiplican por el factor acumulado, de modo que los precios ajustados recientes quedan por encima de los precios sin ajustar. Indicado para backtests de rentabilidad total.
  • Se reconstruye cuando avanza la serie /price sin ajustar.
  • Caché del servidor: 5 minutos.

Cotización en tiempo real de acciones de Taiwán

GET/studio/market/twstock/quote/<stock_id>
Datos desde
Solo instantánea — sin historial
Actualización
Aproximadamente cada 10 segundos

Parámetros

NombreDescripciónValores permitidosPredeterminado
stock_id
string · pathObligatorio
CódigoVer convenciones de la categoría

Ejemplo

Python
data = requests.get(f"{BASE_URL}/studio/market/twstock/quote/2330", headers=headers, timeout=30).json()["data"]# {"open": 2415.0, "high": 2465.0, "low": 2415.0, "close": 2445.0,#  "change_price": -20.0, "change_rate": -0.81, "average_price": 2432.58,#  "volume": 4245, "total_volume": 26403, "amount": 10379025000, "total_amount": 64227410000,#  "yesterday_volume": 27390, "buy_price": 2445.0, "buy_volume": 17,#  "sell_price": 2450.0, "sell_volume": 11, "volume_ratio": 0.96,#  "quote_time": "2026-07-03 14:30:00", "stock_id": "2330", "tick_type": 2}

Respuesta

{"stock_id": "<stock_id>", "data": {...}}; data es un objeto plano.

CampoTipoDescripción
open / high / low / closefloatOHLC del día hasta el momento
change_price / change_ratefloatVariación respecto al cierre anterior (TWD / %)
average_pricefloatPrecio medio negociado
volumeintVolumen del último tick
total_volumeintVolumen acumulado del día
amount / total_amountfloatImporte negociado del último tick / acumulado
yesterday_volumeintVolumen del día anterior
buy_price / buy_volumefloat / intMejor precio de compra (bid)
sell_price / sell_volumefloat / intMejor precio de venta (ask)
volume_ratiofloatRatio de volumen
quote_timestringYYYY-MM-DD HH:MM:SS — una marca de tiempo completa, a diferencia del date sin hora de otros endpoints
stock_idstringCódigo
tick_typeint0 indeterminado, 1 iniciada por el vendedor (賣盤成交), 2 iniciada por el comprador (買盤成交)

Errores

EstadoCuerpoCuándo
400{"error": "Invalid stock_id"}Falló la validación de formato
404{"error": "No data found for stock_id: <stock_id>"}Sin cotización
503{"error": "Upstream rate limit. Please retry shortly."}Cuota del origen de datos agotada

Notas

  • Solo para consultar precios intradía — sin historial, no apto para backtests.
  • Caché del servidor: 10 s.

Cotización en tiempo real de acciones de Taiwán (en bloque)

GET/studio/market/twstock/quote
Datos desde
Solo instantánea — sin historial
Actualización
Aproximadamente cada 10 segundos

Parámetros

NombreDescripciónValores permitidosPredeterminado
stock_ids
string · queryObligatorio
CódigosSeparados por comas, ≤ 50 ids

Ejemplo

Python
data = requests.get(f"{BASE_URL}/studio/market/twstock/quote", headers=headers,                    params={"stock_ids": "2330,2317"}, timeout=30).json()["data"]# {"2330": {...}, "2317": {...}}

Respuesta

{"data": {"<stock_id>": {...quote fields...}, ...}}; campos como en /quote/<stock_id>. Los ids sin cotización no aparecen.

Errores

EstadoCuerpoCuándo
400{"error": "stock_ids parameter required"}Falta
400{"error": "stock_ids exceeds max 50 per request"}Demasiados
400{"error": "Invalid stock_id in list"}Un código no supera la validación de formato
503{"error": "Upstream rate limit. Please retry shortly."}Cuota del origen de datos agotada

Notas

  • Caché del servidor: 10 s.

Cotización en tiempo real de acciones de Taiwán (todas)

GET/studio/market/twstock/quote/all
Datos desde
Solo instantánea — sin historial
Actualización
Aproximadamente cada 10 segundos

Parámetros

Ninguno.

Ejemplo

Python
rows = requests.get(f"{BASE_URL}/studio/market/twstock/quote/all", headers=headers, timeout=30).json()["data"]

Respuesta

{"data": [{...quote fields...}, ...]} (~2,800 filas); campos como en /quote/<stock_id>.

Errores

EstadoCuerpoCuándo
503{"error": "Upstream rate limit. Please retry shortly."}Cuota del origen de datos agotada

Notas

  • Caché del servidor: 10 s.

OHLCV por minuto de acciones de Taiwán

GET/studio/market/twstock/minute/ohlcv/<stock_id>/<schema>
Datos desde
2019-01 (relleno histórico por acción)
Actualización
Velas intradía en vivo; corrección oficial tras el cierre

Parámetros

NombreDescripciónValores permitidosPredeterminado
stock_id
string · pathObligatorio
CódigoUn código cotizado actualmente en TWSE/TPEx, o TAIEX (加權指數)
schema
string · pathObligatorio
Tamaño de la vela1m, 5m, 15m, 30m, 60m, 1d
start
string · query
Primer díaYYYY-MM-DDend − el rango máximo del schema
end
string · query
Último día, inclusiveYYYY-MM-DDhoy (UTC)
adjust
string · query
1 = OHLC ajustado hacia adelante (後復權), con los mismos factores que /price_adj; volume nunca se ajusta0, 1, true, false0

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.

Ejemplo

Python
body = requests.get(f"{BASE_URL}/studio/market/twstock/minute/ohlcv/2330/1m", headers=headers,                    params={"start": "2026-08-06", "end": "2026-08-06"}, timeout=60).json()# {"stock_id": "2330", "schema": "1m", "data": [#   {"close": 2385.0, "high": 2395.0, "low": 2385.0, "open": 2395.0, "ts": "2026-08-06 01:00:00+00:00", "volume": 2540}, ...]}

Respuesta

{"stock_id", "schema", "data": [...]}.

CampoTipoUnidadDescripción
tsstringISO en UTCHora de apertura de la vela (etiqueta de inicio del minuto); la vela de las 13:30 (hora de Taipéi) es la subasta de cierre
open / high / low / closefloatTWDPrecios
volumeintlotes (張), no accionesVolumen. Las velas de TAIEX siempre llevan volume: 0 en todos los schemas — el índice no tiene volumen, así que no se sirve ninguno; no debe leerse como una cifra de importe negociado

Errores

EstadoCuerpoCuándo
400{"error": "Invalid stock_id (must be a listed TWSE/TPEx security)"}No cotiza
400{"error": "Invalid schema. Allowed: [...]"}Schema no válido
400{"error": "Invalid adjust (use 0 or 1)"}adjust 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{"error": "market data temporarily unavailable"}Fallo de lectura del almacén
503{"error": "adjust factors temporarily unavailable"}adjust=1 y factores no disponibles — nunca se sirve sin ajustar de forma silenciosa

Notas

  • La cobertura depende de la demanda: se puede consultar cualquier acción cotizada; la primera consulta carga ~30 días recientes e inscribe la acción en el seguimiento en vivo, y el historial profundo (2019-01 →) se rellena después. Consulte minute/ohlcv/symbols antes de pedir años de historial.
  • Un rango sin datos devuelve 200 con [].
  • No se devuelve una vela aún en formación; use /quote/<stock_id> para el precio en vivo.
  • Divida los periodos largos en tramos que no superen el máximo de cada schema.

Símbolos con datos por minuto

GET/studio/market/twstock/minute/ohlcv/symbols
Datos desde
Instantánea
Actualización
En vivo

Parámetros

Ninguno.

Ejemplo

Python
covered = requests.get(f"{BASE_URL}/studio/market/twstock/minute/ohlcv/symbols", headers=headers, timeout=30).json()["data"]

Respuesta

{"data": ["2330", "TAIEX", ...]} — ids que ya tienen datos por minuto en disco (acciones cotizadas actualmente más TAIEX), ordenados.

Errores

Solo errores comunes.

Velas de 1 minuto de acciones de Taiwán (versión anterior)

GET/studio/market/twstock/kbar/<stock_id>
Datos desde
2019-01-01
Actualización
Caché del servidor de 60 s cuando el rango incluye hoy; si no, 5 min

Parámetros

NombreDescripciónValores permitidosPredeterminado
stock_id
string · pathObligatorio
CódigoUn código cotizado actualmente en TWSE/TPEx, o TAIEX
start
string · query
Primer díaYYYY-MM-DDhoy − 6 días
end
string · query
Último día; end − start ≤ 31 díasYYYY-MM-DDhoy

Ejemplo

Python
data = requests.get(f"{BASE_URL}/studio/market/twstock/kbar/2330", headers=headers,                    params={"start": "2026-08-03", "end": "2026-08-07"}, timeout=60).json()["data"]

Respuesta

{"stock_id", "data": [...]}, en orden ascendente.

CampoTipoDescripción
datestringYYYY-MM-DD (hora de Taipéi)
minutestringHH:MM:SS hora de Taipéi, inicio de la vela (09:00–13:30)
stock_idstringCódigo
open / high / low / closefloatTWD
volumeintLotes (張)

Errores

EstadoCuerpoCuándo
400{"error": "Invalid stock_id (must be a listed TWSE/TPEx security)"}No cotiza
400{"error": "Date range exceeds 31 days"}Rango demasiado largo o fecha mal formada

Notas

  • Versión anterior — es preferible minute/ohlcv/<stock_id>/1m. Una acción cotizada sin datos por minuto devuelve [] (este endpoint no activa la carga inicial).
  • Las velas de hoy son intradía provisionales y se sustituyen por las velas oficiales después de las ~16:10 (hora de Taipéi).
  • Solo tienen datos los ids incluidos en minute/ohlcv/symbols.

Capitalización de mercado de acciones de Taiwán

GET/studio/market/twstock/market_value/<stock_id>
Datos desde
2004-01-01
Actualización
Diaria

Parámetros

NombreDescripciónValores permitidosPredeterminado
stock_id
string · pathObligatorio
CódigoVer convenciones de la categoría
start
string · query
Primera fechaYYYY-MM-DDhistorial completo
end
string · query
Última fechaYYYY-MM-DDla más reciente

Ejemplo

Python
data = requests.get(f"{BASE_URL}/studio/market/twstock/market_value/2330", headers=headers,                    params={"start": "2026-01-01"}, timeout=60).json()["data"]

Respuesta

{"stock_id", "data": [{"date", "stock_id", "market_value"}]}; market_value en TWD.

Errores

400 stock_id no válido, 404 sin datos, 503 cuota del origen de datos.

Notas

  • Caché del servidor: 5 minutos.

Ranking de capitalización de mercado de acciones de Taiwán

GET/studio/market/twstock/market_value/all
Datos desde
Instantánea (último día publicado)
Actualización
Diaria (cierre del día)

Parámetros

NombreDescripciónValores permitidosPredeterminado
top
int · query
Conserva solo los N primeros por capitalización de mercado1–3000todos (~2,400)

Ejemplo

Respuesta

{"date": "YYYY-MM-DD", "twse_ex_etf_market_value": int, "data": [...]}, ordenado por capitalización de mercado descendente.

CampoTipoDescripción
datestringDía de referencia realmente usado (el último publicado; puede ir un día por detrás de hoy)
twse_ex_etf_market_valueintTWD. Suma de las filas con market == "TWSE" que no son ETF, en el mismo día de referencia. Denominador de todo el mercado — top no lo reduce
data[].rankintPosición en el ranking (empieza en 1)
data[].stock_idstringCódigo
data[].namestringNombre
data[].marketstring"TWSE" (上市) o "TPEx" (上櫃), según los listados de valores cotizados de TWSE / TPEx
data[].market_valueintTWD
data[].is_etfbooltrue para los ETF del ranking (359 de 2,370 filas el 2026-09-17). false significa «no está en el conjunto de ETF», no «confirmado que no es un ETF»: un valor sin categoría de industria — p. ej. el REIT 01010T — es false y permanece dentro de twse_ex_etf_market_value

Errores

EstadoCuerpoCuándo
400{"error": "top must be an integer between 1 and 3000"}top no válido
404{"error": "No recent market value data available"} (o un mensaje de listado incompleto)Sin datos recientes
503{"error": "Upstream rate limit. Please retry shortly."}Cuota del origen de datos agotada

Notas

  • El universo es 上市 + 上櫃 + ETF (興櫃 excluido; los ETN no tienen datos). Úselo en lugar de llamar en bucle a /market_value/<stock_id> para preguntas del tipo «los N primeros por capitalización».
  • rank y twse_ex_etf_market_value son universos distintos. rank abarca todo el mercado — 上市 + 上櫃, ETF incluidos — y no cambió cuando se añadió el denominador. El denominador es solo 上市 y excluye los ETF (industry_category en {ETF, 上櫃ETF, 上櫃指數股票型基金(ETF)}); los REIT y las acciones preferentes no se excluyen de él. Por tanto, market_value / twse_ex_etf_market_value es un peso en el índice solo para una fila cuyo market es "TWSE" y que no es un ETF — una fila de TPEx o de un ETF sobre este denominador no es un peso —, mientras que rank sigue siendo una posición en todo el mercado. No deben leerse como un único ranking.
  • market es una etiqueta del segmento de cotización, no un indicador de ETF — el indicador de ETF es is_etf. Úselo para un universo sin ETF. No deduzca los ETF del prefijo de stock_id (00 es una convención del mercado y no un contrato, y deja fuera los REIT 01xxxT) ni vuelva a obtener una clasificación de otro lugar. is_etf es exactamente el criterio con el que se calcula twse_ex_etf_market_value, por lo que un filtro por is_etf y el denominador nunca pueden discrepar.
  • Caché del servidor: 30 minutos.

PER / PBR / rentabilidad por dividendo de acciones de Taiwán

GET/studio/market/twstock/per/<stock_id>
Datos desde
2005-10-01
Actualización
Diaria

Parámetros

NombreDescripciónValores permitidosPredeterminado
stock_id
string · pathObligatorio
CódigoVer convenciones de la categoría
start
string · query
Primera fechaYYYY-MM-DDhistorial completo
end
string · query
Última fechaYYYY-MM-DDla más reciente

Ejemplo

Python
data = requests.get(f"{BASE_URL}/studio/market/twstock/per/2330", headers=headers,                    params={"start": "2026-01-01", "end": "2026-07-22"}, timeout=60).json()["data"]# [{"date": "2026-07-21", "stock_id": "2330", "dividend_yield": 0.95, "PER": 34.87, "PBR": 11.05}, ...]

Respuesta

{"stock_id", "data": [...]}.

CampoTipoDescripción
datestringDía de negociación
stock_idstringCódigo
dividend_yieldfloatRentabilidad por dividendo (%)
PERfloatPrecio / beneficio
PBRfloatPrecio / valor en libros

Errores

400 stock_id no válido, 404 sin datos, 503 cuota del origen de datos.

Notas

  • Para filtros de valor sobre muchas acciones, use batch/per.
  • La fila del mismo día procede de la publicación oficial de TWSE / TPEx y aparece esa misma tarde.
  • Caché del servidor: 5 minutos.

Estado de resultados de acciones de Taiwán

GET/studio/market/twstock/financials/<stock_id>
Datos desde
2013-01-01 por defecto; fechas anteriores si se solicitan
Actualización
Trimestral

Parámetros

NombreDescripciónValores permitidosPredeterminado
stock_id
string · pathObligatorio
CódigoVer convenciones de la categoría
start
string · query
Primera fechaYYYY-MM-DD2013-01-01
end
string · query
Última fechaYYYY-MM-DDhoy

Ejemplo

Python
import pandas as pddata = requests.get(f"{BASE_URL}/studio/market/twstock/financials/2330", headers=headers,                    params={"start": "2022-01-01", "end": "2024-12-31"}, timeout=30).json()["data"]# [{"date": "2022-03-31", "stock_id": "2330", "type": "Revenue", "value": 491075000000.0, "origin_name": "營業收入"}, ...]wide = pd.DataFrame(data).pivot_table(index="date", columns="type", values="value", aggfunc="first")

Respuesta

{"stock_id", "data": [...]}, formato largo (una fila por partida y por trimestre).

CampoTipoDescripción
datestringFin de trimestre (03-31 / 06-30 / 09-30 / 12-31)
stock_idstringCódigo
typestringCódigo de la partida, p. ej. Revenue, GrossProfit, OperatingIncome, NetIncome, EPS, TAX, OtherComprehensiveIncome
valuefloatValor (TWD; EPS en TWD por acción)
origin_namestringEtiqueta en chino — sirve para identificar códigos type desconocidos

Errores

400 stock_id no válido, 404 sin datos, 503 cuota del origen de datos.

Notas

  • start es 2013-01-01 por defecto; si se envía un start anterior, se devuelven filas anteriores (2330 llega hasta 2000-06-30).
  • Caché del servidor: 24 horas.

Balance general de acciones de Taiwán

GET/studio/market/twstock/balance_sheet/<stock_id>
Datos desde
2013-01-01 por defecto; fechas anteriores si se solicitan
Actualización
Trimestral

Parámetros

Igual que /financials/<stock_id>.

Ejemplo

Python
data = requests.get(f"{BASE_URL}/studio/market/twstock/balance_sheet/2330", headers=headers,                    params={"start": "2022-01-01"}, timeout=30).json()["data"]

Respuesta

Mismo formato largo que /financials/<stock_id>. Códigos type clave: CashAndCashEquivalents, TotalAssets, TotalLiabilities, TotalEquity. Los códigos que terminan en _per son % del activo total.

Errores

400 stock_id no válido, 404 sin datos, 503 cuota del origen de datos.

Notas

  • start es 2013-01-01 por defecto; si se envía un start anterior, se devuelven filas anteriores (2330 llega hasta 2012-12-31).
  • Caché del servidor: 24 horas.

Estado de flujos de efectivo de acciones de Taiwán

GET/studio/market/twstock/cashflow/<stock_id>
Datos desde
2013-01-01 por defecto; fechas anteriores si se solicitan
Actualización
Trimestral

Parámetros

Igual que /financials/<stock_id>.

Ejemplo

Python
import pandas as pddata = requests.get(f"{BASE_URL}/studio/market/twstock/cashflow/2330", headers=headers,                    params={"start": "2022-01-01"}, timeout=30).json()["data"]cfo = (pd.DataFrame(data).query("type == 'CashFlowsFromOperatingActivities'")         .assign(date=lambda d: pd.to_datetime(d["date"])).set_index("date")["value"].sort_index())cfo_q = cfo - cfo.groupby(cfo.index.year).shift(1).fillna(0)   # YTD → single quarter

Respuesta

Mismo formato largo que /financials/<stock_id>. Principales códigos type (son los códigos propios del conjunto de datos de origen; el conjunto completo varía según la empresa y el año, así que la respuesta debe tomarse como la lista de referencia y origin_name usarse para todo lo que no figure abajo). Filtre por type, no por origin_name — la etiqueta de un mismo código alterna entre paréntesis de ancho completo y de medio ancho según el año:

typeorigin_name
CashFlowsFromOperatingActivities營業活動之淨現金流入(流出)
CashProvidedByInvestingActivities投資活動之淨現金流入(流出)
CashFlowsProvidedFromFinancingActivities籌資活動之淨現金流入(流出)
PropertyAndPlantAndEquipment取得不動產、廠房及設備 (capex, negativo)
Depreciation / AmortizationExpense折舊費用 / 攤銷費用
CashBalancesIncrease本期現金及約當現金增加(減少)數
CashBalancesBeginningOfPeriod / CashBalancesEndOfPeriod期初(年初)/ 期末現金及約當現金餘額

Las partidas de flujo son acumuladas en el año (YTD), tal como se presentan en Taiwán: la fila 03-31 es solo el T1, 06-30 es T1–T2, 09-30 es T1–T3, 12-31 es el año completo. Para un solo trimestre, reste el trimestre anterior del mismo año (el T1 no requiere resta) — por eso conviene pedir desde un start de enero. CashBalancesEndOfPeriod es el saldo al cierre del trimestre; CashBalancesBeginningOfPeriod es el saldo al inicio del año. Este endpoint no tiene parámetro period — siempre devuelve YTD (la vista de un solo trimestre ?period=quarter existe únicamente en la ruta del gráfico web, no aquí).

Errores

400 stock_id no válido, 404 sin datos, 503 cuota del origen de datos.

Notas

  • start es 2013-01-01 por defecto; si se envía un start anterior, se devuelven filas anteriores (2330 llega hasta 2012-03-31).
  • Caché del servidor: 24 horas.

Ingresos mensuales de acciones de Taiwán

GET/studio/market/twstock/monthly_revenue/<stock_id>
Datos desde
2000-01-01
Actualización
Mensual

Parámetros

NombreDescripciónValores permitidosPredeterminado
stock_id
string · pathObligatorio
CódigoVer convenciones de la categoría
start
string · query
Primera fechaYYYY-MM-DD2000-01-01
end
string · query
Última fechaYYYY-MM-DDhoy

Ejemplo

Python
import pandas as pddata = requests.get(f"{BASE_URL}/studio/market/twstock/monthly_revenue/2330", headers=headers,                    params={"start": "2024-01-01", "end": "2024-12-31"}, timeout=30).json()["data"]df = pd.DataFrame(data).sort_values(["revenue_year", "revenue_month"])df["yoy_pct"] = df["revenue"].pct_change(periods=12) * 100# [{"date": "2024-01-01", "stock_id": "2330", "country": "Taiwan", "create_time": "",#   "revenue": 176299866000, "revenue_year": 2023, "revenue_month": 12},#  {"date": "2024-02-01", "stock_id": "2330", "country": "Taiwan", "create_time": "",#   "revenue": 215785127000, "revenue_year": 2024, "revenue_month": 1}, ...]

Respuesta

{"stock_id", "data": [...]}, una fila por mes.

CampoTipoDescripción
datestringPrimer día del mes posterior al mes de los ingresos — 2024-01-01 lleva revenue_year: 2023, revenue_month: 12. No debe usarse nunca como periodo
stock_idstringCódigo
countrystringMercado — el valor observado es Taiwan
create_timestringSe observa vacío ("") en todas las filas
revenueintIngresos mensuales en TWD (元), no en miles — deducido de la magnitud, el origen de datos no lo indica: 2330 para revenue_year 2024, revenue_month 1 devolvió 215785127000, una cifra que solo tiene sentido leída en 元 (NT$215.8 mil millones)
revenue_monthintMes de los ingresos (1–12) — use este campo, no date, como periodo
revenue_yearintAño de los ingresos

Errores

400 stock_id no válido, 404 sin datos, 503 cuota del origen de datos.

Notas

  • Caché del servidor: 24 horas.

Ratios financieros de acciones de Taiwán

GET/studio/market/twstock/ratios/<stock_id>
Datos desde
2013-03-31 (2013 Q1)
Actualización
Trimestral

Parámetros

NombreDescripciónValores permitidosPredeterminado
stock_id
string · pathObligatorio
CódigoVer convenciones de la categoría
start
string · query
Primera fecha de fin de trimestreYYYY-MM-DD2013-01-01
end
string · query
Última fecha de fin de trimestreYYYY-MM-DDhoy

Ejemplo

Python
import pandas as pddata = requests.get(f"{BASE_URL}/studio/market/twstock/ratios/2330", headers=headers,                    params={"start": "2024-01-01"}, timeout=30).json()["data"]# [..., {"date": "2026-06-30", "stock_id": "2330",#   "gross_margin_q": 67.7207, "gross_margin_ttm": 64.2302, "operating_margin_q": 60.3443, "operating_margin_ttm": 56.1009,#   "net_margin_q": 55.6354, "net_margin_ttm": 50.3717, "roe_q": 11.3934, "roe_ttm": 40.3342, "roa_q": 7.8372, "roa_ttm": 27.3074,#   "eps_q": 27.25, "eps_ttm": 86.28, "eps_yoy_q": 77.4089, "eps_yoy_ttm": 53.2232,#   "revenue_yoy_q": 36.0453, "revenue_yoy_ttm": 30.5567, "revenue_qoq_q": 12.0163, "revenue_qoq_ttm": 8.2017,#   "debt_ratio": 30.9438, "current_ratio": 245.7635, "quick_ratio": 225.0114, "equity_multiplier": 1.4481,#   "interest_coverage_q": 280.5515, "interest_coverage_ttm": 227.0232,#   "inventory_turnover_q": 1.1767, "inventory_turnover_ttm": 4.6058, "cfo_to_net_income_q": 1.1084, "cfo_to_net_income_ttm": 1.1779,#   "fcf_q": 287363030000.0, "fcf_ttm": 1143556366000.0, "fcf_per_share_q": 11.0827, "fcf_per_share_ttm": 44.1036, ...}]df = pd.DataFrame(data).assign(date=lambda d: pd.to_datetime(d["date"])).set_index("date")

Respuesta

{"stock_id", "data": [...]}, formato ancho: una fila por trimestre, de la más antigua a la más reciente, una columna por ratio. Cada ratio es un float redondeado a 4 decimales, o null.

CampoTipoDescripción
datestringFin de trimestre (03-31 / 06-30 / 09-30 / 12-31) — no el día en que el informe se hizo público
stock_idstringCódigo
<ratio>_qfloat | nullSolo el trimestre
<ratio>_ttmfloat | nullÚltimos cuatro trimestres (suma de los cuatro trimestres individuales); null si falta alguno de los cuatro
debt_ratio, current_ratio, quick_ratio, equity_multiplierfloat | nullRatios de balance al cierre del periodo — sin sufijo

<ratio> (cada uno tiene _q y _ttm):

GrupoRatiosUnidad
Rentabilidadgross_margin, operating_margin, pretax_margin, net_margin, opex_ratio, roe, roa% (ya ×100)
Por accióneps, revenue_per_share, fcf_per_shareTWD por acción
Crecimientorevenue_yoy, revenue_qoq, operating_income_yoy, net_income_yoy, eps_yoy% (ya ×100)
Estructurainterest_coverageveces
Eficienciareceivable_turnover, inventory_turnover, asset_turnover, cfo_to_net_incomeveces
Flujo de efectivofcfTWD, importe bruto (no en miles)

Columnas sin sufijo: debt_ratio, current_ratio, quick_ratio son % (ya ×100 — un ratio corriente de 2.46× se devuelve como 245.7635); equity_multiplier se expresa en veces.

Errores

EstadoCuerpoCuándo
400{"error": "Invalid stock_id"}El código no supera la validación de formato
404{"error": "No data found for stock_id: <id>"}No hay estados financieros para el código (ETF como 0050 / 00878), o no hay ninguna fila dentro de start–end
503{"error": "Data temporarily unavailable. Please retry shortly."}Almacén de ratios no disponible todavía — reintentar más tarde; nunca debe leerse como «sin datos»

Notas

  • El ROE / ROA de un solo trimestre no está anualizado; las cifras por acción usan un número de acciones derivado de beneficio neto ÷ EPS; bancos, sociedades de valores y aseguradoras tienen varios ratios que siempre son null (sin margen bruto, ratio corriente, etc.).
  • Las filas llevan la fecha de fin de trimestre, pero el informe de un trimestre solo es público semanas después. En un backtest, desplace cada fila a su fecha de disponibilidad (los plazos legales de presentación, los mismos que los de los estados financieros) — cruzar por date introduce sesgo de anticipación (lookahead).
  • Una partida ausente o un denominador cero da null, nunca 0.
  • No incluye: PER / PBR / rentabilidad por dividendo (diarios — per/<stock_id>) ni los ratios de ingresos mensuales (calcule YoY / MoM a partir de monthly_revenue/<stock_id>).
  • Muchas acciones → GET /studio/market/twstock/batch/ratios?stock_ids=... (≤ 50 ids por llamada).
  • 2013-03-31 es un límite inferior fijo: un start anterior no devuelve nada más antiguo.
  • Lo recalcula el mismo proceso que actualiza los estados financieros, dos veces al día (13:30 y 23:00 UTC).
  • Caché del servidor: 6 horas.

Eventos de dividendos de acciones de Taiwán

GET/studio/market/twstock/dividend/<stock_id>
Datos desde
Según la acción (2330: 2005-06-19)
Actualización
Se actualiza al consultar si los datos están desfasados

Parámetros

NombreDescripciónValores permitidosPredeterminado
stock_id
string · pathObligatorio
CódigoCódigo cotizado actualmente (4–6 dígitos, letra final opcional)
start
string · query
Primera fecha efectivaYYYY-MM-DD estrictohistorial completo
end
string · query
Última fecha efectivaYYYY-MM-DD estrictohistorial completo

El filtrado por rango usa una fecha efectiva de tres niveles: cash_ex_date si existe; si no, stock_ex_date; si no, record_date — los eventos recién anunciados que aún no tienen fecha ex también aparecen.

Ejemplo

Python
data = requests.get(f"{BASE_URL}/studio/market/twstock/dividend/2330", headers=headers,                    params={"start": "2025-01-01", "end": "2025-12-31"}, timeout=30).json()["data"]# [{"record_date": "2025-03-24", "period": "113年第3季", "announce_date": "2025-03-03",#   "cash_ex_date": "2025-03-18", "stock_ex_date": "", "pay_date": "2025-04-10",#   "cash": 4.50002042, "stock": 0.0, "stock_ratio": 0.0}, ...]

Respuesta

{"stock_id", "data": [...]}, una fila por cada fila del anuncio.

CampoTipoDescripción
record_datestring權利分派基準日 YYYY-MM-DD
periodstring股利所屬期間 — una etiqueta opaca (114年第3季, 113, 不適用, …); compárela como cadena, no la convierta en un año
announce_datestring公告日; "" cuando se desconoce
cash_ex_datestring除息交易日; "" cuando no hay / no está decidida
stock_ex_datestring除權交易日; "" cuando no hay
pay_datestring現金股利發放日; "" cuando se desconoce
cashfloatDividendo en efectivo por acción (TWD, 盈餘 + 公積)
stockfloatDividendo en acciones por acción (元面額, 盈餘 + 公積)
stock_ratiofloatstock / 10 — ratio de ajuste de tipo split

Errores

EstadoCuerpoCuándo
400{"error": "Invalid stock_id"}Falló la validación de formato
400{"error": "Invalid start date, expected YYYY-MM-DD"} (o end)Fecha mal formada
404{"error": "No data found for stock_id: <id>"} / {"error": "No dividend records for stock_id: <id>"}No cotiza, o no tiene ningún historial de dividendos
503{"error": "Upstream rate limit. Please retry shortly."}Cuota del origen de datos agotada

Notas

  • Las filas con valor cero (cash == 0 y stock == 0) se conservan — son una decisión anunciada de no repartir.
  • Las fechas efectivas pueden estar en el futuro (anunciado, pero aún sin fecha ex cumplida) — la llamada de historial completo de 2330 llegó hasta una fecha una semana posterior a la solicitud. Filtre por fecha por su cuenta si solo necesita eventos pasados.
  • Una acción válida con historial pero sin eventos en el rango devuelve 200 + [] (distinto de 404).
  • Las acciones excluidas de cotización devuelven 404.

Noticias de acciones de Taiwán

GET/studio/market/twstock/news/<stock_id>
Datos desde
Hacia mediados de 2020 (escaso hasta aproximadamente 2021-02)
Actualización
Se obtienen al consultar

Parámetros

NombreDescripciónValores permitidosPredeterminado
stock_id
string · pathObligatorio
CódigoVer convenciones de la categoría
start
string · query
Primer díaYYYY-MM-DDhoy − 6 días
end
string · query
Último día; end − start ≤ 31 díasYYYY-MM-DDhoy

Ejemplo

Python
data = requests.get(f"{BASE_URL}/studio/market/twstock/news/2330", headers=headers,                    params={"start": "2026-08-01", "end": "2026-08-07"}, timeout=60).json()["data"]

Respuesta

{"stock_id", "data": [...]}, varios artículos por día (fines de semana incluidos).

CampoTipoDescripción
datestringFecha y hora de publicación
stock_idstringCódigo
titlestringTitular
sourcestringMedio
linkstringURL

Errores

EstadoCuerpoCuándo
400{"error": "Date range exceeds 31 days"} o un mensaje de error de análisis de fechaRango demasiado largo / fecha mal formada
503{"error": "Upstream rate limit. Please retry shortly."}Cuota del origen de datos agotada

Notas

  • La cobertura empieza hacia mediados de 2020 (hay filas desde 2020-08; el inicio real no está documentado) y es escasa — unos pocos artículos al día o ninguno — hasta aproximadamente 2021-02; las fechas anteriores pueden devolver [].
  • Los artículos de cada día se obtienen en la primera solicitud de ese día.
  • Caché del servidor: 5 minutos.

Inversores institucionales de acciones de Taiwán

GET/studio/market/twstock/institutional/<stock_id>
Datos desde
Según la acción (2330: 2012-05-02)
Actualización
Diaria

Parámetros

NombreDescripciónValores permitidosPredeterminado
stock_id
string · pathObligatorio
CódigoVer convenciones de la categoría
start
string · query
Primera fechaYYYY-MM-DDhistorial completo
end
string · query
Última fechaYYYY-MM-DDla más reciente

Ejemplo

Python
data = requests.get(f"{BASE_URL}/studio/market/twstock/institutional/2330", headers=headers,                    params={"start": "2024-01-01", "end": "2024-12-31"}, timeout=60).json()["data"]# [{"date": "2024-01-02", "stock_id": "2330", "foreign_buy": 28464159, "foreign_sell": 47404324,#   "trust_buy": 5553520, "trust_sell": 269712, "dealer_self_buy": 452000, "dealer_self_sell": 366190,#   "dealer_hedge_buy": 942546, "dealer_hedge_sell": 780090,#   "foreign_dealer_self_buy": 0, "foreign_dealer_self_sell": 0}, ...]

Respuesta

{"stock_id", "data": [...]}, formato ancho, una fila por día. Todos los valores en acciones (股).

CampoDescripción
date, stock_idDía, código
foreign_buy / foreign_sell外資 (sin operadores por cuenta propia extranjeros)
trust_buy / trust_sell投信
dealer_self_buy / dealer_self_sell自營商自行買賣
dealer_hedge_buy / dealer_hedge_sell自營商避險
foreign_dealer_self_buy / foreign_dealer_self_sell外資自營商 (casi siempre 0)

Errores

400 stock_id no válido, 404 sin datos, 503 cuota del origen de datos.

Notas

  • Compra neta = *_buy − *_sell.
  • Capa por acción — sin agrupar. Estas son las columnas sin procesar de cada categoría; cómo agruparlas queda a criterio de quien las usa. Las superficies por acción de Blave (web, app, chat de IA) cuentan 外資自營商 como parte de 外資, de acuerdo con los nombres de columna de las propias bolsas, y tratan 自營商 como 自行買賣 más 避險. El endpoint de todo el mercado (GET /studio/market/twmarket/institutional) lo agrupa de otra forma — véase esa sección.
  • La fila del mismo día procede de la publicación oficial de TWSE / TPEx y aparece en cuanto las bolsas la publican.
  • Caché del servidor: 5 minutos.

Operaciones con margen de acciones de Taiwán

GET/studio/market/twstock/margin/<stock_id>
Datos desde
Según la acción (2330: 2001-01-05)
Actualización
Diaria

Parámetros

NombreDescripciónValores permitidosPredeterminado
stock_id
string · pathObligatorio
CódigoVer convenciones de la categoría
start
string · query
Primera fechaYYYY-MM-DDhistorial completo
end
string · query
Última fechaYYYY-MM-DDla más reciente

Ejemplo

Python
import pandas as pddata = requests.get(f"{BASE_URL}/studio/market/twstock/margin/2330", headers=headers,                    params={"start": "2024-01-01"}, timeout=60).json()["data"]df = pd.DataFrame(data)df["margin_util"] = df["margin_balance"] / df["margin_limit"]   # 融資使用率

Respuesta

{"stock_id", "data": [...]}, una fila por día. Los valores están en lotes (張), no en acciones — verificado con MI_MARGN de TWSE: para 2026-09-15, 2330 devolvió margin_balance: 29282 y margin_limit: 6483092, que coinciden exactamente con los valores 今日餘額 29,282 y 次一營業日限額 6,483,092 de TWSE para esa fecha. Cada fila lleva su propio date y stock_id; al leer el historial completo (sin start / end), tome todas las cifras de la misma fila — margin_limit se vuelve a publicar cada día y cambia con el tiempo.

CampoDescripción
margin_buy / margin_sell融資買進 / 賣出
margin_cash_repay融資現金償還
margin_balance / margin_prev_balance融資今日 / 前日餘額
margin_limit融資限額 — el 次一營業日限額 de TWSE tal como se publicó en la fecha de esa fila, es decir, el límite que se aplica al SIGUIENTE día hábil (2330 el 2026-09-15: 6,483,092 lotes)
short_buy / short_sell融券買進 / 賣出
short_cash_repay融券現金償還
short_balance / short_prev_balance融券今日 / 前日餘額
short_limit融券限額
offset_loan_short資券相抵

Errores

400 stock_id no válido, 404 sin datos, 503 cuota del origen de datos.

Notas

  • Caché del servidor: 5 minutos.

Distribución de la tenencia accionaria de acciones de Taiwán

GET/studio/market/twstock/shareholding/<stock_id>
Datos desde
Según la acción (2330: 2010-01-29)
Actualización
Semanal, los viernes

Parámetros

NombreDescripciónValores permitidosPredeterminado
stock_id
string · pathObligatorio
CódigoVer convenciones de la categoría
start
string · query
Primera fechaYYYY-MM-DDhistorial completo
end
string · query
Última fechaYYYY-MM-DDla más reciente

Ejemplo

Python
data = requests.get(f"{BASE_URL}/studio/market/twstock/shareholding/2330", headers=headers,                    params={"start": "2024-01-01", "end": "2024-03-31"}, timeout=60).json()["data"]

Respuesta

{"stock_id", "data": [...]}, una fila por fecha × nivel.

CampoTipoDescripción
datestringFecha de la semana
stock_idstringCódigo
levelstringTramo de tenencia: 1-999, 1,000-5,000, 5,001-10,000, 10,001-15,000, 15,001-20,000, 20,001-30,000, 30,001-40,000, 40,001-50,000, 50,001-100,000, 100,001-200,000, 200,001-400,000, 400,001-600,000, 600,001-800,000, 800,001-1,000,000, more than 1,000,001, total, 差異數調整(說明4)
peopleintNúmero de titulares
unitintAcciones en tenencia
percentfloat% de las acciones emitidas

Errores

400 stock_id no válido, 404 sin datos, 503 cuota del origen de datos.

Notas

  • Las cifras son la distribución de la tenencia accionaria publicada por TDCC (集保結算所).
  • Caché del servidor: 5 minutos.

Tenencia extranjera de acciones de Taiwán

GET/studio/market/twstock/foreign_shareholding/<stock_id>
Datos desde
2013-01-01 por defecto; fechas anteriores si se solicitan
Actualización
Diaria

Parámetros

NombreDescripciónValores permitidosPredeterminado
stock_id
string · pathObligatorio
CódigoVer convenciones de la categoría
start
string · query
Primera fechaYYYY-MM-DD2013-01-01
end
string · query
Última fechaYYYY-MM-DDhoy

Ejemplo

Python
data = requests.get(f"{BASE_URL}/studio/market/twstock/foreign_shareholding/2330", headers=headers,                    params={"start": "2026-01-01"}, timeout=60).json()["data"]

Respuesta

{"stock_id", "data": [...]}, una fila por día.

CampoDescripción
date, stock_idDía, código
ForeignInvestmentSharesAcciones en manos de inversores extranjeros
ForeignInvestmentSharesRatioRatio de tenencia extranjera (%)
ForeignInvestmentRemainingSharesAcciones que los extranjeros aún pueden comprar
ForeignInvestmentRemainRatioRatio restante (%)
ForeignInvestmentUpperLimitRatioLímite de tenencia extranjera (%)
ChineseInvestmentUpperLimitRatioLímite de tenencia de inversores de la RPC (%)
NumberOfSharesIssuedAcciones emitidas

Errores

400 stock_id no válido, 404 sin datos, 503 cuota del origen de datos.

Notas

  • start es 2013-01-01 por defecto; si se envía un start anterior, se devuelven filas anteriores (2330 llega hasta 2004-02-12).
  • Caché del servidor: 24 horas.

Compra/venta de bancos públicos en acciones de Taiwán

GET/studio/market/twstock/gov_bank/<stock_id>
Datos desde
2021-06-30
Actualización
Diaria

Parámetros

NombreDescripciónValores permitidosPredeterminado
stock_id
string · pathObligatorio
CódigoVer convenciones de la categoría
start
string · query
Primer díaYYYY-MM-DDhoy − 6 días
end
string · query
Último día; end − start ≤ 31 díasYYYY-MM-DDhoy

Ejemplo

Python
data = requests.get(f"{BASE_URL}/studio/market/twstock/gov_bank/2330", headers=headers,                    params={"start": "2026-08-01", "end": "2026-08-07"}, timeout=60).json()["data"]

Respuesta

{"stock_id", "data": [...]}, hasta 8 filas por día (una por banco), ordenadas por fecha y banco.

CampoDescripción
date, stock_idDía, código
bank_nameBanco
buy / sellAcciones compradas / vendidas
buy_amount / sell_amountTWD comprados / vendidos

Errores

EstadoCuerpoCuándo
400{"error": "Date range exceeds 31 days"} o un mensaje de error de análisis de fechaRango demasiado largo / fecha mal formada
503{"error": "Upstream rate limit. Please retry shortly."}Cuota del origen de datos agotada

Notas

  • Caché del servidor: 5 minutos.

Préstamo de valores de acciones de Taiwán

GET/studio/market/twstock/lending/<stock_id>
Datos desde
2001-05-01
Actualización
Diaria

Parámetros

NombreDescripciónValores permitidosPredeterminado
stock_id
string · pathObligatorio
CódigoVer convenciones de la categoría
start
string · query
Primera fechaYYYY-MM-DDhistorial completo
end
string · query
Última fechaYYYY-MM-DDla más reciente

Ejemplo

Python
data = requests.get(f"{BASE_URL}/studio/market/twstock/lending/2330", headers=headers,                    params={"start": "2026-08-01"}, timeout=60).json()["data"]

Respuesta

{"stock_id", "data": [...]}, varias filas por día.

CampoDescripción
date, stock_idDía, código
transaction_type競價 / 議借
volumeVolumen
fee_rateTasa de comisión del préstamo
closePrecio de cierre
original_return_dateFecha de devolución original
original_lending_periodPlazo original del préstamo

Errores

400 stock_id no válido, 404 sin datos, 503 cuota del origen de datos.

Notas

  • Caché del servidor: 5 minutos.

Compra/venta de brókeres por acción

GET/studio/market/twstock/broker/stock/<stock_id>
Datos desde
2021-06-30
Actualización
Diaria, después de las 21:30 aproximadamente (hora de Taipéi)

Parámetros

Envíe date para un solo día, o start (+ end) para un rango; si se envían ambos, prevalece start.

NombreDescripciónValores permitidosPredeterminado
stock_id
string · pathObligatorio
CódigoVer convenciones de la categoría
date
string · query
Un solo díaYYYY-MM-DDhoy
start
string · query
Inicio del rangoYYYY-MM-DD
end
string · query
Fin del rango; rango ≤ 366 días, inclusiveYYYY-MM-DDstart

Ejemplo

Python
rows = requests.get(f"{BASE_URL}/studio/market/twstock/broker/stock/2330", headers=headers,                    params={"start": "2026-08-03", "end": "2026-08-07"}, timeout=60).json()["data"]

Respuesta

{"stock_id", "data": [...]}, una fila por sucursal y por día.

CampoTipoDescripción
datestringDía de negociación
stock_idstringCódigo
broker_idstringCódigo de la sucursal (puede ser alfanumérico, p. ej. 920A)
broker_namestringNombre de la sucursal
pricefloatPrecio medio negociado ponderado por volumen
buy / sellintAcciones compradas / vendidas

Errores

EstadoCuerpoCuándo
400{"error": "Invalid stock_id"}Falló la validación de formato
400{"error": "Invalid date (YYYY-MM-DD)"}Fecha mal formada
400{"error": "start/end range is <n> days; max 366 (inclusive) — split into smaller ranges"}Rango demasiado largo
503{"error": "Upstream rate limit. Please retry shortly."}Datos no disponibles temporalmente — reintentar; no debe leerse como «sin operaciones»

Notas

  • Un día sin datos (festivo, anterior a 2021-06-28, u hoy antes de las ~21:30) devuelve 200 + [].
  • Las consultas por rango están operativas: start / end sobre 2026-09-06 → 2026-09-13 devolvió filas de cinco días de negociación distintos, tanto para broker/stock/<stock_id> como para broker/trader/<trader_id>.
  • Caché del servidor: 5 minutos.

Compra/venta de brókeres por sucursal

GET/studio/market/twstock/broker/trader/<trader_id>
Datos desde
2021-06-30
Actualización
Diaria, después de las 21:30 aproximadamente (hora de Taipéi)

Parámetros

Mismas reglas de date / start / end que /broker/stock/<stock_id>.

NombreDescripciónValores permitidosPredeterminado
trader_id
string · pathObligatorio
Código de sucursal obtenido de /broker/searchLetras, dígitos, - (p. ej. 9217, 920A)
date
string · query
Un solo díaYYYY-MM-DDhoy
start
string · query
Inicio del rangoYYYY-MM-DD
end
string · query
Fin del rango; rango ≤ 366 días, inclusiveYYYY-MM-DDstart

Ejemplo

Python
rows = requests.get(f"{BASE_URL}/studio/market/twstock/broker/trader/9217", headers=headers,                    params={"date": "2026-08-07"}, timeout=60).json()["data"]

Respuesta

{"trader_id", "data": [...]}, una fila por acción y por día; campos date, broker_id, broker_name, stock_id, price, buy, sell (como en /broker/stock).

Errores

Como en /broker/stock/<stock_id>, con 400 {"error": "Invalid trader_id"} para un código no válido.

Notas

  • Caché del servidor: 5 minutos.

Anuncios de atención y disposición de acciones de Taiwán

GET/studio/market/twstock/alerts
Datos desde
TWSE 2001-01; TPEx: atención 2002-02, disposición 2003-09
Actualización
Diaria, a las 17:45, 21:30 y 07:00 (hora de Taipéi)

Parámetros

Indique date, o start / end, o ninguno (= hoy, hora de Taipéi).

NombreDescripciónValores permitidosPredeterminado
date
string · query
Un día: disposiciones en vigor ese día, avisos de atención anunciados ese díaYYYY-MM-DD estricto; no se combina con start / end
start
string · query
Primer día del rangoYYYY-MM-DD estricto2001-01-01 con stock_id; si no, end − 365 días
end
string · query
Último día del rango (inclusive)YYYY-MM-DD estrictohoy (o start si es posterior)
kind
string · query
Tipo de anunciodisposal (處置), notice (注意)ambos
market
string · query
Bolsatwse, tpexambos
stock_id
string · query
Un código; elimina el límite de 366 díasVer convenciones de la categoríatodos

Semántica del rango: una disposición se devuelve cuando su periodo (start–end) se solapa con el rango; un aviso de atención, cuando su date de anuncio cae dentro de él. Sin stock_id, el rango es como máximo de 366 días, inclusive — divida los rangos más largos de todo el mercado (cabe un año natural por llamada). A diferencia de lo habitual en la categoría, start / end / date tienen validación estricta.

Ejemplo

Respuesta

{"start", "end", "data": [...]}; start / end devuelven el rango resuelto (ambos son iguales a date cuando se envió date). Filas ordenadas por date, market, kind, stock_id. Una fila por anuncio.

CampoTipoDescripción
datestringDía del anuncio YYYY-MM-DD (una disposición entra en vigor el siguiente día de negociación)
stock_idstringCódigo — incluye warrants, ETF y bonos convertibles (p. ej. 037060, 45402)
stock_namestring | nullNombre tal como se publicó
marketstringtwse (上市) o tpex (上櫃)
kindstringdisposal o notice
countintEl recuento acumulado de la bolsa (累計 / 累計次數)
start, endstring | nullPeriodo de la disposición, ambos días incluidos; null en los avisos de atención
conditionstring | nullDisposición: el motivo tal como se publicó (連續三次, 連續3個營業日, 最近十個營業日已有六次 …). Aviso de atención: las cláusulas citadas (第一款、第五款); null si no hay ninguna
measurestring | nullTipo de disposición: 第一次處置, 第二次處置, 再次處置, 人工管制撮合, 收足五成款券 …; null en los avisos de atención y en las filas antiguas de TPEx
match_minutesint | nullDisposición: el N de 「約每N分鐘撮合一次」 leído del texto; null cuando el texto no indica ninguno (todas las disposiciones de TWSE anteriores a ~2011 — su texto está en blanco — y las medidas sin casación periódica) y en los avisos de atención
reasonstring | nullTexto completo del anuncio; null cuando la bolsa no publicó ninguno (todas las disposiciones de TWSE anteriores a 2011-03) (disposición 處置內容, aviso de atención 注意交易資訊)
close, pefloat | nullCierre y PER en el anuncio; siempre null en las disposiciones de TWSE

Errores

EstadoCuerpoCuándo
400{"error": "Invalid start date, expected YYYY-MM-DD"} (o end)start / end mal formados
400{"error": "start must not be after end"}Rango invertido
400{"error": "Invalid date, expected YYYY-MM-DD"}date mal formado
400{"error": "use either date or start/end"}date enviado junto con start o end
400{"error": "Invalid stock_id"}Falló la validación de formato
400{"error": "kind must be one of ['disposal', 'notice']"} / {"error": "market must be one of ['twse', 'tpex']"}Valor desconocido
400{"error": "start/end range is <n> days; max 366 (inclusive) without stock_id — split into smaller ranges"}Rango de más de 366 días sin stock_id
503{"error": "Data temporarily unavailable. Please retry shortly."}Una tabla solicitada no se puede servir (sin actualizar desde hace 48 h, o ilegible) — reintentar más tarde; nunca debe leerse como «sin anuncios». Solo se comprueban las tablas de los kind / market solicitados

Notas

  • Una disposición se anuncia tras el cierre y entra en vigor el siguiente día de negociación — date es el día del anuncio, start el primer día en vigor. Para preguntar «en disposición el día D», use date=D (o start=end=D), no la fecha del anuncio.
  • Una acción puede tener periodos de disposición solapados (un 第二次處置 anunciado dentro del primero).
  • start / end son el periodo anunciado; un festivo del mercado o una suspensión de la negociación dentro de él prolonga el final real, algo que los datos no registran.
  • match_minutes sigue las reglas vigentes en cada momento (TPEx 5 / 20 minutos → 2 desde 2026-08-10) — léalo fila por fila, nunca dé por supuesto un valor.
  • No se incluyen las listas de candidatos previos a la disposición (處置候選).
  • Cítese como 「資料來源:臺灣證券交易所、證券櫃檯買賣中心」.
  • La fecha de inicio de TWSE cubre tanto las disposiciones como los avisos de atención.
  • Un anuncio vespertino de TPEx puede aparecer por primera vez en la ejecución de las 07:00.

Consulta en bloque de acciones de Taiwán

GET/studio/market/twstock/batch/<data_type>
Datos desde
Según data_type (igual que el endpoint de una sola acción)
Actualización
Según data_type

Parámetros

NombreDescripciónValores permitidosPredeterminado
data_type
string · pathObligatorio
Conjunto de datosprice, price_adj, per, institutional, shareholding, foreign_shareholding, financials, balance_sheet, monthly_revenue, ratios, dividend
stock_ids
string · queryObligatorio
CódigosSeparados por comas, ≤ 50
start
string · query
Primera fechaYYYY-MM-DD (validación estricta solo para dividend)según data_type
end
string · query
Última fechaYYYY-MM-DDsegún data_type

Ejemplo

Python
payload = requests.get(f"{BASE_URL}/studio/market/twstock/batch/per", headers=headers,                       params={"stock_ids": "2330,6182", "start": "2026-08-04", "end": "2026-08-08"},                       timeout=120).json()# {"data_type": "per",#  "data": {"2330": [{"date": "2026-08-04", "dividend_yield": 0.95, "PER": 31.19, "PBR": 10.21, "stock_id": "2330"}, ...],#           "6182": [...]},#  "failed": []}

Respuesta

{"data_type", "data": {"<stock_id>": [...rows...]}, "failed": [...]}. Las filas son idénticas a las del endpoint de una sola acción correspondiente.

  • failed — ids cuya obtención en el servidor falló (rate limit o error del origen de datos); reintente esos.
  • Un id que no aparece ni en data ni en failed realmente no tiene datos.

Errores

EstadoCuerpoCuándo
400{"error": "Unsupported data_type '<x>'. Supported: [...]"}data_type no válido
400{"error": "stock_ids parameter required"}Falta
400{"error": "stock_ids exceeds max 50 per request"}Demasiados
400{"error": "Invalid stock_id in list"}Un código no supera la validación de formato
400{"error": "Invalid start date, expected YYYY-MM-DD"}Solo dividend

Notas

  • Todo el mercado (~2,000 acciones) son ~40 llamadas; nunca reparta la consulta entre endpoints de una sola acción.
  • ratios (財務比率): las filas de cada id son las filas anchas por trimestre de /ratios/<stock_id> ("data": {"2330": [{"date": "2026-06-30", "stock_id": "2330", "roe_q": 11.3934, ...}], "2317": [...]}). Un código sin estados financieros (ETF) no aparece ni en data ni en failed (sin 404); un almacén de ratios que aún no está disponible pone todos los ids en failed (sin 503).
  • dividend difiere de /dividend/<stock_id>: solo lee datos almacenados (sin actualización), un id desconocido o una acción sin historial de dividendos simplemente no aparece (sin 404), y un problema de cuota del origen de datos aparece en failed, no como un 503.