- the
oddsscope, - a grant for the sportsbook you are calling —
pinnaclefor/v1/pinnacle, and - a grant for the sport you are asking about — see Per-sport grants below.
odds scope but no pinnacle grant is rejected, a pinnacle key without the odds scope is rejected, and a key that holds odds and pinnacle but not the sport in question is rejected on any request that names that sport.
odds is a single scope covering both prematch and live prices. There is no separate live-odds permission to request.Passing your key
REST — X-API-Key header
WebSocket — header or key parameter
The key is checked during the handshake, before the connection is upgraded. Server-side clients should send the header:
key parameter is accepted on REST endpoints too, but the header is preferred — query strings end up in proxy logs and browser history.
When both are present, the header wins.
Sportsbook grants
Each sportsbook is passed through by its own stack under its own path prefix, and each is granted independently on your key. Today that is:
A key granted one book cannot read another’s data.
Per-sport grants
On top of the sportsbook grant, a key carries an allowlist of sports within that sportsbook. Access is deny by default — a newly issued key with no sport grants sees an empty book, even if it holdsodds and pinnacle.
How grants are enforced
The allowlist affects both REST and WebSocket. The rule is consistent: list endpoints filter, explicit sport references reject.
The reason lists filter rather than reject is that the honest answer to “what can I see?” is the granted subset. The reason an explicit
?sport= or match id rejects with 403 is that silence would be indistinguishable from a bug — the set of sports a sportsbook offers is public, so refusing loudly is cheaper to support and leaks nothing.
A worked example
Apinnacle key granted E Sports (12) and Soccer (29), but not Baseball (3):
Authentication errors
Every failure is a JSON body with anerror field:
A
503 is about the authentication backend, not your key. Treat it as transient and retry — do not disable the key or alert on it as a permission problem.Unauthenticated endpoints
Two endpoints answer without a key, deliberately, so that a liveness probe does not need a credential:
To know whether the data is live rather than just the process, read the
feed_healthy flag on your WebSocket heartbeat.