On this page

API Docs

The same fixtures, predictions and probabilities shown on this site, as a REST API, plus a real-time WebSocket for live scores. Start with a 14-day trial (card required, nothing charged until it ends); higher limits on paid plans. Also available as an MCP server for AI agents.

Base URL:  https://api.predictiqpro.com
Auth:      Authorization: Token YOUR_API_KEY

Resources

AreaEndpointsReference
Matches/fixtures/, /lineups/{id}Fixtures & lineups
Tables/standings/Standings
Predictions/predictions/live, /predictions/{id}Predictions
Market analysis/market-analysis/{id}, /wom/{id}Market analysis
Live/live/feed, /live/wsLive scores feed
Teams, players, venues/api/v2/teams/, /players/, /venues/v2 API
Accuracy/status/accuracyAccuracy & status

Authentication

Send your API key in the Authorization header on every request:

Authorization: Token YOUR_API_KEY

Get a key at predictiqpro.com/register. 14-day trial: a card is required and nothing is charged until it ends. WebSockets can’t set headers in a browser, so they take the key as a ?key= query parameter instead. Endpoints marked Public need no key.

Base URL & limits

https://api.predictiqpro.com

Request limits depend on your plan; see pricing. Every authenticated response carries X-RateLimit-Limit-Hourly and X-RateLimit-Remaining-Hourly headers (plus daily and monthly ones where your plan has those limits), so you can see where you stand before you hit a 429. GET /account/me shows current usage.

Errors

Errors use standard HTTP status codes. 401 means a missing or invalid key, 404 an unknown id and 429 a rate limit reached.

Original endpoints return a detail message:

{ "detail": "Missing or malformed Authorization header" }

v2 endpoints return a structured error:

{ "success": false, "error": { "code": "NOT_FOUND", "message": "No player found with id 1" } }

And a successful v2 response looks like this:

{
  "success": true,
  "data": { ... },
  "meta": { "last_updated": "2026-10-05T09:30:00+00:00", "source": "internal" },
  "pagination": { "limit": 50, "offset": 0, "total": 312 }
}

Quickstart

curl https://api.predictiqpro.com/predictions/live \
  -H "Authorization: Token YOUR_API_KEY"

Import the collection into Postman, add your key to the api_key variable, and run Live and upcoming predictions first.

Free sandbox

Build and test your integration before you add a card. Create a free account, copy your key and call the sandbox routes. They return invented matches in the same format as the live API, marked "sample": true, limited to 120 calls an hour. Live predictions, odds and market data need the 14-day trial or a paid plan.

# No card needed. Sample data in the same format as the live API.
curl -H "Authorization: Token YOUR_API_KEY" \
  https://api.predictiqpro.com/sandbox/predictions/live

# One sample match (ids 900001 to 900003)
curl -H "Authorization: Token YOUR_API_KEY" \
  https://api.predictiqpro.com/sandbox/predictions/900001

Create a free account to get a key.

Fixtures & lineups

Matches across every covered league, with scores, kickoff times and confirmed line-ups.

MethodEndpointDescriptionAccess
GET/fixtures/
league_id, status, date_from, date_to
List matches. Filter by league, status (NS, LIVE, FT) or date range.API key
GET/fixtures/{fixture_id}
fixture_id
One match: teams, score, kickoff, league.API key
GET/lineups/{fixture_id}
fixture_id
Line-ups and team context for a match, when published.API key

Standings

League tables built from finished and in-play matches.

MethodEndpointDescriptionAccess
GET/standings/
league_id
Current-season league table: played, results, goals and points. Includes matches in play. Without league_id it lists leagues that played in the last 45 days.API key

News

MethodEndpointDescriptionAccess
GET/news
category, tag, limit, offset
Published articles, newest first.Public
GET/news/categoriesAvailable article categories.Public
GET/news/{slug}
slug
One article.Public

Predictions

Win/draw/loss probabilities, expected goals and goal markets. Probabilities are the market consensus where market data exists (basis: market_consensus) and the statistical model otherwise (basis: statistical_model); the model’s own numbers are always included as model_prob_*.

MethodEndpointDescriptionAccess
GET/predictions/livePredictions for live and upcoming matches, with live momentum for matches in play.API key
GET/predictions/{fixture_id}
fixture_id
Full prediction for one match.API key
GET/intelligence/{fixture_id}
fixture_id
Injuries, line-up and tactical signals gathered for a match. Returns available: false when none have been collected yet.API key
GET/teams/{team_id}/intelligence
team_id, limit
Recent collected intelligence for a team: aggregate impact scores and key factors.API key

Market analysis

De-vigged market probabilities and movement signals, for comparing the model against the market. Coverage varies by match.

MethodEndpointDescriptionAccess
GET/market-analysis/{fixture_id}
fixture_id, market
Market movement analysis: direction, consensus probabilities and sudden moves.API key
GET/wom/{fixture_id}
fixture_id
How far the market has moved from its opening position for a match.API key
GET/odds/{fixture_id}
fixture_id
Market snapshot behind the consensus for a match, where available.API key
GET/odds/history/{fixture_id}
fixture_id, market (default 1X2)
How the market moved over time.API key

