# 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 |


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.wynta.com/player-platform-api.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
