TYGER SDK

Documentation updated

Add your game to TYGER

Bringing TYGER's adaptive music engine into your game is a creative partnership, not just an API integration. We work closely with each studio to shape the experience around your title — which game events drive the music, what arrangements fit your tone, and how the SDK plugs into your runtime.

If that sounds like something you'd like to explore, drop us a line at contact@tygermedia.ai with a short note about your studio and the game you're working on. Someone from our partnerships team will be happy to set up a conversation and walk you through what's possible. We evaluate each potential partner carefully so we can deliver something great together.

The TYGER app

The SDK is served by the TYGER desktop app for Windows. It runs a small HTTP server on the player's machine; your integration talks to it over localhost. Errors come back as real HTTP status codes with a JSON body, so you can see exactly what went wrong while you integrate.

The TYGER team provides the app build, your API key and a Postman collection when you are onboarded. Playing music requires a free TYGER account: sign in and start the music before you test — with no session open the app plays 30-second previews, and once your session is open every track plays in full, adaptive mode.

Two kinds of integrator use the same API:

Developer Reference

Local game events REST API

The TYGER SDK is a fire-and-forget REST contract: your client sends game events to the local HTTP ingress and never waits on the response to keep playing. Success is observable in the app — the music reacts.

Wire contract: a request that succeeds returns an empty HTTP 200. A request that fails returns the real status code (401, 403, 409, 422, 500) with a JSON body { "error": "<tag>", "detail": "..." }. The detail field is optional.

Base URL and port

The server binds to 127.0.0.1 (IPv4 loopback) on the player's machine. At startup it takes the first free port from this list:

Try the ports in that order and lock in the first one where GET /tyger/health answers 200. A port that refuses the TCP connection is not TYGER.

Authentication

Every route except GET /tyger/health requires an API key, passed as a query parameter on every request:

The TYGER team generates and shares your key when you are onboarded. The kind of key decides how a session names its game:

Key kindIdentifiesGame
Studioone gameimplied by the key — never sent
Platformthe integratorgame_id in the connect body, from the games your key is allowed to drive

No key is 401 unauthorized; a key that matches nothing is 403 forbidden. Requests carrying browser fetch metadata (Origin, Sec-Fetch-Site) are refused with 403 forbidden_origin: the ingress is a localhost server and must not be drivable from a web page. Clients written in C++, C#, Go or any non-browser HTTP stack never send these headers.

Session lifecycle

GET /tyger/health confirm the port connect open the session game-events one or more events per request disconnect close the session × N

Call connect when your integration starts, game-events as moments happen, disconnect when it stops. No heartbeat is required. Sessions are per API key: your connect never disturbs another integrator's session, and your disconnect only closes yours.

Ending your session

You own the close. TYGER never ends your session for you: not when the game process exits, not after a period without events, not when your client disappears. There is no heartbeat and no idle timeout. Call disconnect:

If you skip it, the app stays in game mode with the adaptive music running until the player restarts TYGER. A connect on a session that is already open is harmless, so reconnecting after a crash needs no special handling: call connect again and carry on.

Sessions live in memory. After TYGER restarts, game-events answers 409 no_session: call connect again, then resend.

Session ownership

TYGER also detects supported titles on its own. On a machine where your platform observes a game TYGER already detected, both sources report the same game. TYGER runs one game session and decides who owns it:

Connecting and retrying

On startup, find the port with GET /tyger/health, then fire POST /tyger/v1.0/session/connect. If the TCP connection refuses, TYGER is not running. Keep retrying with a backoff. Recommended client contract: 5-second request timeout, 10-second retry interval.

Verifying your integration

The HTTP response only tells you the request was accepted. Verify the effect in the app:

Nothing audible? Check, in this order: the user is signed in, the music is started (press play), sound effects are enabled for the game in the game card's Audio settings, the event name matches the game's vocabulary.

Endpoints

GET /tyger/health Liveness check & port discovery

Purpose

Liveness check — confirms TYGER is up and locks in which port it bound to. No API key. Answers an empty 200.

Example

curl "http://127.0.0.1:58931/tyger/health"
POST /tyger/v1.0/session/connect Open your session

Purpose

Open a session for the game. A studio key implies the game; a platform key names it with game_id. Calling connect again on an open session is harmless.

Example — studio key

curl -X POST "http://127.0.0.1:58931/tyger/v1.0/session/connect?api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'

Example — platform key

curl -X POST "http://127.0.0.1:58931/tyger/v1.0/session/connect?api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "game_id": 21640 }'

Query parameters

FieldRequiredType
api_keyYesstring

Request fields

FieldRequiredType
game_idPlatform keys onlynumber — the game's id, from the list your key is allowed to drive

Errors

POST /tyger/v1.0/session/disconnect Close your session

Purpose

Close your session. Further /tyger/v1.0/game-events calls fail with 409 no_session until you connect again. If TYGER's own detection still sees the game, the session falls back to it instead of ending.

Example

curl -X POST "http://127.0.0.1:58931/tyger/v1.0/session/disconnect?api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'

Query parameters

FieldRequiredType
api_keyYesstring

Request fields

FieldRequiredType
game_idNonumber — platform keys may repeat the connected game; a different id is 409 no_session

Errors

POST /tyger/v1.0/game-events Submit game events

Purpose

Submit one or more game events for your open session. Events are applied in order; a batch is accepted as a whole or rejected as a whole.

Example

curl -X POST "http://127.0.0.1:58931/tyger/v1.0/game-events?api_key=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "events": [
      { "name": "kill" },
      { "name": "death", "data": { "killer": "player" } }
    ]
  }'

Query parameters

FieldRequiredType
api_keyYesstring

Request fields

FieldRequiredType
eventsYesarray<object> — at least one
events[].nameYesstring — see Event names
events[].dataNoany — passed through to the game's event handler as-is. No supported game reads it today; leave it out unless agreed at onboarding

Errors

Event names

Each game has its own vocabulary of moments, agreed with you during onboarding. Names are case-sensitive; a name the game doesn't know is accepted and ignored. Platform keys drive TYGER's supported titles with their existing vocabulary:

Gamegame_idEvent names
VALORANT21640kill, death, assist, headshot — kill streaks (first blood, double kill, triple kill, killing spree) are derived from consecutive kill events

Global errors

Any endpoint can return the following:

TYGER SDK | Tyger

TYGER SDK on TYGER. Adaptive game audio that scores your every move.