Programmatic access to our football prediction data, scoped to your subscription. Base URL: https://predygo.com
The Automated API is a $29.99/mo add-on available on the Predygo Pro and Predygo Elite plans. The free tier does not include API access, and the add-on cannot be purchased or added onto a free account. To use the API you must first be on an active Pro or Elite plan and then add the Automated API add-on — a free account can never obtain an API key. It includes live (in-play) picks right in the feed — delivered through the API, not a Telegram channel. Live is gated to your plan's live-drops limit: the top picks by confidence at any given time (see the tier table below; admin keys uncapped). Your feed is also scoped to your plan's markets, and the total number of picks it returns is limited to your plan's pick quantity (the same daily allotment your subscription already grants). Get your key from Profile & Billing → Automated API in your account (admins: My account → Your API key). Every request needs your key, sent as a bearer token or header. Keys are shown once; rotate to replace a lost key.
curl -H "Authorization: Bearer YOUR_KEY" https://predygo.com/api/v1/predictions
# or
curl -H "X-API-Key: YOUR_KEY" https://predygo.com/api/v1/predictions
tiers array (e.g. ["pro","elite"]) telling you which tiers that pick went to, so you can double-check or filter further on your end.| Method / path | Returns |
|---|---|
GET /api/v1/predictions | The active betting slate sent to your tier — actively live (in-play) picks first, ranked by confidence, then upcoming pre-game. Use ?source=live for just the live board. |
GET /api/v1/results | Recently graded results (win/loss/push/void) sent to your tier — last 2 days by default (?days=N, up to 7). For settling recent bets, not bulk history. |
GET /api/v1/me | Your key's scope, tier and rate limit. |
| Param | Meaning |
|---|---|
league | Exact league name filter, e.g. ?league=England%20Championship |
source | /predictions — ?source=live returns ONLY the actively in-play board; ?source=pregame only upcoming. Default returns both, live first. |
limit | Max rows. Scoped feeds: 1–500 (default 200). Admin all=true feeds: 1–5000 (default 2000), paged with offset. |
offset | Admin all=true only — skip this many rows for paging (default 0). |
days | /results — how many days back to return. Tier keys: default 2, max 7. Admin all=true: default 90, max 365. |
all | Admin keys only. ?all=true returns the FULL list from the source model, names normalized. On /predictions: every upcoming ungraded prediction, not just the ones PredyGo posted (min sets a confidence floor, e.g. &min=70). On /results: all graded rows including model-only ones never posted, over the last days (default 90, max 365). Each row has posted:true/false so you can tell which were dropped. Non-admin keys get 403. |
Every prediction row includes posted (was it dropped to a channel) and key (row_id::bet, a stable identifier for de-duping). On the full list, odds is the raw source decimal.
{
"tier": "elite",
"scope": "all markets, pre-game + live, up to 50 picks/day",
"pick_limit": 50, // max pre-game picks (your plan's daily quantity; null = admin/uncapped)
"live_limit": 20, // max LIVE (in-play) picks included — top N by confidence (null = uncapped)
"live_count": 3, // how many live (in-play) picks are in THIS response
"count": 2, // total predictions returned (live are listed FIRST, best confidence first)
"predictions": [
{
"id": 1234,
"league": "England Championship",
"home": "Burnley", "away": "Charlton",
"market": {
"code": "VISITA MARCA",
"name": "Away team to score",
"canonical": { "market": "team_totals", "team": "away", "name": "Over", "point": 0.5 }
},
"confidence": 97,
"odds": "6.50 / +550",
"kickoff": "2026-10-18 15:00:00",
"source": "pregame", // "pregame" or "live"
"tiers": ["pro","elite"], // which subscription tiers this pick was sent to
"result": "pending",
"score": null,
"posted_at": "2026-10-18T09:55:00Z",
"graded_at": null
}
]
}
results is identical but keyed results, with result set to win/loss/push/void and score filled. /api/v1/me returns your pick_limit and live_limit too.
Three steps: get your key, pull the feed, render it. Base URL is https://predygo.com. Every call is read-only and scoped to your plan.
1. Pull upcoming predictions (shell):
curl -H "Authorization: Bearer YOUR_KEY" \
"https://predygo.com/api/v1/predictions?limit=20"
2. Pull graded results for a "recent form" widget (last 2 days by default; add ?days=7 to look back further):
curl -H "Authorization: Bearer YOUR_KEY" \
"https://predygo.com/api/v1/results?limit=50&days=7"
3. Render it on your page (browser JS — keep the key on your server, never in client code; proxy the call):
// On YOUR server (key stays secret), expose a small proxy:
const r = await fetch("https://predygo.com/api/v1/predictions?limit=10", {
headers: { "Authorization": "Bearer " + process.env.PREDYGO_KEY }
});
const { predictions } = await r.json();
// predictions[i] = { league, home, away, market:{code,name}, confidence, odds, kickoff, source }
predictions.forEach(p => {
console.log(p.home + " v " + p.away + " — " + p.market.name + " @ " + p.confidence + "%");
});
?all=true to /predictions (the full model list, each row flagged posted:true/false) and to /results (adds graded model-only rows over the last days, default 90). Page the full lists with limit (up to 5000) and offset.Live picks come through this same API — no Telegram channel, no separate endpoint. They arrive in the /predictions feed right beside pre-game picks, flagged with "source": "live" (pre-game picks are "source": "pregame"). A live pick's kickoff is already in the past and it carries the current in-play confidence and, when priced, odds.
The feed is ordered for live betting: actively live games come first, ranked by the best predictions (highest confidence), so the most relevant in-play picks are always at the top of the response. Each response also includes live_count — how many live picks it contains.
The API's live board is deeper than the Telegram live channel — it returns the top live picks by confidence up to your plan's API live limit:
| Plan | Live picks in the feed |
|---|---|
| Predygo Pro | Top 10 by confidence |
| Predygo Elite | Top 20 by confidence |
| Admin | Uncapped |
Live picks are never hidden by your daily pick quota — pick_limit bounds the pre-game slate, but the live board always comes through on top. As games finish and new ones kick off, the live set rolls over on its own.
To pull ONLY the live board, add ?source=live (or ?source=pregame for upcoming only):
# just the actively in-play picks, best first
curl -H "Authorization: Bearer YOUR_KEY" "https://predygo.com/api/v1/predictions?source=live"
live_limit and the current live_count are shown on every /predictions response, and live_limit on /api/v1/me.Your key returns the data your subscription includes — the same markets your plan receives, plus live in-play picks up to your plan's live-drops limit, and no more than your plan's total daily pick quantity. Admin keys return everything, uncapped. Your exact scope, pick_limit and live_limit are shown on /api/v1/me and in your key panel. Scope follows your plan automatically: if you upgrade, your key widens; if a plan lapses, it narrows.
Tiers nest. A key sees every pick published to its tier and every tier below it: Elite returns Elite + Pro + Free, Pro returns Pro + Free, Free returns Free. An admin key returns every published pick regardless of tag. (Each pick lists the tiers it was published to in its tiers field.)
| Plan | Data scope | Daily picks | Live picks |
|---|---|---|---|
| Predygo Free | No API access — not available on the free tier | ||
| Predygo Pro | all markets, pre-game + live, up to 25 picks/day | 25 / day | Top 10 by confidence |
| Predygo Elite | all markets, pre-game + live, up to 35 picks/day | 35 / day | Top 20 by confidence |
| Admin | all markets incl. live | Uncapped | Uncapped |
This table reflects our live plan configuration — markets, pick quantities and live limits all come straight from each plan and update automatically when a plan changes.
Each key is for one connection. The first client (IP address) to use a key claims it; while that connection is active, requests from any other IP get 429 with "code":"key_in_use". The key frees up automatically after 15 min of inactivity, so moving between networks (home → mobile) just works after a short pause. If you need the feed in more than one place at once, use more than one plan — sharing a single key across machines or reselling it will lock everyone but the first connection out.
Two ceilings apply, both set by your plan tier:
| Tier | Per minute | Per day |
|---|---|---|
| Pro | 60/min | 5,000/day |
| Elite | 120/min | 20,000/day |
Go over either and you get 429 Too Many Requests with a Retry-After header — back off and retry after the seconds it names (the per-minute window rolls continuously; the daily cap resets at 00:00 UTC). Your exact limits are always returned by /api/v1/me. The live feed updates as picks are posted and graded, so polling every few seconds to a minute is plenty and stays well under the limit.
This API is built for live betting — fast reads of the picks that are active right now. It is not a bulk-export or scraping tool: the results window is capped at 7 days, page sizes are limited, and each key only ever sees the picks and markets its own tier receives. Pulling more than your live bets need, or hammering the endpoints to harvest data, will trip the rate limit and may get the key revoked.
| Status | Meaning |
|---|---|
401 | Missing or invalid key. |
403 | API access not enabled for this account. |
429 | Rate limit exceeded (per-minute or daily cap), or the key is already in use from another connection ("code":"key_in_use"). Check Retry-After. |