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, optional on-chain orchestration, and realtime subscriptions.
It should be usable from browser apps, React Native, backend jobs, scripts, agents, and tests.
Integration modes
| Mode | When | Configuration |
|---|---|---|
| Public reads | Catalog, analytics, parlay market list | baseUrl (+ optional tournamentsBaseUrl) |
| User HTTP | Bets, packs, tournament enter, social | auth + tournamentsAuth |
| HTTP + on-chain | Parlay place, vault deposit, LP | onchain: { contracts, wallet } |
| Server-to-server | Bulk register, agents v1, protocol admin | Header providers / separate admin clients |
Browser wallet
import { createBentoSdk, jwtAuthProvider, walletAuthProvider } from '@bento.fun/sdk';
const sdk = createBentoSdk({
baseUrl: process.env.BENTO_URL!,
tournamentsBaseUrl: process.env.PARLAY_TOURNMENT_URL,
auth: walletAuthProvider(() => ({
'x-wallet-address': '0x…',
'x-signature': '0x…',
'x-timestamp': String(Date.now()),
})),
tournamentsAuth: jwtAuthProvider({
getAccessToken: () => localStorage.getItem('bento_jwt') ?? '',
}),
});Backend prepares calldata, your signer sends
import { buildPlaceParlayCalldata } from '@bento.fun/sdk';
const quote = await sdk.tournaments!.parlay.createQuote({ /* legs */ });
const calldata = buildPlaceParlayCalldata(quote);
const hash = await backendWallet.sendTransaction({
to: calldata.to,
data: calldata.data,
});Or use sdk.onchain.placeParlayFromQuoteId(quoteId) when onchain is configured.
Read-only
const sdk = createBentoSdk({
baseUrl: process.env.BENTO_URL!,
tournamentsBaseUrl: process.env.PARLAY_TOURNMENT_URL,
auth: walletAuthProvider(() => ({})),
});
await sdk.public.listDuels({ page: 1 });
await sdk.tournaments?.parlay.listMarkets();Top-level client
createBentoSdk() returns:
| Property | Host | Auth |
|---|---|---|
public | Markets | None |
user | Markets | Wallet (required) |
realtime | Markets (WS) | None |
tournaments? | Tournaments | 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 |
ogMetadata | social card metadata |
auth | eoaLogin, eoaRegister, Auth0 flows |
duelInvitations | create, join, validate |
withdrawalRequests | pre-validate, list, create |
autoMint | faucet mint |
updates | F1, RSS, news feeds |
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 |
parentMarkets | create, invite, join, add child |
packs | enter, picks, creator flows |
portfolio | account reads |
withdraw | withdraw, claim winnings/fees |
wallet | sign, sign-typed-data, send-tx |
polymarket | discovery, orders, positions |
referralAnalytics | referral drill-down |
aws | presigned upload URL |
agentAction | agent withdraw, bet, create-market |
bulkRegister | bulk register (bulkRegisterAuthProvider) |
sdk.tournaments (tournaments host)
Present when tournamentsBaseUrl is set.
| Namespace | Key methods |
|---|---|
parlay | listMarkets, createQuote, getQuote, claim, getHistory, getTickets |
parlayAdmin | operator overrides, manual resolve |
tournaments | list, getById, enter, bracket, claims, disputes |
admin | create, draft/publish/settle, health, creators |
protocolAdmin | disputes, automation, cancel |
f1 / f1Admin | predict, enter, operator lifecycle |
fantasy / fantasyAdmin | contests, entries, seed/settle |
lp | pool, APY, add/remove liquidity |
chat | messages, reactions, Ably token |
streamChat / streamFeeds | tokens, groups, channels |
feeds | screen, spotlight, fixtures |
sports / proxies | NFL, MLB, Sportmonks, Odds API, FunKit |
assets | team logo resolver |
agents | public feed, leaderboard |
agentsWallet / agentsV1 / agentsExternal | agent CRUD and APIs |
profile / me / follow / home | social layer |
notifications | device tokens, legacy register/unregister |
socialChat / socialFeeds / users | XMTP, Stream social |
auth | wallet JWT on tournaments host |
sdk.onchain
Present when onchain + tournamentsBaseUrl are configured.
sdk.onchain?.placeParlayFromQuoteId(quoteId);
sdk.onchain?.depositAndEnterTournament(tournamentId, amount);
sdk.onchain?.claimParlay(parlayId);
sdk.onchain?.claimTournamentPayout(tournamentId);
sdk.onchain?.addLiquidity(amount);
sdk.onchain?.removeLiquidity(lpAmount);Calldata builders are also exported: buildPlaceParlayCalldata, buildVaultDepositCalldata, buildVaultClaimCalldata.
sdk.realtime
sdk.realtime.connectMarketList({ onEvent });
sdk.realtime.subscribeToDuel({ duelId, onEvent });WebSocket payloads are provisional — see Mutation semantics.
Auth providers
import {
walletAuthProvider,
jwtAuthProvider,
bulkRegisterAuthProvider,
agentV1AuthProvider,
externalAgentAuthProvider,
} from '@bento.fun/sdk';| Provider | Headers | Use with |
|---|---|---|
walletAuthProvider | x-wallet-* | auth on markets host |
jwtAuthProvider | Authorization: Bearer | tournamentsAuth |
bulkRegisterAuthProvider | x-api-key | user.bulkRegister |
agentV1AuthProvider | x-agent-id, x-agent-key | agentsV1 |
externalAgentAuthProvider | x-api-key | agentsExternal |
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 |
|---|---|---|
| Parlay | parlay.createQuote() | onchain.placeParlayFromQuoteId() |
| Tournament enter | tournaments.enter() | onchain.depositAndEnterTournament() |
| Market bet | user.placeBet() | Backend 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 (~700 methods).
For request/response JSON schemas use the interactive OpenAPI UI:
Regenerate after SDK changes:
pnpm docs:generate:sdk-referenceDocumentation layers
| Layer | Purpose |
|---|---|
| Quickstart + Guides | End-to-end flows: bet, parlay, tournament, create market/tournament |
| This page | Clients, auth, namespaces, on-chain |
| SDK API reference | Every method + HTTP route |
| OpenAPI UI | Backend schemas and try-it |
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.