> For the complete documentation index, see [llms.txt](https://docs.wynta.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.wynta.com/playerapi.md).

# Player Platform API

**Event Tracking Service**

API Integration Guide Service: PAM API Service Version: 0.1.0

### Overview

The Event Tracking Service provides two core endpoints for capturing player behaviour and maintaining player profile data in real time. Events are accepted asynchronously — the API validates and queues each payload, returning immediately with an accepted/rejected count rather than waiting for downstream processing to complete.

**Base URL**

https\://{base\_url}

**Authentication**

All endpoints require a Bearer token passed in the Authorization header. Tokens are scoped per environment (live / staging) and are issued via the Admin API. Authorization: Bearer \<your\_token>

#### Request Headers

The following headers apply to all API endpoints.

| Header            | Type   | Required | Default | Description                                                               |
| ----------------- | ------ | -------- | ------- | ------------------------------------------------------------------------- |
| Authorization     | String | Yes      | N/A     | Bearer — a secret token issued per client. All endpoints require this.    |
| Content-Type      | String | Yes      | N/A     | Must be application/json for all POST request bodies.                     |
| X-Client-Id       | String | No       | —       | SDK or client identifier. Bound to structured logs for traceability.      |
| X-Idempotency-Key | String | No       | —       | UUID v4 — enables deduplication and caching. Recommended for retry logic. |

#### Authentication Error Responses

The following errors are returned when authentication or authorisation fails.

| Status | Code           | Message                                   | Trigger                                                        |
| ------ | -------------- | ----------------------------------------- | -------------------------------------------------------------- |
| 401    | invalid\_token | Missing or malformed Authorization header | No Authorization header present, or not using Bearer scheme.   |
| 401    | invalid\_token | Invalid or expired token                  | Token not found in DB, has been revoked, or has expired.       |
| 403    | forbidden      | Token scope insufficient                  | Token exists but lacks the required scope (e.g. events:write). |

### Endpoints at a Glance

| Method | Endpoint            | Purpose                                                                                  |
| ------ | ------------------- | ---------------------------------------------------------------------------------------- |
| POST   | /v1/events/track    | Track one or more behavioural events for a player (e.g. login, deposit, bet placed).     |
| POST   | /v1/events/identify | Create or update a player profile with traits (e.g. country, VIP level, account status). |

|   |
| - |

### 1. Track Events

**POST /v1/events/track**

Accepts a batch of one or more event objects and routes them to the configured downstream destinations (e.g. CRM, data warehouse, message broker). The API validates each event individually — valid events are accepted and invalid ones are rejected with per-event error details. The response is returned with HTTP 202 Accepted, indicating the events have been queued for processing.

**Request Body**

| Field  | Type  | Required | Description                                                                                                          |
| ------ | ----- | -------- | -------------------------------------------------------------------------------------------------------------------- |
| events | array | Yes      | Array of event objects. Each object must conform to the event schema described below. Minimum one event per request. |

#### Event Object Schema

Each item in the events array represents a single player action. The fields below are the standard envelope — additional properties can be passed inside properties for event-specific data.

| Field        | Type   | Required | Description                                                                                                |
| ------------ | ------ | -------- | ---------------------------------------------------------------------------------------------------------- |
| user\_id     | string | Yes      | Unique identifier for the player in your system. Must be consistent across all events for the same player. |
| session\_id  | string | No       | Identifier for the current player session. Used to group events within a single session.                   |
| event\_id    | string | No       | Unique identifier for this specific event instance. Used for deduplication. Recommended format: UUID v4.   |
| event\_name  | string | Yes      | Name of the event being tracked (e.g. login\_success, deposit\_completed, bet\_placed). Use snake\_case.   |
| timestamp    | string | Yes      | ISO 8601 datetime string representing when the event occurred. Example: 2026-05-18T14:38:00.000Z           |
| device\_type | string | No       | Type of device used. Accepted values: mobile, tablet, desktop.                                             |
| platform     | string | No       | Operating system or platform. Accepted values: ios, android, web.                                          |
| brand\_id    | string | No       | Identifier for the brand or operator, used in multi-brand setups.                                          |
| properties   | object | No       | Free-form key-value object containing event-specific data. All values must be JSON-serialisable.           |

**Example Request**

POST /v1/events/track Authorization: Bearer Content-Type: application/json

{ "events": \[ { "user\_id": "ply\_776192", "session\_id": "sess\_abc12398", "event\_id": "a1b2c3d4-0000-0000-0000-0007", "event\_name": "deposit\_success", "timestamp": "2026-05-18T15:10:00.000Z", "device\_type": "mobile", "platform": "android", "brand\_id": "brand\_01", "properties": { "amount": 100, "currency": "EUR", "payment\_method": "visa" } }, { "user\_id": "ply\_776192", "session\_id": "sess\_abc12398", "event\_id": "a1b2c3d4-0000-0000-0000-0008", "event\_name": "bet\_placed", "timestamp": "2026-05-18T15:16:00.000Z", "device\_type": "mobile", "platform": "android", "brand\_id": "brand\_01", "properties": { "bet\_amount": 2, "currency": "EUR", "game\_id": "gates\_of\_olympus" } } ] }

**Response — 202 Accepted**

| Field    | Type    | Description                                                                                    |
| -------- | ------- | ---------------------------------------------------------------------------------------------- |
| accepted | integer | Number of events that passed validation and were successfully queued for processing.           |
| rejected | integer | Number of events that failed validation and were not queued.                                   |
| errors   | array   | Array of EventError objects describing each rejected event. Empty if all events were accepted. |

#### EventError Object

| Field     | Type    | Description                                                                                      |
| --------- | ------- | ------------------------------------------------------------------------------------------------ |
| index     | integer | Zero-based position of the failed event in the submitted events array.                           |
| event\_id | string  | null                                                                                             |
| code      | string  | Machine-readable error code identifying the failure reason (e.g. MISSING\_FIELD, INVALID\_TYPE). |
| message   | string  | Human-readable description of the validation failure.                                            |

**Example Response — full success**

{ "accepted": 2, "rejected": 0, "errors": \[] }

**Example Response — partial failure**

{ "accepted": 1, "rejected": 1, "errors": \[ { "index": 1, "event\_id": "a1b2c3d4-0000-0000-0000-0008", "code": "MISSING\_FIELD", "message": "event\_name is required" } ] }

**HTTP Status Codes**

| Status | Meaning          | Description                                                                                                                                      |
| ------ | ---------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| 202    | Accepted         | The request was received and processed. Check accepted/rejected counts in the response body — a 202 does not guarantee all events were accepted. |
| 401    | Unauthorized     | Missing or invalid Bearer token.                                                                                                                 |
| 422    | Validation Error | The request body itself is malformed (e.g. events field is not an array). Distinct from per-event validation errors returned in the 202 body.    |

|   |
| - |

### 2. Identify Player

**POST /v1/events/identify**

Creates or updates the profile (traits) for a known player. Use this endpoint whenever player attributes change — such as on registration, KYC approval, VIP tier change, or preference update. Traits are merged into the player's profile by default; use unset\_traits to explicitly remove fields. The response is returned with HTTP 202 Accepted.

**Request Body**

| Field         | Type   | Required | Description                                                                                                                                         |
| ------------- | ------ | -------- | --------------------------------------------------------------------------------------------------------------------------------------------------- |
| user\_id      | string | Yes      | Unique identifier for the player. Must match the user\_id used in track events for the same player.                                                 |
| anonymous\_id | string | No       | Anonymous identifier for the player prior to login or registration. Used to link pre-login behaviour to an identified profile.                      |
| traits        | object | No       | Key-value object of player attributes to set or update. All values must be JSON-serialisable. Existing traits not included here are left unchanged. |
| unset\_traits | array  | No       | List of trait field names to explicitly remove from the player profile. Applied after traits are merged.                                            |
| timestamp     | string | Yes      | ISO 8601 datetime string for when this identify call occurred. Example: 2026-05-18T14:38:00.000Z                                                    |

#### Common Trait Fields

While traits is a free-form object, the following fields are commonly used across iGaming platforms:

| Trait              | Type   | Description                                                    |
| ------------------ | ------ | -------------------------------------------------------------- |
| email              | string | Player's email address.                                        |
| phone              | string | Player's phone number in E.164 format.                         |
| first\_name        | string | Player's first name.                                           |
| last\_name         | string | Player's last name.                                            |
| date\_of\_birth    | string | Date of birth in YYYY-MM-DD format.                            |
| country            | string | ISO 3166-1 alpha-2 country code (e.g. MT, GB, DE).             |
| currency           | string | Player's primary currency code (e.g. EUR, GBP).                |
| language           | string | Preferred language code (e.g. en, de, fr).                     |
| kyc\_status        | string | KYC verification status. E.g. pending, approved, rejected.     |
| vip\_level         | string | Current VIP tier (e.g. bronze, silver, gold, platinum).        |
| account\_status    | string | Account state. E.g. active, suspended, self\_excluded, closed. |
| registration\_date | string | ISO 8601 datetime when the player registered.                  |
| brand\_id          | string | Brand or operator identifier in multi-brand setups.            |

**Example Request — new registration**

POST /v1/events/identify Authorization: Bearer Content-Type: application/json

{ "user\_id": "ply\_776192", "timestamp": "2026-05-18T14:38:00.000Z", "traits": { "email": "<player@example.com>", "first\_name": "Alex", "last\_name": "Smith", "date\_of\_birth": "1990-04-15", "country": "MT", "currency": "EUR", "language": "en", "kyc\_status": "pending", "vip\_level": "bronze", "account\_status": "active", "registration\_date": "2026-05-18T14:38:00.000Z", "brand\_id": "brand\_01" } }

**Example Request — VIP upgrade + unset a trait**

{ "user\_id": "ply\_776192", "timestamp": "2026-05-18T20:00:00.000Z", "traits": { "vip\_level": "platinum", "kyc\_status": "approved" }, "unset\_traits": \["anonymous\_segment"] }

**Response — 202 Accepted**

| Field    | Type   | Description                                                                                                     |
| -------- | ------ | --------------------------------------------------------------------------------------------------------------- |
| user\_id | string | The user\_id of the player whose profile was created or updated. Echoed back from the request for confirmation. |

**Example Response**

{ "user\_id": "ply\_776192" }

**HTTP Status Codes**

| Status | Meaning          | Description                                                                                                        |
| ------ | ---------------- | ------------------------------------------------------------------------------------------------------------------ |
| 202    | Accepted         | Profile update queued successfully.                                                                                |
| 401    | Unauthorized     | Missing or invalid Bearer token.                                                                                   |
| 422    | Validation Error | The request body is malformed — typically a missing required field (user\_id or timestamp) or incorrect data type. |

|   |
| - |

### Error Reference

**All 422 Validation Error responses share this structure:**

{ "detail": \[ { "loc": \["body", "user\_id"], "msg": "field required", "type": "missing", "input": null, "ctx": {} } ] }

| Field  | Type   | Description                                                                  |
| ------ | ------ | ---------------------------------------------------------------------------- |
| detail | array  | List of one or more validation error objects.                                |
| loc    | array  | Path to the field that failed validation (e.g. \["body", "user\_id"]).       |
| msg    | string | Human-readable error message.                                                |
| type   | string | Machine-readable error type code (e.g. missing, string\_type, value\_error). |
| input  | any    | The value that was actually received for the failing field.                  |
| ctx    | object | Additional context about the error, such as expected constraints.            |

|   |
| - |

### Integration Notes

**Batching Events**

The /v1/events/track endpoint accepts multiple events in a single request. Batch events where possible to reduce HTTP overhead — especially for high-frequency events such as slot spins or heartbeats. A sensible batch size is 10–50 events per request.

**Event Ordering**

Events within a batch are processed in order. Always include a precise timestamp on each event — do not rely on server-side receipt time for ordering, as batches may arrive out of sequence during retries.

**Deduplication**

Providing a unique event\_id on each event enables the service to deduplicate retried requests. Without an event\_id, duplicate events may be processed if the same request is sent more than once.

**Identify Before Track**

Call /v1/events/identify at registration and whenever key player traits change. This ensures the CRM and downstream systems always have an up-to-date player profile when events arrive.

| ⚠ Note: The /v1/events/track response of 202 Accepted does not guarantee downstream delivery. Monitor the rejected count and errors array in every response and implement retry logic for failed events. |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

|   |
| - |

### Code Examples

#### POST /v1/events/track — Track Events

**cURL**

```
curl -X POST "http://<host>:8001/v1/events/track" \
-H "Authorization: Bearer <your_token>" \
-H "Content-Type: application/json" \
-d '{
"events": [
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0007",
"event_name": "deposit_success",
"timestamp": "2026-05-18T15:10:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "brand_01",
"properties": {
"amount": 100,
"currency": "EUR",
"payment_method": "visa"
}
}
]
}'
```

**JavaScript (fetch)**

```
const response = await fetch("http://<host>:8001/v1/events/track", {
method: "POST",
headers: {
"Authorization": "Bearer <your_token>",
"Content-Type": "application/json",
},
body: JSON.stringify({
events: [
{
user_id: "ply_776192",
session_id: "sess_abc12398",
event_id: "a1b2c3d4-0000-0000-0000-0007",
event_name: "deposit_success",
timestamp: new Date().toISOString(),
device_type: "mobile",
platform: "android",
brand_id: "brand_01",
properties: {
amount: 100,
currency: "EUR",
payment_method: "visa",
},
},
],
}),
});

const data = await response.json();
console.log(`Accepted: ${data.accepted}, Rejected: ${data.rejected}`);

if (data.errors.length > 0) {
data.errors.forEach(err => {
console.error(`Event[${err.index}] failed: ${err.code} - ${err.message}`);
});
}
```

**Python (requests)**

```
import requests

url = "http://<host>:8001/v1/events/track"
headers = {
"Authorization": "Bearer <your_token>",
"Content-Type": "application/json",
}
payload = {
"events": [
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0007",
"event_name": "deposit_success",
"timestamp": "2026-05-18T15:10:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "brand_01",
"properties": {
"amount": 100,
"currency": "EUR",
"payment_method": "visa",
},
}
]
}

response = requests.post(url, json=payload, headers=headers)
data = response.json()

print(f"Accepted: {data['accepted']}, Rejected: {data['rejected']}")
for err in data.get("errors", []):
print(f"Event[{err['index']}] failed: {err['code']} - {err['message']}")
```

**Node.js (axios)**

```
const axios = require("axios");   // npm install axios

const client = axios.create({
baseURL: "http://<host>:8001",
headers: { Authorization: "Bearer <your_token>" },
});

async function trackEvents(events) {
const { data } = await client.post("/v1/events/track", { events });
console.log(`Accepted: ${data.accepted}, Rejected: ${data.rejected}`);
if (data.errors.length > 0) {
data.errors.forEach(err =>
console.error(`Event[${err.index}] failed: ${err.code} - ${err.message}`))
}
return data;
}

trackEvents([
{
user_id: "ply_776192",
session_id: "sess_abc12398",
event_id: "a1b2c3d4-0000-0000-0000-0007",
event_name: "deposit_success",
timestamp: new Date().toISOString(),
device_type: "mobile",
platform: "android",
brand_id: "brand_01",
properties: { amount: 100, currency: "EUR", payment_method: "visa" },
},
]);
```

|   |
| - |

|   |
| - |

#### POST /v1/events/identify — Identify Player

**cURL**

```
curl -X POST "http://<host>:8001/v1/events/identify" \
-H "Authorization: Bearer <your_token>" \
-H "Content-Type: application/json" \
-d '{
"user_id": "ply_776192",
"timestamp": "2026-05-18T14:38:00.000Z",
"traits": {
"email": "player@example.com",
"first_name": "Alex",
"last_name": "Smith",
"country": "MT",
"currency": "EUR",
"kyc_status": "approved",
"vip_level": "gold",
"account_status": "active"
}
}'
```

**JavaScript (fetch)**

```
const response = await fetch("http://<host>:8001/v1/events/identify", {
method: "POST",
headers: {
"Authorization": "Bearer <your_token>",
"Content-Type": "application/json",
},
body: JSON.stringify({
user_id: "ply_776192",
timestamp: new Date().toISOString(),
traits: {
email: "player@example.com",
first_name: "Alex",
last_name: "Smith",
country: "MT",
currency: "EUR",
kyc_status: "approved",
vip_level: "gold",
account_status: "active",
},
}),
});

const data = await response.json();
console.log("Profile updated for:", data.user_id);
```

**Python (requests)**

```
import requests

url = "http://<host>:8001/v1/events/identify"
headers = {
"Authorization": "Bearer <your_token>",
"Content-Type": "application/json",
}
payload = {
"user_id": "ply_776192",
"timestamp": "2026-05-18T14:38:00.000Z",
"traits": {
"email": "player@example.com",
"first_name": "Alex",
"last_name": "Smith",
"country": "MT",
"currency": "EUR",
"kyc_status": "approved",
"vip_level": "gold",
"account_status": "active",
},
}

response = requests.post(url, json=payload, headers=headers)
data = response.json()
print(f"Profile updated for: {data['user_id']}")
```

**Node.js (axios)**

```
const axios = require("axios");   // npm install axios

const client = axios.create({
baseURL: "http://<host>:8001",
headers: { Authorization: "Bearer <your_token>" },
});

async function identifyPlayer(userId, traits) {
const { data } = await client.post("/v1/events/identify", {
user_id: userId,
timestamp: new Date().toISOString(),
traits,
});
console.log("Profile updated for:", data.user_id);
return data;
}

identifyPlayer("ply_776192", {
email: "player@example.com",
first_name: "Alex",
last_name: "Smith",
country: "MT",
currency: "EUR",
kyc_status: "approved",
vip_level: "gold",
account_status: "active",
});
```

## Complete iGaming CRM Event Taxonomy

### Registration & Authentication

#### Event List

registration\_started registration\_completed registration\_failed guest\_account\_created social\_signup\_started social\_signup\_completed email\_verification\_sent email\_verified phone\_verification\_sent phone\_verified kyc\_started kyc\_submitted kyc\_approved kyc\_rejected kyc\_resubmitted age\_verification\_completed identity\_verification\_completed address\_verification\_completed duplicate\_account\_detected login\_started login\_success login\_failed logout password\_reset\_requested password\_reset\_completed two\_factor\_enabled two\_factor\_disabled account\_locked account\_unlocked

#### Sample Event Property Structures

**registration\_completed**

| Property             | Sample Value |
| -------------------- | ------------ |
| registration\_method | email        |
| promo\_code          | WELCOME100   |
| currency             | EUR          |

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0001",
"event_name": "registration_completed",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"registration_method": "email",
"promo_code": "WELCOME100",
"currency": "EUR"
}
}
```

**kyc\_submitted**

| Property             | Sample Value |
| -------------------- | ------------ |
| document\_type       | passport     |
| verification\_vendor | sumsub       |
| attempt\_number      | 1            |

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0002",
"event_name": "kyc_submitted",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"document_type": "passport",
"verification_vendor": "sumsub",
"attempt_number": 1
}
}
```

