Personalize Bet Placement

ootb_sports_bet_placed is the required Sports event for Optimove Personalize. Send it each time an identified customer’s sports bet is accepted by the operator.

Personalize uses placed bets to build customer interests and aggregate popularity at the Selection, Market, Event, Type, Class and Category levels. It is the core Real-Time Event for standard Sports recommendation methods.

Send this event using the Server-Side Events API.

Before you begin

  • The referenced Category, Class, Type, Event, Market and Selection must exist in Sports Inventory.
  • Every event key must exactly match the corresponding Inventory key.
  • customer must be the stable identifier used when requesting recommendations for the same customer.
  • Send the event after the operator has accepted the bet. Do not report rejected bet attempts as placed bets.
  • Send one event for each selection or leg. For a multi-selection bet, reuse the bet slip identifier and report the correct leg number on every event.

Example

{
  "tenant": "your_tenant_id",
  "timestamp": "2026-07-09T14:22:01Z",
  "event": "ootb_sports_bet_placed",
  "customer": "customer_12345",
  "context": {
    "ootb_betslip_key": "ticket_9001",
    "ootb_bet_date_time": "2026-07-09T14:22:00Z",
    "ootb_betslip_status": "open",
    "ootb_bet_key": "bet_10001",
    "ootb_bet_stake": 20,
    "ootb_odds_decimal_price": 2.1,
    "ootb_selection_key": "selection_man_utd",
    "ootb_selection_name": "Manchester United",
    "ootb_market_key": "market_match_result_7842",
    "ootb_market_name": "Match Result",
    "ootb_event_date_time": "2026-07-10T19:00:00Z",
    "ootb_event_key": "event_7842",
    "ootb_event_name": "Manchester United vs Liverpool",
    "ootb_meeting_key": "type_premier_league",
    "ootb_meeting_name": "Premier League",
    "ootb_class_key": "class_england",
    "ootb_class_name": "England",
    "ootb_discipline_key": "category_football",
    "ootb_discipline_name": "Football",
    "ootb_leg_num": 1,
    "ootb_bet_type": "Single",
    "ootb_num_selections": 1,
    "ootb_channel": "Desktop"
  }
}

Context fields

