Coins
Gamma Coins are the player's real, server-authoritative balance. The SDK never trusts the client: every spend/earn is validated and applied on the server.
Read the balance
const balance = await gamma.getCoins(); // number (0 outside the app)
Cheap to call — read it whenever you need the current value rather than caching.
Spend coins
const res = await gamma.spendCoins(50, 'extra_life');
if (res.ok) {
grantExtraLife(); // only now
} else {
showError(res.error); // e.g. 'insufficient_coins'
}
amount— integer,1..10000reason— lowercase[a-z0-9_]+, ≤ 64 chars (e.g.extra_life,power_up_shield)
Result shape:
{ ok: boolean; newBalance?: number; spent?: number; balance?: number; error?: string }
Never grant the reward before the promise resolves with
ok: true. The operation is atomic and server-authoritative — assume nothing until you get the result.
Earn coins
Award coins for an in-game accomplishment:
const res = await gamma.earnCoins(5, 'checkpoint');
if (res.ok) showToast('+5 coins!');
amount— integer,1..100per call- The server enforces a hard cap of 2000 coins earned from all games per user
per hour; excess returns
{ok: false, error: 'rate_limited'}.
Result shape:
{ ok: boolean; newBalance?: number; earned?: number; error?: string }
Use semantic reasons
The reason is stored in the coin audit log. Use descriptive identifiers so spend
patterns can be analysed:
- ✅
extra_life,power_up_shield,skin_dragon,revive - ❌
buy,x,item1
Outside the app
getCoins() returns 0 and spendCoins/earnCoins return
{ok: false, error: 'no_transport'} unless you enable the
dev mock. Always keep an offline path — see
App-only & offline.
See also the full API reference and error codes.