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.

ModeWhat a tap doesWho uses it
operatorHands off a payload to your own commerce surface (bet slip, entry, order form) via a BET_CLICKED event.Sportsbooks, DFS operators, prediction markets
affiliateOpens a comparison cart; a second click opens a tracked click-out URL for the chosen sportsbook.Publishers, media, affiliates
📘

Operator and affiliate are separate arrangements

Each 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.

📘

Precedence

If your preset JSON contains a widgetMode value, 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
}
  • data is the complete flow object the card was rendered from - no follow-up API call needed.
  • buttonPayload is 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's null only 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 betsPOST /v1/affiliates/event-position - one betting market position with live odds from every eligible operator, overlaid with your best affiliate offer per operator.
  • ParlaysPOST /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 cartRequireBetUrl preset 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:

  1. 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).
  2. 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

operatoraffiliate
Tap behaviorBET_CLICKED handoffComparison cart → click-out
Prices shownYesYes
ParlaysYesYes
RequiresA parent page listening for eventsAffiliate link inventory + country/region params

Next Steps


Did this page help you?