v2.0 — Live Football News Aggregator

11 sources.
Zero scraping
on your end.

A Node.js/Express API that scrapes, deduplicates, and caches football news from BBC Sport, ESPN, Sky Sports, The Guardian, Goal, 90mins, OneFootball, and FourFourTwo — returning clean JSON on every call.

Subscribe on RapidAPI GitHub ↗
11 News Sources
v2 Current Version
5m Cache TTL
News Sources

Where the news comes from.

BBC Sport
ESPN
Sky Sports
The Guardian
Goal.com
90mins
OneFootball
FourFourTwo — EPL
FourFourTwo — La Liga
FourFourTwo — UCL
FourFourTwo — Bundesliga

All sources scraped in real-time with Cheerio. Each item returns title, URL, image (where available), and source label.

What It Does

Football data, scraped clean.

📰

Per-Source Endpoints

Each news source has its own endpoint. Hit /news/bbc, /news/espn, or /news/skysports independently if you only need one outlet.

Unified Feed

/news/all runs all scrapers in parallel with Promise.allSettled, merges the results, and deduplicates by URL — one call, everything, no duplicates.

🏆

World Cup Feed

/news/worldcup hits WC-dedicated pages on BBC, Sky, and The Guardian, then cross-filters general feeds using WC 2026 keywords — 3-minute TTL for faster refresh.

📰

League-Specific News

FourFourTwo endpoints broken out by competition — EPL, La Liga, Champions League, Bundesliga — so you can target one league without client-side filtering.

🧠

Smart Caching

Vercel KV caching with 5-minute TTL on news feeds, 3-minute on the world cup and unified feed. Every response tells you whether it came from cache or a fresh scrape.

🔒

Rate Limiting + CORS

30 req/min per client enforced at router level. CORS enabled globally. All responses follow a consistent { success, data, cached } wrapper.

Endpoints

Everything under /api/v2

Meta
GET /health API health — uptime, version, timestamp
GET /news List of all active news sources
Aggregated
GET /news/all Merged, deduped feed from all sources Main
GET /news/worldcup World Cup 2026 specific news WC 2026
Per Source
GET /news/bbc BBC Sport football
GET /news/espn ESPN football — includes images
GET /news/skysports Sky Sports football
GET /news/guardian The Guardian football section
GET /news/goal Goal.com — includes images
GET /news/90mins 90mins (si.com/soccer) — includes images
GET /news/onefootball OneFootball home feed
FourFourTwo by League
GET /news/fourfourtwo/epl Premier League
GET /news/fourfourtwo/laliga La Liga
GET /news/fourfourtwo/ucl Champions League
GET /news/fourfourtwo/bundesliga Bundesliga

Full live testing and response samples available on the RapidAPI listing.

Response Shape

Consistent. Predictable.

Every endpoint returns the same wrapper. Each news item includes title, URL, image (where available), and the source it came from.

JSON GET /api/v2/news/bbc
{
  "success": true,
  "cached": false,
  "data": [
    {
      "title": "Arsenal confirm new signing ahead of UCL clash",
      "url": "https://www.bbc.com/sport/football/articles/...",
      "image": "https://ichef.bbci.co.uk/...",
      "source": "BBC Sport"
    }
  ]
}
What I Had to Fix in v2

The real work behind the rewrite.

01

Cache check ran after the scrape

In v1, the cache lookup happened after the scrape was already done — so every request was a cold scrape regardless. Fixed by moving cache-check first inside a unified scraperRoute wrapper that handles the entire flow.

02

Requests timing out with no fallback

Upstream sources occasionally hang. Added timeout handling in fetchHTML via Axios so slow or unresponsive sources fail fast, especially important in /news/all where everything runs in parallel.

03

Getting blocked without a User-Agent

BBC, Sky Sports, and The Guardian all return 403s or empty pages for headless requests. Adding a realistic browser User-Agent in every fetchHTML call fixed the block immediately.

04

Rate limiter was registered after the routes

In v1 the limiter was mounted too late in the middleware chain — requests went through before it could apply. Moved to before app.use("/api/v2", router) so it actually intercepts at the right point.

05

CORS applied inconsistently

CORS was scoped to individual routes in v1, missing several endpoints. Fixed by applying it globally at the app level so every route is accessible from browser clients without exceptions.

06

One failing source killed the whole /news/all

Promise.all rejects entirely if any scraper throws. Switched to Promise.allSettled so the unified feed returns whatever succeeded — partial data beats a 500 error every time.

Use Cases

Who's using it.

Football Hub Apps

News dashboards that want a unified feed from multiple outlets without building and maintaining their own scrapers.

World Cup 2026 Apps

Prediction and tracking apps that need a dedicated WC 2026 news stream separate from general football noise.

Bots & Alerts

Telegram and Discord bots pushing league-specific or competition-specific headlines to football communities.

League Dashboards

Apps targeting EPL, La Liga, UCL, or Bundesliga in isolation using the FourFourTwo league-specific endpoints.

Ready to build?

Subscribe on RapidAPI. Free tier available. Start hitting endpoints in minutes.

Get Access on RapidAPI ↗