<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: SportScore</title>
    <description>The latest articles on DEV Community by SportScore (@sportscore).</description>
    <link>https://dev.to/sportscore</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3894949%2Fbead0950-bd94-4bea-a3b4-8534bb0061dd.png</url>
      <title>DEV Community: SportScore</title>
      <link>https://dev.to/sportscore</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sportscore"/>
    <language>en</language>
    <item>
      <title>We built a free live-scores widget you can drop into any website in 30 seconds</title>
      <dc:creator>SportScore</dc:creator>
      <pubDate>Thu, 23 Apr 2026 22:40:06 +0000</pubDate>
      <link>https://dev.to/sportscore/we-built-a-free-live-scores-widget-you-can-drop-into-any-website-in-30-seconds-4mib</link>
      <guid>https://dev.to/sportscore/we-built-a-free-live-scores-widget-you-can-drop-into-any-website-in-30-seconds-4mib</guid>
      <description>&lt;p&gt;&lt;strong&gt;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.&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;A few months ago a small-time football blog reached out and asked the question every indie sports-data project hears eventually:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"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?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;So we built the opposite of that. This post walks through what we shipped.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://sportscore.com/embed/" rel="noopener noreferrer"&gt;&lt;strong&gt;sportscore.com/embed/&lt;/strong&gt;&lt;/a&gt; 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.&lt;/p&gt;

&lt;p&gt;Four sports are supported on day one:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Football (soccer)&lt;/strong&gt; — leagues and clubs, from the Premier League down through Liga Profesional de Baloncesto equivalents&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Basketball&lt;/strong&gt; — the NBA, the WNBA, EuroLeague, and national leagues&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cricket&lt;/strong&gt; — IPL, international fixtures, T20 tournaments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tennis&lt;/strong&gt; — ATP and WTA events, men's and women's singles and doubles&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  The 30-second install
&lt;/h2&gt;

&lt;p&gt;Say you run a Real Madrid fan blog. Here's the full integration:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;iframe&lt;/span&gt;
  &lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"https://sportscore.com/embed/fixtures/football/team/real-madrid/"&lt;/span&gt;
  &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"320"&lt;/span&gt;
  &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"420"&lt;/span&gt;
  &lt;span class="na"&gt;loading=&lt;/span&gt;&lt;span class="s"&gt;"lazy"&lt;/span&gt;
  &lt;span class="na"&gt;referrerpolicy=&lt;/span&gt;&lt;span class="s"&gt;"no-referrer-when-downgrade"&lt;/span&gt;
  &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;"border: 1px solid #dce3ef; border-radius: 6px;"&lt;/span&gt;
  &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"Real Madrid fixtures"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/iframe&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's it. Paste it anywhere HTML is allowed. No &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; tag to load, no CSP hoops, no &lt;code&gt;api_key=&lt;/code&gt; query param. Hit publish.&lt;/p&gt;

&lt;p&gt;Not running Real Madrid? Replace &lt;code&gt;/real-madrid/&lt;/code&gt; with your team's slug. Common ones:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;manchester-united&lt;/code&gt;, &lt;code&gt;liverpool&lt;/code&gt;, &lt;code&gt;fc-barcelona&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/competition/premier-league/&lt;/code&gt; for the league table&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/basketball/competition/national-basketball-association/&lt;/code&gt; for the NBA&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/cricket/competition/indian-premier-league/&lt;/code&gt; for IPL&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/tennis/competition/atp-madrid-spain-men-singles/&lt;/code&gt; for ATP Madrid&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All slugs are browseable at &lt;a href="https://sportscore.com/embed/" rel="noopener noreferrer"&gt;sportscore.com/embed/&lt;/a&gt; — there's a preset gallery with live previews.&lt;/p&gt;

&lt;h2&gt;
  
  
  On WordPress: one click, zero copy-paste
&lt;/h2&gt;

