Widget Modes
The widget mode controls what happens when the user taps a card's call-to-action. It is set per deployment and does not change at runtime - if you need two behaviors (e.g. an operator surface and an affiliate surface), embed the widget twice with different configurations.
| Mode | What a tap does | Who uses it |
|---|---|---|
operator | Hands off a payload to your own commerce surface (bet slip, entry, order form) via a BET_CLICKED event. | Sportsbooks, DFS operators, prediction markets |
affiliate | Opens a comparison cart; a second click opens a tracked click-out URL for the chosen sportsbook. | Publishers, media, affiliates |
Operator and affiliate are separate arrangementsEach mode is licensed and permissioned on its own. If you want both - say, an operator surface in your app plus an affiliate surface on your media property - expect the commercials and account permissions to be set up separately for each. Talk to your Odditt contact.
Setting the Mode
The default is operator. The mode is normally fixed in your deployment's preset configuration; it can also be seeded with the widgetMode iframe parameter.
PrecedenceIf your preset JSON contains a
widgetModevalue, the preset wins over the?widgetMode=iframe parameter (presets load after the URL is parsed). Leave the field out of the preset if you want to control the mode per embed.
The mode is also forwarded to the API as widget_mode, which enforces mode-specific behavior server-side.
Operator Mode
One tap, one event. When the user taps the CTA, the widget emits a BET_CLICKED postMessage to your page containing everything you need to pre-populate your bet slip:
{
"type": "BET_CLICKED",
"payload": {
"flowId": "abc-123",
"flowType": "funflow",
"buttonPayload": "opaque-operator-token-or-null",
"data": { "playerName": "...", "oddsDecimal": 2.5, "...": "..." }
},
"timestamp": 1711800000000
}datais the complete flow object the card was rendered from - no follow-up API call needed.buttonPayloadis yours. Whatever token or deeplink your bet slip needs, you hand it to us in your live-quote response and we hand it straight back on tap. We never look inside it. If you don't return one, the card never renders - a bet you can't price is a bet the user never sees, so you won't get a tap on it. It'snullonly when your deployment doesn't use live quoting at all.- The payload shape follows the product mode - a DFS deployment receives the player / stat line / direction / multiplier fields it needs for entry creation.
The widget's job ends at the handoff: it never navigates, deep-links, or opens windows in operator mode. Your page decides what to do with the event.
Affiliate Mode
Two clicks: tap card → cart → tracked click-out.
Step 1 - the cart opens
Tapping the CTA opens the comparison cart (no event is emitted to your page). The widget calls the Affiliate API to build it:
- Single bets →
POST /v1/affiliates/event-position- one betting market position with live odds from every eligible operator, overlaid with your best affiliate offer per operator. - Parlays →
POST /v1/affiliates/parlay- the multi-leg version, with combined odds and per-leg detail for each operator.
Both calls carry the geography from the embed's country / region parameters, so only operators legal in that region are returned. The operatorIds parameter further narrows which books can appear.
Step 2 - what the cart shows
- One row per operator: logo, name, line, and odds side by side (in the embed's configured odds format), so the user sees a true price comparison.
- A 🎁 Offer Available pill on rows that carry one of your affiliate deals; expanding the row reveals the deal copy - tagline, bullets, fine print, and an age disclaimer when enabled.
- For parlays, the expanded row also shows the per-leg ladder and how many legs each book could match.
- Operators without a usable link for the user's device are dropped. The
cartRequireBetUrlpreset field controls whether a row needs a "Place Bet" link specifically, or whether an offer-claim link alone is enough.
Step 3 - the tracked click-out
The cart's Bet Now / Claim Offer buttons are real links that open in a new tab - required for iOS/Android universal-link handoff into the sportsbook app. Before rendering, the widget:
- Detects the user's device and picks the right link per operator (app/universal link preferred on mobile, web link otherwise; desktop never uses a mobile link).
- Appends your click identifier to the URL at click time, so the click is attributed in your click reporting. Links that are pre-baked with tracking pass through unchanged.
See the Affiliate API guide for the offer, link-inventory, and reporting endpoints behind this flow.
Clean Mode
A third, narrative-only mode (clean) exists for specific arrangements - no prices or CTAs, enforced at the API layer. If that sounds relevant to your use case, ask your Odditt contact.
Choosing a Mode
operator | affiliate | |
|---|---|---|
| Tap behavior | BET_CLICKED handoff | Comparison cart → click-out |
| Prices shown | Yes | Yes |
| Parlays | Yes | Yes |
| Requires | A parent page listening for events | Affiliate link inventory + country/region params |
Next Steps
- Product Modes - sportsbook vs DFS vs prediction market rendering
- Widget Events - the full
BET_CLICKEDpayload reference - Affiliate API - offers, carts, links, and click reporting
- Iframe Parameters -
widgetMode,country,region,operatorIds
Updated about 15 hours ago

