Grand opening25% off everything with FAM-261023-261025-UL4B9this weekendAdded for you at checkout Halloween Edition36 maps, limited runlimited runShop the drop

FREE TOOL · SERVER

FiveM server status badge generator

A badge is the cheapest piece of proof a server has. It sits at the top of a README or a store page and says, without anybody having to click anything, that there are twenty-seven people on right now. Build one here, copy the Markdown, done — and the image you paste is the live endpoint, not a screenshot of it.

A cfx.re join code is the better choice: it keeps working when your IP changes.

Leave it empty for a badge with no label at all.

34/100, amber when the server is full

The same three shapes shields.io draws, so it sits level with your other badges.

Live preview — this is the endpoint, not a drawing of it
fivem server status
Markdown — README, GitHub, Gitea

Paste this straight into README.md. GitHub refetches it through its own image proxy, which is why the badge carries no fonts and no scripts.

[![fivem server status](https://fam-tools.com/api/server-status-badge?q=y4lg95)](https://cfx.re/join/y4lg95)
HTML — your site, your docs, a forum post

Set a height if your stylesheet stretches images; the SVG itself is 20 pixels tall.

<a href="https://cfx.re/join/y4lg95"><img src="https://fam-tools.com/api/server-status-badge?q=y4lg95" alt="fivem server status"></a>
The plain URL — Discord, embeds, anything else

Discord unfurls it as an image. Our route sends a long Cache-Control, so an embed that goes round a big server does not turn into traffic at your game server.

https://fam-tools.com/api/server-status-badge?q=y4lg95

HOW TO USE IT

From the box to your README

Four steps, and the only one that takes any thought is the first.

  1. Put your join code in. y4lg95 rather than an IP, so the badge keeps working the day you move host. An IP and port works too if the server is unlisted.
  2. Pick what it says. Player count is the one people actually read. Online-or-offline is the plainest. Server name, map and game build are there for a docs page where the badge is labelling something rather than bragging.
  3. Match your other badges. If the README already has shields.io badges, pick the same style — flat is shields' default, so that is ours too.
  4. Copy the Markdown and paste it under your title. Leave the link checkbox on and the badge becomes a join link, which is the whole point of putting it where people can see it.
Or skip the builder and write the URL yourself

The endpoint is /api/server-status-badge and it takes four parameters. Nothing is signed and nothing needs an account.

q
Required. A join code, an ip:port, a hostname, or a whole cfx.re/join/… link.
label
The grey left-hand half. Defaults to fivem. Pass it empty for a badge with no label.
show
players (default), status, name, map or build.
style
flat (default), flat-square or plastic.

WHY IT LOOKS LIKE THIS

Built for the proxy, not for our own page

A badge that only renders on the site that generated it is a demo. These are the constraints that make it render everywhere.

No fonts, no scripts, no stylesheets

GitHub pipes every external image through camo, which strips it out of its original context. A webfont reference would silently fall back, a script would never run, a CSS variable would resolve to nothing. So the SVG carries no references at all, and every piece of text has its width measured on our server and written into the file as a textLength. Same pixels in a README, a Jira ticket and a PDF.

It fails as a picture

A bad address, a rate-limited request, a dead upstream — every one of those still answers 200 with a grey "unknown" badge. The alternative is a 404 or a 500, which caches as a broken image and keeps looking broken long after the problem is fixed.

It caches, hard and on purpose

We hold each server's answer for ninety seconds and serve the badge with a several-minute Cache-Control. Fresh checks are also rate limited per visitor. The number you see is a couple of minutes old at worst, and your game server never notices the README exists.

It will not probe anything private

Addresses are resolved before anything is fetched, and private, loopback, link-local, carrier-NAT and reserved ranges are refused outright, as is any port below 1024. A public endpoint that fetches whatever a stranger types is a request-forgery hole, and this one is closed.

QUESTIONS

About the status badge

Will the badge work in a GitHub README?
Yes, and that is the case it was built for. GitHub does not load your image directly — it refetches it through its own proxy, camo, and serves it from a GitHub domain. Anything resolved in the page it lands in therefore fails: webfonts, stylesheets, scripts, CSS variables, external images. Our SVG uses none of them. It is shapes, one gradient, a clip path and text in Verdana with every string width calculated server side, which is why the badge looks identical in a README, in a forum post and dragged onto a desktop.
How fresh is the number on the badge?
Up to ninety seconds old on our side, then however long the viewer’s cache holds it. The route sends a Cache-Control of a few minutes and GitHub’s proxy applies its own on top, so a badge in a popular README may show a value a few minutes old. That is deliberate: a live badge that refetched on every page view would turn your README into a traffic source pointed at your own game server.
What happens to the badge when my server goes down?
It turns red and says offline. If the check itself cannot run — a bad address, our rate limit, an upstream that times out — you get a grey badge saying unknown instead. The endpoint answers HTTP 200 with a picture in every single case, including an error, because a badge that returns a 500 shows up as a broken-image icon in somebody’s README and stays that way in every cache that saw it.
Should I use the join code or the IP?
The join code, nearly always. It survives an IP change, a host migration and a DDoS reroute without you editing your README, and it carries the fields only the platform knows. Use the IP when your server is deliberately unlisted, or when you specifically want the badge to reflect whether that one machine is reachable rather than whether the listing is alive.
Can I change the colours or the label?
The label, yes — type it in the builder, or leave it empty for a badge with no label section at all. The colours are fixed on purpose: green for online, amber when the server is full, red for offline, grey for unknown. A status badge is read at a glance by people who have never seen your README before, and that only works if the colours mean the same thing on every badge they have ever seen.