🇬🇧 English: Go client for the BYMA (Buenos Aires stock exchange) free market data API. Read the English README →
Cliente en Go para BYMA Open Data, la API gratuita de datos de mercado de Bolsas y Mercados Argentinos. Acciones, CEDEARs, ETFs, bonos, cauciones, opciones, futuros, índices, dólar MEP, cotizaciones en vivo e históricos OHLCV, como structs tipados de Go. Sin API key y sin dependencias.
El badge Live API es una suite de tests que corre contra la API real todos los días hábiles, así te enterás si BYMA cambió algo antes que tus usuarios.
go get github.com/carvalab/openbymadataRequiere Go 1.26 o superior.
package main
import (
"context"
"fmt"
"log"
"github.com/carvalab/openbymadata"
)
func main() {
client := openbymadata.NewClient() // caché de 5 minutos activado por defecto
defer client.Close()
ctx := context.Background()
open, err := client.IsMarketOpen(ctx)
if err != nil {
log.Fatal(err)
}
fmt.Println("mercado abierto:", open)
ggal, err := client.GetBluechip(ctx, "GGAL")
if err != nil {
log.Fatal(err)
}
fmt.Printf("GGAL %.2f (%+.2f%%)\n", ggal.Last, ggal.Change*100)
// Los históricos necesitan el plazo: "GGAL 24HS", no "GGAL".
bars, err := client.GetHistoryLastDays(ctx, "GGAL 24HS", 30)
if err != nil {
log.Fatal(err)
}
fmt.Println("velas diarias:", len(bars.Time))
mep, err := client.GetMEPIndices(ctx)
if err != nil {
log.Fatal(err)
}
fmt.Printf("dólar MEP: %.2f\n", mep[0].Last)
}Hay ejemplos ejecutables de cada método en
pkg.go.dev,
y go run ./cmd/example recorre casi toda la API.
- Los históricos necesitan el plazo en el símbolo.
GetHistory,GetHistoryLastDaysyGetIntradayHistoryreciben"GGAL 24HS". Con"GGAL"solo devuelven un resultado vacío, sin error. - Para cotizaciones usá
Settlement24HSoSettlementCI. Con la liquidación T+1,Settlement48HSya no trae precios. - Mercado abierto vs día hábil.
IsMarketOpenes true solo mientras BYMA está operando.IsWorkingDaydice si hoy es día hábil.GetMarketTimeda el horario de apertura y cierre de hoy (UTC-3). Changees una fracción.0.0123significa +1,23%.- Los precios de cauciones y préstamos de valores son tasas tal como las publica BYMA, y la escala cambia entre campos. Compará campos equivalentes.
- El intradiario viene con demora en la API gratuita: pocas velas por día.
GetCompanyBalanceya no anda en la API gratuita; BYMA lo puso detrás de un login. Para los PDFs de los estados contables usáGetIncomeStatement.
Las listas de todo el mercado se guardan 5 minutos en caché (ver Caché). Las consultas por símbolo, cotizaciones, históricos y estado del mercado siempre van a la API.
Estado del mercado e índices
| Método | Devuelve |
|---|---|
IsMarketOpen(ctx) |
si BYMA está operando ahora |
IsWorkingDay(ctx) |
si hoy es día hábil |
GetMarketTime(ctx) |
horario de apertura y cierre de hoy |
GetServerTime(ctx) |
el reloj de BYMA (UTC-3) |
GetIndices(ctx) |
valores de índices (el Merval es "M") |
GetIndexHistory(ctx, symbol, res, from, to) |
OHLCV de un índice |
GetMEPIndices(ctx) |
índices de dólar MEP |
MarketResume(ctx) |
totales negociados |
GetTopMovers(ctx) |
acciones, bonos y opciones del panel de subas y bajas |
Renta variable
| Método | Devuelve |
|---|---|
GetBluechips(ctx) |
panel líder |
GetGalpones(ctx) |
panel general |
GetCedears(ctx) |
CEDEARs |
GetETFs(ctx) |
ETFs |
GetCorporateGovernance(ctx), GetCorporateGovernancePlus(ctx) |
paneles de gobierno corporativo |
Renta fija y mercado de dinero
| Método | Devuelve |
|---|---|
GetBonds(ctx) |
bonos públicos |
GetShortTermBonds(ctx) |
letras |
GetCorporateBonds(ctx) |
obligaciones negociables |
GetGreenBonds, GetSocialBonds, GetSustainabilityBonds, GetLinkedBonds |
bonos temáticos |
GetSenebiBonds, GetSenebiLetters, GetSenebiCorporateBonds |
segmento SENEBI (símbolos .SB) |
GetFinancialTrusts(ctx) |
fideicomisos financieros |
GetRepos(ctx) |
cauciones |
GetSecuritiesLending(ctx) |
préstamos de valores |
GetBondIndices(ctx) |
índices de renta fija |
GetBondCoupons(ctx, symbol) |
cronograma de renta y amortización de un bono |
Derivados
| Método | Devuelve |
|---|---|
GetOptions(ctx) |
opciones, con OptionType CALL/PUT |
GetFutures(ctx) |
futuros (suele venir vacío en la API gratuita) |
Cotizaciones e históricos
| Método | Devuelve |
|---|---|
GetCurrentQuote(ctx, symbol, settlement) |
punta compradora/vendedora y último precio |
GetHistory(ctx, symbol, res, from, to) |
OHLCV (diario, semanal, mensual o intradiario) |
GetHistoryLastDays(ctx, symbol, days) |
OHLCV diario hasta hoy |
GetIntradayHistory(ctx, symbol, res, from, to) |
velas de 1, 5 o 60 minutos |
Búsquedas
| Método | Devuelve |
|---|---|
GetSecurity(ctx, symbol) |
una acción o CEDEAR de cualquier panel |
GetBluechip, GetCedear, GetGalpone, GetBond, GetOption, GetFuture |
un instrumento por símbolo |
GetMultipleSecurities(ctx, symbols) |
varias acciones de una vez |
SearchSecurities(ctx, text) |
acciones cuyo símbolo contiene el texto |
SearchInstruments(ctx, query) |
cualquier instrumento por símbolo o nombre, hasta 10 |
GetInstrumentCatalog(ctx) |
todos los instrumentos listados (unos 11.000) |
Empresas y presentaciones
| Método | Devuelve |
|---|---|
GetCompanyInfo(ctx, symbol) |
datos de la sociedad |
GetEquityProfile(ctx, symbol) |
ficha de la especie (ISIN, valor nominal, ...) |
GetCompanyManagement(ctx, symbol) |
directorio |
GetMarketResponsibles(ctx, symbol) |
responsables de relaciones con el mercado |
GetIncomeStatement(ctx, symbol) |
estados contables con link al PDF |
GetNews(ctx) |
avisos de BYMA con link al PDF |
La documentación campo por campo de cada tipo está en pkg.go.dev.
opts := openbymadata.DefaultClientOptions() // caché activo, timeout 30s, 3 reintentos
opts.Timeout = 10 * time.Second
opts.Logger = myLogger // cualquier cosa con Debug/Info/Warn/Error
client := openbymadata.NewClient(opts)Si armás ClientOptions a mano, poné EnableCache: true para tener caché; el
valor cero lo apaga.
Las listas de todo el mercado (paneles, bonos, opciones, índices, noticias,
MEP, el catálogo) se guardan en memoria 5 minutos y se comparten entre
goroutines. Las búsquedas como GetBluechip o GetMultipleSecurities leen de
esas listas.
client.GetCacheInfo() // cantidad, antigüedad y vigencia por clave
client.ClearCache() // forzar datos nuevosMás en CACHING_GUIDE.md.
- Todos los métodos reciben un
context.Context. Si lo cancelás o vence su deadline, se corta el request en curso y cualquier reintento pendiente; chequealo conerrors.Is(err, context.DeadlineExceeded). - Los errores de red y los HTTP 400, 408, 429 y 5xx se reintentan
(
RetryAttempts, 3 por defecto) esperando 1s, 2s, 3s… BYMA responde 400 al azar cuando está cargada, por eso se reintenta. El resto de los 4xx fallan enseguida. - Los errores son errores de Go envueltos, por ejemplo
request failed after 2 attempts: HTTP error 404.
Para ver cada request, pasá un Logger; ver DEBUG.md.
go test ./... # tests unitarios, respuestas grabadas de BYMA
INTEGRATION_TEST=true go test -tags integration -run Integration ./... # API realLos tests unitarios reproducen respuestas grabadas de la API real
(internal/api/testdata), así que corren sin conexión. La suite contra la API
real corre en CI todos los días hábiles; los chequeos de precios solo corren
si IsMarketOpen es true, así que feriados y corridas fuera de horario no
fallan.
BYMA cambia la API sin avisar. Hay tres cosas que lo detectan:
- la corrida Live API de los días hábiles,
- un chequeo que falla cuando BYMA deja de mandar un campo que parseamos,
- una corrida semanal Discover que compara la web de BYMA con esta librería y abre un issue con los endpoints para agregar, sacar o corregir.
docs/MAINTAINING.md tiene el paso a paso de cada caso.
Issues y pull requests son bienvenidos. Corré go test ./... y gofmt -s
antes de abrir un PR. Si BYMA cambió algo, empezá por
docs/MAINTAINING.md.
MIT, ver LICENSE. Las notas de cada versión están en GitHub Releases.