WebSocket API

Market Data en tiempo real

Recibí cotizaciones, trades y order books al instante. Conectá tu bot de trading o dashboard con datos en vivo del mercado argentino y USA.

Tiempo real

Trades, quotes y order books al instante

Autenticación segura

Credenciales o token OAuth 2.0

Multi-activo

Acciones, CEDEARs, Bonos y Cripto

Heartbeat automático

Conexión persistente sin interrupciones

Formato de activos

Todos los activos se especifican con el formato:

SYMBOL|MARKET|TERM

Ejemplos:

GGAL|BCBA|T0(Acción)
AL30|BCBA|T0(Bono)
AAPL|BCBA|T0(CEDEAR)

Para empezar necesitás:

Cuenta comitente activa en IOL
Usuario y contraseña (los mismos de la plataforma)
Cliente WebSocket (browser, Python, Node.js, etc.)

Autenticación

Antes de suscribirte a datos, debés autenticarte. Podés usar tus credenciales de IOL o un token OAuth. La autenticación debe hacerse inmediatamente después de conectar.

Ver código completo en Python, JavaScript y más →

Autenticación con credenciales

WS

Enviá tu usuario y contraseña de IOL para autenticarte. Es el método más simple.

ParameterTypeRequiredDescription
actionstringYesDebe ser "auth"
usernamestringYesUsuario de tu cuenta IOL
passwordstringYesContraseña de tu cuenta IOL
Enviar al WebSocket
1{
2 "action": "auth",
3 "username": "tu_usuario",
4 "password": "tu_password"
5}

Autenticación con token

WS(recomendado para producción)

Usá un token OAuth previamente obtenido desde la REST API. Más seguro para aplicaciones en producción.

ParameterTypeRequiredDescription
actionstringYesDebe ser "auth_token"
tokenstringYesToken de autenticación OAuth
Enviar al WebSocket
1{
2 "action": "auth_token",
3 "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
4}

Ciclo de vida

El ciclo de vida de una conexión WebSocket incluye conexión, autenticación, suscripción y mantenimiento mediante heartbeats.

Ver implementación completa con manejo de heartbeat →

Flujo de conexión

1

Conectar

wss://stream-marketdata.invertironline.com

2

Autenticar

Enviá tus credenciales o token inmediatamente después de conectar.

3

Suscribir

Suscribite a los activos que te interesan.

4

Recibir datos

El servidor envía pings periódicos. Respondé con pong para mantener la conexión.

PING - Heartbeat

WS

Para mantener la conexión activa, el servidor envía mensajes de ping. Debés responder con pong.

Ping del servidor
1{
2 "action": "ping"
3}

DISCONNECT

WSDesconexión

Cerrá la conexión WebSocket de forma ordenada. El servidor confirmará la desconexión antes de cerrar el socket.

Desconectar
1{
2 "action": "disconnect"
3}

Operaciones

Las operaciones te permiten suscribirte y desuscribirte de diferentes tipos de datos de mercado.

Ver ejemplo de suscripción en Python, JavaScript y más →
trades

Cada operación ejecutada

quotes

Mejor compra/venta (BBO)

order_book

Profundidad del mercado

SUBSCRIBE

WSSuscribirse a datos

Suscribite a uno o más activos para recibir actualizaciones en tiempo real. Podés combinar múltiples tipos de datos en una sola request.

ParameterTypeRequiredDescription
actionstringYesDebe ser "subscribe"
tradesstring[]NoArray de activos para recibir trades
quotesstring[]NoArray de activos para recibir quotes
order_bookstring[]NoArray de activos para recibir order books
Suscripción simple
1{
2 "action": "subscribe",
3 "trades": ["GD30|BCBA|T0"],
4 "quotes": ["ALUA|BCBA|T0", "PAMP|BCBA|T0"]
5}

Límite de suscripciones

Máximo 50 títulos simultáneos por conexión. Si necesitás más, abrí conexiones adicionales.

UNSUBSCRIBE

WSDesuscribirse de activos específicos

Cancelá la suscripción a activos específicos cuando ya no necesites recibir sus actualizaciones.

ParameterTypeRequiredDescription
actionstringYesDebe ser "unsubscribe"
tradesstring[]NoArray de activos a desuscribir de trades
quotesstring[]NoArray de activos a desuscribir de quotes
order_bookstring[]NoArray de activos a desuscribir de order books
Desuscripción
1{
2 "action": "unsubscribe",
3 "quotes": ["CLDR|BCBA|T0"]
4}

