REST API
Use the REST API when no SDK exists for your platform or language. Any HTTP client can send events to Vortex Analytics.
Base URL: https://in.vortexanalytics.io
Content-Type: application/json
Body size limit: 1 MB per request
Authentication
Section titled “Authentication”Every request must include your Tenant ID — either as a query parameter (GET requests) or as the tenant_id field in the JSON body (POST requests). There is no API key header.
Your Tenant ID is available in the Vortex dashboard.
Endpoints
Section titled “Endpoints”| Method | Path | Description |
|---|---|---|
GET | /validate | Verify your tenant ID is valid |
POST | /track | Send a single event |
POST | /batch | Send multiple events in one request |
Validate tenant
Section titled “Validate tenant”Verify your tenant ID before sending events. Call this on startup.
GET /validate?tenant_id={YOUR_TENANT_ID}Query parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
tenant_id | string | Yes | Your project tenant identifier |
Responses
| Code | Meaning |
|---|---|
200 | Tenant is valid — safe to send events |
400 | tenant_id query parameter is missing |
403 | Tenant not found or unauthorized |
curl "https://in.vortexanalytics.io/validate?tenant_id=mygame"import requests
resp = requests.get( "https://in.vortexanalytics.io/validate", params={"tenant_id": "mygame"}, timeout=5,)if resp.status_code == 200: print("Tenant valid")const resp = await fetch( "https://in.vortexanalytics.io/validate?tenant_id=mygame");if (resp.ok) { console.log("Tenant valid");}Track single event
Section titled “Track single event”Send one event immediately.
POST /trackRequest body
{ "tenant_id": "mygame", "tracking": { "name": "level_complete", "value": "{\"level\": 3, \"time\": 94.2}", "identity": "550e8400-e29b-41d4-a716-446655440000", "session_id": "b1e2f3a4-c5d6-7890-abcd-ef1234567890", "platform": "STEAM", "app_version": "1.4.2", "timestamp": "2026-05-16T14:30:00.000Z", "custom": "{\"region\": \"EU\", \"premium\": true}" }}Fields
| Field | Type | Required | Description |
|---|---|---|---|
tenant_id | string | Yes | Your project tenant identifier |
tracking.name | string | Yes | Event name, e.g. level_complete |
tracking.identity | string | Yes | Persistent device or user identifier (UUID recommended) |
tracking.session_id | string | Yes | Session identifier — a new UUID per app launch |
tracking.platform | string | Yes | Platform string, e.g. STEAM, IOS, ANDROID, WEB |
tracking.app_version | string | Yes | Application version string, e.g. 1.4.2 |
tracking.value | string | No | JSON-encoded event payload. Max 70 KB. Must be valid JSON if provided |
tracking.timestamp | string | No | ISO 8601 UTC timestamp. Server time is used if omitted or zero |
tracking.custom | string | No | JSON-encoded metadata attached to this event. Max 70 KB. Must be valid JSON if provided |
Responses
| Code | Meaning |
|---|---|
200 | Event accepted |
400 | Invalid JSON, missing required fields, or oversized value / custom |
403 | Tenant not found or unauthorized |
415 | Content-Type header present but not application/json |
curl -X POST "https://in.vortexanalytics.io/track" \ -H "Content-Type: application/json" \ -d '{ "tenant_id": "mygame", "tracking": { "name": "level_complete", "value": "{\"level\": 3}", "identity": "550e8400-e29b-41d4-a716-446655440000", "session_id": "b1e2f3a4-c5d6-7890-abcd-ef1234567890", "platform": "WEB", "app_version": "1.0.0" } }'import jsonimport requests
payload = { "tenant_id": "mygame", "tracking": { "name": "level_complete", "value": json.dumps({"level": 3}), "identity": "550e8400-e29b-41d4-a716-446655440000", "session_id": "b1e2f3a4-c5d6-7890-abcd-ef1234567890", "platform": "WEB", "app_version": "1.0.0", },}
resp = requests.post( "https://in.vortexanalytics.io/track", json=payload,)resp.raise_for_status()const value = JSON.stringify({ level: 3 });
await fetch("https://in.vortexanalytics.io/track", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ tenant_id: "mygame", tracking: { name: "level_complete", value, identity: "550e8400-e29b-41d4-a716-446655440000", session_id: "b1e2f3a4-c5d6-7890-abcd-ef1234567890", platform: "WEB", app_version: "1.0.0", }, }),});Track batch events
Section titled “Track batch events”Send multiple events in a single HTTP request. More efficient than individual calls when tracking several events at once.
POST /batchRequest body
{ "tracks": [ { "tenant_id": "mygame", "tracking": { "name": "tutorial_step_1", "identity": "550e8400-e29b-41d4-a716-446655440000", "session_id": "b1e2f3a4-c5d6-7890-abcd-ef1234567890", "platform": "STEAM", "app_version": "1.4.2" } }, { "tenant_id": "mygame", "tracking": { "name": "tutorial_step_2", "identity": "550e8400-e29b-41d4-a716-446655440000", "session_id": "b1e2f3a4-c5d6-7890-abcd-ef1234567890", "platform": "STEAM", "app_version": "1.4.2" } } ]}Each object inside tracks follows the same structure as the /track body. Invalid tracks are skipped server-side without failing the whole batch.
Responses
| Code | Meaning |
|---|---|
200 | Batch processed (individual invalid tracks are skipped, not rejected) |
400 | Request body is not valid JSON |
415 | Content-Type header present but not application/json |
curl -X POST "https://in.vortexanalytics.io/batch" \ -H "Content-Type: application/json" \ -d '{ "tracks": [ { "tenant_id": "mygame", "tracking": { "name": "tutorial_step_1", "identity": "550e8400-e29b-41d4-a716-446655440000", "session_id": "b1e2f3a4-c5d6-7890-abcd-ef1234567890", "platform": "WEB", "app_version": "1.0.0" } }, { "tenant_id": "mygame", "tracking": { "name": "tutorial_step_2", "identity": "550e8400-e29b-41d4-a716-446655440000", "session_id": "b1e2f3a4-c5d6-7890-abcd-ef1234567890", "platform": "WEB", "app_version": "1.0.0" } } ] }'import requests
tracks = [ { "tenant_id": "mygame", "tracking": { "name": "tutorial_step_1", "identity": "550e8400-e29b-41d4-a716-446655440000", "session_id": "b1e2f3a4-c5d6-7890-abcd-ef1234567890", "platform": "WEB", "app_version": "1.0.0", }, }, { "tenant_id": "mygame", "tracking": { "name": "tutorial_step_2", "identity": "550e8400-e29b-41d4-a716-446655440000", "session_id": "b1e2f3a4-c5d6-7890-abcd-ef1234567890", "platform": "WEB", "app_version": "1.0.0", }, },]
resp = requests.post( "https://in.vortexanalytics.io/batch", json={"tracks": tracks},)resp.raise_for_status()const tracks = [ { tenant_id: "mygame", tracking: { name: "tutorial_step_1", identity: "550e8400-e29b-41d4-a716-446655440000", session_id: "b1e2f3a4-c5d6-7890-abcd-ef1234567890", platform: "WEB", app_version: "1.0.0", }, }, { tenant_id: "mygame", tracking: { name: "tutorial_step_2", identity: "550e8400-e29b-41d4-a716-446655440000", session_id: "b1e2f3a4-c5d6-7890-abcd-ef1234567890", platform: "WEB", app_version: "1.0.0", }, },];
await fetch("https://in.vortexanalytics.io/batch", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ tracks }),});Identity and session management
Section titled “Identity and session management”| Concept | Recommendation |
|---|---|
| identity | A persistent UUID tied to the device or user. Generate once and store it (e.g. in local storage or a file). Reuse across sessions. |
| session_id | A new UUID generated each time the application starts. |
| timestamp | ISO 8601 UTC, e.g. 2026-05-16T14:30:00.000Z. Omit to let the server record arrival time. |