Skip to main content

Steam auth verification

Steam auth verification lets a Steam build of your game sign players in through Blazium Games. The game sends a Steam session ticket, and Blazium Games checks it with Steam, confirms the player owns the game, and returns a signed session token. Your servers, or any third-party service you run, check that token with the game's auth key.

You don't need your own Steamworks Web API key on your servers, and players don't need a Blazium Games account. If a player has linked Steam to their Blazium Games account, the token says which account that is.

Turn it on​

The listing must be linked to its Steam app. Either:

  • tick Enable Steam auth verification when you import from Steam, or
  • open the listing's Steam tab, enter the Steamworks Web API key, and click Turn on.

Blazium Games keeps the Web API key, encrypted, while this is on, and makes two keys for the listing:

KeyWhere it goesWhat it does
Auth key (128 characters)Your servers only. Never ship it in the game.Signs session tokens (HS512) and authenticates your servers to Blazium Games.
Ticket key (bg_ and 32 hex characters)The game client.The identity string the game passes to GetAuthTicketForWebApi. Tickets made with any other identity are refused.

The Steam tab shows the last 4 characters of the auth key. Show auth key displays the whole key until your next change on the tab. Owners and admins of the listing can see it; AI agents and MCP tokens can't.

Sign a player in​

In the game, ask Steam for a Web API ticket with the ticket key as the identity, then send it to Blazium Games:

// Steamworks SDK
SteamUser()->GetAuthTicketForWebApi("bg_0123456789abcdef0123456789abcdef");
// In the GetTicketForWebApiResponse_t callback, hex-encode m_rgubTicket.
POST https://api.blazium.online/api/v1/steam/{game_uid}/auth
Content-Type: application/json

{ "ticket": "140000006a7e..." }

The answer:

{
"success": true,
"data": {
"token": "eyJhbGciOiJIUzUxMiIs...",
"expires_at": "2026-10-08T19:04:05Z",
"steam_id": "76561197960287930",
"family_shared": false,
"session_uid": "3f0c...",
"blazium_user_uid": "u_..."
}
}

blazium_user_uid is only there when the player linked Steam. A token is issued only when Steam accepts the ticket, the account owns the game, and it has no publisher ban. The game sends the token to your servers, which check it as below.

The exact URLs for your listing are on its Steam tab, under Endpoints.

Refresh a token​

Tokens last 1 hour. Before or up to 24 hours after a token expires, the game can swap it for a new one without asking Steam for another ticket:

POST https://api.blazium.online/api/v1/steam/{game_uid}/refresh
Content-Type: application/json

{ "token": "eyJhbGciOiJIUzUxMiIs..." }

Ownership is checked again, and the old token is revoked. After 24 hours, or once a token is revoked, the game needs a new ticket.

Check a token on your servers​

Your servers can check a token themselves: verify the HS512 signature with the auth key, then check the claims.

ClaimValue
isshttps://blazium.games
audsteam:{app_id}
gidThe listing's game_uid.
subThe player's SteamID64.
osidThe owner's SteamID64 when the game is borrowed through Family Sharing.
owntrue
vacWhether Steam reported a VAC ban.
buidThe player's Blazium Games user ID, if they linked Steam.
jti, iat, expToken ID, issue time, and expiry.

A local check can't see revocations. To include them, ask Blazium Games, sending the auth key as a Bearer token:

POST https://api.blazium.online/api/v1/steam/{game_uid}/server/verify
Authorization: Bearer <auth key>
Content-Type: application/json

{ "token": "eyJhbGciOiJIUzUxMiIs...", "recheck_ownership": false }

The answer has valid, expired, revoked, claims, and blazium_user (uid and username) when the player linked Steam. With recheck_ownership: true it also asks Steam again and adds ownership.

Revoke tokens and check ownership​

POST https://api.blazium.online/api/v1/steam/{game_uid}/server/revoke
Authorization: Bearer <auth key>

{ "jti": "..." } // one token
{ "steam_id": "7656119..." } // every token for a player
GET https://api.blazium.online/api/v1/steam/{game_uid}/server/ownership/{steam_id}
Authorization: Bearer <auth key>

The ownership answer has owns_app, permanent, owner_steam_id, and checked_at. It doesn't need a session token.

Rotate keys and turn it off​

On the Steam tab:

  • New auth key makes a new auth key. The old one stops working right away and every session token is revoked.
  • New ticket key makes a new ticket key. Builds with the old one can't sign in until they're updated.
  • Replace Web API key swaps in a new Steamworks Web API key after you revoke the old one. The auth key, ticket key and session tokens keep working.
  • Turn off revokes every token, deletes both keys, and forgets the Web API key. Turning it on again makes new keys.

If the auth key leaks, make a new one at once, then update your servers. If the Web API key leaks, revoke it in Steamworks and replace it here.

Limits​

RoutesLimit
auth and refresh60 per minute per IP address, and 1,200 per minute per game.
server/*1,200 per minute per game. Wrong auth keys are limited to 30 per minute per IP address.

Errors​

CodeHTTPMeaning
4245404Steam auth verification is off for this game.
4246400 or 401The ticket isn't hex, or Steam refused it. Make it with the game's ticket key.
4247403The Steam account doesn't own the game, or has a publisher ban.
4248401 or 422The token isn't valid for this game, or its session ended.
4249401Send the game's auth key as a Bearer token.
4240400steam_id isn't a SteamID64, or revoke got neither jti nor steam_id.
4243502Steam didn't answer, or refused the game's Web API key. Replace the key on the Steam tab.
4290429Too many requests.

What players should know​

Each sign-in stores a session record with the player's Steam ID, the owner's Steam ID for Family Sharing, the linked Blazium Games account if any, the token's expiry, and the IP address. Records are deleted 30 days after the token expires. Tickets aren't stored. See the Steam API disclosure and the Privacy Policy.