FieldRequiredTypePersonalize useNotes
ootb_betslip_keyYesStringGroups selections that belong to the same ticket or bet slipReuse it for every leg of the same multi-selection bet. Do not reuse it for an unrelated ticket.
ootb_bet_date_timeYesString (date-time)Determines when the customer interaction occurred and supports recency-based modellingSend the accepted placement time as an ISO 8601 UTC timestamp.
ootb_betslip_statusYesStringRecords the ticket’s lifecycle state at placementUse a stable status vocabulary. A newly accepted unresolved bet is commonly open.
ootb_bet_keyYesStringIdentifies the bet within the operator’s data and helps relate later updatesUse a stable unique identifier. Keep it consistent with the related settlement event.
ootb_bet_stakeYesNumberSupplies bet value for stake-aware analysis and modellingMust be zero or greater. Use a JSON number without a currency symbol.
ootb_odds_decimal_priceYesNumberSupplies normalized decimal odds for ranking and modellingMust be zero or greater. Send the decimal price for this selection.
ootb_selection_keyYesStringPrimary join to the Sports Inventory Selection and the item recommended by PersonalizeMust exactly match Inventory selectionKey.
ootb_selection_nameYesStringSupplies a readable outcome and supports name-based Sports modelsUse the same name as Inventory where possible. The key remains the authoritative join.
ootb_market_keyYesStringJoins the Selection to its Sports Inventory MarketMust exactly match Inventory marketKey.
ootb_market_nameYesStringSupplies market meaning for modelling, filtering and diagnosticsUse the same name as Inventory where possible.
ootb_event_date_timeYesString (date-time)Distinguishes pre-event and in-play timing and joins activity to the fixture scheduleSend the scheduled event start as an ISO 8601 UTC timestamp.
ootb_event_keyYesStringJoins the bet to its Sports Inventory Event or fixtureMust exactly match Inventory eventKey.
ootb_event_nameYesStringSupplies fixture and participant context for Sports modelsUse the same name as Inventory where possible. Keep team or participant naming consistent.
ootb_meeting_keyYesStringJoins the bet to the Sports Inventory Type levelDespite the event field name, this maps to Inventory typeKey.
ootb_meeting_nameYesStringSupplies readable competition, league or meeting contextUse the Inventory Type name.
ootb_class_keyYesStringJoins the bet to the Sports Inventory Class levelMust exactly match Inventory classKey.
ootb_class_nameYesStringSupplies readable Class contextUse the same name as Inventory where possible.
ootb_discipline_keyYesStringJoins the bet to the Sports Inventory Category levelDespite the event field name, this maps to Inventory categoryKey.
ootb_discipline_nameYesStringSupplies the readable sport or disciplineUse the Inventory Category name.
ootb_leg_numYesNumberIdentifies this selection’s position in a multi-leg betMust be zero or greater. Send a whole number and use one consistent indexing convention.
ootb_bet_typeYesStringDistinguishes structures such as Single, Multiple, System and Bet BuilderUse a stable vocabulary across placement and settlement events.
ootb_num_selectionsYesNumberDescribes bet complexity and the number of expected leg eventsMust be zero or greater. Send a whole number.
ootb_platformNoStringAccepted by the event schema but not currently retained by the Personalize Bet Placement mapperExamples include iOS, Android and Web.
ootb_channelNoStringSupplies access-channel contextExamples include mobile, web and retail.
ootb_licenseNoStringSupplies regulatory or jurisdiction context where configuredUse a stable license identifier.
ootb_betslip_stakeNoNumberAccepted by the event schema but not currently retained by the Personalize Bet Placement mapperMust be zero or greater. Do not repeat the selection allocation here unless it equals the complete ticket total.
ootb_bet_bonusNoNumberSupplies the bonus-funded portion of the betMust be zero or greater.
ootb_bet_sel_stakeNoNumberSupplies the stake allocated to this SelectionMust be zero or greater. Particularly useful for multi-selection value analysis.
ootb_bet_sel_bonusNoNumberSupplies the bonus amount allocated to this SelectionMust be zero or greater.
ootb_is_liveNoBoolean or integerAccepted by the event schema but not currently retained by the Personalize Bet Placement mapperPrefer JSON true or false. If integers are used, use 1 for live and 0 otherwise.
ootb_odds_numberNoNumberSupplies the numerator when fractional odds are also requiredSend it together with ootb_odds_denominator. Decimal odds remain required.
ootb_odds_denominatorNoNumberSupplies the denominator when fractional odds are also requiredSend it together with ootb_odds_number.
ootb_odds_american_priceNoNumberAccepted by the event schema but not currently retained by the Personalize Bet Placement mapperDecimal odds remain the required normalized representation.
ootb_leg_typeNoStringAdds semantic detail for the legExamples include To win, Handicap and Outright.
ootb_each_wayNoBoolean or stringDescribes an each-way leg where applicablePrefer a Boolean. If strings are required by your source, use one stable vocabulary such as Yes and No.
ootb_is_freeNoBooleanAccepted by the event schema but not currently retained by the Personalize Bet Placement mapperSend true only when no cash stake funded the bet.
ootb_brandNoStringSupplies downstream brand or skin contextThe top-level tenant still determines event routing. Use a stable configured value when this context is needed.

Sports Inventory joins

Event contextInventoryMeaning
ootb_discipline_keycategoryKeySport or discipline
ootb_class_keyclassKeyClass
ootb_meeting_keytypeKeyCompetition, league, meeting or Type
ootb_event_keyeventKeyEvent or fixture
ootb_market_keymarketKeyMarket
ootb_selection_keyselectionKeySelection or outcome

All six keys should describe one valid path through the Inventory hierarchy. Do not combine a Selection from one Event with the Event, Type or Category keys from another branch.

Multi-selection bets

Send one ootb_sports_bet_placed event for every selection. Each event should:

  • use the same ootb_betslip_key for the complete ticket;
  • identify its own Selection and parent Market/Event hierarchy;
  • set ootb_leg_num to that leg’s position; and
  • set ootb_num_selections to the total number of selections on the ticket.

Validation checklist

  • The wrapper contains tenant, timestamp, event, customer and context.
  • event is exactly ootb_sports_bet_placed.
  • All required fields are present for every selection or leg.
  • The six hierarchy keys match one valid Sports Inventory path.
  • Bet and event timestamps are valid ISO 8601 UTC values.
  • Decimal odds and numeric values are JSON numbers, not formatted strings.
  • Multi-selection legs share the ticket identifier and total selection count.
  • The event represents an accepted bet, not an attempted or rejected bet.

Did this page help you?