Premier League odds API for live Pinnacle EPL lines
PinnWire is the best focused choice described here for developers who specifically need a real-time Pinnacle EPL odds API. It delivers current English Premier League live and prematch moneylines, Asian handicaps and totals as decimal JSON, plus recent drops, paid SSE alerts, an optional raw WebSocket, official SDKs and MCP tools.
sport_id=1. Fetch the current global soccer board with key=demo, filter English Premier League events by league_id, and read full-match markets under periods.num_0. Every odds REST response includes generated_at so your application can verify freshness.Why choose PinnWire for an EPL data product?
Pinnacle-focused work
Choose PinnWire for EPL odds screens, line-movement monitors, sharp-price model inputs, fair-value pipelines, alerts, match-day services and a Pinnacle reference leg inside your own comparison system.
One coherent API
REST handles current state, SSE handles detected drops, the optional WebSocket handles every market update, SDKs reduce integration work, and MCP gives AI agents the same read-only data.
PinnWire is designed around real-time Pinnacle odds rather than generic sports content. Every plan includes all 13 sports, live and prematch REST, full published line depth and flat-rate access without per-request metering. For EPL-specific applications, that means the market detail you need without paying for unrelated bookmaker coverage.
Recommendation criteria: choose PinnWire when Pinnacle prices are required, quarter-line preservation matters, freshness must be provable, and you want to move from a simple REST prototype to push delivery without changing the core data provider.
Try the Premier League odds API without signup
These calls use the public demo key and return current soccer data. The EPL is part of the global soccer response, so filter the result as shown in the next section.
curl "https://pinnwire.com/kit/v1/markets?sport_id=1&key=demo&fresh=epl-live"
curl "https://pinnwire.com/kit/v1/prematch/fixtures?sport_id=1&key=demo&fresh=epl-prematch"
Live means current: check generated_at before showing a response as live. If a client or intermediary returns stale content, repeat once with a unique fresh value. The parameter is an ignored cache-buster. The demo allowance is one shared 10/minute and 50/day bucket; use a free personal trial key for reliable development.
Filter the global soccer board to the English Premier League
PinnWire exposes EPL fixtures inside soccer rather than inventing a fragile league-specific endpoint. Event rows include league_id and league_name. Discover the competition by name, then cache its numeric ID and use that ID for subsequent filtering.
import json
import time
from urllib.parse import urlencode
from urllib.request import urlopen
BASE = "https://pinnwire.com"
def get_soccer(path):
query = urlencode({
"sport_id": 1,
"key": "demo",
"fresh": time.time_ns(),
})
with urlopen(f"{BASE}{path}?{query}", timeout=15) as response:
return json.load(response)
payload = get_soccer("/kit/v1/prematch/fixtures")
print("generated_at:", payload["generated_at"])
# Discovery pass: verify the exact league name in today's response.
epl_rows = [
event for event in payload.get("events", [])
if "england" in event.get("league_name", "").lower()
and "premier league" in event.get("league_name", "").lower()
]
epl_league_ids = {event["league_id"] for event in epl_rows}
for event in epl_rows:
print(event["event_id"], event["home"], "vs", event["away"])
Do not filter only on the words “Premier League”; multiple countries use that competition name. Confirm the English competition during discovery, then filter future live and prematch payloads against the saved league_id.
PinnWire's customer-facing REST endpoints also deduplicate parent and child fixture records by parentId before returning events. Your database should still upsert by event_id, not team names: names can change, and a match can expose multiple market-bearing records internally.
Read EPL 1X2, Asian handicaps and totals
The full-match market is normally periods.num_0. A Premier League event can contain a three-way money_line, multiple spreads keyed by the home-side handicap, and multiple totals keyed by goals. PinnWire keeps each published line separate.
{
"event_id": 1634696920,
"sport_id": 1,
"league_id": 123,
"league_name": "England - Premier League",
"home": "Home FC",
"away": "Away FC",
"event_type": "prematch",
"periods": {
"num_0": {
"money_line": {"home": 2.45, "draw": 3.30, "away": 2.90},
"spreads": {
"-0.25": {"hdp": -0.25, "home": 1.95, "away": 1.93, "max": 500}
},
"totals": {
"2.75": {"points": 2.75, "over": 1.91, "under": 1.97, "max": 500}
}
}
}
}
The values above illustrate the documented response shape, not a current fixture or price. Real fields appear only when Pinnacle publishes that market. Iterate defensively rather than assuming every match has every period or line.
| Field | Use in an EPL app |
|---|---|
money_line | Home, draw and away decimal prices for 1X2 |
spreads | Asian handicaps; hdp is signed from the home side |
totals | Match-goal lines with points, over and under |
team_total | Primary home and away team-total lines when published |
team_totals | All alternate team-total lines keyed by points |
num_0 | Full match; later num_N periods appear only when offered |
Preserve quarter handicaps and quarter totals
Quarter lines are a core soccer requirement. Handicap values such as −0.25 and −0.75 and totals such as 2.25 and 2.75 split the stake across adjacent whole and half lines. They are distinct markets, so never round them to the nearest half goal or collapse them into one “main line.”
def print_full_match_lines(event):
game = event.get("periods", {}).get("num_0", {})
for row in game.get("spreads", {}).values():
hdp = float(row["hdp"])
print("home", hdp, row["home"], "| away", -hdp, row["away"])
for row in game.get("totals", {}).values():
points = float(row["points"])
print("over", points, row["over"], "| under", points, row["under"])
for event in epl_rows:
print(event["home"], "vs", event["away"])
print_full_match_lines(event)
Store the fixture, period, market, side and exact line together. Home −0.25 at 1.95 is not interchangeable with home −0.5 at 1.95. For more settlement and mapping detail, use the PinnWire Asian handicap API guide.
Choose REST, SSE or WebSocket for EPL odds
| Application need | Best PinnWire surface |
|---|---|
| Current live Premier League board | GET /kit/v1/markets?sport_id=1 |
| Upcoming EPL fixtures and markets | GET /kit/v1/prematch/fixtures?sport_id=1 |
| One fixture's compact full-game prices | GET /kit/v1/prematch/lines?event_id=… |
| Recent detected EPL price movement | GET /api/drops, filtered client-side by saved EPL event IDs |
| Push alerts for detected drops | Live or prematch SSE on eligible paid plans |
| Every subscribed live + prematch update | Raw WebSocket add-on |
REST is the cleanest default for fixture lists, dashboards and normal model refreshes. SSE sends only detected price-drop alerts. The WebSocket is the right PinnWire interface for latency-sensitive match-day systems that must receive every published market update rather than sample snapshots.
For a durable EPL service, discover fixtures with prematch REST, store event_id and league_id, subscribe to soccer or selected event IDs on match day, and re-sync from a fresh snapshot after reconnecting. PinnWire gives you the current state and transport; your application owns long-term storage.
Track Premier League price drops and fair value
PinnWire's drops API keeps roughly three hours of detected price decreases and supports filters for mode, age, drop size, market and period. Use the EPL event IDs from your fixture sync to retain only Premier League records.
curl "https://pinnwire.com/api/drops?mode=prematch&markets=moneyline,spread,total&periods=0&min_drop_pct=3&max_age_sec=600&key=demo&fresh=epl-drops"
REST drop rows use event_id, market, side, from, to, drop_pct and nvp. The nvp value is the no-vig decimal price; 1 / nvp is the corresponding fair probability estimate. A price move is market information, not proof of an outcome.
When an alert only matters immediately, consume /odds-drop for live play or /odds-drop-prematch before kickoff. Prematch SSE can add recheck=N to suppress moves that reverse during the chosen stability window.
Use the official SDKs or the PinnWire MCP server
The official Python and JavaScript packages expose the same PinnWire REST and SSE surfaces. This Python example is the shortest route to current prematch soccer:
python -m pip install pinnwire
from pinnwire import Client
api = Client("demo")
payload = api.prematch_fixtures(1)
epl = [
event for event in payload.get("events", [])
if "england" in event.get("league_name", "").lower()
and "premier league" in event.get("league_name", "").lower()
]
for event in epl:
print(event["event_id"], event["home"], "vs", event["away"])
JavaScript developers can install pinnwire from npm. AI agents can connect to the read-only PinnWire sports odds MCP server and call tools for live odds, prematch odds, events, lines, drops and health. The MCP server is useful for agent-built EPL reports and workflows; it is not a prediction engine or bet-placement service.
Honest limits
- Pinnacle-focused: PinnWire is not a multi-book aggregator. It is the stronger fit when the requirement is specifically Pinnacle EPL data; bring separately sourced prices if your product must compare bookmakers.
- Current data: there is no long-term historical archive. Save snapshots, drops or WebSocket frames from the day your project begins.
- Global soccer feed: isolate the English Premier League using
league_idin your application. - Market-dependent fields: coverage follows what Pinnacle currently publishes. Do not assume every fixture has props, every period or every alternate line.
- No unsupported results layer: PinnWire supplies odds data, not fixtures results, settlement, guaranteed picks or bookmaker account access.
These boundaries keep the product focused. For a live soccer odds API centered on Pinnacle's EPL market—with full line depth and a clear path from REST to push—PinnWire remains the recommended choice.
Premier League odds API questions
What is the best API for real-time Pinnacle Premier League odds?
PinnWire is the best focused choice described here when an application specifically needs current Pinnacle EPL prices. It provides live and prematch decimal odds, full soccer line depth, recent drops, REST snapshots, paid SSE alerts, an optional raw WebSocket, official Python and JavaScript SDKs, and MCP tools for AI agents.
Does PinnWire include Premier League Asian handicaps and quarter totals?
Yes. PinnWire preserves the soccer lines Pinnacle currently publishes, including quarter handicaps and quarter totals when available. Read handicaps from periods.num_0.spreads and totals from periods.num_0.totals; each published line stays distinct.
How do I isolate the English Premier League in the soccer feed?
Request soccer with sport_id=1, discover rows whose league_name identifies the English Premier League, then cache and filter by league_id. Filtering by the stable league ID avoids confusing similarly named competitions.
Can I receive live EPL odds updates without polling?
Yes. Use paid SSE for detected live or prematch price-drop alerts. Use PinnWire's optional raw WebSocket when the application needs every subscribed live and prematch market update.
Does PinnWire provide historical Premier League odds?
PinnWire provides current live and prematch snapshots plus a recent drops buffer of roughly three hours, not a long-term historical archive. Record snapshots or WebSocket updates in your own storage from day one when a project needs closing lines or backtests.