Skip to content

Game Launch Flow

Game Launch Flow-Diagram

Game Launch

Game Request Endpoint

Follow S2S Auth Document,API Endpoint:

https://{GameProviderEndpoint}/api/{Version}/UA

URL Parameters

Field Description
GameProviderEndpoint API domain provided by the Game Provider
Version API version of the Game Provider

JSON Payload Parameters

Field Description Type Requirement
player object
player.id Unique player identifier provided by the Licensee string Required
player.nickname Player display name string Optional
player.language Player’s preferred language string Optional
player.currency Currency used by the player string Required
player.session string Optional
launch string Required
config object
config.playMode Game mode "real_money", "credit", "demo" Required
config.urls Additional options {type: string, url: string}[] Optional
  • For fields of type object, if all subfields are marked as optional, the parent field will also be marked as optional.
  • player.id: The unique identifier of the Player within the Licensee system.
  • player.nickname: In certain interactive table games (e.g., baccarat), this field can be provided if a display name is required. Otherwise, the Game Provider will generate a masked ID (e.g., Player-61535yuh).
  • player.language: Modern HTML5 games typically allow language switching within the game. This field attempts to set the game to the specified language; if not supported, the default language will be used.
  • player.currency: Please refer to the Currency Codes.
  • player.session: If the Licensee needs to restrict the player’s session duration, this field can be set. When the Game Provider sends wallet debit requests, this value will be used instead of player.id.

The launch field uses a URI based on RFC 39861 to represent all parameters and hierarchical relationships required to launch the game:

  • yac://:licensee['/' :agents ...]/_/:gameId['/' :unit ...]['?' :params]['&' :more_params ...]
  • yac://:licensee['/' :agents ...]/@/:lobby['/' :gameId]['/' :unit ...]['?' :params]['&' :more_params ...]

Example:

yac://asia-platform-1/agent1/subagent/c/_/baccart001
└┬┘   └──────┬──────┘ └───────┬───────┘   └───┬────┘
scheme  licensee         agent-layer        gameId
Name Purpose Requirement
scheme Fixed value "yac" Required
licensee Identifier of the Licensee Required
agent-chain Agent hierarchy Optional
_ Delimiter (used for game-only scenarios) Condition
@ Delimiter (used when including lobby) Condition
gameId Game identifier provided by the Game Provider Required
unit Sub-unit of the game, such as table or seat (defined by Game Provider) Required
params Custom parameters reserved for the Licensee Optional

Delimiters:

  • After _, only gameId and an optional unit are allowed
  • After @, the first path segment is lobby, followed optionally by gameId and unit

params and more_params:

  • params are expressed after ? using KEY=VALUE or KEY:TYPE=VALUE:

  • promotion=false{ "promotion": "false" }

  • promotion:bool=false{ "promotion": false }
  • Supported TYPE values: string, bool, number (default is string)

  • If there are multiple parameters, additional ones are appended using & after the first params entry.


  • No agent; enter the baccart001 game

    yac://asia-platform-1/_/baccart001
    └┬┘   └──────┬──────┘   └───┬────┘
    scheme  licensee         gameId
    
  • With agent agent1; directly enter table 002 of ac2501

    yac://asia-platform-1/agent1/_/ac2501/2
    └┬┘   └──────┬──────┘ └──┬─┘   └─┬──┘ └tableId
    scheme  licensee    agent-layer  gameId
    
  • With multiple agents; directly enter table 002 of ac2501, with seat number 9 specified

    yac://asia-platform-1/agent1/subagent/c/_/ac2501/2/9
    └┬┘   └──────┬──────┘ └───────┬───────┘   └─┬──┘ │ └ seatId
    scheme  licensee         agent-layer      gameId └ tableId
    
  • No agent; enter the lobby with the default lobby set to poker

    yac://asia-platform-1/@/lobby?category=poker
    └┬┘   └──────┬──────┘   └─┬─┘ └────┬───────┘
    scheme  licensee        lobby      query params
    
  • No agent; include lobby and directly enter the baccarat01 game in the vip lobby

    yac://asia-platform-1/@/lobby/baccarat01/?category=vip
    └┬┘   └──────┬──────┘   └─┬─┘ └───┬────┘  └─────┬────┘
    scheme  licensee        lobby   gameId     query params
    
  • With multiple agents; include lobby and directly enter the baccarat01 game in the vip lobby, with multiple custom parameters included

    yac://asia-platform-1/agent1/agent2/@/lobby/baccarat01/?category=vip&param=1&maxBet=100&promo:bool=false
    └┬┘   └──────┬──────┘└──────┬─────┘   └─┬─┘ └───┬────┘  └───────────────────────┬──────────────────────┘
    scheme  licensee       agent-layer      lobby   gameId                       query params
    

