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_KEYResources
| Area | Endpoints | Reference |
|---|---|---|
| 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/ws | Live scores feed |
| Teams, players, venues | /api/v2/teams/, /players/, /venues/ | v2 API |
| Accuracy | /status/accuracy | Accuracy & status |
Authentication
Send your API key in the Authorization header on every request:
Authorization: Token YOUR_API_KEYGet 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.comRequest 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/900001Create a free account to get a key.
Fixtures & lineups
Matches across every covered league, with scores, kickoff times and confirmed line-ups.
| Method | Endpoint | Description | Access |
|---|---|---|---|
| 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.
| Method | Endpoint | Description | Access |
|---|---|---|---|
| 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
| Method | Endpoint | Description | Access |
|---|---|---|---|
| GET | /newscategory, tag, limit, offset | Published articles, newest first. | Public |
| GET | /news/categories | Available 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_*.
| Method | Endpoint | Description | Access |
|---|---|---|---|
| GET | /predictions/live | Predictions 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}/intelligenceteam_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.
| Method | Endpoint | Description | Access |
|---|---|---|---|
| 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.
| Method | Endpoint | Description | Access |
|---|---|---|---|
| GET | /status | API status with an accuracy summary. | Public |
| GET | /status/accuracy | Full report: accuracy, log loss, Brier score and calibration. | Public |
| GET | /status/accuracy/history | The 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.
| Method | Endpoint | Description | Access |
|---|---|---|---|
| GET | /live/feed | All matches in play: teams, logos, score, minute, period. | Public |
curl https://api.predictiqpro.com/live/feedLive WebSocket
DEVELOPER PLAN AND UPOne 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
snapshotsent once, right after connecting: every match in play.updatesent when something changed: the changed matches, any goals, and ids of matches that ended.heartbeatsent about every 15 seconds when nothing changed. If you hear nothing for 45 seconds, reconnect.- Send the text
pingany 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
| 4401 | Missing or invalid API key. |
| 4403 | Your plan does not include the real-time feed (Developer and up). Use GET /live/feed instead. |
| 4429 | Too 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.
| Method | Endpoint | Description | Access |
|---|---|---|---|
| GET | /live/arena/{fixture_id}/statsfixture_id | Possession, shots, corners, cards, xG and the pressure series. Unreported values are null, never 0. | Public |
| GET | /live/arena/{fixture_id}/momentum-historyfixture_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 PLANShow 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.comalso allowsapp.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>| Option | Values | Effect |
|---|---|---|
mode | live, replay | live follows a match in play. replay plays back a finished match from its recorded pressure data. |
off | layer names, comma-separated | Start with these layers hidden. |
on | layer names, comma-separated | Start with these layers shown. If a name is in both lists, on wins. |
dim | 2, 3 | A flat top-down pitch (2) or the 3D stadium (3). Default 3. |
quality | low, med, high | How hard the 3D view works. low draws a thinner crowd and skips smoothing, for slow devices. |
cam | follow, fixed | Whether the 3D camera drifts with the play or holds one angle. Ignored in 2D. |
Layers
| Name | What it is |
|---|---|
scoreboard | Score, clock and team names under the pitch |
label | Floating tag saying who is on top |
wave | Pressure chart, mirrored for the two teams |
stats | Possession, shots, corners, cards and xG, when reported for the match |
rings | The last 5, 10 and 15 minute rings |
boards | Pitch-side boards (3D only) |
crowd | The stands (3D only) |
brand | PredictIQ Pro tag and the data note |
controls | Replay 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/feedfirst. - Replay: a finished match with recorded pressure data. Without it the embed says so instead of drawing an empty pitch.
What you will see
| Result | Meaning |
|---|---|
Arena renders | The 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 frame | The 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 trialv2 · 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.
| Method | Endpoint | Description | Access |
|---|---|---|---|
| GET | /api/v2/events/date, date_from, date_to, league_id, team_id, status, limit, offset | List events. | API key |
| GET | /api/v2/events/live | Events in play. | API key |
| GET | /api/v2/events/{event_id}event_id | One event. | API key |
| GET | /api/v2/events/{event_id}/predictionsevent_id | The model’s prediction for the event. | API key |
| GET | /api/v2/events/{event_id}/oddsevent_id | Market snapshot for the event. | API key |
| GET | /api/v2/events/{event_id}/lineupsevent_id | Line-ups for the event. | API key |
v2 · Leagues & teams
| Method | Endpoint | Description | Access |
|---|---|---|---|
| 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}/standingsleague_id | League table. | API key |
| GET | /api/v2/leagues/{league_id}/fixturesleague_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}/fixturesteam_id | A team’s fixtures. | API key |
| GET | /api/v2/teams/{team_id}/statsteam_id | A team’s season statistics. | API key |
v2 · Players, managers & venues
| Method | Endpoint | Description | Access |
|---|---|---|---|
| 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}/statsplayer_id | Player statistics. | API key |
| GET | /api/v2/players/{player_id}/transfersplayer_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
| Method | Endpoint | Description | Access |
|---|---|---|---|
| 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
| Method | Endpoint | Description | Access |
|---|---|---|---|
| POST | /register/ | Create an account and get an API key. Body: { email, password }. | Public |
| GET | /account/me | Your plan, keys and current usage. | API key |
| GET | /account/usage | Usage over time. | API key |
| POST | /account/regenerate-key | Issue a new API key and revoke the old one. | API key |
| POST | /account/regenerate-widget-key | Issue 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.