FPL Intelligence - Picks, Optimizer, Watchlist, History avatar

FPL Intelligence - Picks, Optimizer, Watchlist, History

Pricing

from $50.00 / 1,000 gameweek picks generateds

Go to Apify Store
FPL Intelligence - Picks, Optimizer, Watchlist, History

FPL Intelligence - Picks, Optimizer, Watchlist, History

Fantasy Premier League intelligence: weekly captain & transfer picks, wildcard optimizer, mini-league insights, price-change predictor, manager dashboard, live tracker, 10 seasons of history.

Pricing

from $50.00 / 1,000 gameweek picks generateds

Rating

5.0

(1)

Developer

Omar Eldeeb

Omar Eldeeb

Maintained by Community

Actor stats

2

Bookmarked

7

Total users

0

Monthly active users

a day ago

Last modified

Features

Limited permissions

Share

FPL Intelligence — Picks, Optimizer, Watchlist, History

Fantasy Premier League intelligence as a one-call API. Replaces parts of Fantasy Football Hub (£19.99/yr), FPL Review ($5/mo), Fantasy Football Scout (£25/yr), and LiveFPL Premium with pay-per-event pricing — and uniquely gives you the full historical archive (2016-17 → 2025-26) for FPL model training.

What does this Actor do?

Seven modes, each producing a distinct output shape:

  • gameweek_picks — top 5 captain candidates / transfer-in targets / differentials / sell candidates for the upcoming gameweek, with composite scoring + reason tags. Optional Gemini AI verdict.
  • wildcard_optimizer — optimal 15-man squad given a budget, position quotas (2/5/5/3), 3-per-club cap, lock/exclude lists. Auto-picks captain + vice + formation.
  • mini_league_intel — given any league ID, surfaces captain spread + true differential picks (high in this league, low globally) + you-vs-the-field deltas.
  • price_change_predictor — tonight's predicted risers and fallers from net-transfer-rate vs ownership (community-known FPL price algorithm).
  • manager_dashboard — given a manager ID, full season trajectory + chip usage + best/worst captains (with real points from live data) + per-transfer P&L over a 5-GW window.
  • live_tracker — single snapshot OR pollable refresh during a live gameweek. Per-manager live points + per-league live standings.
  • historical_seasons — 10 years of FPL data via the vaastav community archive. Per-gameweek, season totals, fixtures, or players. schemaTier flag (full / no_xg / basic) documents per-season coverage honestly.

All data is pulled from the public Fantasy Premier League API (no auth, no key, no proxy required) plus the vaastav GitHub archive. Stress-tested at 250 concurrent requests with zero rate-limiting (full report in _research/fpl-stress/ if interested).

Why use this Actor?

  1. FPL managers scheduling weekly picks runs — pipe captain/transfer recommendations to Slack/Discord/Sheets without writing API code.
  2. Mini-league competitors tracking the field — see who captained what, find the player who's 80% owned in your league but 5% globally, and get differentials before your rivals.
  3. Price-change watchers running a nightly job — predict tonight's £0.1m moves before they hit, time your transfers around the threshold.
  4. Data scientists / model builders — pull every per-gameweek snapshot from 2016-17 onwards with a single mode call. xG/xA/xGI fields available from 2021-22.
  5. FPL content creators (podcasters, newsletter writers, Twitter analysts) — generate weekly captain briefings, Gemini-powered verdicts, mini-league scouting reports.

How to use this Actor

  1. Pick a mode (see modes list above).
  2. Fill in the relevant section's fields (manager IDs, league IDs, gameweek, etc.).
  3. Hit Run, or schedule it on Apify's scheduler.
  4. Export the dataset as JSON / CSV / Excel, or pipe to a webhook.

Pay per event: you are charged only for the results a run delivers (see Pricing). New Apify accounts get free monthly platform credit, which covers plenty of test runs.

Input examples

1. Gameweek picks (default)

