RELAY POR WEBHOOK
Alertas de queda da Pinnacle no Discord ou no Slack.
Um relay é um processo que mantém aberto o stream de quedas da API de odds da Pinnacle e posta cada alerta em um webhook de chat. Esta página traz o loop, o formato da mensagem, a regra de retentativa do webhook e o cooldown que impede um mercado agitado de inundar um canal. Ele roda em um plano com alertas SSE; a chave gratuita é só REST.
As três partes de um relay
O lado do stream é um GET para /odds-drop para mercados ao vivo ou /odds-drop-prematch para os pré-jogo, com sua chave no header x-portal-apikey e min_drop definido na query string. A conexão fica aberta e cada linha data: carrega uma lista JSON de alertas. Um objeto solto em vez de uma lista é uma mensagem de controle, como a saudação connected; pule essas.
O lado do chat é um POST para a URL de webhook que seu workspace forneceu. O Discord lê um corpo JSON com um campo content; os incoming webhooks do Slack leem um campo text. Os dois respondem bem abaixo de um segundo e os dois limitam a velocidade com que um webhook pode postar.
No meio ficam um formatador e uma verificação de cooldown. O relay inteiro tem cerca de quarenta linhas em qualquer linguagem com um cliente HTTP:
open GET /odds-drop?min_drop=5 (key in header)
for each line of the stream:
skip lines that do not start with "data:"
msg = parse JSON after "data:"
skip msg when it is an object (control message)
for alert in msg:
skip when alert.sport not in SPORTS
skip when cooldown(alert) is still running
enqueue post(webhook, text(alert))
Mantenha o POST fora do loop de leitura. Se o relay espera cada resposta do webhook antes de ler a próxima linha, uma resposta lenta atrasa todos os alertas atrás dela. Uma pequena fila em memória com um worker que a esvazia é suficiente, e se a fila encher, descarte a entrada mais antiga: um alerta sobre um preço de três minutos atrás já não é notícia.
O que colocar na mensagem
Cada alerta nomeia a partida e a seleção: home, away, league, sport, o mercado em sect, o lado em outcome e os dois preços, from_price e to_price. O stream envia preços, não uma porcentagem, então o relay calcula a queda por conta própria: (from − to) ÷ from × 100. Ele também carrega nvp, o preço justo com a margem removida, que é o número que um leitor compara com o preço ainda oferecido em outro lugar.
Cairns Dolphins v Sunshine Coast Phoenix
Basketball · Moneyline · Away
2.86 → 2.70 (−5.59%)
fair 3.04 · Australia NBL1 Women
Quatro linhas curtas leem bem em um celular e em uma lista de canais. Imprima o preço justo como n/a quando nvp for nulo, em vez de transformar um valor ausente em zero. Deixe o timestamp para o cliente de chat; toda mensagem já carrega um.
Retentativas do lado do webhook
Webhooks falham de três maneiras e cada uma pede uma reação diferente. Um 429 significa que o canal está recebendo posts mais rápido do que a plataforma permite; ele vem com um header Retry-After, então espere esse tempo e envie a mesma mensagem de novo. Um 5xx ou um timeout é transitório; tente de novo com um atraso que dobra, limitado a 30 segundos e a três tentativas. Um 400 significa que o próprio corpo foi rejeitado, e nenhuma retentativa vai consertar isso: registre o formato do payload e siga em frente.
Uma rajada de alertas durante uma grade grande é quando o 429 chega. Duas configurações absorvem a maior parte: poste uma mensagem por evento em vez de uma por resultado, e mantenha um cooldown por seleção para que um preço que continua caindo não poste a cada poucos segundos. As regras de deduplicação e cooldown cobrem as chaves a usar.
Quando o stream termina
Conexões caem. Quando o stream fecha, reconecte depois de uma pausa curta que cresce a cada falha repetida, e verifique o plano quando a primeira mensagem de controle reportar um erro. Alertas que caíram enquanto você estava desconectado não são reenviados, então uma lacuna continua sendo uma lacuna; as seleções que importam alertam de novo na próxima vez que cruzarem seu limite. A página de configuração do SSE cobre o formato dos frames e o loop de reconexão em detalhe.
Quedas ao vivo e pré-jogo chegam por streams separados. Um único processo de relay pode manter as duas conexões e postar em dois canais, o que mantém uma deriva lenta do pré-jogo fora do canal que acompanha os movimentos durante o jogo. Se o alvo é um celular e não um canal, o bot de Telegram no pnclDATA é o mesmo loop com um POST diferente no final.
Perguntas antes de construir
O relay precisa de um plano pago?
Sim. O stream de quedas vem com o plano de alertas SSE a US$ 99 por mês e com os dois planos combinados de REST e SSE a US$ 149 e US$ 229. A chave gratuita é só REST e não consegue abrir o stream.
Um relay pode atender vários canais?
Sim. Filtre por sport ou league depois do parse e encaminhe cada alerta para o webhook daquele grupo. O stream não tem um parâmetro de esporte próprio, então o filtro mora no relay.
Por que a mesma partida postou duas vezes?
Um preço que continua caindo pode cruzar o limite mais de uma vez, e cada cruzamento é um alerta novo. Pule repetições pelo id do alerta e mantenha um cooldown por evento e resultado.
Os campos do stream e os preços dos planos seguem a documentação publicada pelo fornecedor, conferida em 26 de setembro de 2026. Publicado em .