@bento.fun/sdk
v0.5.5
Published
Official TypeScript SDK for Bento prediction markets, packs, parlays, tournaments, fantasy, portfolio, and realtime.
Maintainers
Readme
@bento.fun/sdk
Official TypeScript SDK for Bento — prediction markets, packs, parlays, bracket tournaments, F1, fantasy, portfolio, and realtime.
Features
- Two API hosts — markets (
baseUrl) and tournaments / parlay (tournamentsBaseUrl) from one factory - Contract-backed types — OpenAPI-generated TypeScript for request/response shapes
- Wallet-agnostic — bring Privy, Wagmi, Turnkey, or server signers; SDK accepts headers and viem wallets
- 700+ HTTP methods — public reads, authenticated trading, parlays, fantasy, social, agents, admin
- On-chain orchestration — optional viem helpers for parlay placement, vault deposit/claim, LP
- Realtime — websocket subscriptions for market list and duel activity
Requirements
- Node.js 18+
- TypeScript 5+ (recommended)
Install
npm install @bento.fun/sdkQuick start
Public reads need no auth. sdk.user (bets, create market) needs a Bearer JWT from eoaLogin — not raw x-wallet-* headers on the markets host.
import { createBentoSdk, jwtAuthProvider, walletAuthProvider } from '@bento.fun/sdk';
const baseUrl = process.env.BENTO_URL!;
const tournamentsBaseUrl = process.env.PARLAY_TOURNMENT_URL;
// Unauthenticated client for catalog + login
const publicSdk = createBentoSdk({ baseUrl });
const { data } = await publicSdk.public.listDuels({ page: 1, limit: 20 });
// Login: sign message → JWT (see Authentication below)
const token = '…'; // from eoaLogin
const sdk = createBentoSdk({
baseUrl,
tournamentsBaseUrl,
auth: walletAuthProvider(() => ({ Authorization: `Bearer ${token}` })),
tournamentsAuth: jwtAuthProvider({ getAccessToken: () => token }),
});
// Use duelId (on-chain), not id (database row)
const row = data[0];
if (row?.duelId) {
await sdk.public.getDuelById({ duelId: row.duelId });
}Authentication
| Host | Config | Headers |
|------|--------|---------|
| Markets (sdk.user) | auth | Authorization: Bearer <JWT> from public.auth.eoaLogin |
| Tournaments | tournamentsAuth | Bearer JWT or x-wallet-address + x-signature + x-timestamp |
walletAuthProvider only injects headers — for markets pass Bearer inside it:
const ts = String(Date.now());
const signature = await wallet.signMessage({
message: `Bento.fun Login\nTimestamp: ${ts}\nWallet: ${address}`,
});
const { token } = (await sdk.public.auth.eoaLogin({
address,
signature,
timestamp: ts,
})) as { token: string };| Provider | Use for |
|----------|---------|
| walletAuthProvider | Inject Authorization: Bearer (markets) or x-wallet-* (tournaments) |
| jwtAuthProvider | tournamentsAuth with Bearer token |
| bulkRegisterAuthProvider | Bulk register (x-api-key) |
| agentV1AuthProvider / externalAgentAuthProvider | Agent APIs |
See Authentication and Accounts & wallets (signing key ≠ managed account address).
Important semantics
- HTTP acceptance ≠ on-chain finality — poll reads or use
sdk.realtimeafter mutations. duelIdvsid— list rows have both; useduelIdforgetDuelById/ bets.- Amounts in wei — bet/parlay amounts are base units (18 decimals on BSC/credits), not whole tokens.
creditsvsusdc—collateralModeon markets; credits stack is not geo-gated like USDC.
On-chain (optional)
Requires 0.5.4+ for correct parlay/LP approval amounts.
await sdk.onchain!.placeParlayFromQuoteId(quoteId);
await sdk.onchain!.depositAndEnterTournament(tournamentId, amount);Documentation
| Resource | Description | |----------|-------------| | Quickstart | First API calls | | Authentication | Bearer login flow | | Common patterns | IDs, errors, rate limits | | Test the SDK | sdk-sandbox | | SDK API reference | Every method + route |
Links
- App: app.bento.fun
- GitHub: github.com/Bentodotfun/bento.fun
- Issues: github.com/Bentodotfun/bento.fun/issues
License
MIT — see LICENSE.
