Developers

Your stats, on your own site.

Paste two lines on your website and your Social Stack card appears with your trophies, earnings and audience, and stays up to date on its own. The same data is available as JSON for overlays, bots and anything else you build. No API key, no cookies, read-only.

Try it

This is the real card, loaded from this site the same way it will load on yours. Change the theme, or type any Social Stack username to see their card.

Embed code

Resizes itself to the card, however many trophies you earn.

<div data-socialstack="cocow"></div>
<script src="https://socialstack.me/embed.js" async></script>

Public API

The same data as JSON (trophies, earnings, Twitch numbers, links) for a stream overlay, a bot or a hand-made site. No key, read-only.

GET https://socialstack.me/api/v1/profiles/cocowOpen

The widget

One container, one script. The script finds every container on the page, loads the card in an iframe and keeps its height in sync with the content, so a new trophy never leaves a gap or a scrollbar.

<div data-socialstack="cocow"></div>
<script src="https://socialstack.me/embed.js" async></script>
data-socialstackrequiredThe username whose card to show, as it appears in the profile URL.
data-theme"dark" | "light" | "auto"Defaults to dark. auto follows each visitor's system setting, which is usually what you want on a site that has both.
  • The card fills its container, so you set the width. Put it in a column, a sidebar or a grid cell and it follows. Only the height is handled for you.
  • The card is rendered on our servers and needs no JavaScript of its own. The script only sizes the frame.
  • The iframe is lazy-loaded: a card in your footer costs nothing until someone scrolls to it.
  • Nothing is stored or tracked on your visitors. The widget sets no cookie and makes no request of its own.
  • Rendering your site after page load (React, Vue, Astro view transitions)? Call window.SocialStackEmbed.render() once your container is in the DOM. Containers already mounted are skipped.
  • No JavaScript allowed on your platform? Use the iframe tab above. It works everywhere, at a fixed height you set yourself.

The API

One endpoint, one profile. It returns what the profile page already shows publicly. Nothing is exposed here that a visitor could not read by opening it.

GEThttps://socialstack.me/api/v1/profiles/<username>
AuthenticationnonePublic, read-only. There is no key to request and no header to send.
CORS*Callable straight from a browser, from any origin.
Rate limit60 / min / IPBeyond that, 429 with a Retry-After header.
Caching5 mins-maxage=300, stale-while-revalidate=3600. Profile edits are pushed through sooner than that when sections change.
Errors400 · 404 · 429400 malformed username, 404 no such profile, 429 too many requests. Always JSON, always { "error": "…" }.

Response

username · name · urlstringIdentity. name falls back to the username when the profile has no display name.
bio · category · nationalitystring?Omitted when the profile leaves them empty.
verifiedbooleanWhether the profile carries the verified check.
avatar · bannerstringAbsolute image URLs. Both may 404 if the account never uploaded one.
colors{ background, text }The two colours picked in the profile editor, as hex.
badges[]id, label, description, rarity, icon, link?Trophies derived from the Liquipedia record. Nobody can grant themselves one from the dashboard. rarity is legendary | epic | rare | common.
stats[]id, label, value, display, sourceUp to three headline numbers. value is the raw number, display the abbreviated form shown on the card ($1.2M). A stat worth zero is left out rather than shown as zero.
accounts[]platform, username, url, game?External accounts declared by the profile's sections: Twitch, GitHub, Liquipedia. game is set for Liquipedia only, since the wiki is per-game.
links[]url, label?The profile's own links, in page order. label is only set for the labelled list sections.

Example: @cocow

The live response, fetched when this page was generated.

{
  "username": "cocow",
  "url": "https://socialstack.me/cocow",
  "name": "Cocow",
  "bio": "@Trackmania  player | 🇫🇷 | Former  @izi_dream   @Team_GO  #TeamPAX by  @Domingo  | come.marquet@gmail.com | SNK enjoyer",
  "category": "Player",
  "nationality": "France",
  "verified": true,
  "avatar": "https://yhruivccjlxmkxfhomif.supabase.co/storage/v1/object/public/users/1e096f35-9312-41ef-b7e9-0106c29aa02e.profile",
  "banner": "https://yhruivccjlxmkxfhomif.supabase.co/storage/v1/object/public/users/1e096f35-9312-41ef-b7e9-0106c29aa02e.banner",
  "colors": {
    "background": "#062247",
    "text": "#ffffff"
  },
  "badges": [],
  "stats": [
    {
      "id": "earnings",
      "label": "Earnings",
      "value": 14176,
      "display": "$14K",
      "source": "liquipedia"
    }
  ],
  "accounts": [
    {
      "platform": "liquipedia",
      "username": "Cocow_",
      "game": "trackmania",
      "url": "https://liquipedia.net/trackmania/Cocow_"
    },
    {
      "platform": "liquipedia",
      "username": "Cocow",
      "game": "trackmania",
      "url": "https://liquipedia.net/trackmania/Cocow"
    }
  ],
  "links": [
    {
      "url": "https://x.com/TMCocow"
    },
    {
      "url": "https://www.instagram.com/come.marquet/"
    },
    {
      "url": "https://www.twitch.tv/tmcocow"
    },
    {
      "url": "https://trackmania.io/#/player/bf154307-85ef-4402-915d-415dc57cffc0",
      "label": "TrackMania.io player page"
    },
    {
      "url": "https://www.esportsearnings.com/players/10473-cocow-come-marquet/team-history",
      "label": "Esports Earnings"
    }
  ]
}

Fair use

No contract, but three things worth stating plainly.

  • The data belongs to the people who published it. Show it as it is, and keep the link back to the profile. That is what makes the card fair to its owner.
  • Trophies and results come from Liquipedia, under their API terms of use. Cache what you fetch rather than polling us in a loop; you would only be hammering them through us.
  • The endpoint is versioned. /api/v1/ keeps its shape. A breaking change gets a new version, not a silent edit under your integration.

Want your own card? Create a page, add your sections, and the embed code is waiting in your dashboard.

Create your page