**email\_verified**

| Property             | Sample Value               |
| -------------------- | -------------------------- |
| verification\_method | "link"                     |
| email                | "<user@example.com>"       |
| verified\_at         | "2026-05-18T14:40:00.000Z" |

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0021",
"event_name": "email_verified",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"verification_method": "link",
"email": "user@example.com",
"verified_at": "2026-05-18T14:40:00.000Z"
}
}
```

**phone\_verified**

| Property             | Sample Value               |
| -------------------- | -------------------------- |
| phone\_number        | "+35699123456"             |
| verification\_method | "sms\_otp"                 |
| verified\_at         | "2026-05-18T14:41:00.000Z" |

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0022",
"event_name": "phone_verified",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"phone_number": "+35699123456",
"verification_method": "sms_otp",
"verified_at": "2026-05-18T14:41:00.000Z"
}
}
```

**login\_failed**

| Property        | Sample Value        |
| --------------- | ------------------- |
| login\_method   | "email\_password"   |
| failure\_reason | "invalid\_password" |
| attempt\_number | 2                   |

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0023",
"event_name": "login_failed",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"login_method": "email_password",
"failure_reason": "invalid_password",
"attempt_number": 2
}
}
```

**login\_success**

| Property          | Sample Value    |
| ----------------- | --------------- |
| login\_method     | email\_password |
| two\_factor\_used | true            |
| device\_id        | dev\_00122      |

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0003",
"event_name": "login_success",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"login_method": "email_password",
"two_factor_used": true,
"device_id": "dev_00122"
}
}
```

