SportScore now ships a no-API-key, no-signup, auto-updating fixtures widget for football, basketball, cricket and tennis. Here's how it works, why we built it free, and what it looks like on a real blog post.
A few months ago a small-time football blog reached out and asked the question every indie sports-data project hears eventually:
"I just want to put this week's Premier League fixtures on my sidebar. Do I need an API key? A plan? A paid tier?"
The honest answer used to be: kind of, yeah. Most sports-data APIs — even the ones that advertise a "free tier" — want you to register, generate a key, build an integration, write some HTML, and somewhere along the way hit a paywall for the specific league you actually care about.
That's a bad trade for a blog post or a fan site. A 200-visitor-a-day niche community shouldn't need a credit card on file to show the score of Sunday's match.
So we built the opposite of that. This post walks through what we shipped.
What it does
sportscore.com/embed/ is a free, key-less, iframe-based fixtures widget. You pick a team or a competition, copy an iframe, paste it anywhere you'd embed a YouTube video — a WordPress post, a forum thread, a Wix site, a Ghost blog, a plain static HTML page. Live scores, upcoming fixtures, finished results, all of it.
Four sports are supported on day one:
- Football (soccer) — leagues and clubs, from the Premier League down through Liga Profesional de Baloncesto equivalents
- Basketball — the NBA, the WNBA, EuroLeague, and national leagues
- Cricket — IPL, international fixtures, T20 tournaments
- Tennis — ATP and WTA events, men's and women's singles and doubles
The widget itself is 320×420 by default (adjustable 240–600 wide, 300–900 tall), auto-refreshes, adapts to light and dark mode, and renders inside a sandboxed iframe so there's no CSS collision with your theme.
The 30-second install
Say you run a Real Madrid fan blog. Here's the full integration:
<iframe
src="https://sportscore.com/embed/fixtures/football/team/real-madrid/"
width="320"
height="420"
loading="lazy"
referrerpolicy="no-referrer-when-downgrade"
style="border: 1px solid #dce3ef; border-radius: 6px;"
title="Real Madrid fixtures">
</iframe>
That's it. Paste it anywhere HTML is allowed. No <script> tag to load, no CSP hoops, no api_key= query param. Hit publish.
Not running Real Madrid? Replace /real-madrid/ with your team's slug. Common ones:
-
manchester-united,liverpool,fc-barcelona -
/competition/premier-league/for the league table -
/basketball/competition/national-basketball-association/for the NBA -
/cricket/competition/indian-premier-league/for IPL -
/tennis/competition/atp-madrid-spain-men-singles/for ATP Madrid
All slugs are browseable at sportscore.com/embed/ — there's a preset gallery with live previews.
On WordPress: one click, zero copy-paste
Iframes are great for static sites. For WordPress users we shipped a plugin that turns the whole thing into a Gutenberg block:
- Download the plugin zip → sportscore.com/static/downloads/sportscore-embed-v1.0.0.zip
- WordPress admin → Plugins → Add New → Upload Plugin → Activate
- In any post or page, insert the "SportScore — Live Scores & Fixtures" block
- Pick sport, type, and slug from the sidebar — live preview renders in the editor
Classic editor users can use a shortcode:
[sportscore sport="football" type="team" slug="real-madrid"]
The plugin ships with the free-tier attribution link automatically embedded, so compliance is zero-effort (more on that below).
Why free?
Because we want people to actually use this.
The sports-data market is a field of paywalls. The data itself is mostly the same across providers — fixtures, scores, standings, top scorers. What differs is the billing, the rate limits, and the contract length. If you're running a hobby site or an indie project, none of that makes sense to pay for.
Our bet is straightforward: if we make the widget genuinely free and genuinely easy, enough people will use it that the resulting inbound links and brand awareness pay for the infrastructure. It's the same logic as Stripe's docs, or Figma's free tier, or Cloudflare's free plan — ship a great free product, grow the top of the funnel, monetise the users who outgrow it.
The one thing we ask in return: a visible "Powered by SportScore" link on any page that renders the data, with rel="dofollow" so search engines see it. That's the free-tier deal. If you want to remove the attribution — for a commercial product, a white-label integration, or just editorial preference — email api@sportscore.com and we'll sort out a commercial arrangement. See full terms.
The WordPress plugin and the iframe snippet both ship the attribution line pre-wired, so for 95% of users this is a non-issue.
How it works under the hood
Skim worthy for other builders:
- The widget is a server-rendered Django template that resolves the team/competition slug, fetches the next ~14 days of fixtures (capped at 8 for legibility), and renders a self-contained HTML document
- The iframe sandboxes the styles — your site's CSS never touches the widget, the widget's CSS never touches your site
- Data refreshes roughly once a minute via a lightweight AJAX poll inside the iframe
- The endpoint is CORS-open and behind Cloudflare, so there's no origin to allow-list
- Rate-limit is currently the honour-system ~10,000 req/24h/IP for fair-use embedders, enforced loosely at the edge
No account, no token, no secrets to rotate. This is deliberately simple because the alternative — OAuth, key management, quota dashboards — is exactly the friction we're trying to eliminate.
The API too, if you want it
If iframes don't suit your use case, the same 8 underlying endpoints are available as a plain REST API (and as a Python client, and as an MCP server for Claude / Cursor / Zed). Same free-forever tier, same attribution deal:
- REST: sportscore.com/developers/openapi.yaml
- Interactive docs: sportscore.com/developers/api/
-
Python client (
pip install sportscore): wraps all 8 endpoints as sync + async methods -
MCP server (
npx sportscore-mcp): lets an LLM query scores and fixtures as tool calls
Every surface mirrors the same 8 tools: get_matches, get_match_detail, get_team_schedule, get_standings, get_top_scorers, get_player, get_bracket, get_tracker. Documentation transfers between them.
What's next
Short list, no promises:
- More sports. Rugby, NFL/American football, hockey, and baseball are the top reader requests.
- More widget variants. A compact one-line "ticker" for header bars, a single-match "scorecard", and a tournament-bracket mode.
- Richer Gutenberg block. Inline slug autocomplete so users don't have to visit the browser, plus a native block variant for full-width "takeover" embeds.
- i18n. The data is global; the UI isn't yet.
Try it
If you run a blog, a fan site, a discord community page, a school newspaper, a tipping site, or anything else that touches sports — grab the iframe, drop it in, and we'd love to know. We ship widget improvements in response to what people actually embed.
Questions, bug reports, feature requests: api@sportscore.com. Source for the MCP server and Python client are open — github.com/Backspace-me/sportscore-mcp and github.com/Backspace-me/sportscore-py.
Free live scores, forever. No API keys. No paywalls. That's the whole pitch.
Cross-posted from Medium.
Top comments (0)