pnclPULSEGet API access

DROP ALERT NOTES

Different drop thresholds per sport on one SSE stream

min_drop is set per connection and you get one connection per stream. Set the floor low, then apply per-sport thresholds in your own code.

A Pinnacle odds API drop stream takes one threshold, min_drop, set when the connection opens. The stream has no sport parameter, and each account holds one connection per stream, so a second live connection with the same key closes the first. If you want soccer at 5% and tennis at 3%, the answer is not two streams. It is one stream set low, with per-sport rules in your own code.

The constraint, stated plainly

Three documented facts frame the problem, as the SSE setup guide states them, checked 2026-09-29. First, min_drop is a connection setting: the documented example uses 5 and it goes as low as 1. Second, the stream carries no sport filter. Third, one connection per stream per account.

Any design that needs two different server-side thresholds on live markets at once is therefore out. What remains is client-side filtering, which turns out to be the better design anyway.

Set the floor low, then filter up

Open the stream with min_drop at the lowest threshold you intend to use anywhere, down to the floor of 1 if that is what your most sensitive sport needs. The stream then delivers every fall at or above that floor, and your code applies the real rule per alert:

RULES = {"Soccer": 5.0, "Tennis": 3.0}  # percent, per sport
DEFAULT = 4.0

def passes(alert):
    limit = RULES.get(alert["sport"], DEFAULT)
    was, now = alert["from_price"], alert["to_price"]
    drop_pct = 100 * (was - now) / was
    return drop_pct >= limit

Each alert is self-contained: it names the sport, the league, the market and the side, and carries the price before and after the fall, so the filter needs no second request. The percentage formula, the fall divided by the old price, is the same one the feed applies, as the drop alerts guide documents.

Phase thresholds come free

Live and prematch drops arrive on separate streams, and a live and a prematch connection can run side by side on one account. That means the most important threshold split, live versus prematch, does get its own min_drop per connection. Use it: move size and cadence differ so much between the two phases that most applications run them as separate rules anyway. Per-sport refinement then happens inside each phase handler with the filter above.

What the low floor costs you

A lower min_drop means more deliveries, and every delivered alert is work for your filter, your dedupe store and your logs. The keys and cooldowns described in the deduplication guide do not change; they run on what survives your threshold rule, exactly as before.

Measure for a week before you tune. Log how many alerts arrived per sport, how many passed your rule, and how many you acted on. If one sport floods the log without producing a single decision, raise its number in your rule table, not on the connection. If the whole stream is noise, raise min_drop and let the server do the filtering again.

One connection, one floor, many rules. The stream delivers; your code decides.