### Session & Engagement

#### Event List

app\_opened app\_closed session\_started session\_ended heartbeat page\_viewed lobby\_viewed game\_category\_viewed search\_performed game\_details\_viewed provider\_viewed banner\_clicked promotion\_viewed notification\_opened push\_received push\_clicked email\_opened email\_clicked sms\_clicked deeplink\_opened

#### Sample Event Property Structures

**session\_started**

| Property      | Sample Value |
| ------------- | ------------ |
| app\_version  | 3.4.1        |
| network\_type | wifi         |
| device\_model | Samsung S24  |

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0019",
"event_name": "push_clicked",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"template_id": "tmpl_push_01",
"deep_link": "/casino/slots",
"notification_type": "promotional"
}
}
```

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0006",
"event_name": "promotion_viewed",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"promotion_id": "promo_100",
"promotion_type": "deposit_bonus",
"placement": "homepage_banner"
}
}
```

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0005",
"event_name": "game_category_viewed",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"category_name": "slots",
"subcategory_name": "megaways",
"sort_order": "popular"
}
}
```

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0004",
"event_name": "session_started",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"app_version": "3.4.1",
"network_type": "wifi",
"device_model": "Samsung S24"
}
}
```

**game\_category\_viewed**

| Property          | Sample Value |
| ----------------- | ------------ |
| category\_name    | slots        |
| subcategory\_name | megaways     |
| sort\_order       | popular      |

