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 }

Browser wallet

import { createBentoSdk, jwtAuthProvider, walletAuthProvider } from '@bento.fun/sdk';

// `token` from eoaLogin / eoaRegister — see Authentication.
// `apiKey` 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, // optional — see Environments
  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 needs 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

Sportmonks / other sports data proxies are HTTP on the tournaments host (not wired on createBentoSdk().tournaments). → Sportmonks sports data

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

HTTP vs on-chain flows

ActionHTTPOn-chain
Tournament entertournaments.enter()onchain.depositAndEnterTournament()
Market betuser.placeBetFromEstimate()Server handles chain via markets host

Full API reference

Request/response shapes also ship as TypeScript types in @bento.fun/sdk.

Documentation layers

LayerPurpose
Quickstart + GuidesEnd-to-end flows
CookbookCurated method shortlist
This pageClients, auth, namespaces, on-chain
SDK API referenceExhaustive method + HTTP route index

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