Create a market
Submit a new prediction or versus market on the Bento markets host.
Prerequisites
- Markets host URL (
baseUrl) - Wallet auth headers on
createBentoSdk(creator wallet) - Sufficient collateral / credits for on-chain creation (backend enforces limits)
Flow
import { createBentoSdk, walletAuthProvider } from '@bento.fun/sdk';
const sdk = createBentoSdk({
baseUrl: process.env.BENTO_URL!,
auth: walletAuthProvider(() => ({
'x-wallet-address': walletAddress,
'x-signature': signature,
'x-timestamp': String(Date.now()),
})),
});
// 1. Create (HTTP 201 — on-chain submission accepted)
const result = await sdk.user.createDuel(
{
question: 'Will Team A win?',
type: 'prediction', // or 'versus' with optionA / optionB
category: 'Football',
description: 'Optional context for traders',
startTime: new Date().toISOString(),
endTime: new Date(Date.now() + 7 * 86400000).toISOString(),
privacyAccess: 'public',
collateralMode: 'usdc', // or 'credits'
},
{ requestId: `create-${Date.now()}` },
);
if (result.kind !== 'accepted') {
throw new Error('Market creation rejected');
}
const { duelId, txHash } = result.raw;
console.log({ duelId, txHash });
// 2. Poll until the market appears in catalog (eventual consistency)
let detail;
for (let i = 0; i < 10; i++) {
try {
detail = await sdk.public.getDuelById({ duelId });
break;
} catch {
await new Promise((r) => setTimeout(r, 2000));
}
}Use duelId from the response — not a database id from list rows. See Common patterns.
Parent markets (grouped events)
For multi-market events (e.g. a match with several child markets):
const parent = await sdk.user.createParentMarket(
{ /* title, schedule, options — see Markets OpenAPI */ },
{ requestId: `parent-${Date.now()}` },
);
await sdk.user.createParentMarketInvitation({
parentMarketId: parent.raw.parentMarketId,
});Request bodies are defined in the Markets OpenAPI schema (CreateDuelDto, parent-market DTOs).
Agent / access-code path
Server agents with an access code can use:
await sdk.user.agentAction.createMarket({
accessCode: process.env.AGENT_ACCESS_CODE!,
/* market fields */
});Pass accessCode on each agent-action call (body for POST). Wallet headers still apply via auth — see Authentication.
After creation
| Task | SDK call |
|---|---|
| Resolve outcome | sdk.user.duels.resolve |
| Contest / dispute | sdk.user.duels.submitContest |
| Public reads | sdk.public.getDuelById({ duelId }) |
HTTP acceptance does not mean the chain has finalized. See Mutation semantics.
Related
- Place a bet — trade on an existing market
- SDK API reference —
sdk.user.duels.createDuel - Markets OpenAPI — full request/response schemas