**promotion\_viewed**

| Property        | Sample Value     |
| --------------- | ---------------- |
| promotion\_id   | promo\_100       |
| promotion\_type | deposit\_bonus   |
| placement       | homepage\_banner |

### Financial

#### Event List

deposit\_started deposit\_submitted deposit\_success deposit\_failed deposit\_pending deposit\_cancelled first\_deposit\_completed repeat\_deposit\_completed deposit\_method\_added deposit\_method\_removed payment\_method\_selected saved\_card\_added withdrawal\_started withdrawal\_requested withdrawal\_approved withdrawal\_rejected withdrawal\_processed withdrawal\_completed withdrawal\_failed withdrawal\_cancelled wallet\_balance\_updated wallet\_bonus\_balance\_updated wallet\_locked wallet\_unlocked manual\_adjustment\_credit manual\_adjustment\_debit cashback\_credited cashback\_claimed refund\_processed

#### Sample Event Property Structures

**deposit\_submitted**

| Property        | Sample Value  |
| --------------- | ------------- |
| amount          | 100           |
| currency        | "EUR"         |
| payment\_method | "visa"        |
| transaction\_id | "txn\_882001" |

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0024",
"event_name": "deposit_submitted",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"amount": 100,
"currency": "EUR",
"payment_method": "visa",
"transaction_id": "txn_882001"
}
}
```

**deposit\_success**

| Property        | Sample Value |
| --------------- | ------------ |
| amount          | 100          |
| currency        | EUR          |
| payment\_method | visa         |

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0009",
"event_name": "cashback_credited",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"amount": 15,
"currency": "EUR",
"cashback_type": "weekly_lossback"
}
}
```

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0008",
"event_name": "withdrawal_requested",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"amount": 250,
"currency": "EUR",
"withdrawal_method": "bank_transfer"
}
}
```

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0007",
"event_name": "deposit_success",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"amount": 100,
"currency": "EUR",
"payment_method": "visa"
}
}
```

