Game Launch Flow
Game Launch Flow-Diagram
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 asoptional, the parent field will also be marked asoptional.
Player Related-setting
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.
Launch Related-setting
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:
-
paramsare expressed after?usingKEY=VALUEorKEY:TYPE=VALUE: -
promotion=false→{ "promotion": "false" } promotion:bool=false→{ "promotion": false }-
Supported
TYPEvalues:string,bool,number(default isstring) -
If there are multiple parameters, additional ones are appended using
&after the firstparamsentry.
-
No agent; enter the
baccart001gameyac://asia-platform-1/_/baccart001 └┬┘ └──────┬──────┘ └───┬────┘ scheme licensee gameId -
With agent
agent1; directly enter table 002 ofac2501yac://asia-platform-1/agent1/_/ac2501/2 └┬┘ └──────┬──────┘ └──┬─┘ └─┬──┘ └tableId scheme licensee agent-layer gameId -
With multiple agents; directly enter table
002ofac2501, with seatnumber 9specifiedyac://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
pokeryac://asia-platform-1/@/lobby?category=poker └┬┘ └──────┬──────┘ └─┬─┘ └────┬───────┘ scheme licensee lobby query params -
No agent; include lobby and directly enter the
baccarat01game in theviplobbyyac://asia-platform-1/@/lobby/baccarat01/?category=vip └┬┘ └──────┬──────┘ └─┬─┘ └───┬────┘ └─────┬────┘ scheme licensee lobby gameId query params -
With multiple agents; include lobby and directly enter the
baccarat01game in theviplobby, with multiple custom parameters includedyac://asia-platform-1/agent1/agent2/@/lobby/baccarat01/?category=vip¶m=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.
Game-related Settings
-
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