Install to a confirmed payment
The whole surface fits on one page. No signup, no API key, no dashboard, no wallet extension, and no interactive prompt anywhere.
Status: M1 of eleven. The SDK is real and runs end to end. The chain underneath it is an in-memory mock — there is no public network yet, and nothing anywhere holds value.
bun add kei-transaction # or npm / pnpm / yarnESM, TypeScript types included, runs in a browser and in Node or Bun.
Two entry points, because a key signs only for its own account
Kei.start() // PLAYER — browser. Holds the player's seed.
Kei.server() // ISSUER — Node/Bun only. Holds the game's seed.Kei.server() refuses to run if it detects a browser, and says why. An issuer seed in the client is a total compromise of your economy: anyone can mint your currency without limit.
Wallet
kei.address // 'kei_3abc...'
await kei.balance() // 12.5 — a number, in Kei
await kei.send(toAddress, amount) // { hash, amount, to }
await kei.faucet() // testnet only; throws on mainnet
kei.seed // export for backup; never logged
kei.on('received', tx => {})
await kei.wallet.summary() // { address, kei, tokens, items, pending }Tokens
const gems = await game.token.issue({ name: 'Gems', symbol: 'GEM', decimals: 0 })
await gems.mint(playerAddress, 500)
await gems.burn(500)
await gems.balanceOf(address)
const drop = await gems.commit([{ to: playerA, amount: 500 }])const gems = await kei.token('GEM', issuerAddress)
await gems.balance()
await gems.transfer(to, 120) // no 'from' — the signer is the sender
await kei.claims.pending()Errors are sentences that state their own fix
Not enough Kei — balance is 0.4, tried to send 1.2.Because the reader is often an agent, and it cannot ask a follow-up question.
The full reference
This page is a summary and the package is the source of truth. For agents, /llms.txt is the same surface compressed, and /AGENTS.md is the integration procedure with the failure modes named.