**withdrawal\_requested**

| Property           | Sample Value   |
| ------------------ | -------------- |
| amount             | 250            |
| currency           | EUR            |
| withdrawal\_method | bank\_transfer |

**withdrawal\_processed**

| Property           | Sample Value     |
| ------------------ | ---------------- |
| amount             | 250              |
| currency           | "EUR"            |
| withdrawal\_method | "bank\_transfer" |
| transaction\_id    | "txn\_993210"    |

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0025",
"event_name": "withdrawal_processed",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"amount": 250,
"currency": "EUR",
"withdrawal_method": "bank_transfer",
"transaction_id": "txn_993210"
}
}
```

**wallet\_balance\_updated**

| Property          | Sample Value |
| ----------------- | ------------ |
| previous\_balance | 320.50       |
| new\_balance      | 420.50       |
| currency          | "EUR"        |
| update\_reason    | "deposit"    |

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0026",
"event_name": "wallet_balance_updated",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"previous_balance": 320.50,
"new_balance": 420.50,
"currency": "EUR",
"update_reason": "deposit"
}
}
```

**refund\_processed**

| Property                  | Sample Value         |
| ------------------------- | -------------------- |
| amount                    | 50                   |
| currency                  | "EUR"                |
| refund\_reason            | "failed\_withdrawal" |
| original\_transaction\_id | "txn\_993199"        |

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0027",
"event_name": "refund_processed",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"amount": 50,
"currency": "EUR",
"refund_reason": "failed_withdrawal",
"original_transaction_id": "txn_993199"
}
}
```

**cashback\_credited**

| Property       | Sample Value     |
| -------------- | ---------------- |
| amount         | 15               |
| currency       | EUR              |
| cashback\_type | weekly\_lossback |

### Bonus & Promotions

#### Event List

bonus\_viewed bonus\_opted\_in bonus\_activated bonus\_awarded bonus\_claimed bonus\_expired bonus\_cancelled bonus\_forfeited bonus\_wagering\_started bonus\_wagering\_completed bonus\_converted\_to\_cash free\_spin\_awarded free\_spin\_used free\_spin\_expired promo\_code\_entered promo\_code\_applied promo\_code\_failed tournament\_joined leaderboard\_entered leaderboard\_reward\_claimed mission\_started mission\_completed loyalty\_points\_earned loyalty\_points\_redeemed vip\_level\_upgraded

#### Sample Event Property Structures

**bonus\_claimed**

| Property      | Sample Value |
| ------------- | ------------ |
| bonus\_id     | bonus\_100   |
| bonus\_amount | 100          |
| currency      | EUR          |

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0012",
"event_name": "vip_level_upgraded",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"previous_vip_level": "gold",
"new_vip_level": "platinum",
"vip_points": 25000
}
}
```

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0011",
"event_name": "free_spin_used",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"game_id": "sweet_bonanza",
"provider_id": "pragmatic_play",
"spin_value": 0.2
}
}
```

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0010",
"event_name": "bonus_claimed",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"bonus_id": "bonus_100",
"bonus_amount": 100,
"currency": "EUR"
}
}
```

