An unofficial Ruby wrapper for the FotMob API. Get football/soccer data including team stats, match details, and league standings.
- 🏆 Team Data - Get comprehensive team information and statistics
- ⚽ Match Details - Detailed match information including lineups, stats, and live scores
- 📅 Matches by Date - All matches for a given day across 150+ leagues
- 📊 League Data - League tables, fixtures, and competition details
- 🛡️ Error Handling - Custom error classes for different scenarios
- ⏱️ Configurable - Timeout and timezone support
Add to your Gemfile:
gem 'fotmob'Or install directly:
gem install fotmobrequire 'fotmob'
client = Fotmob.new
# All matches for today
matches = client.get_matches("20251030")
matches[:leagues].each { |l| puts l[:name] }
# Match details (lineups, stats, events)
match = client.get_match_details("5315746")
puts "#{match[:general][:homeTeam][:name]} vs #{match[:general][:awayTeam][:name]}"
puts match[:header][:status][:scoreStr]
# Team info
team = client.get_team("8455") # Chelsea
puts team[:details][:name]
# League standings
league = client.get_league("47") # Premier League
puts league[:details][:name]All matches for a given date (150+ leagues).
matches = client.get_matches("20251030")
# Returns: { leagues: [...], date: "..." }
# Each league has a :matches array with scores, teams, statusFull match data — lineups, stats, events, shotmap.
match = client.get_match_details("5315746")
# Returns: { general:, header:, content: { stats:, lineup:, shotmap:, ... } }Team overview, fixtures, and squad.
team = client.get_team("8455")
# Returns: { details:, overview:, fixtures:, ... }League table, fixtures, and stats.
league = client.get_league("47")
# Returns: { details:, table:, fixtures:, stats:, ... }# Defaults: timeout 10s, timezone Europe/Paris
client = Fotmob.new(timeout: 30, timezone: "America/New_York")The gem includes custom error classes for different scenarios:
begin
team = client.get_team("invalid_id")
rescue Fotmob::NotFoundError => e
puts "Team not found: #{e.message}"
rescue Fotmob::RateLimitError => e
puts "Rate limit exceeded: #{e.message}"
rescue Fotmob::TimeoutError => e
puts "Request timed out: #{e.message}"
rescue Fotmob::APIError => e
puts "API error: #{e.message} (Status: #{e.status_code})"
rescue Fotmob::Error => e
puts "Error: #{e.message}"
endFotmob::Error- Base error classFotmob::APIError- API returned an error responseFotmob::NotFoundError- Resource not found (404)Fotmob::RateLimitError- Rate limit exceeded (429)Fotmob::TimeoutError- Request timed outFotmob::InvalidResponseError- Invalid JSON response
# Clone the repository
git clone https://github.com/bjrsti/fotmob.git
cd fotmob
# Install dependencies
bundle install
# Run tests
bundle exec rspec
# Run linter
bundle exec rubocop
# Open console
bundle exec rake consoleThe gem has two test layers:
Unit tests (default) — fast, offline, using VCR cassettes to replay recorded API responses:
bundle exec rspec
# or
bundle exec rakeIntegration tests — hit the live Fotmob API to catch upstream changes. Run manually or on a schedule:
FOTMOB_INTEGRATION=true bundle exec rspec spec/integration/Integration tests are excluded from the default suite. Run them periodically (e.g. monthly) or whenever you suspect the API has changed.
- Fork it
- Create your feature branch (
git checkout -b my-new-feature) - Commit your changes (
git commit -am 'Add some feature') - Push to the branch (
git push origin my-new-feature) - Create a Pull Request
IDs are in the fotmob.com URL for each resource:
- Teams:
fotmob.com/teams/8455/overview/chelsea→8455 - Matches:
fotmob.com/matches/chelsea-vs-manchester-city/abc123#5315746→5315746 - Leagues:
fotmob.com/leagues/47/overview/premier-league→47
This is an unofficial API wrapper and is not affiliated with FotMob. Use at your own risk and be mindful of rate limits.
MIT License. See LICENSE for details.