Base URL: https://arg-bursatil-scrapper.sitemaster.com.ar
Ver el markdown crudo en una pestaña aparte
/health
Chequeo de proceso vivo (usado por Docker/Dokploy healthcheck). Sin autenticación.
Respuesta 200:
{
"status": "ok",
"uptimeSeconds": 12345,
"timestamp": "2026-06-24T22:16:29.832Z"
}
/status
Estado del pipeline: mercado abierto/cerrado, salud del sidecar de HomeBroker, fuente activa y frescura por clase de activo, cupo de requests de IOL. Sin autenticación.
Respuesta 200:
{
"timestamp": "2026-06-24T22:16:30.228Z",
"marketOpen": false,
"sidecar": {
"reachable": true,
"homebrokerConnected": false,
"lastTickAt": null
},
"assetClasses": {
"acciones": { "activeSource": "iol", "lastWriteAt": null, "isStale": true, "fallbackSince": "2026-06-24T19:58:47.454Z" },
"bonos_ars": { "activeSource": "iol", "lastWriteAt": null, "isStale": true, "fallbackSince": "2026-06-24T19:58:47.466Z" },
"bonos_usd": { "activeSource": "iol", "lastWriteAt": null, "isStale": true, "fallbackSince": "2026-06-24T19:58:47.481Z" },
"cedears": { "activeSource": "iol", "lastWriteAt": null, "isStale": true, "fallbackSince": "2026-06-24T19:58:47.528Z" },
"opciones": { "activeSource": "iol", "lastWriteAt": null, "isStale": true, "fallbackSince": "2026-06-24T19:58:47.536Z" }
},
"iol": { "requestsThisMonth": 0, "monthlyLimit": 25000 }
}
Campos por clase de activo:
activeSource: "homebroker" | "iol" | null (sin dato todavía)lastWriteAt: timestamp ISO de la última fila escrita en Postgres para esa clase, o nullisStale: si pasó el umbral de frescura de la fuente activa sin escritura nuevafallbackSince: desde cuándo está en fallback a IOL, o null si está en HomeBroker/
Dashboard HTML legible para humanos: mismo contenido que /status en formato de tabla, más la última foto de precios conocida por símbolo (cache en memoria, el mismo que alimenta Google Sheets). Se autorrefresca cada 30s. Sin autenticación.
/prices
Snapshot completo de precios en JSON — pensado para que el front lo consuma directo, sin pasar por Google Sheets. Mismo cache en memoria que alimenta / y la sincronización a Sheets: carry-forward de presentación, así que un símbolo sigue apareciendo con su último valor conocido aunque la fuente no haya mandado un tick nuevo en el último ciclo. Sin autenticación.
Respuesta 200:
{
"timestamp": "2026-06-25T13:46:22.000Z",
"count": 2,
"prices": [
{
"Tipo": "ACCION",
"Simbolo": "GGAL",
"Descripcion": "",
"Currency": "ARS",
"UltCI": 0,
"UltCI_Bid": 0,
"UltCI_Ask": 0,
"UltCI_CantBid": 0,
"UltCI_CantAsk": 0,
"Ult24hs": 7630,
"Ult24hs_Bid": 7625,
"Ult24hs_Ask": 7635,
"Ult24hs_CantBid": 120,
"Ult24hs_CantAsk": 80,
"Apertura": 0,
"Maximo": 0,
"Minimo": 0,
"CierreAnt": 0,
"VarPct": 0.06,
"Volumen": 0,
"TipoOpcion": "",
"Subyacente": "",
"Strike": "",
"Vencimiento": "",
"Timestamp": "2026-06-25 10:46:04"
},
{
"Tipo": "OPCION",
"Simbolo": "GFGC7400AG",
"Descripcion": "",
"Currency": "ARS",
"UltCI": 759.999,
"UltCI_Bid": 0,
"UltCI_Ask": 0,
"UltCI_CantBid": 0,
"UltCI_CantAsk": 0,
"Ult24hs": 0,
"Ult24hs_Bid": 0,
"Ult24hs_Ask": 0,
"Ult24hs_CantBid": 0,
"Ult24hs_CantAsk": 0,
"Apertura": 0,
"Maximo": 0,
"Minimo": 0,
"CierreAnt": 0,
"VarPct": 0,
"Volumen": 0,
"TipoOpcion": "CALL",
"Subyacente": "GGAL",
"Strike": 7400,
"Vencimiento": "2026-08-21",
"Timestamp": "2026-06-25 13:46:09"
}
]
}
Notas de campos:
Tipo: "ACCION" | "BONO_ARS" | "BONO_USD" | "CEDEAR" | "OPCION"UltCI* / Ult24hs*: último/bid/ask/cantidades para contado inmediato y 24hs respectivamente. 0 si esa rueda de liquidación no tiene dato (no es null, para simplificar el consumo desde el front)TipoOpcion, Subyacente, Strike, Vencimiento: solo tienen valor cuando Tipo === "OPCION"; para el resto de los tipos vienen vacíos ("")Vencimiento: fecha en formato YYYY-MM-DDSimbolo/internal/homebroker/ticks
Interno — usado solo por el sidecar de HomeBroker (Python) corriendo en la misma red de Docker Compose. El puerto no está publicado externamente; no es parte de la API pública.
Auth: header X-Sidecar-Token si SIDECAR_TOKEN está seteado.
Respuesta: 204 sin cuerpo si el payload es válido (escriba o no, según WRITE_ENABLED); 400 si el payload no matchea el schema esperado; 401 si falta o no coincide el token.
curl https://arg-bursatil-scrapper.sitemaster.com.ar/health curl https://arg-bursatil-scrapper.sitemaster.com.ar/status curl https://arg-bursatil-scrapper.sitemaster.com.ar/prices