**free\_spin\_used**

| Property     | Sample Value    |
| ------------ | --------------- |
| game\_id     | sweet\_bonanza  |
| provider\_id | pragmatic\_play |
| spin\_value  | 0.2             |

**vip\_level\_upgraded**

| Property             | Sample Value |
| -------------------- | ------------ |
| previous\_vip\_level | gold         |
| new\_vip\_level      | platinum     |
| vip\_points          | 25000        |

### Gameplay

#### Event List

game\_opened game\_loaded game\_load\_failed game\_started game\_paused game\_resumed game\_closed game\_crashed bet\_placed bet\_confirmed bet\_failed bet\_cancelled bet\_settled bet\_won bet\_lost bet\_voided bet\_cashout\_requested bet\_cashout\_completed max\_bet\_limit\_hit insufficient\_balance\_detected slot\_spin\_started slot\_spin\_completed slot\_feature\_triggered slot\_bonus\_round\_started slot\_bonus\_round\_completed slot\_jackpot\_triggered slot\_jackpot\_won slot\_autospin\_enabled slot\_autospin\_disabled live\_table\_joined live\_table\_left dealer\_interaction side\_bet\_placed seat\_reserved poker\_table\_joined poker\_table\_left poker\_hand\_started poker\_hand\_completed poker\_tournament\_registered poker\_tournament\_started poker\_tournament\_finished poker\_rebuy\_completed poker\_addon\_purchased

