Let players start instantly without making account creation destroy their save later.
Start with a stable anonymous identity, issue player-scoped access and refresh tokens, then upgrade that same player without changing the player id. Add email/password, Google/GitHub/Discord OAuth, or server-verified Steam ticket identity when your game needs them.
POST /auth/anonymous
→ player_id = 8d…
→ access + refresh token
play as guest
↓
POST /auth/upgrade-guest
→ SAME player_id
→ same saves / scores / balances Inspect the token and upgrade rules before wiring login UI.
The public OpenAPI contract documents anonymous/email login, single-use refresh rotation, logout, guest upgrade, verification/reset, Google/GitHub/Discord OAuth and Steam Web API ticket login. The important part is the trust boundary, not the number of buttons on a login screen.
Live API status
A live check of the hosted API right now. No made-up uptime percentage and no hidden demo environment.
Check current statusPublic API contract
The hosted HTTP surface is documented as OpenAPI. Inspect the wire format before choosing an SDK or writing an adapter.
Open the specMIT client SDKs
The JavaScript, Godot, Unity, and Roblox client SDK source is public. The hosted backend itself remains a managed proprietary service.
Inspect the SDK sourceDocumented exit path
Read what is exportable today and the written commitment for advance notice plus an export window if the hosted service winds down.
Read the exit guaranteeGuest login without lost progress
See why a guest should become a registered account in place instead of creating a second player record and migrating saves later.
Read the guest-upgrade guideAnonymous first
Use a stable client-generated anonymous id to create or retrieve the same guest player and receive a player token pair immediately.
Upgrade in place
Attach email/password to the calling guest. The player id stays the same, so documents, leaderboard scores and economy balances do not need a migration.
Rotate and recover
Refresh tokens are single-use; reuse revokes the chain. Verification, password-reset and sign-out-everywhere flows are separate endpoints rather than application folklore.
The publishable key starts auth. It is not an admin credential.
Player builds may contain the project publishable key so they can call /auth/*. The returned player access token is then scoped to that player. Secret API keys and server tokens belong only in trusted infrastructure. Keeping these roles separate is what makes “safe to ship” meaningful.
OAuth for web identities; Steam tickets for Steam players.
Google, GitHub and Discord use per-project OAuth apps. Steam uses Valve's different trust model: configure the App ID, publisher Web API key and ticket identity in Credentials; the client sends only a GetAuthTicketForWebApi ticket and Crux verifies it with Valve server-side.
Verify the ticket with Valve, then key game data to the Crux player id.
Your Steam client calls GetAuthTicketForWebApi(ticketIdentity), hex-encodes the returned binary ticket, and sends it to POST /v1/auth/steam with the normal publishable Crux key. Crux calls Valve's publisher-only AuthenticateUserTicket endpoint from trusted infrastructure and maps the verified SteamID64 to one stable player record. The Steamworks publisher key never ships in the game.
Already logged in as a guest or email/OAuth account? Send a fresh Steam ticket to POST /v1/auth/steam/link with that player's Bearer token. The link endpoint refuses to silently merge two existing players.
Create a guest from your actual game build, then prove the upgrade preserves identity.
Run anonymous login outside the Crux dashboard, write one player document, upgrade that guest to an email/password account, and confirm the same player id still owns the document. That validates the flow your players will actually experience.