How to Host a 24/7 Sports Scores & Match Alert Discord Bot (2026)
A match alert bot posts live scores and kickoff countdowns to your Discord server automatically. No more manually typing "Groningen vs Fortuna starts in 30 minutes" every matchday.
This guide covers working code in Python (discord.py) and JavaScript (discord.js), sports API options, Discord timestamp formatting, and how to keep the bot online 24/7 for €0.50/month.
1. How a Sports & Match Alert Bot Works
A sports notification bot does three things in a loop:
- Polls a sports API or RSS feed at scheduled intervals (e.g., every 60 seconds during live matchdays).
- Formats the embed with team logos, current score, goal scorers, and localized kickoff timestamps.
- Pushes webhook alerts or message updates into designated announcement channels without hitting Discord rate limits.
┌────────────────────────┐ ┌─────────────────────────┐ ┌────────────────────────┐
│ Sports / Match API │ ───► │ Your 24/7 Bot (Node/Py)│ ───► │ Discord Channel Embed │
│ (Football-Data / ESPN) │ │ Hosted on Space-Node │ │ Live Score & Timeline │
└────────────────────────┘ └─────────────────────────┘ └────────────────────────┘
2. Working Python Code: Live Match & Kickoff Alert Bot
This discord.py script checks for upcoming fixtures and posts match alerts with relative countdowns:
import discord
from discord.ext import commands, tasks
import aiohttp
import asyncio
from datetime import datetime
intents = discord.Intents.default()
bot = commands.Bot(command_prefix="!", intents=intents)
CHANNEL_ID = 123456789012345678 # Replace with your announcement channel ID
@bot.event
async def on_ready():
print(f"Bot connected as {bot.user}")
match_check_loop.start()
@tasks.loop(minutes=5)
async def match_check_loop():
channel = bot.get_channel(CHANNEL_ID)
if not channel:
return
# Example: Kickoff Unix timestamp (UTC)
# Generates dynamic relative time like "in 45 minutes" or "2 hours ago"
kickoff_epoch = int(datetime(2026, 8, 29, 20, 0).timestamp())
embed = discord.Embed(
title="⚽ Match Alert: Groningen vs Fortuna Sittard",
description=f"**Kickoff:** <t:{kickoff_epoch}:F>\n**Countdown:** <t:{kickoff_epoch}:R>",
color=discord.Color.green()
)
embed.add_field(name="Competition", value="Eredivisie", inline=True)
embed.add_field(name="Venue", value="Euroborg", inline=True)
embed.set_footer(text="Live Match Updates • Powered by Space-Node")
# In production, check fixture status before sending to prevent duplicates
# await channel.send(embed=embed)
bot.run("YOUR_DISCORD_BOT_TOKEN")
3. Formatting Match Times with Discord Timestamps
One of the biggest mistakes server owners make is posting hardcoded times like "20:00 CET". Players in different timezones (UK, US, Asia) will constantly ask what time that is for them.
Discord supports native Unix epoch timestamps that automatically adapt to every user's local device clock and timezone:
| Discord Markdown Syntax | Display Output | Best Use Case |
|---|---|---|
<t:1787947200:t> | 8:00 PM | Short time |
<t:1787947200:F> | Saturday, August 29, 2026 8:00 PM | Full match date & kickoff |
<t:1787947200:R> | in 2 hours (or 15 minutes ago) | Live countdown badge |
<t:1787947200:d> | 08/29/2026 | Matchday date |
Combining <t:TIMESTAMP:F> and <t:TIMESTAMP:R> in one embed gives users both the exact local kickoff time and a ticking countdown without editing the message.
4. Popular Free & Low-Cost Sports APIs
To pull live scores and upcoming fixtures for your bot, you can integrate with these popular REST APIs:
- Football-Data.org: Free tier provides live scores, standings, and fixtures for Premier League, Champions League, Eredivisie, and La Liga.
- API-Football (RapidAPI): Covers over 1,000 leagues worldwide with live goal events, lineups, and live statistics.
- TheSportsDB: Community-driven open database for sports logos, banners, team assets, and match schedules.
- Custom Webhook Scraping: If you have an existing RSS feed or custom scraper, your bot can listen on a local port and relay events to Discord instantly.
5. Why Home PC or Free Tiers Break Match Bots
A sports bot that goes offline during a live match is worse than no bot at all. Common failure modes:
- Free tiers sleep. Render and Fly.io free containers spin down after inactivity. By the time the container wakes up, the goal notification is 30 seconds late.
- Shared IP rate limits. Free hosts stack hundreds of bots on the same IP. Sports APIs and Discord both throttle harder on those addresses.
- Home PC reboots. Windows Update, a power cut, or your router resetting during a cup final means a silent bot.
6. Hosting Your Bot 24/7 for €0.50/mo
Put the bot on a Discord bot hosting plan so it stays online during every match:
- Order a Growth plan (€0.50/month, 512 MB RAM, AMD Ryzen 9 9950X). The free Starter tier (64 MB) works for testing.
- In the Pterodactyl panel, select Python 3.11/3.12 or Node.js 20/22.
- Upload your code via the file manager, Git, or SFTP.
- Set
BOT_TOKENandAPI_KEYas environment variables in the panel. - Click Start. The bot connects to Discord and auto-restarts if it crashes.
That covers the full setup: API polling, timestamp formatting, and a host that does not sleep mid-match. The Growth plan at €0.50/month handles a sports bot easily. See all Discord bot hosting plans.