#### Sample Event Property Structures

**game\_opened**

| Property     | Sample Value       |
| ------------ | ------------------ |
| game\_id     | gates\_of\_olympus |
| provider\_id | pragmatic\_play    |
| game\_type   | slot               |

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0015",
"event_name": "bet_won",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"win_amount": 18,
"multiplier": 9,
"currency": "EUR"
}
}
```

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0014",
"event_name": "bet_placed",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"bet_amount": 2,
"currency": "EUR",
"wallet_type": "cash"
}
}
```

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0013",
"event_name": "game_opened",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"game_id": "gates_of_olympus",
"provider_id": "pragmatic_play",
"game_type": "slot"
}
}
```

**game\_started**

| Property           | Sample Value         |
| ------------------ | -------------------- |
| game\_id           | "gates\_of\_olympus" |
| provider\_id       | "pragmatic\_play"    |
| game\_type         | "slot"               |
| balance\_at\_start | 320.50               |

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0028",
"event_name": "game_started",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"game_id": "gates_of_olympus",
"provider_id": "pragmatic_play",
"game_type": "slot",
"balance_at_start": 320.50
}
}
```

**game\_ended**

| Property                   | Sample Value         |
| -------------------------- | -------------------- |
| game\_id                   | "gates\_of\_olympus" |
| provider\_id               | "pragmatic\_play"    |
| session\_duration\_seconds | 342                  |
| balance\_at\_end           | 285.00               |

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0029",
"event_name": "game_ended",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"game_id": "gates_of_olympus",
"provider_id": "pragmatic_play",
"session_duration_seconds": 342,
"balance_at_end": 285.00
}
}
```

**game\_crashed**

| Property            | Sample Value            |
| ------------------- | ----------------------- |
| game\_id            | "gates\_of\_olympus"    |
| provider\_id        | "pragmatic\_play"       |
| error\_code         | "ERR\_NETWORK\_TIMEOUT" |
| active\_bet\_amount | 2.00                    |

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0030",
"event_name": "game_crashed",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"game_id": "gates_of_olympus",
"provider_id": "pragmatic_play",
"error_code": "ERR_NETWORK_TIMEOUT",
"active_bet_amount": 2.00
}
}
```

**bet\_placed**

| Property     | Sample Value |
| ------------ | ------------ |
| bet\_amount  | 2            |
| currency     | EUR          |
| wallet\_type | cash         |

**bet\_won**

| Property    | Sample Value |
| ----------- | ------------ |
| win\_amount | 18           |
| multiplier  | 9            |
| currency    | EUR          |

**bet\_lost**

| Property     | Sample Value         |
| ------------ | -------------------- |
| bet\_amount  | 2                    |
| currency     | "EUR"                |
| wallet\_type | "cash"               |
| game\_id     | "gates\_of\_olympus" |

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0031",
"event_name": "bet_lost",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"bet_amount": 2,
"currency": "EUR",
"wallet_type": "cash",
"game_id": "gates_of_olympus"
}
}
```

**slot\_spin\_started**

| Property     | Sample Value      |
| ------------ | ----------------- |
| game\_id     | "sweet\_bonanza"  |
| provider\_id | "pragmatic\_play" |
| bet\_amount  | 1.00              |
| currency     | "EUR"             |

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0032",
"event_name": "slot_spin_started",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"game_id": "sweet_bonanza",
"provider_id": "pragmatic_play",
"bet_amount": 1.00,
"currency": "EUR"
}
}
```