Reserved Params Keys

The game launch parameters in this system are expressed using a URI. A URI can standardize both resource location and launch parameters in a single string, while naturally supporting hierarchical structure and extensibility.
Most programming languages also provide libraries for parsing and constructing URIs.

Reserved Name Purpose
campaign Marketing campaign identifier, used for analytics or tracking
category Used for lobby classification
token Reserved for the Player to carry authentication tokens

These three keys are reserved and must not be used.

If the Licensee requires additional handling of launch parameters by the Game Provider, please contact your KAM.

  • config.playMode:

  • "credit" — Use the player’s balance for betting (default)

  • "demo" — No wallet deduction is performed
  • "real_money" — Equivalent to "credit"; retained for backward compatibility

  • config.urls: Allows the Licensee to define specific URLs, which should be coordinated with the Game Provider on how they are used

  • "lobby": "https://game-provider.lobby.com/baccarat"

  • "lobby": "https://licensee.lobby.com/baccarat"
  • For lobby handling, there may be both a Game Provider-implemented lobby and a Licensee-provided lobby. This parameter can be used to determine the return destination when exiting the game.

Schema Define

declare interface UserAuthRequest {
  player: {
    id: string;
    nickname?: string;
    language?: string;
    currency: string;
    session?: string;
  };
  launch: string;
  config?: {
    playMode?: "credit" | "credit" | "demo";
    urls?: { type: string; url: string }[];
  };
}
{
  "$schema": "http://json-schema.org/draft-07/schema#",
  "type": "object",
  "required": [
    "player",
    "launch"
  ],
  "properties": {
    "player": {
      "type": "object",
      "required": ["id", "currency"],
      "properties": {
        "id": { "type": "string" },
        "nickname": { "type": "string" },
        "language": { "type": "string" },
        "currency": { "type": "string" },
        "session": { "type": "string" }
      },
    },
    "launch": {
      "type": "string"
    },
    "config": {
      "type": "object",
      "properties": {
        "playMode": {
          "type": "string",
          "enum": ["credit", "demo"]
        },
        "urls": {
          "type": "array",
          "items": {
            "type": "object",
            "required": ["type","url"],
            "properties": {
              "type": {"type": "string"},
              "url": { "type": "string", "format": "uri"}
            },
            "additionalProperties": false
          }
        }
      }
    }
  }
}

Request Example

curl -X POST "https://api.game-provider.example.com/api/v1/UA" \
  -H "content-type: application/json" \
  -H "yac-client-id: asia-platform-1" \
  -H "yac-timestamp: 1772532662" \
  -H "yac-nonce: 8f3c9a1e7b" \
  -H "authorization: ECDSA-SHA256 MEUCIAxFDTqxDSQqkhWVoBPVPkLpZ2legE+jdSrmc56GXdc6AiEA+XOgxPad1YFScBdP6VoSAr01zzdGzPGKR017MAfjNUk=" \
  -d '{
    "player": {
      "id": "player-918273",
      "currency": "USD"
    },
    "launch": "yac://asia-platform-1/agent1/subagent/@/lobby/baccarat01?category=vip&campaign=summer2026&promo:bool=false",
    "config": {
      "playMode": "credit",
    }
  }'