Accuracy & status

Published on purpose, no key needed: measured against finished matches the model predicted before kickoff.

MethodEndpointDescriptionAccess
GET/statusAPI status with an accuracy summary.Public
GET/status/accuracyFull report: accuracy, log loss, Brier score and calibration.Public
GET/status/accuracy/historyThe trend across recent evaluation runs.Public

Live scores feed

Every match in play, straight from the live feed rather than waiting on a database sync. Poll it every 20 seconds, or use the WebSocket below to have changes pushed to you.

MethodEndpointDescriptionAccess
GET/live/feedAll matches in play: teams, logos, score, minute, period.Public
curl https://api.predictiqpro.com/live/feed

Live WebSocket

DEVELOPER PLAN AND UP

One connection streams every match in play. You get a full snapshot on connect, then only what changes: scores, the minute, goals and matches that have ended. Keys on plans below Developer can read the same data from GET /live/feed, refreshed every 20 seconds. See pricing.

Connect

const ws = new WebSocket(
  "wss://api.predictiqpro.com/live/ws?key=YOUR_API_KEY"
);

ws.onmessage = (event) => {
  const msg = JSON.parse(event.data);

  if (msg.type === "snapshot") {
    // every match in play right now
    console.log(msg.matches);
  }
  if (msg.type === "update") {
    msg.matches.forEach((m) =>
      console.log(m.home.name, m.home_score, "-", m.away_score, m.away.name)
    );
    msg.goals.forEach((g) => console.log("GOAL", g));
  }
};

Browsers cannot set headers on a WebSocket, so the key travels as the key query parameter. For a public web page, connect from your own server and relay the messages, so your key is never visible in the page.

Messages

  • snapshot sent once, right after connecting: every match in play.
  • update sent when something changed: the changed matches, any goals, and ids of matches that ended.
  • heartbeat sent about every 15 seconds when nothing changed. If you hear nothing for 45 seconds, reconnect.
  • Send the text ping any time and you get back {"type":"pong"}.

Each match:

{
  "id": 587901,
  "league": { "id": 9, "name": "Premier League", "logo": "https://…" },
  "home": { "id": 1, "name": "Arsenal", "logo": "https://…" },
  "away": { "id": 2, "name": "Chelsea", "logo": "https://…" },
  "home_score": 1,
  "away_score": 0,
  "minute": 56,
  "period": "2nd_half",
  "status": "LIVE"
}

An update message:

{
  "type": "update",
  "matches": [ /* only the matches that changed */ ],
  "goals": [
    { "match_id": 587901, "side": "home", "home_score": 1, "away_score": 0, "minute": 56 }
  ],
  "ended": [ 587902 ],
  "ts": 1759560000
}

Close codes

4401Missing or invalid API key.
4403Your plan does not include the real-time feed (Developer and up). Use GET /live/feed instead.
4429Too many connections (3 per key).

Scores are regulation-time scores. Reconnect with a growing delay (1s, 2s, 4s, up to 30s) and read GET /live/feed while you are disconnected.

Live arena

Momentum and match statistics behind the 3D arena. The arena on any fixture is included from the Developer plan up; the stats and history endpoints are open.

MethodEndpointDescriptionAccess
GET/live/arena/{fixture_id}/stats
fixture_id
Possession, shots, corners, cards, xG and the pressure series. Unreported values are null, never 0.Public
GET/live/arena/{fixture_id}/momentum-history
fixture_id
Per-minute momentum with goal markers.Public
WS/live/arena/{fixture_id}/ws?key=
fixture_id, key
Momentum pushed every few seconds for one match.Plan

Arena embed

BUSINESS PLAN

Show the 3D arena on your own site with one iframe. It runs live for a match in play, or replays a finished match. What it draws is real match data: pressure, score and statistics. It does not move a ball or players, because no on-pitch position data is part of the feed.

Your embed key

  • One key per account, on the Live arena embed card of your dashboard.
  • You choose up to 3 sites that may show it. Subdomains are included, so example.com also allows app.example.com.
  • predictiqpro.com always works, so you can preview. With an empty list the embed shows nowhere else.
  • Making a new key stops the old one at once; anything still using it goes blank.
  • The key is not an API key. It only lets the arena load and gives no access to your data.

Embedding

<iframe src="https://predictiqpro.com/embed/arena/{match_id}?key=YOUR_EMBED_KEY"
  width="100%" height="520" frameborder="0" allowfullscreen></iframe>

{match_id} is the same id the REST API uses, so a match from GET /live/feed drops straight in.

URL options

The arena starts with every layer on. Add options to the address to change what it draws before the first frame, for a small panel or next to a scoreboard you already show.

<iframe src="https://predictiqpro.com/embed/arena/{match_id}?key=YOUR_EMBED_KEY&mode=replay&dim=2&off=wave,rings&quality=low"
  width="100%" height="520" frameborder="0" allowfullscreen></iframe>
