Mensajes
El feed de usuario envía cada actualización como un objeto JSON sin envoltorio (sin envoltorio de tupla). Todas las actualizaciones comparten un mismo envoltorio; la acción la determinan cuáles deunmatched / matched están rellenos y el valor de origin.
Envoltorio común
messageID es el id de entrada del stream que añade la streaming-api antes de enviar. Persiste el último que hayas procesado: es tu cursor de reproducción. Consulta Reproducir mensajes perdidos más abajo.
El bloque matched
Presente siempre que la actualización represente un cruce (matched != null). Cada campo de abajo se envía en
cada cruce salvo los marcados como condicionales. Todos los valores son desde tu perspectiva: como taker ves
el lado que tomaste; como maker ves el lado que colocaste.
Las mismas cantidades en REST (obtener apuestas cruzadas) van
formateadas como string a 2 decimales en lugar de números, y se calculan con un orden de comisión y
redondeo ligeramente distinto. Reconcilia con un céntimo de tolerancia en lugar de igualdad exacta.
El bloque unmatched
Presente siempre que la actualización concierna a una orden que está (o deja de estar) en el libro: colocaciones,
cancelaciones y el lado maker de un cruce. Las cuotas y los lados son desde la perspectiva del maker,
es decir, lo que colocaste, no lo que el libro ofrece a los demás.
Cómo identificar la acción
unmatched.filled === 0 && unmatched.offered > 0-> orden colocadaunmatched.offered === 0-> orden canceladamatched != null && unmatched == null-> cruzado como takermatched != null && unmatched != null-> cruzado como maker (cruce parcial siunmatched.remaining > 0)
orderType: "postArb" también llevan isPostArb: true dentro de matched / unmatched (en actualizaciones de colocación, cruce y cancelación); el campo se omite en el resto.
Semántica de side y market por tipo de apuesta
El significado deside (y qué campos extra aparecen) dentro de matched / unmatched depende de type:
market solo está presente en actualizaciones moneyline1x2: nombra el resultado a 3 vías del que trata el mercado (equipo local, equipo visitante o el empate), y side indica si la apuesta es yes o no sobre ese resultado. Todos los campos son desde tu perspectiva: como maker ves el lado que colocaste; como taker ves el lado que tomaste.
Acción: orden colocada
Se puso una oferta nueva en el libro.unmatched.filled es 0, unmatched.offered > 0 y matched es null.
Acción: orden cancelada
El usuario (o el sistema en su nombre) canceló una oferta. El campo distintivo esunmatched.offered === 0.
Acción: orden cruzada (taker)
El usuario tomó la oferta de otro.unmatched es null, matched lleva el cruce y origin es "wager".
Acción: orden cruzada (maker, cruce parcial)
Alguien golpeó la oferta colocada del usuario. Tantomatched como unmatched están rellenos; unmatched.remaining muestra lo que sigue en el libro. Como unmatched está definido, origin es "offer".
Acción: orden cruzada (moneyline1x2)
Los cruces en mercados de fútbol a 3 vías llevan el parmarket + side descrito arriba en lugar de un side hex de participante. Aquí el usuario tomó “yes” sobre el equipo local a +120 (una apuesta a que gana Arsenal):
side: "yes" a +120, el maker ve side: "no" a -120 sobre el mismo market.
Reproducir mensajes perdidos
El feed de usuario v2 admite recuperación de huecos tras una desconexión. Cada mensaje lleva unmessageID (un id de entrada de stream monótonamente creciente, p. ej. "1751552702114-0"). Si se cae la conexión, puedes obtener exactamente los mensajes que te perdiste.
Endpoint
Authorization, la cabecera Auth o el parámetro de consulta token. Solo se devuelven mensajes que pertenecen al usuario autenticado.
Respuesta: success
Tu afterID seguía presente en el historial retenido, así que la lista devuelta es un relleno de hueco completo: no se perdió nada entre afterID y beforeID:
Respuesta: cache_expired
Tu afterID ya salió del historial retenido, así que el servidor no puede demostrar que la reproducción es completa:
availableMessages es lo que sigue retenido, de más antiguo a más reciente. Los mensajes anteriores a la ventana de retención no se pueden recuperar con la reproducción: reconecta de inmediato en lugar de confiar en una mirada atrás larga.