{
"mode": "gameweek_picks",
"picksOptions": {
"topN": 5,
"differentialThresholdPct": 5.0,
"fixtureLookahead": 3
},
"enableAiVerdict": false
}

Returns 4 categories × 5 rows each (captain / transfer-in / differential / sell). Set enableAiVerdict: true to add a 1-paragraph Gemini brief at +$0.05.

2. Wildcard optimizer with budget cap

{
"mode": "wildcard_optimizer",
"optimizerOptions": {
"budget": 100.0,
"lockedPlayers": ["430", "328"],
"excludedTeams": ["1"]
}
}

Locks Haaland (id 430) and Salah (id 328), excludes Arsenal players (team id 1). Returns one row with the optimal 15-man squad, formation, total cost.

3. Mini-league intel for the global Overall league

{
"mode": "mini_league_intel",
"leagueIds": ["314"],
"leagueOptions": {
"topManagersPerLeague": 50,
"compareToManagerId": "1000000"
}
}

Returns a league summary (captain spread + differentials + your-vs-field comparison) plus 50 league_manager rows.

4. Tonight's price changes

{
"mode": "price_change_predictor",
"pricePredictorOptions": {
"minConfidence": 0.5,
"includeNeutral": false
}
}

Returns predicted risers + fallers above 50% confidence. With maxItems you get the most active movers; rows are listed by player ID, so sort by netTransferRate or confidence to rank them.

5. Your season dashboard

{
"mode": "manager_dashboard",
"managerIds": ["1000000"]
}

Returns one dashboard row + one transfer_roi row per transfer you've made (P&L vs the player you sold).

6. Live tracker — poll every 60s during the GW

{
"mode": "live_tracker",
"managerIds": ["1000000"],
"leagueIds": ["314"],
"gameweek": 36,
"liveOptions": { "refreshIntervalSec": 60, "maxSnapshots": 30 }
}

Snapshots every minute for up to 30 polls (~30 min of live coverage).

7. Historical training data — 4 most recent seasons

{
"mode": "historical_seasons",
"historicalOptions": {
"seasons": ["2021-22", "2022-23", "2023-24", "2024-25"],
"dataType": "per_gameweek"
},
"maxItems": 100000
}

Pulls ~22,800 rows × 4 = ~91,200 per-player-per-GW records with full xG/xA fields. About 6 seconds total runtime + ~22 MB of data.

Output

Every row has a type field discriminating its shape. Sample captain_pick:

{
"type": "captain_pick",
"scrapedAt": "2026-05-10T08:48:56.437Z",
"source": "fpl-api",
"player": {
"id": 430, "code": 223094, "webName": "Haaland",
"team": { "id": 13, "name": "Man City", "shortName": "MCI" },
"position": "FWD", "cost": 14.7, "status": "a",
"selectedByPercent": 64.3, "form": 5.5,
"expectedGoalInvolvements": 27.42, "expectedGoalInvolvementsPer90": 0.86,
"epNext": 6, "setPiece": { "penaltiesOrder": 1, "cornersOrder": null, "freekicksOrder": null }
},
"gameweek": 37,
"upcomingFixture": { "id": 362, "home": {...}, "away": {...}, "...": "..." },
"pickScore": 62.7,
"fixtureLookaheadDifficulty": 2.7,
"reasonTags": ["good_form", "set_piece_taker", "easy_fixture", "home_advantage", "xgi_leader", "high_ep_next", "current_dreamteam"],
"rank": 1
}

Data fields per row type