OptionValuesEffect
modelive, replaylive follows a match in play. replay plays back a finished match from its recorded pressure data.
offlayer names, comma-separatedStart with these layers hidden.
onlayer names, comma-separatedStart with these layers shown. If a name is in both lists, on wins.
dim2, 3A flat top-down pitch (2) or the 3D stadium (3). Default 3.
qualitylow, med, highHow hard the 3D view works. low draws a thinner crowd and skips smoothing, for slow devices.
camfollow, fixedWhether the 3D camera drifts with the play or holds one angle. Ignored in 2D.

Layers

NameWhat it is
scoreboardScore, clock and team names under the pitch
labelFloating tag saying who is on top
wavePressure chart, mirrored for the two teams
statsPossession, shots, corners, cards and xG, when reported for the match
ringsThe last 5, 10 and 15 minute rings
boardsPitch-side boards (3D only)
crowdThe stands (3D only)
brandPredictIQ Pro tag and the data note
controlsReplay bar: play, pause, speed and scrub (replay only)

Names that are not on this list are ignored, so a typo does nothing rather than breaking the page. The address has the last word: the arena always starts in the state you asked for.

Which matches work

  • Live: a match in play with reported pressure data. Check GET /live/feed first.
  • Replay: a finished match with recorded pressure data. Without it the embed says so instead of drawing an empty pitch.

What you will see

ResultMeaning
Arena rendersThe key is valid, the plan includes the arena and your site is on the list.
"key is not valid"The key was replaced or mistyped. Copy the current one from your dashboard.
"does not have the live arena"The account behind the key does not have the arena in its plan.
Empty frameThe page showing the embed is not on your list. The browser refuses to draw it; this is enforced by the site, not by the page.

Live demo

This isn’t a screenshot. It’s the real /predictions/live endpoint, rendered as one of the drop-in embeddable widgets.

Log in to render this exact widget with your own key, or see it live on the widgets page.

Start 14-day trial

v2 · Events

v2 wraps every response in { success, data, meta } and paginates lists with limit and offset (default 50, max 200). The index at GET /api/v2 lists every resource.

MethodEndpointDescriptionAccess
GET/api/v2/events/
date, date_from, date_to, league_id, team_id, status, limit, offset
List events.API key
GET/api/v2/events/liveEvents in play.API key
GET/api/v2/events/{event_id}
event_id
One event.API key
GET/api/v2/events/{event_id}/predictions
event_id
The model’s prediction for the event.API key
GET/api/v2/events/{event_id}/odds
event_id
Market snapshot for the event.API key
GET/api/v2/events/{event_id}/lineups
event_id
Line-ups for the event.API key

v2 · Leagues & teams

MethodEndpointDescriptionAccess
GET/api/v2/leagues/All leagues.API key
GET/api/v2/leagues/{league_id}
league_id
One league.API key
GET/api/v2/leagues/{league_id}/standings
league_id
League table.API key
GET/api/v2/leagues/{league_id}/fixtures
league_id
A league’s fixtures.API key
GET/api/v2/teams/Teams, with computed stats.API key
GET/api/v2/teams/{team_id}
team_id
One team.API key
GET/api/v2/teams/{team_id}/fixtures
team_id
A team’s fixtures.API key
GET/api/v2/teams/{team_id}/stats
team_id
A team’s season statistics.API key

v2 · Players, managers & venues

MethodEndpointDescriptionAccess
GET/api/v2/players/
search, position, limit, offset
Search and list players.API key
GET/api/v2/players/{player_id}
player_id
A player profile.API key
GET/api/v2/players/{player_id}/stats
player_id
Player statistics.API key
GET/api/v2/players/{player_id}/transfers
player_id
Transfer history.API key
GET/api/v2/managers/Managers.API key
GET/api/v2/managers/{manager_id}
manager_id
One manager.API key
GET/api/v2/referees/Referees.API key
GET/api/v2/referees/{referee_id}
referee_id
One referee.API key
GET/api/v2/venues/Stadiums and venues.API key
GET/api/v2/venues/{venue_id}
venue_id
One venue.API key

v2 · TV & social

MethodEndpointDescriptionAccess
GET/api/v2/tv-channels/TV channels.API key
GET/api/v2/broadcasts/Which channel shows which match.API key
GET/api/v2/social/Social links for teams and competitions.API key

Account

MethodEndpointDescriptionAccess
POST/register/Create an account and get an API key. Body: { email, password }.Public
GET/account/meYour plan, keys and current usage.API key
GET/account/usageUsage over time.API key
POST/account/regenerate-keyIssue a new API key and revoke the old one.API key
POST/account/regenerate-widget-keyIssue a new widget key.API key

Widgets & MCP

Drop ready-made match and prediction widgets into your own site with the widgets, or let AI agents call this data directly through the MCP server. New to the API? Follow a step-by-step quickstart guide in Python or JavaScript.