TypeScript SDK
createBentoSdk, integration modes, and module reference for @bento.fun/sdk.
@bento.fun/sdk is the core package. It owns domain types, HTTP clients for two API hosts, auth providers, and optional on-chain orchestration.
It should be usable from browser apps, React Native, server jobs, scripts, agents, and tests.
Integration modes
| Mode | When | Configuration |
|---|---|---|
| Public reads | Catalog, analytics, tournament list | baseUrl (+ optional tournamentsBaseUrl); apiKey still required by the factory |
| User HTTP | Auth, bets, packs, tournament enter | apiKey + auth + tournamentsAuth |
| HTTP + on-chain | Vault deposit, LP | onchain: { contracts, wallet } |
| Protocol admin | Gated markets / tournaments admin routes | createMarketsProtocolAdminClient / createTournamentsProtocolAdminClient |
Browser wallet
import { createBentoSdk, jwtAuthProvider, walletAuthProvider } from '@bento.fun/sdk';
// `token` is the JWT from public.auth.eoaLogin, see Authentication for the sign → login recipe.
// `apiKey` is required, mint at /concepts/builder-api-key
const sdk = createBentoSdk({
baseUrl: process.env.BENTO_URL!, // https://internal-server.bento.fun
apiKey: process.env.BENTO_BUILDER_API_KEY!,
tournamentsBaseUrl: process.env.PARLAY_TOURNAMENT_URL,
auth: walletAuthProvider(() => ({ Authorization: `Bearer ${token}` })),
tournamentsAuth: jwtAuthProvider({ getAccessToken: () => token }),
});Server prepares calldata, your signer sends
import { buildVaultDepositCalldata } from '@bento.fun/sdk';
// amountHuman is whole tokens; decimals match the vault collateral (18 for credits)
const data = buildVaultDepositCalldata(tournamentId, 0, '10', 18);
const hash = await backendWallet.sendTransaction({
to: creditsVault, // your OnchainContractConfig vault
data,
});Or use sdk.onchain.depositAndEnterTournament(...) when onchain is configured.
Read-only
const sdk = createBentoSdk({
baseUrl: process.env.BENTO_URL!, // https://internal-server.bento.fun
apiKey: process.env.BENTO_BUILDER_API_KEY!,
tournamentsBaseUrl: process.env.PARLAY_TOURNAMENT_URL,
auth: walletAuthProvider(() => ({})),
});
await sdk.public.listDuels({ page: 1 });
await sdk.tournaments?.tournaments.list({ limit: 5 });Top-level client
createBentoSdk() returns:
| Property | Host | Auth |
|---|---|---|
public | Markets | Catalog open; auth/weblink need Builder API key |
user | Markets | Builder API key + Bearer JWT |
tournaments? | Tournaments | Builder API key + optional JWT / wallet |
onchain? | Chain | viem wallet |
createTournamentsSdk() is available for tournaments-only integrations.
sdk.public (markets host)
Namespaces on PublicClient:
| Namespace | Key methods |
|---|---|
duels / markets | list, getById (alias naming) |
packs | list, getById, payout/refund proofs |
leaderboard | global reads |
parentMarkets | read, invite validate |
portfolio | account, PnL, positions |
analytics | getPlatformReport |
protocolStats | getSummary, getStats |
publicBets | chart reads |
auth | eoaLogin, eoaRegister, Auth0 flows |
duelInvitations | create, validate, list (many routes are public) |
withdrawalRequests | pre-validate, list, create |
Top-level shortcuts: listDuels, getDuelById, listMarkets, getMarketById, getContests.
List rows expose both id (database) and duelId (on-chain). Pass duelId to getDuelById / getMarketById.
sdk.user (markets host)
| Namespace | Key methods |
|---|---|
bets | estimateBuy, placeBet, sellBet, getUserShares, charts |
duels | createDuel, resolve, contest, participants |
duelInvitations | create, userJoin, validateInvite, membership |
parentMarkets | create, invite, join, add child |
packs | enter, picks, creator flows |
portfolio | account reads |
withdraw | withdraw, claim winnings/fees |
polymarket | discovery, orders, positions |
referralAnalytics | referral drill-down |
sdk.tournaments (tournaments host)
Present when tournamentsBaseUrl is set.
| Namespace | Key methods |
|---|---|
tournaments | list, getById, enter, submitPicks / getPicks (stage chips), bracket, claims, disputes |
f1 | dashboards, rounds, predictions, leaderboards |
lp | pool, APY, add/remove liquidity |
auth | wallet JWT on tournaments host |
sdk.onchain
Present when onchain + tournamentsBaseUrl are configured.
sdk.onchain?.depositAndEnterTournament(tournamentId, { amountUsdc: '100' });
sdk.onchain?.claimTournamentPayout(tournamentId);
sdk.onchain?.addLiquidity(amount);
sdk.onchain?.removeLiquidity(lpAmount);Each onchain method resolves to { success, txHash?, error? } and never throws, branch on result.success.
Calldata builders are also exported: buildVaultDepositCalldata, buildVaultClaimCalldata.
Auth providers
import {
walletAuthProvider,
jwtAuthProvider,
staticHeadersProvider,
} from '@bento.fun/sdk';| Provider | Headers | Use with |
|---|---|---|
walletAuthProvider | injected headers (Authorization: Bearer markets, x-wallet-* tournaments) | auth |
jwtAuthProvider | Authorization: Bearer | tournamentsAuth |
staticHeadersProvider | fixed headers you supply | auth / tournamentsAuth |
Protocol admin (opt-in)
Separate factories, not part of createBentoSdk():
import {
createMarketsProtocolAdminClient,
createTournamentsProtocolAdminClient,
} from '@bento.fun/sdk';
const marketsAdmin = createMarketsProtocolAdminClient({ baseUrl, auth });
const tournamentsAdmin = createTournamentsProtocolAdminClient({ baseUrl, auth });HTTP vs on-chain flows
| Action | HTTP | On-chain |
|---|---|---|
| Tournament enter | tournaments.enter() | onchain.depositAndEnterTournament() |
| Market bet | user.placeBet() | Server handles chain via markets host |
Full API reference
Every SDK HTTP method (routes, auth, mutation snippets) is indexed in the auto-generated SDK API reference.
Request/response shapes ship as TypeScript types in @bento.fun/sdk (generated
from pinned OpenAPI contracts). Public Swagger UI is not exposed.
Documentation layers
| Layer | Purpose |
|---|---|
| Quickstart + Guides | End-to-end flows: bet, tournament, create market/tournament |
| This page | Clients, auth, namespaces, on-chain |
| SDK API reference | Every method + HTTP route |
Intentionally excluded
Not exposed in the public SDK:
/bento/bot/*- Inbound webhooks
/api/meta/*,/api/config/keys
Wallet-agnostic design
The SDK depends on viem-compatible wallets for on-chain paths only. Privy, Wagmi, Turnkey, and server signers belong in your app layer.