Gaming Inventory File Schema
This page defines the customer-facing Gaming Inventory file contract for Optimove Personalize.
Root object contract
The file must be valid UTF-8 JSON containing one non-empty object:
{
"SLOT001": {
"game_code": "SLOT001",
"game_name": "Adventure Quest"
}
}Each top-level key identifies one game. For every game:
- the top-level key must exactly equal the nested
game_code; - comparison is case-sensitive;
game_codeis a required, non-empty string;game_nameis strongly recommended and, when sent, must be non-empty;- do not use an apostrophe in a game code; the current processor normalizes apostrophes in top-level keys to hyphens;
- the same
game_codemust be sent asootb_game_codein Personalize real-time events; - unknown top-level games from the previous successful snapshot are deletion candidates when omitted; and
- JSON property order has no meaning.
An empty object can pass parts of the current API validation but is not a valid customer snapshot. Reject it locally.
Type and omission rules
Use JSON-native types. In particular:
- use
trueorfalsefornew, without quotation marks; - use
0or1integers for platform flags; - use a decimal between
0and1forrtp, such as0.96, not96; - use arrays where the table specifies an array, even for one value; and
- do not send numbers or Booleans as strings.
Unless a field-specific rule below says otherwise, an optional field that is omitted or set to null provides no value for that feature. Platform fields are the exception: never send them as null. Omitting useful metadata can reduce filtering, modelling or response-enrichment capabilities.
Complete field dictionary
| Field | Required | Type and example | Default or omission behaviour | What Personalize uses it for |
|---|---|---|---|---|
game_code | Yes | String: "SLOT001" | No default. Must be non-empty and equal the top-level key. | Primary game identifier. Joins the catalogue to ootb_game_code in real-time events and identifies recommended games. Also creates a filterable game-code tag. |
game_name | No, strongly recommended | String: "Adventure Quest" | No default; when sent, must be non-empty. Omitting it drops the display name, its recommendation metadata, text-similarity input and name tag. | Customer-facing game name, recommendation response metadata, text-based similarity and a filterable name tag. |
game_category | No | String: "Slots" | No category or category tag when omitted. | Top-level catalogue classification, model input and recommendation filtering tag. |
game_class | No | String: "Video Slots" | No class or class tag when omitted. | Second-level classification, model input and recommendation filtering tag. |
game_type | No | String: "Five Reel" | No type metadata when omitted. | Third-level classification and game metadata. Use an explicit tags entry as well if this value must be an independently selectable filter. |
description | No | String: "A five-reel adventure slot." | No short description when omitted. | Returned game description and text/content modelling input. |
desktop | No | Integer 0 or 1: 1 | If all three platform fields are omitted, all three default to 1. If any is provided, send all three explicitly. | Determines whether the game is eligible on desktop. |
mobile | No | Integer 0 or 1: 1 | If all three platform fields are omitted, all three default to 1. If any is provided, send all three explicitly. | Determines whether the game is eligible on mobile. |
tablet | No | Integer 0 or 1: 0 | If all three platform fields are omitted, all three default to 1. If any is provided, send all three explicitly. | Determines whether the game is eligible on tablet. |
extra_channels | No | Pipe-separated string: "iOS|Android" | No additional channel availability when omitted. | Extends channel-based filtering beyond desktop, mobile and tablet. Preserve the exact channel vocabulary used by your recommendation requests. |
rtp | No | Number from 0 to 1: 0.96 | No RTP value or RTP-derived tag when omitted. | Return-to-player model input and filterable RTP ranges. |
themes | No | Array of strings: ["Adventure", "Egyptian"] | No theme metadata or theme tags when omitted. | Similarity/model input and theme-based recommendation filtering. |
launch_date | No, strongly recommended | String in DD/MM/YYYY: "17/05/2025" | Processing can substitute the processing day when omitted. Always send the true launch date to avoid making older games appear newly launched. | Recently launched and new-game modelling. |
new | No | Boolean: true | No explicit new-game status when omitted. | Stored new-game metadata used by configured modelling. The current tag generator does not create a filter tag from this field. |
supplier | No | String: "Example Games" | No supplier metadata or supplier tag when omitted. | Supplier affinity modelling and supplier-based filtering. |
default_order | No | Integer: 10 | No explicit default rank when omitted. | Provider-defined fallback ordering metadata. Confirm how your configured Personalize experience interprets precedence before relying on it. |
jackpot_type | No | String: "progressive" | No jackpot classification when omitted. | Jackpot affinity and returned game metadata. |
formatted_summary | No | String: "Adventure Quest is a five-reel..." | No long-form summary when omitted. | Stored long-form content. It is not part of the current standard content-model corpus or standard item-detail response; use requires a configured consumer. |
formatted_summary_short | No | String: "A fast five-reel adventure." | No short formatted summary when omitted. | Stored short content that can be returned when recommendation item details are requested. It is not part of the current standard content-model corpus. |
image_url | No, recommended for visual content | Absolute URI: "https://cdn.example.com/games/slot001.jpg" | No image can be returned or rendered when omitted. | Game imagery in recommendation responses and personalised visual content. The URL must remain reachable by the consuming channel. |
game_features | No | Array of one-pair objects: [{"variance":"high"},{"free_spins":true}] | No feature-derived tags or model inputs when omitted. | Custom game characteristics used for modelling and filtering. Send exactly one key/value pair per object; empty objects are invalid. |
tags | No | Array of one-pair objects: [{"exclusive":true},{"seasonal":"Halloween"}] | No custom tags when omitted. | Customer-defined recommendation filters and model inputs. Send exactly one key/value pair per object; empty objects are invalid. |
skin_id | No | Array of strings: ["main", "premium"] | No skin restriction when omitted. | Availability filtering. Values must exactly match the skin identifier supplied with recommendation context. |
regulation | No | Array of strings: ["GB", "DE"] | No regulation restriction when omitted. | Availability filtering. Values must exactly match the regulation supplied with recommendation context. |
inclusions | No | Object of string arrays: {"country":["GB","DE"]} | No custom inclusion rule when omitted. | Makes a game eligible only for the listed values of a context field. Field names and values must exactly match recommendation context. |
exclusions | No | Object of string arrays: {"currency":["USD","CAD"]} | No custom exclusion rule when omitted. | Makes a game ineligible for the listed values of a context field. Field names and values must exactly match recommendation context. |
extra | No | JSON object: {"lobby_path":"/games/slot001","studio":"North"} | No additional response data when omitted. | Flexible stored metadata. It is included only when the recommendation request enables item details; your application defines and consumes its keys. |
Platform availability
Send all three platform fields explicitly on every game:
{
"desktop": 1,
"mobile": 1,
"tablet": 0
}At least one platform must be 1. If all three are omitted, processing defaults all three to 1, which can unintentionally make a game available everywhere. If some fields are present and others absent, validation and downstream behaviour are harder to reason about; explicit values avoid ambiguity.
Do not send null for any platform field. The current validator can treat three explicit nulls like omission, while processing treats the keys as present and produces no platform availability. Either omit all three fields or, preferably, send all three as explicit 0 or 1 integers.
Tags and game features
Both fields accept customer-defined keys and JSON values. Use one key/value pair per object:
{
"game_features": [
{ "variance": "high" },
{ "free_spins": true },
{ "reels": 5 }
],
"tags": [
{ "exclusive": true },
{ "seasonal": "Halloween" }
]
}Do not combine several keys in one object. Current processing consumes one pair from each object, so later pairs in the same object may be ignored.
Invalid:
{
"game_features": [
{
"variance": "high",
"free_spins": true
}
]
}Also avoid empty objects such as "tags": [{}].
Availability rules
Availability fields remove ineligible games before recommendations are returned.
Use skin_id and regulation for the standard dimensions:
{
"skin_id": ["main"],
"regulation": ["GB", "DE"]
}Use inclusions and exclusions for additional context dimensions:
{
"inclusions": {
"country": ["GB", "DE"],
"customer_tier": ["gold", "platinum"]
},
"exclusions": {
"currency": ["USD", "CAD"]
}
}For a given dimension, use a clear inclusion or exclusion policy. Avoid placing the same dimension/value in both objects. A rule only works when its field name and value use exactly the same vocabulary as the recommendation request context.
Complete valid example
The following one-game example demonstrates all 27 supported customer fields. In production, include every game intended to remain in the catalogue.
{
"SLOT001": {
"game_code": "SLOT001",
"game_name": "Adventure Quest",
"game_category": "Slots",
"game_class": "Video Slots",
"game_type": "Five Reel",
"description": "A five-reel adventure slot with bonus rounds.",
"desktop": 1,
"mobile": 1,
"tablet": 1,
"extra_channels": "iOS|Android",
"rtp": 0.96,
"themes": ["Adventure", "Exploration"],
"launch_date": "17/05/2025",
"new": false,
"supplier": "Example Games",
"default_order": 10,
"jackpot_type": "progressive",
"formatted_summary": "Adventure Quest is a five-reel slot with an expanding map and three bonus rounds.",
"formatted_summary_short": "A five-reel adventure with three bonus rounds.",
"image_url": "https://cdn.example.com/games/slot001.jpg",
"game_features": [
{ "variance": "high" },
{ "free_spins": true }
],
"tags": [
{ "exclusive": false },
{ "seasonal": "Summer" }
],
"skin_id": ["main", "premium"],
"regulation": ["GB", "DE"],
"inclusions": {
"country": ["GB", "DE"]
},
"exclusions": {
"currency": ["USD", "CAD"]
},
"extra": {
"lobby_path": "/games/slot001",
"studio": "North"
}
}
}Pre-upload contract checklist
Before calling /validate, verify locally that:
- The root is a non-empty object.
- Every desired game for the brand is present.
- Every root key exactly equals
game_code. - No
game_codecontains an apostrophe. - Every game has a non-empty
game_code;game_nameis present wherever available. - Every
game_codeis unique and stable across uploads. -
game_codematchesootb_game_codein real-time events. - Platform flags are explicit
0or1values and at least one is1. - No platform flag is
null. -
rtpvalues are between0and1. -
launch_datevalues are real calendar dates inDD/MM/YYYYformat. -
newvalues are JSON Booleans. - Tags and features contain one key/value pair per object.
- Availability field names and values match recommendation context.
- Every removal compared with the last successful snapshot is intentional.
- A snapshot removing more than half of the current games is blocked pending coordination with Optimove.
Continue with the quickstart or review monitoring and recovery.
Updated about 2 hours ago
