← eurocoeff
DE EN

How eurocoeff Updates Its Data Daily

Methodology · Reading time: ~7 minutes · Updated: May 2026

One of the most common questions we receive: where does eurocoeff's data come from, and how can I be confident it's accurate? This page describes the data pipeline, sources, and validation steps in detail. We've kept it transparent on purpose — both because trust is the foundation for data sites, and because honest methodology disclosure is central to the UEFA coefficient debate.

Data sources

eurocoeff uses two primary sources for match data:

  1. football-data.org — an established, licensed API for live match results, standings, and competition data. This delivers real-time updates during CL, EL, and UECL match days.
  2. 5-jahres-wertung.de — a German sister site that maintains historical UEFA coefficient data going back to the 1970s. This provides the historical baseline for our archives and supplies data derived from official UEFA publications.

We do not scrape uefa.com directly. Instead we work with data providers who source official UEFA data under license, and supplement that with the extensive historical database of 5-jahres-wertung.de.

The pipeline architecture

Here's the exact flow that runs every night and during match days:

  1. 06:15 UTC daily: A cron job on a Hostinger VPS starts a Docker container with the scraper. The scraper pulls current match results and standings from the sources.
  2. Database update: Pulled data is written to a PostgreSQL 16 database (eurocoeff-postgres container). This database serves as the source-of-truth and contains the full history of all scrape runs for audit purposes.
  3. API endpoint: A Fastify API container (eurocoeff-api, port 3210) exposes current data as a JSON endpoint, secured by an API token.
  4. GitHub Actions trigger: After a successful scrape, the VPS sends a repository_dispatch trigger to the eurocoeff GitHub workflow. That workflow:
  5. Build and deploy:
    • Pulls current data from the VPS API
    • Writes it to src/data/uefa-data.json
    • Runs bun run build to generate a complete static site
    • Pushes the build to GitHub
    • Cloudflare Pages detects the push and auto-deploys (typically within 2-3 minutes)

During active Champions League, Europa League, or Conference League match days, the pipeline runs more frequently — typically every 30 minutes between 18:00 and 24:00 UTC, to keep live standings and the matchday widget current.

Validation and error handling

Several validation steps prevent corrupt data from reaching the live site:

What we don't do

For transparency, a few deliberate constraints:

Accuracy and known limits

Values on eurocoeff typically match official UEFA values to two decimal places. Discrepancies can occur in the following cases:

Technical architecture (summary)

For technically interested readers, the stack overview:

More architectural detail is on the About page.

Feedback and corrections

If you find a data inaccuracy or have a methodology suggestion, email us at [email protected]. We take corrections seriously and are transparent when we introduce an error — the next snapshot reflects the correction.

Related articles