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, optional on-chain orchestration, and realtime subscriptions.

It should be usable from browser apps, React Native, backend jobs, scripts, agents, and tests.

Integration modes

ModeWhenConfiguration
Public readsCatalog, analytics, parlay market listbaseUrl (+ optional tournamentsBaseUrl)
User HTTPBets, packs, tournament enter, socialauth + tournamentsAuth
HTTP + on-chainParlay place, vault deposit, LPonchain: { contracts, wallet }
Server-to-serverBulk register, agents v1, protocol adminHeader 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:

PropertyHostAuth
publicMarketsNone
userMarketsWallet (required)
realtimeMarkets (WS)None
tournaments?TournamentsOptional 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
ogMetadatasocial card metadata
autheoaLogin, eoaRegister, Auth0 flows
duelInvitationscreate, join, validate
withdrawalRequestspre-validate, list, create
autoMintfaucet mint
updatesF1, 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)

NamespaceKey methods
betsestimateBuy, placeBet, sellBet, getUserShares, charts
duelscreateDuel, resolve, contest, participants
parentMarketscreate, invite, join, add child
packsenter, picks, creator flows
portfolioaccount reads
withdrawwithdraw, claim winnings/fees
walletsign, sign-typed-data, send-tx
polymarketdiscovery, orders, positions
referralAnalyticsreferral drill-down
awspresigned upload URL
agentActionagent withdraw, bet, create-market
bulkRegisterbulk register (bulkRegisterAuthProvider)

sdk.tournaments (tournaments host)

Present when tournamentsBaseUrl is set.

NamespaceKey methods
parlaylistMarkets, createQuote, getQuote, claim, getHistory, getTickets
parlayAdminoperator overrides, manual resolve
tournamentslist, getById, enter, bracket, claims, disputes
admincreate, draft/publish/settle, health, creators
protocolAdmindisputes, automation, cancel
f1 / f1Adminpredict, enter, operator lifecycle
fantasy / fantasyAdmincontests, entries, seed/settle
lppool, APY, add/remove liquidity
chatmessages, reactions, Ably token
streamChat / streamFeedstokens, groups, channels
feedsscreen, spotlight, fixtures
sports / proxiesNFL, MLB, Sportmonks, Odds API, FunKit
assetsteam logo resolver
agentspublic feed, leaderboard
agentsWallet / agentsV1 / agentsExternalagent CRUD and APIs
profile / me / follow / homesocial layer
notificationsdevice tokens, legacy register/unregister
socialChat / socialFeeds / usersXMTP, Stream social
authwallet 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';
ProviderHeadersUse with
walletAuthProviderx-wallet-*auth on markets host
jwtAuthProviderAuthorization: BearertournamentsAuth
bulkRegisterAuthProviderx-api-keyuser.bulkRegister
agentV1AuthProviderx-agent-id, x-agent-keyagentsV1
externalAgentAuthProviderx-api-keyagentsExternal

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
Parlayparlay.createQuote()onchain.placeParlayFromQuoteId()
Tournament entertournaments.enter()onchain.depositAndEnterTournament()
Market betuser.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-reference

Documentation layers

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

On this page