**slot\_spin\_completed**

| Property     | Sample Value      |
| ------------ | ----------------- |
| game\_id     | "sweet\_bonanza"  |
| provider\_id | "pragmatic\_play" |
| win\_amount  | 4.50              |
| currency     | "EUR"             |

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0033",
"event_name": "slot_spin_completed",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"game_id": "sweet_bonanza",
"provider_id": "pragmatic_play",
"win_amount": 4.50,
"currency": "EUR"
}
}
```

**live\_table\_joined**

| Property     | Sample Value          |
| ------------ | --------------------- |
| game\_id     | "live\_roulette\_vip" |
| provider\_id | "evolution"           |
| table\_id    | "tbl\_rlt\_007"       |
| game\_type   | "live\_roulette"      |

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0034",
"event_name": "live_table_joined",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"game_id": "live_roulette_vip",
"provider_id": "evolution",
"table_id": "tbl_rlt_007",
"game_type": "live_roulette"
}
}
```

**live\_table\_left**

| Property                   | Sample Value          |
| -------------------------- | --------------------- |
| game\_id                   | "live\_roulette\_vip" |
| provider\_id               | "evolution"           |
| table\_id                  | "tbl\_rlt\_007"       |
| session\_duration\_seconds | 610                   |

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0035",
"event_name": "live_table_left",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"game_id": "live_roulette_vip",
"provider_id": "evolution",
"table_id": "tbl_rlt_007",
"session_duration_seconds": 610
}
}
```

### Sportsbook

#### Event List

sportsbook\_opened sport\_selected league\_selected match\_viewed odds\_viewed bet\_builder\_used single\_bet\_placed multi\_bet\_placed live\_bet\_placed cashout\_viewed cashout\_accepted cashout\_rejected bet\_slip\_opened bet\_slip\_abandoned favorite\_team\_added

#### Sample Event Property Structures

**single\_bet\_placed**

| Property      | Sample Value |
| ------------- | ------------ |
| sport         | football     |
| league        | EPL          |
| stake\_amount | 20           |

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0017",
"event_name": "cashout_accepted",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"cashout_amount": 32,
"profit_amount": 12,
"currency": "EUR"
}
}
```

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0016",
"event_name": "single_bet_placed",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"sport": "football",
"league": "EPL",
"stake_amount": 20
}
}
```

**cashout\_accepted**

| Property        | Sample Value |
| --------------- | ------------ |
| cashout\_amount | 32           |
| profit\_amount  | 12           |
| currency        | EUR          |

### CRM & Engagement

#### Event List

campaign\_entered campaign\_exited journey\_entered journey\_completed journey\_dropped segment\_entered segment\_exited webhook\_received recommendation\_clicked survey\_started survey\_completed feedback\_submitted support\_chat\_started support\_ticket\_created affiliate\_click\_tracked affiliate\_registration\_tracked

#### Sample Event Property Structures

**campaign\_entered**

| Property       | Sample Value         |
| -------------- | -------------------- |
| campaign\_id   | camp\_100            |
| campaign\_name | Deposit Reactivation |
| channel        | push                 |

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0020",
"event_name": "segment_entered",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"segment_id": "seg_vip",
"segment_name": "High Value Players",
"entry_reason": "deposit_threshold"
}
}
```

**Sample JSON**

```
{
"user_id": "ply_776192",
"session_id": "sess_abc12398",
"event_id": "a1b2c3d4-0000-0000-0000-0018",
"event_name": "campaign_entered",
"timestamp": "2026-05-18T14:38:00.000Z",
"device_type": "mobile",
"platform": "android",
"brand_id": "utm_camp_12",
"properties": {
"campaign_id": "camp_100",
"campaign_name": "Deposit Reactivation",
"channel": "push"
}
}
```

**push\_clicked**

| Property           | Sample Value   |
| ------------------ | -------------- |
| template\_id       | tmpl\_push\_01 |
| deep\_link         | /casino/slots  |
| notification\_type | promotional    |

**segment\_entered**

| Property      | Sample Value       |
| ------------- | ------------------ |
| segment\_id   | seg\_vip           |
| segment\_name | High Value Players |
| entry\_reason | deposit\_threshold |