curl -X POST "https://api.game-provider.example.com/api/v1/UA" \
  -H "content-type: application/json" \
  -H "yac-client-id: asia-platform-1" \
  -H "yac-timestamp: 1772532662" \
  -H "yac-nonce: 8f3c9a1e7b" \
  -H "authorization: ECDSA-SHA256 MEUCIAxFDTqxDSQqkhWVoBPVPkLpZ2legE+jdSrmc56GXdc6AiEA+XOgxPad1YFScBdP6VoSAr01zzdGzPGKR017MAfjNUk=" \
  -d '{
    "player": {
      "id": "player-918273",
      "nickname": "LuckyPlayer",
      "language": "en",
      "currency": "USD",
      "session": "sess_WFAQL8GkrabBS7xYVNpo"
    },
    "launch": "yac://asia-platform-1/agent1/subagent/@/lobby/baccarat01?category=vip&campaign=summer2026&promo:bool=false",
    "config": {
      "playMode": "credit",
      "urls": [
        {
          "type": "lobby",
          "url": "https://licensee.example.com/lobby/baccarat"
        }
      ]
    }
  }'

entry will return the game URL, with token appended as a query string.

{
  "entry": "https://fake.example.org",
  "token": "eyJhbGciOiJFUzI1NiJ9.eyJpZCI6InBsYXllci05MTgyNzMiLCJjdXJyZW5jeSI6IlVTRCIsInBsYXlNb2RlIjoiY3JlZGl0IiwibGF1bmNoIjp7Im1vZGUiOiJsb2JieSIsImxpY2Vuc2VlIjoiYXNpYS1wbGF0Zm9ybS0xIiwiYWdlbnRzIjpbImFnZW50MSIsInN1YmFnZW50Il0sImxvYmJ5IjoibG9iYnkiLCJnYW1lSWQiOiJiYWNjYXJhdDAxIiwidW5pdHMiOltdLCJwYXJhbXMiOnsiY2F0ZWdvcnkiOiJ2aXAiLCJjYW1wYWlnbiI6InN1bW1lcjIwMjYiLCJwcm9tbzpib29sIjoiZmFsc2UifX0sImlzcyI6ImlkZW50aXR5LmVyaWNhc2luby5vcmciLCJzdWIiOiJhc2lhLXBsYXRmb3JuLTE6cGxheWVyLTkxODI3MyIsImF1ZCI6ImdhbWUtcHJvdmlkZXIuZXJpY2FzaW5vLm9yZyIsImlhdCI6MTc3MzExNzM4MSwiZXhwIjoxNzczMTE3OTgxfQ.I6u12uTO2-0yA32aSJXxa0Taco57XNL4k3--HUvyfT_yOrFH0pvykUzFNrP9hfbwjIvllJd7jn7K8oFTHNkRJA"
}

Based on this response, the game launch URL should be constructed as https://fake.example.org?token=eyJhbGciOiJFUzI1NiJ9.eyJpZCI6InBsYXllci05MTgyNzMiLCJjdXJyZW5jeSI6IlVTRCIsInBsYXlNb2RlIjoiY3JlZGl0IiwibGF1bmNoIjp7Im1vZGUiOiJsb2JieSIsImxpY2Vuc2VlIjoiYXNpYS1wbGF0Zm9ybS0xIiwiYWdlbnRzIjpbImFnZW50MSIsInN1YmFnZW50Il0sImxvYmJ5IjoibG9iYnkiLCJnYW1lSWQiOiJiYWNjYXJhdDAxIiwidW5pdHMiOltdLCJwYXJhbXMiOnsiY2F0ZWdvcnkiOiJ2aXAiLCJjYW1wYWlnbiI6InN1bW1lcjIwMjYiLCJwcm9tbzpib29sIjoiZmFsc2UifX0sImlzcyI6ImlkZW50aXR5LmVyaWNhc2luby5vcmciLCJzdWIiOiJhc2lhLXBsYXRmb3JuLTE6cGxheWVyLTkxODI3MyIsImF1ZCI6ImdhbWUtcHJvdmlkZXIuZXJpY2FzaW5vLm9yZyIsImlhdCI6MTc3MzExNzM4MSwiZXhwIjoxNzczMTE3OTgxfQ.I6u12uTO2-0yA32aSJXxa0Taco57XNL4k3--HUvyfT_yOrFH0pvykUzFNrP9hfbwjIvllJd7jn7K8oFTHNkRJA

If iframe is used to launch the game, the URL should be set using the same composition method as above.

{
  "success": false,
  "code": "<ERROR_CODE>",
  "reason": "<ERROR_REASON>"
}

Error reason maybe is empty string