BentoSDK

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

ModeWhenConfiguration
Public readsCatalog, analytics, tournament listbaseUrl (+ optional tournamentsBaseUrl); apiKey still required by the factory
User HTTPAuth, bets, packs, tournament enterapiKey + auth + tournamentsAuth
HTTP + on-chainVault deposit, LPonchain: { contracts, wallet }
Protocol adminGated markets / tournaments admin routescreateMarketsProtocolAdminClient / 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:

PropertyHostAuth
publicMarketsCatalog open; auth/weblink need Builder API key
userMarketsBuilder API key + Bearer JWT
tournaments?TournamentsBuilder API key + optional JWT / wallet
onchain?Chainviem wallet

createTournamentsSdk() is available for tournaments-only integrations.

sdk.public (markets host)

Namespaces on PublicClient:

NamespaceKey methods
duels / marketslist, getById (alias naming)
packslist, getById, payout/refund proofs
leaderboardglobal reads
parentMarketsread, invite validate
portfolioaccount, PnL, positions
analyticsgetPlatformReport
protocolStatsgetSummary, getStats
publicBetschart reads
autheoaLogin, eoaRegister, Auth0 flows
duelInvitationscreate, validate, list (many routes are public)
withdrawalRequestspre-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)

NamespaceKey methods
betsestimateBuy, placeBet, sellBet, getUserShares, charts
duelscreateDuel, resolve, contest, participants
duelInvitationscreate, userJoin, validateInvite, membership
parentMarketscreate, invite, join, add child
packsenter, picks, creator flows
portfolioaccount reads
withdrawwithdraw, claim winnings/fees
polymarketdiscovery, orders, positions
referralAnalyticsreferral drill-down

sdk.tournaments (tournaments host)

Present when tournamentsBaseUrl is set.

NamespaceKey methods
tournamentslist, getById, enter, submitPicks / getPicks (stage chips), bracket, claims, disputes
f1dashboards, rounds, predictions, leaderboards
lppool, APY, add/remove liquidity
authwallet 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';
ProviderHeadersUse with
walletAuthProviderinjected headers (Authorization: Bearer markets, x-wallet-* tournaments)auth
jwtAuthProviderAuthorization: BearertournamentsAuth
staticHeadersProviderfixed headers you supplyauth / 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

ActionHTTPOn-chain
Tournament entertournaments.enter()onchain.depositAndEnterTournament()
Market betuser.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

LayerPurpose
Quickstart + GuidesEnd-to-end flows: bet, tournament, create market/tournament
This pageClients, auth, namespaces, on-chain
SDK API referenceEvery 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.

On this page