TypeKey fields
captain_pick / transfer_in / differentialplayer (full normalized object), pickScore, reasonTags, rank, upcomingFixture, fixtureLookaheadDifficulty
sell_candidateplayer, reasonTags (e.g. "injured", "form_drop"), rank
optimizer_squadsquad[15] with isStarter/isCaptain/isViceCaptain flags, totalCost, formation, totalExpectedPoints
league_summaryleague, gameweek, topCaptainCounts, topDifferentials, comparedManagerDelta
league_managerleague, manager, rank, lastRank, eventTotal, total, captainElementId
price_change_predictionplayer, predictedDirection (rise/fall/neutral), netTransferRate, confidence, predictedNewCost
manager_dashboardmanager, perGameweek[], chipUsage[], captainHistory[], bestCaptain, worstCaptain, pastSeasons[]
manager_transfer_roimanager, transfer (gw, in, out), pointsAfter5gw, verdict
live_snapshotsnapshotAt, gameweek, manager (live points + XI), league (top managers ranked by live points), bonusFinalized
historical_player_gwseason, schemaTier, name, team, position, round, total_points, expected_goals, value, ... (40+ raw fields)
ai_verdictgameweek, brief, captainRecommendation, topTransferAdvice

Pricing

Pay only for what you use. Every event below is charged from the first one. There are no free events per run; Apify's free monthly credit covers trial runs.

EventPrice
apify-actor-start$0.01 (auto-fired by platform per GB memory)
gameweek-picks-fetched$0.05 (primary — bundles all 4 pick categories)
optimizer-run$0.10
mini-league-analyzed$0.02 (per league)
price-change-predicted$0.005 (per flagged player)
manager-dashboard-fetched$0.01 (per manager)
live-snapshot$0.005 (per snapshot)
historical-snapshot-fetched$0.01 (per season-gameweek pair)
ai-verdict$0.05 (opt-in only)

Typical run costs

WorkflowEventsTotal cost
Weekly captain pick run1 picks + 1 actor-start$0.06
Picks + AI verdict1 picks + 1 ai + 1 start$0.11
Wildcard optimizer1 optimizer + 1 start$0.11
Daily 50-manager mini-league check1 league + 1 start$0.03
100-player price-change scanup to 100 × $0.005 + startup to $0.51
Manager dashboard1 manager + 1 start$0.02
Live tracker (30 snapshots)30 × $0.005 + start$0.16
Full 2024-25 season pull (38 GWs)38 × $0.01 + start$0.39

A typical weekly routine (picks + price check + one mini-league) costs well under $1 a week. If FPL's API is down and a run delivers nothing, no result events are charged (only the platform's apify-actor-start applies).

Tips & advanced options

  • Schedule it. Run gameweek_picks every Friday at 10am UTC, pipe to Slack via Apify's webhook integration. Run price_change_predictor daily at 11pm UTC (~3 hours before FPL's nightly price update).
  • Lock premiums in optimizer. The optimizer maximizes sum of ep_next within constraints, which often surfaces value picks over premium attackers due to the 3-per-club cap. If you prefer star power, set lockedPlayers: ["430"] to force Haaland in.
  • Mini-league differentials. A "differential" in this actor is a player highly owned in your league (>25%) but rare globally (<10%). Useful for finding what the elite are doing that the masses haven't caught onto.
  • Historical schema tiers. Seasons 2022-23 onwards have full xG/xA/xGI/xGC fields. 2020-21 to 2021-22 have most fields but no Opta xG. Earlier seasons (2016-17 to 2019-20) have basic stats only — name/round/total_points/value but no position/team/xP. The schemaTier field on each row tells you what to expect.
  • Live tracker memo. When polling, the actor clears its in-run cache between snapshots so each one fetches fresh live data.
  • Fantasy Premier League data: pulled from fantasy.premierleague.com/api/ — the same JSON endpoints powering the official FPL website. Public, unauthenticated, and used by every FPL tool that exists. Note: this is not an officially documented public API; the Premier League could change or restrict it at any time without notice. The endpoints have been stable since ~2017.
  • Historical archive: pulled from vaastav/Fantasy-Premier-League (MIT-licensed community archive maintained by Vaastav Anand and contributors).
  • All FPL data and team names © Premier League. Use of this actor is for personal analytical use; no warranty of accuracy is implied.
  • Price-change predictions are based on a community-known heuristic (net-transfer-rate-vs-ownership thresholds), not an official FPL formula. Confidence values are empirical, not contractual.