UNSUBSCRIBE_ALL

WSDesuscribirse de todo

Cancelá todas las suscripciones activas de una vez. Útil antes de desconectar o para empezar de cero.

Desuscribir todo
1{
2 "action": "unsubscribe_all"
3}

Schemas de datos

Formatos de los mensajes que recibís del WebSocket.

TRADE - Trade

type: T

Cada operación ejecutada en el mercado.

Estructura del mensaje (objeto msg):

CampoTipoDescripción
SstringSímbolo del activo
MstringMercado (ej: BCBA)
TstringPlazo (ej: T0, T1)
PnumberPrecio de la operación
XnumberCantidad operada
TSnumberVolumen nominal acumulado (total de acciones/unidades operadas hoy)
TPnumberVolumen monetario acumulado (monto total operado en moneda hoy)
DstringTimestamp ISO 8601

Ejemplo:

Mensaje recibido
1{
2 "type": "T",
3 "code": 200,
4 "msg": {
5 "S": "GD30",
6 "M": "BCBA",
7 "T": "T0",
8 "P": 28861.0,
9 "X": 5596,
10 "TS": 13654168.0,
11 "TP": 3931492332.82,
12 "D": "2023-10-17T18:39:54.569641+00:00"
13 }
14}

QUOTE - Quote

type: Q

Mejor oferta de compra y venta (BBO).

Estructura del mensaje (objeto msg):

CampoTipoDescripción
SstringSímbolo del activo
MstringMercado (ej: BCBA)
TstringPlazo (ej: T0, T1)
VarrayArray de niveles del order book (quotes)
DstringTimestamp ISO 8601

Estructura del objeto V (Values):

CampoTipoDescripción
TstringTipo de quote: "BID" (compra) o "OFFER" (venta)
XnumberCantidad disponible a este precio
PnumberPrecio del bid u offer

Ejemplo:

Mensaje recibido
1{
2 "type": "Q",
3 "code": 200,
4 "msg": {
5 "S": "GD30",
6 "M": "BCBA",
7 "T": "T0",
8 "V": [
9 { "T": "BID", "X": 22006.0, "P": 28861.0 },
10 { "T": "BID", "X": 5720.0, "P": 28860.5 },
11 { "T": "OFFER", "X": 12409.0, "P": 28978.5 }
12 ],
13 "D": "2023-10-17T18:39:57.7727723Z"
14 }
15}

Errores

Códigos de error que podés recibir y cómo manejarlos.

400

Argument Error

Falta un parámetro requerido o el formato es inválido.

Acción:Revisá que todos los parámetros requeridos estén presentes.
Ejemplo
1{
2 "type": "Error",
3 "code": 400,
4 "msg": "Argument Error"
5}
401

Authentication Error

Credenciales inválidas o token expirado.

Acción:Verificá usuario/contraseña o renovar el token.
Ejemplo
1{
2 "type": "Error",
3 "code": 401,
4 "msg": "Authentication Error"
5}
403

Forbidden

No tenés permisos para acceder a este recurso.

Acción:Contactá a soporte si creés que es un error.
Ejemplo
1{
2 "type": "Error",
3 "code": 403,
4 "msg": "Forbidden"
5}
404

Not Found

El activo solicitado no existe.

Acción:Verificá el formato SYMBOL|MARKET|TERM.
Ejemplo
1{
2 "type": "Error",
3 "code": 404,
4 "msg": "Not Found"
5}
429

Rate Limit

Demasiadas requests en poco tiempo.

Acción:Esperá unos segundos antes de reintentar.
Ejemplo
1{
2 "type": "Error",
3 "code": 429,
4 "msg": "Too Many Requests"
5}
500

Server Error

Error interno del servidor.

Acción:Reintentá en unos minutos.
Ejemplo
1{
2 "type": "Error",
3 "code": 500,
4 "msg": "Internal Server Error"
5}

Mejores prácticas

  • Implementá manejo de errores para cada operación que enviés al WebSocket.
  • Usá reintentos con backoff exponencial para errores temporales (500).
  • Logueá todos los errores para facilitar el debugging y monitoreo.
  • No reintentes automáticamente errores 401 - requiere intervención del usuario.