&lt;p&gt;Iframes are great for static sites. For WordPress users we shipped a plugin that turns the whole thing into a Gutenberg block:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download the plugin zip → &lt;a href="https://sportscore.com/static/downloads/sportscore-embed-v1.0.0.zip" rel="noopener noreferrer"&gt;sportscore.com/static/downloads/sportscore-embed-v1.0.0.zip&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;WordPress admin → Plugins → Add New → Upload Plugin → Activate&lt;/li&gt;
&lt;li&gt;In any post or page, insert the "SportScore — Live Scores &amp;amp; Fixtures" block&lt;/li&gt;
&lt;li&gt;Pick sport, type, and slug from the sidebar — live preview renders in the editor&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Classic editor users can use a shortcode:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[sportscore sport="football" type="team" slug="real-madrid"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The plugin ships with the free-tier attribution link automatically embedded, so compliance is zero-effort (more on that below).&lt;/p&gt;

&lt;h2&gt;
  
  
  Why free?
&lt;/h2&gt;

&lt;p&gt;Because we want people to actually use this.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The one thing we ask in return:&lt;/strong&gt; a visible "Powered by SportScore" link on any page that renders the data, with &lt;code&gt;rel="dofollow"&lt;/code&gt; 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 &lt;code&gt;api@sportscore.com&lt;/code&gt; and we'll sort out a commercial arrangement. See &lt;a href="https://sportscore.com/developers/terms/" rel="noopener noreferrer"&gt;full terms&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The WordPress plugin and the iframe snippet both ship the attribution line pre-wired, so for 95% of users this is a non-issue.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works under the hood
&lt;/h2&gt;

&lt;p&gt;Skim worthy for other builders:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The widget is a &lt;strong&gt;server-rendered Django template&lt;/strong&gt; 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&lt;/li&gt;
&lt;li&gt;The iframe sandboxes the styles — your site's CSS never touches the widget, the widget's CSS never touches your site&lt;/li&gt;
&lt;li&gt;Data refreshes roughly once a minute via a lightweight AJAX poll inside the iframe&lt;/li&gt;
&lt;li&gt;The endpoint is &lt;strong&gt;CORS-open&lt;/strong&gt; and behind Cloudflare, so there's no origin to allow-list&lt;/li&gt;
&lt;li&gt;Rate-limit is currently the honour-system ~10,000 req/24h/IP for fair-use embedders, enforced loosely at the edge&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;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.&lt;/p&gt;

&lt;h2&gt;
  
  
  The API too, if you want it
&lt;/h2&gt;

&lt;p&gt;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:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;REST&lt;/strong&gt;: &lt;a href="https://sportscore.com/developers/openapi.yaml" rel="noopener noreferrer"&gt;sportscore.com/developers/openapi.yaml&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interactive docs&lt;/strong&gt;: &lt;a href="https://sportscore.com/developers/api/" rel="noopener noreferrer"&gt;sportscore.com/developers/api/&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Python client&lt;/strong&gt; (&lt;code&gt;pip install sportscore&lt;/code&gt;): wraps all 8 endpoints as sync + async methods&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MCP server&lt;/strong&gt; (&lt;code&gt;npx sportscore-mcp&lt;/code&gt;): lets an LLM query scores and fixtures as tool calls&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Every surface mirrors the same 8 tools: &lt;code&gt;get_matches&lt;/code&gt;, &lt;code&gt;get_match_detail&lt;/code&gt;, &lt;code&gt;get_team_schedule&lt;/code&gt;, &lt;code&gt;get_standings&lt;/code&gt;, &lt;code&gt;get_top_scorers&lt;/code&gt;, &lt;code&gt;get_player&lt;/code&gt;, &lt;code&gt;get_bracket&lt;/code&gt;, &lt;code&gt;get_tracker&lt;/code&gt;. Documentation transfers between them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's next
&lt;/h2&gt;

&lt;p&gt;Short list, no promises:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;More sports.&lt;/strong&gt; Rugby, NFL/American football, hockey, and baseball are the top reader requests.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;More widget variants.&lt;/strong&gt; A compact one-line "ticker" for header bars, a single-match "scorecard", and a tournament-bracket mode.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Richer Gutenberg block.&lt;/strong&gt; Inline slug autocomplete so users don't have to visit the browser, plus a native block variant for full-width "takeover" embeds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;i18n.&lt;/strong&gt; The data is global; the UI isn't yet.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;If you run a blog, a fan site, a discord community page, a school newspaper, a tipping site, or anything else that touches sports — &lt;a href="https://sportscore.com/embed/" rel="noopener noreferrer"&gt;grab the iframe&lt;/a&gt;, drop it in, and we'd love to know. We ship widget improvements in response to what people actually embed.&lt;/p&gt;

&lt;p&gt;Questions, bug reports, feature requests: &lt;code&gt;api@sportscore.com&lt;/code&gt;. Source for the MCP server and Python client are open — &lt;a href="https://github.com/Backspace-me/sportscore-mcp" rel="noopener noreferrer"&gt;github.com/Backspace-me/sportscore-mcp&lt;/a&gt; and &lt;a href="https://github.com/Backspace-me/sportscore-py" rel="noopener noreferrer"&gt;github.com/Backspace-me/sportscore-py&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Free live scores, forever. No API keys. No paywalls. That's the whole pitch.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Cross-posted from &lt;a href="https://medium.com/@SportScore/we-built-a-free-live-scores-widget-you-can-drop-into-any-website-in-30-seconds-9c8594dc56bd" rel="noopener noreferrer"&gt;Medium&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>webdev</category>
      <category>opensource</category>
      <category>api</category>
      <category>wordpress</category>
    </item>
  </channel>
</rss>