FAQ

Q: How do I find my manager ID? A: Log into the FPL website, navigate to "Points" or "Pick Team", and look at the URL. It will be fantasy.premierleague.com/entry/<your-id>/event/N.

Q: How do I find a mini-league ID? A: From your league's standings page, the URL is fantasy.premierleague.com/leagues/<league-id>/standings/c.

Q: Why is the optimizer leaving budget unspent? A: The optimizer uses a 1-for-1 swap heuristic which can get stuck on the 3-per-club cap (e.g. it can't add Haaland because there are already 3 Man City players in the squad). To work around: pre-lock your premium picks via lockedPlayers, then the optimizer fills the rest around them.

Q: How accurate are the price-change predictions? A: The thresholds (rise > 0.0145, fall < -0.003 net-transfer-rate) are community-known approximations based on observed FPL price-change behavior. FPL never publishes the formula, so accuracy varies but is usually good for high-confidence (≥0.8) flags.

Q: Can I get H2H league data? A: Not in v1. The classic-league endpoints work for H2H members but the H2H-specific endpoints (matches, knockouts) aren't yet wired. File an issue on the actor page and I'll add it.

Q: Does the AI verdict cost extra? A: Yes, $0.05 per verdict. It's opt-in via enableAiVerdict: true in gameweek_picks mode only.

Q: I resurrected a finished run after a gameweek deadline. Why is it still on the old gameweek? A: When gameweek is left empty, a run fixes its gameweek on its first start and keeps it for the rest of its life, including after an Apify restart or a resurrect. That is what stops a restart from delivering and charging the same results twice under a new gameweek. To get the new gameweek, start a new run, or set gameweek explicitly.

Q: Is there a free trial? A: There are no free events per run: every chargeable event is billed from the first one. Apify's free monthly platform credit is enough to try every mode several times.

Q: Will this break when FPL changes their API? A: The endpoints have been stable since ~2017. If they break, every FPL tool breaks at once — the community pressure forces a quick fix. The actor will continue to fetch what it can and log warnings on partial failures.

Q: My run failed with "FPL's API is refusing requests". What happened? A: FPL's servers occasionally refuse requests for a few minutes, for example during the gameweek update ("The game is being updated") or a temporary block at their edge. The actor retries every call with backoff for up to about 30 seconds. If FPL still refuses, the run fails with that message instead of returning an empty or misleading dataset, and no result events are charged. Re-run a few minutes later. Optional extras (set-piece notes, transfer history, bonus-locked flag) never fail a run: if one is unavailable, the run continues without it and says so in its status message.

Q: My run finished with 0 rows and "raise the run timeout". Is FPL down? A: Not necessarily. On runs shorter than about 50 seconds, every request is cut short to leave time for delivery before the timeout, so the actor cannot tell a slow FPL from a down one. Re-run with a longer timeout (a few minutes is plenty for most inputs) before assuming FPL is down. If FPL really is refusing requests, a longer run fails with "FPL's API is refusing requests" instead.

Support

Issue with the actor? Open a ticket on the actor's Apify page — I respond within 48h.

Changelog

  • October 2026 (1.1.9): New FAQ on short runs (under about 50 seconds) that end with 0 rows and "raise the run timeout". Internal tidy-up of the restart bookkeeping. No behaviour or output change.
  • October 2026 (1.1.8): If FPL refuses a request more than once and the run timeout then arrives, the run now fails honestly with "FPL is refusing requests" instead of "raise the run timeout". Up to 50 mini-leagues per run. If a tie at the cut-off is longer than the 60-page safety limit, a status row says that managers at that rank may be incomplete. The list of items not fetched in time shows each league once. No output field was added, removed or renamed.
  • October 2026 (1.1.7): If FPL stays silent on a request until it times out, the run now fails honestly with "FPL is refusing requests" even when the run timeout also arrives (1.1.6 could finish with 0 rows and "raise the run timeout"). Large mini-leagues are more complete when FPL splits tied managers across pages: overlapping pages are re-read and the whole tie at the cut-off is fetched, then ties are ordered by manager ID. A run that Apify restarts part-way skips the managers it already delivered by ID, so page jitter no longer stops a league; it flags only managers whose rank or points really changed. No output field was added, removed or renamed.
  • October 2026 (1.1.6): A run that Apify restarts part-way now resumes large mini-leagues as long as the rows it had already delivered are unchanged, and keeps the gameweek it started with when the gameweek is left empty (no repeat delivery or charge if a deadline passes during the restart). A run that mostly ran out of time is reported as a timeout even if one request also got an error. The list of items not fetched in time is shortened to the first 10. No output field was added, removed or renamed.
  • October 2026 (1.1.5): If FPL refuses or stalls a request and the run then runs into its timeout, the run now fails honestly with "FPL is refusing requests" (keeping the original error) instead of finishing with 0 rows and "raise the run timeout". league_manager rows are delivered in rank order again. A failed delivery of one gameweek no longer stops the remaining gameweeks. A price scan resumed after an Apify restart fills maxItems exactly. No output field was added, removed or renamed.
  • October 2026 (1.1.4): Runs that hit their timeout now always end with a partial_delivery row listing exactly what was not fetched in time (leagues, managers, seasons or gameweeks), and a league skipped for time says so instead of suggesting an FPL problem. A request cut off by the run timeout is never reported as FPL refusing requests. Short runs deliver more: requests stop early enough to leave time for delivery. A live tracker resumed after an Apify restart keeps your polling interval. When maxItems cuts a historical_seasons per-gameweek run you always get the lowest gameweeks, in order, the same every time. Price predictions still pick the most active movers first but are now listed by player ID. Manager lists that FPL pages with duplicates are filled to the number you asked for. Fixed: a run with an unusual timeout length could mark every request as failed. No output field was added, removed or renamed.
  • October 2026 (1.1.3): If FPL briefly refuses requests, the actor now pauses and probes until FPL answers again instead of giving up, so a short block no longer drops managers. Runs near their timeout stop fetching early enough to still deliver what they have. A league with no standings yet (pre-season) returns a league_not_started row and is not charged. When maxItems cuts your results, a truncated_by_max_items row says how many were left out. If Apify restarts a run part-way, rows already delivered are not repeated or charged again. Duplicate managers that FPL's live standings can list twice are removed. No output field was added, removed or renamed.
  • October 2026 (1.1): More reliable when FPL's API is flaky. Every FPL call is retried with exponential backoff on HTTP 403/429/5xx, network errors and FPL's "game is being updated" page. Optional extras (set-piece notes, transfer history, bonus status) no longer fail a run. Bad manager or league IDs now return a clear not_found / invalid_input status row. A run that cannot reach FPL at all now fails with a plain-language message rather than a stack trace. There are no longer free events per run: every chargeable event is billed from the first one. You are charged only for results that actually reach your dataset: anything cut by maxItems or the run timeout, an empty league or live snapshot, or a gameweek that has not been played yet is not charged, and the run says why in a status row. maxItems is now exact. Long runs stop cleanly before their timeout and keep everything already delivered. No output field was added, removed or renamed.
  • October 2026: The AI verdict now uses Google Gemini 3.5 Flash Lite, because the provider retires Gemini 2.5 Flash on 2026-10-20. The generatedBy field of ai_verdict rows now reads gemini-3.5-flash-lite (it was gemini-2.5-flash). AI calls are retried on temporary errors and on incomplete answers, and the ai-verdict event is charged only for a complete verdict. No output field was added, removed or renamed.