Real-Time Events
Optimove Personalize combines two kinds of customer data:
- Inventory data describes the games or sports items that can be recommended.
- Real-Time Events describe what an identified customer played or bet on.
The identifiers in an event must match the identifiers in your Inventory integration. Personalize uses that match to turn customer activity into recommendation signals.
This guide covers only the Real-Time Events used by Personalize. Send them through the Server-Side Events API. That API guide is the source of truth for your endpoint, authentication, HTTP responses, retries and delivery limits.
Events to implement
| Vertical | Event | Status for Personalize | What it enables |
|---|---|---|---|
| Gaming | ootb_game_launch | Required | Customer-to-game history, game affinity, popularity and personalised Gaming recommendations |
| Gaming | ootb_game_session | Optional | Session value, stakes, GGR and activity signals for financial- or value-aware methods |
| Sports | ootb_sports_bet_placed | Required | Customer betting history and standard Sports methods such as Popular, Trending, Similarity and Personalised Popular |
| Sports | ootb_sports_bet_settled | Optional | Settlement- and outcome-aware methods, including Prior Win |
“Optional” means that Personalize can operate without the event. Implement it when you want to use a method that depends on the additional data.
Event request wrapper
Every event uses the same top-level request structure. The event-specific fields belong inside context.
{
"tenant": "your_tenant_id",
"timestamp": "2026-07-09T14:22:01Z",
"event": "ootb_game_launch",
"customer": "customer_12345",
"context": {
"ootb_launch_timestamp": "2026-07-09T14:22:00Z",
"ootb_game_code": "SLOT001",
"ootb_game_name": "Mega Fortune Slots",
"ootb_game_category": "Slots",
"ootb_start_balance": 125.5,
"ootb_country": "UK"
}
}| Field | Required | Type | Personalize use | Notes |
|---|---|---|---|---|
tenant | Yes | String or number | Routes the event to the correct Optimove tenant and Personalize brand configuration | Use the exact tenant identifier supplied by Optimove. |
timestamp | Yes | String (date-time) | Records when the event was reported | Send an ISO 8601 UTC timestamp, for example 2026-07-09T14:22:01Z. Event-specific action times remain in context. |
event | Yes | String | Selects the event schema and Personalize processing path | Use the exact event name shown in this guide. Event names are case-sensitive. |
customer | Yes for Personalize | String | Associates the interaction with a customer so Personalize can build history and return personalised recommendations | Use the same stable customer identifier used when requesting recommendations. An anonymous event cannot contribute to an identified customer’s Personalize profile. |
context | Yes | Object | Contains the event-specific Inventory identifiers and activity data | Follow the field table for the selected event. Do not move context fields to the top level. |
Identifier matching
Gaming
context.ootb_game_code must equal the corresponding game_code in Gaming Inventory.
Although some event schemas accept a number, Gaming Inventory uses a string. Sending game codes as strings everywhere avoids type and formatting mismatches. Do not change leading zeros, case or punctuation between the Inventory and event payloads.
| Real-Time Event field | Gaming Inventory field | Purpose |
|---|---|---|
ootb_game_code | game_code | Joins customer gameplay to the game that Personalize can recommend |
Sports
Sports event keys must match the complete Sports Inventory hierarchy.
| Real-Time Event field | Sports Inventory field | Inventory level |
|---|---|---|
ootb_discipline_key | categoryKey | Category, such as the sport or discipline |
ootb_class_key | classKey | Class |
ootb_meeting_key | typeKey | Type, such as a league, meeting or competition |
ootb_event_key | eventKey | Sporting event or fixture |
ootb_market_key | marketKey | Market |
ootb_selection_key | selectionKey | Selection or outcome |
Use the same value and JSON type on both sides of each join. A name is useful for reporting and modelling, but it does not repair a mismatched key.
Integration rules
- Complete the relevant Gaming or Sports Inventory integration before relying on Real-Time Events.
- Use a stable, identified
customervalue on every event sent for Personalize. - Send all timestamps in ISO 8601 UTC format.
- Preserve Inventory identifiers exactly. Do not translate or reformat keys in the event pipeline.
- For a multi-selection sports bet, send one event for each selection or leg. Reuse the bet slip identifier and set the correct leg number on each event.
- Validate both the wrapper and the selected event’s
contextbefore sending production traffic. - Monitor event delivery and verify that customer, event and Inventory identifiers appear as expected in your Optimove environment.
Next steps
- Gaming integrations: start with Game Launch, then decide whether to add Game Session.
- Sports integrations: start with Bet Placement, then decide whether to add Bet Settled.
- For transport and authentication, use the Server-Side Events API.
Updated about 2 hours ago
