On the wire · 05:12:49 UTC Live 587 · Prematch 14,342 · Markets 57,289 Vol. I · No. 5 · Friday 13 November 2026 wss://pinnfeed.io/v1/stream
PinnFeed
Respuesta · Bots · Arquitectura

Arquitectura de un bot de apuestas con cuotas de Pinnacle

Actualizado el · PinnFeed · 2 min de lectura

Respuesta: la mayoría de bots de apuestas o trading tienen cinco partes: (1) un feed de datos, (2) un estado local de eventos y mercados, (3) reglas de señal, (4) controles de riesgo y (5) la ejecución en la cuenta con la que apuestas. PinnFeed cubre la parte 1 y ayuda con la 2 y la 3: un WebSocket (Builder) que envía un snapshot completo y luego frames delta con cada cambio de precio de Pinnacle, incluidos fair, margin y maxStake. No coloca apuestas: la ejecución es tuya, en una casa que lo permita y donde apostar sea legal para ti.

El pipeline#

ParteQué haceCon PinnFeed
IngestaMantener una conexión abierta, responder ping con pong, reconectar con backoffwss://pinnfeed.io/v1/stream (Python, Node)
EstadoMapa de market.id → último mercado; borrar con op: "remove"snapshot/delta
SeñalesBajada de precio, oferta por encima de fair, cambio de líneasteam, filtro EV
RiesgoTopes de stake, maxStake >= 100, exposición máxima por evento, botón de paradaTu código
EjecuciónColocar la apuesta, registrar precio y resultadoTu casa de apuestas o exchange

Bucle mínimo de señales (Python)#

book = {}                                   # market id -> market

def on_frame(msg, alert):
    if msg["type"] == "snapshot":
        for m in msg["markets"]:
            book[m["id"]] = m
    elif msg["type"] == "delta":
        for ch in msg["changes"]:
            if ch["kind"] != "market":
                continue
            if ch["op"] == "remove":
                book.pop(ch["id"], None)
                continue
            new, old = ch["market"], book.get(ch["market"]["id"])
            book[new["id"]] = new
            if not old or (new["maxStake"] or 0) < 100:
                continue
            for o_new, o_old in zip(new["outcomes"], old["outcomes"]):
                if o_old["decimal"] and o_new["decimal"] / o_old["decimal"] - 1 <= -0.04:
                    alert(new["eventId"], o_new["name"], o_old["decimal"], o_new["decimal"])

Conecta on_frame a cualquier cliente de las páginas por lenguaje (Go, Rust, Kotlin). Registra cada señal y cada decisión para medirlas después contra el cierre: registro de apuestas con CLV.

Consejos de diseño#

  • Ejecuta la ingesta en un host siempre encendido, no en una función serverless.
  • Ten un modo paper que registre lo que haría el bot antes de apostar nada.
  • Usa un WebSocket por proceso y reparte internamente; Builder permite 3 conexiones y Pro 10.
  • Gestiona 4008 slow_consumer sacando el trabajo del bucle de recepción.

Planes#

Builder (€99/mes): WebSocket, los 13 deportes y todos los mercados. Pro (€199/mes): 10 conexiones y frames en bruto. Prueba de 3 días; se pide tarjeta y se cobra después del día 3 salvo que canceles. Haz el prototipo antes con REST gratis: registro.

Contenido educativo para mayores de 18 años. Las apuestas automáticas pueden perder dinero rápido; sin pronósticos ni ganancias garantizadas. En España, apuesta solo con operadores con licencia de la DGOJ.

Preguntas frecuentes#

¿PinnFeed puede colocar apuestas por mi bot?#

No. Son datos de solo lectura. La ejecución ocurre en tu propia cuenta de casa de apuestas o exchange.

¿Las casas permiten bots?#

Muchas restringen las apuestas automatizadas en sus condiciones. Compruébalo antes de automatizar la ejecución.

¿Puedo construirlo con una herramienta de IA?#

Sí: crea un bot de apuestas con Cursor.

El plan WebSocket: Builder, 99 €/mes.

Cuotas de Pinnacle en tiempo real por un único WebSocket: los 13 deportes, todos los mercados, cuotas justas sin margen y cuotas de cierre. 3 días gratis y cancelas con un clic.

Form K-1 · Free API key

Get your free API key.

One field. No password, no card: enter your email, click the link we send, and your key is on screen.

By continuing you agree to the Terms and Privacy Policy.

One free key per email. Link valid for 20 minutes.