FlashScore News Scraper
Pricing
from $3.10 / 1,000 news items
FlashScore News Scraper
Fetches FlashScore's sports news feed, category/tag menu, and individual article content via FlashScore's persisted-query GraphQL API. No login or API key needed. Derived from romy/flashscore-all-in-one-api, split out as a focused news slice for content monitoring and editorial research.
What does FlashScore News Scraper do?
FlashScore News Scraper pulls the news list, the news category/tag menu, and individual article bodies from FlashScore. It talks directly to the same persisted-query GraphQL API the official FlashScore Android app uses (global.ds.lsapp.eu), reverse-engineered by live MITM capture against a real device (Frida SSL-pinning bypass + mitmproxy). No FlashScore account, no API key, no scraping setup.
This is the news slice of FlashScore All-in-One API, split out as its own focused, batch-run Actor.
Why use FlashScore News Scraper?
- Real news feed, not scraped HTML — the exact persisted-query GraphQL calls the app itself sends, cross-checked live
- Discover real tag ids —
includeMenureturns every category/team/tournament tag FlashScore's news section supports (dozens of sports, hundreds of teams/tournaments), which you can then pass astagIdto filter the news list - Article bodies in parallel — pass a batch of article ids and get them all fetched concurrently, one row per article
- No account needed — every read request works fully anonymously
- Use cases: sports news aggregation, content monitoring, editorial research
Input
| Field | Type | Description |
|---|---|---|
fetchNewsList | boolean | Fetches the news list (optionally filtered by tagId). Default true. |
tagId | string | Filters the news list to one tag (team, league, sport, or topic). Sourced from a tag's id field in the news menu output — there's no fixed short list, FlashScore has hundreds of tags. |
includeMenu | boolean | Fetches the news category/tag menu. Default false. Useful to discover real tagId values. |
articleIds | string[] | Article ids to fetch in full, in parallel. Default []. Often discoverable from the news list output's nested article stub id fields. |
At least one of fetchNewsList, includeMenu, or a non-empty articleIds must be set, or the run throws immediately.
Example:
{"fetchNewsList": true,"includeMenu": true,"articleIds": ["QFgdUkIk"]}
Output
The parent Actor's listNews/getNewsMenu were never typed beyond unknown — their real response shapes hadn't been verified. This Actor's live smoke test found and confirmed the following real shapes.
News list (fetchNewsList: true) — the response is data.findNewsLayoutByProjectId.sections, an array of named sections (e.g. "Top News", "Transfer News", "Premier League"), each carrying a small articles array of stubs (id + isTopped only — not full article bodies). There is no single flat array of individual articles upstream; sections are the real top-level list. One dataset row is pushed per section, tagged type: "news-item":
{"type": "news-item","__typename": "CatSection","title": "Transfer News","articles": [{ "__typename": "CatArticleOnLayoutSection", "id": "v5bCE1WG", "isTopped": true },{ "__typename": "CatArticleOnLayoutSection", "id": "MZIltPuS", "isTopped": false }],"sectionType": "MIXED","tag": {"__typename": "CatTag","id": "pG5roijlWSzc94ws","entityId": "pG5roijl","entityType": "TAG","slug": "transfer-window"}}
Use each section's tag.id as tagId to filter, and each article stub's id as an articleIds entry to fetch full content.
News menu (includeMenu: true) — the response is data.findNewsMenuByProjectId.items, a clean flat array of tags. One row per tag, tagged type: "news-tag":
{"type": "news-tag","__typename": "CatMenuItem","name": "Premier League","tag": {"__typename": "CatTag","id": "dYlOSQODCdnS0XT8","entityId": "dYlOSQOD","entityType": "TOURNAMENT_TEMPLATE","slug": "premier-league"}}
Article (articleIds) — one row per id, tagged type: "article":
{"type": "article","articleId": "QFgdUkIk","article": {"data": {"findCatArticleById": {"id": "QFgdUkIk","type": "STANDARD","publishedAt": 1788130743,"title": "Premier League talking points: Chelsea dazzle in attack as Liverpool stutter","slug": "football-premier-league-premier-league-talking-points-chelsea-dazzle-in-attack-as-liverpool-stutter","images": [{ "url": "https://livesport-ott-images.ssl.cdn.cra.cz/...jpeg", "altText": "..." }]}}}}
If any of the three sections above ever return an unrecognized shape (upstream schema change), this Actor falls back to pushing the whole raw GraphQL result as one row (type: "news-list" or type: "news-menu") instead of guessing a wrong structure.
Known limitations
- The parent Actor's own types for
listNews/getNewsMenuwereunknown— never previously verified. This README documents the real shapes found during this Actor's live smoke test (above); a future upstream schema change could alter them. - The
getArticlepersisted query (nah) returns article metadata (title, slug, publish date, images) but not a body/content field in the observed live response — the persisted query's field selection is fixed server-side and this Actor can't request additional fields. - "News items" in the list response are really named sections (Top News, Transfer News, per-league sections), each holding article stubs (id only) rather than a single flat list of full articles — fetch full content via
articleIds. - This Actor only covers
/news,/news/menu, and/news/{id}. Matches, standings, search, and everything else FlashScore-related live in the parent FlashScore All-in-One API.
Pricing
Pay-per-event. Charged $0.004 per news-item event (one event per dataset row pushed — news list section, menu tag, or article). See the Actor's Pricing tab for current tiered rates.