Download OpenAPI specification:Download
The API communication is always using HTTP POST with json requests and json responses. Content-type on requests need to be set to application/json.
Communication will always be over HTTPS.
Http status 200 means operation was successful (only use 200 for success, never 201). If the request is unsuccessful the http status must be either 40x or 50x. The exact error is clarified by an errorcode variable. For a complete list of all error codes see below.
All fields in all requests and responses are always in lower case.
Language is defined by two char ISO 639 codes i.e. ja for Japanese. If other codes are required custom mappings can be configured upon request.
Currency is defined by three char ISO 4217 codes i.e. JPY for Japanese Yen. If other codes are required custom mappings can be configured upon request.
Country is defined by two char ISO 3166 alpha 2 codes i.e. JP for Japan.
All amounts are presented in cents where for example 1.00 USD will be sent as 100. Meaning all amounts always has "two decimals". This also applies to currencies that do not have decimals like 1 JPY will also be sent as 100.
The jackpot contribution in contributionamount is in ten-thousand of a cent, meaning contribution is with "six decimals", i.e. contribution of 1.00 USD will be sent as 1,000,000.
JSON parser must be configured to ignore unknown fields. This to allow the API to grow with new features without breaking backwards compatibility.
For requests, the JSON generator should be set to ignore null fields i.e. to not be included in the generated request data.
Current outgoing IP from test/staging system is 158.180.12.240.
The roundid value is used to uniquely identify the financial game round. The VisionLINK will make sure it's always unique, even if several players are playing on the same table.
All debit, credit and reverse requests will always have the roundid included.
All requests will always have the externalsessionid included.
Each game round will always be notified as closed even if there's no win. In such cases there will be a zero credit call sent.
The transid value is used to uniquely identify each individual transaction.
The default platform behaviour is to send each FREEBET being played as individual game rounds, with regular debit and credit calls. This can be reconfigured on Vision Link side to only send a freebet summary. In such case there will not be any debit calls, just a single credit call in the end with reason=FREEBET_SUMMARY when all freebets are successfully consumed.
The parameter jurisdiction, if used, must follow our internal definitions which are based on the country of the regulator for example 'MT' for MGA.
The communication with wallet is expected to be idempotent processed. This means that if the same request is received again, the same result as before should be returned without changing the balance the second time.
Any pending open game round will be automatically closed, normally after 48 hours but variations can exist for different games and products. This means that both method getbalance and credit must be allowed even if session is already closed.
Please note for just integrating with Vision RGS the following are not used;
The Operator API is for server request from the operator to the Vision platform. This API is protected by Basic Auth mechanics, credentials will be given by the integration team. In production the API will be behind a firewall.
To be used for creating a game session via API. This is called as a server to server call, where response will be a json response, not a 302 redirect response.
The game launch itself is a two step process as the launchurl responded will point to the public game launcher. This to allow injection of addition iframe's or other html based game loaders.
When calling the gamelauncher method the request will be considered already authenticated due to it's an authorised method, hence there is no additional callback for authenticate with the wallet.
Request:
class GameLauncherPlayRequestBean
{
// Required
String mode;
String gamecode;
String currency;
String language;
// Required if REAL mode
String playerid;
String externalsessionid;
String ipaddress;
String country;
// Optional player flags
String displayname;
String brand;
// Optional launch parameter
String channel;
String exiturl;
String depositurl;
// Optional settings, please ignore unless you know what these means
String forcecountry;
Integer rtpversion;
Long defaultbet;
Long minbet;
Long maxbet;
Long riskexposure;
}
Response:
class GameLauncherPlayResponseBean
{
String launchurl;
String sessionid;
}
To be used for getting replay data for a previously played game round.
Request:
class GameLauncherReplayRequestBean
{
String roundid;
String language;
int timezone;
}
Response:
class GameLauncherReplayResponseBean
{
String launchurl;
}
If error is returned the json data will hold two fields;
Error codes with HTTP status in parentheses.
The Wallet API is for server request from the Vision platform to the wallet. This API is using Basic Auth mechanics that must be verified on wallet side. The credentials will be given by the integration team. In production the API will be behind a firewall.
The getbalance method will be called to retrieve initial balance, as well as pulling new balance. Some external provider might call get balance to force a keep alive of the gaming session.
Request:
class WalletVisionBalanceRequestBean
{
String playerid;
String sessionid;
String externalsessionid;
String gamecode;
}
Response:
class WalletVisionGenericSuccessResponseBean
{
String currency;
Long cashbalance;
Long bonusbalance;
String externaltransid;
}
The debit method, used for bet request. Please note it is possible to get dual debits on the same game round (occurs on game like Blackjack). It is also possible to receive a debit call with roundended flag set to true meaning there will not be any further transactions in this game round.
The debitamount is always the exact amount to debit the player account. The contributionamount is information of how much of bet that will go into jackpot pooling.
Possible game play reason are as below. For these reasons the 'gamecode' field is always included.
Possible expense reason are as below. For these reasons the 'gamecode' field is not included.
Please note that due to lack in API logic on most external providers the tags BUY_FEATURE and GAMBLE cannot be mapped correctly. For such game rounds the reason will still be REGULAR.
The platform might send reason=FREEBET with debitamount=0. This to notify free game round starts. In such cases the extra value for freebetamount=nn will be included. This behaviour is though not consistent over all game providers, some will only send credits, and some will only send a final credit.
The BURST_TRANSFER is used for transaction intense games where server need to hold a balance temporarily before returning back actual winnings.
For reason DEALER_TIP, MEGAJACKPOT_BUYIN and TOURNAMENT_BUYIN the VisionLINK platform will only send a debit with both roundstarted and roundended set to true.
Request:
class WalletVisionDebitRequestBean
{
String playerid;
String sessionid;
String externalsessionid;
String gamecode;
String reason;
String roundid;
String transid;
String currency;
String externalfreebetid;
Long freebetamount;
Boolean freebetended;
Long debitamount;
Long contributionamount;
boolean roundstarted;
boolean roundended;
}
Response:
class WalletVisionGenericSuccessResponseBean
{
String currency;
Long cashbalance;
Long bonusbalance;
String externaltransid;
}
The credit method, used for win request. Please note it is possible to get dual credits on the same game round. Actual end of game round is notified by roundended flag.
The creditamount is always the exact amount to credit the player account. The jackpotamount is information of how much of the win that came from jackpot pool.
The reason type will not change between debit and credit.
Possible game play reason are as below. For these reasons the 'gamecode' field is always included.
Possible payout reason are as below. For these reasons the 'gamecode' field might be included.
Please note that due to lack in API logic on most external providers the tags BUY_FEATURE and GAMBLE cannot be mapped correctly. For such game rounds the reason will still be REGULAR.
The BURST_TRANSFER is used for transaction intense games where server need to hold a balance temporarily before returning back actual winnings. When winnings are credited back the extra optional fields for totalbetcount, totalbetamount, totaljackpotcontribution, totalwinamount and totaljackpotamount will also be provided. These will help the wallet to calculate correct turnover for kickback / wagering requirements.
For reason CAMPAIGN_WIN, FREEGAME_WIN, JACKPOT_WIN and TOURNAMENT_WIN the VisionLINK platform will only send a credit with both roundstarted and roundended set to true.
Request:
class WalletVisionCreditRequestBean
{
String playerid;
String sessionid;
String externalsessionid;
String gamecode;
String reason;
String roundid;
String transid;
String currency;
String externalfreebetid;
Long freebetamount; // Only FREEBET_SUMMARY
Long creditamount;
Long jackpotamount; // Only REGULAR and BUY_FEATURE
Integer totalbetcount; // Only BURST_TRANSFER
Long totalbetamount; // Only BURST_TRANSFER
Long totaljackpotcontribution; // Only BURST_TRANSFER
Long totalwinamount; // Only BURST_TRANSFER
Long totaljackpotamount; // Only BURST_TRANSFER
boolean roundstarted;
boolean roundended;
}
Response:
class WalletVisionGenericSuccessResponseBean
{
String currency;
Long cashbalance;
Long bonusbalance;
String externaltransid;
}
The unified debitandcredit method is used for processing both bet and win as one transaction where end of round is notified with the roundended flag. Please note the debitamount must be validated and processed before the creditamount. I.e. if player have 100 on the account, a request with debitamount of 200 plus creditamount of 300 must be rejected with error NOT_SUFFICIENT_FUNDS. It cannot result in net +100 for the player.
Please note this method is not used by the Vision RGS. It is only required by a few 3rd party game providers through the optional Vision LINK aggregation logic.
Possible debit and credit reasons are as below. For these reasons the 'gamecode' field is always included.
Request:
class WalletVisionDebitCreditRequestBean
{
String playerid;
String sessionid;
String externalsessionid;
String gamecode;
String reason;
String roundid;
String transid;
String currency;
String externalfreebetid;
Long freebetamount;
Boolean freebetended;
Long debitamount;
Long contributionamount;
Long creditamount;
Long jackpotamount;
boolean roundstarted;
boolean roundended;
}
Response:
class WalletVisionGenericSuccessResponseBean
{
String currency;
Long cashbalance;
Long bonusbalance;
String externaltransid;
}
The reverse method is used to reverse (rollback) a previous debit. Only debit amounts can be reversed. You either reply http status 200 + currency + balance (as in request was received and processed successfully, though nothing where needed to be done) or return http status 404 with errorcode=ROUND_NOT_FOUND + currency + balance.
Request:
class WalletVisionReverseRequestBean
{
String playerid;
String sessionid;
String externalsessionid;
String gamecode;
String roundid;
String transid;
String originaltransid;
Boolean roundended;
}
Response:
class WalletVisionGenericSuccessResponseBean
{
String currency;
Long cashbalance;
Long bonusbalance;
String externaltransid;
}
The endsession method will be called when Vision platform identifies that the gaming session has ended. If you don't process this request the server must still return success:true.
Request:
class WalletVisionEndSessionRequestBean
{
String playerid;
String sessionid;
String externalsessionid;
String gamecode;
Integer numrounds;
Long totalbetamount;
Long totalwinamount;
}
Response:
class WalletVisionGenericSuccessResponseBean
{
boolean success = true;
}
In case a validation or processing error occur, the server should send an error response instead of a success response. The response parser is dependent on correct errorcode being used, where the http status is used for monitoring. The http status can not be 200 as that means "success". Exact list see below.
For errorcode=NOT_SUFFICIENT_FUNDS it's mandatory to include currency, cashbalance and bonusbalance. This to avoid an extra server call for getbalance. For all other errors it can be omitted (fields should not be included in the json).
Response:
class WalletVisionGenericErrorResponseBean
{
// Mandatory
String errorcode;
String errormessage;
// Optional except for NOT_SUFFICIENT_FUNDS
String currency;
Long cashbalance;
Long bonusbalance;
}
The errorcode need to be any of the following codes. In this context the error code is a text string, not a numeric value. The expected http status is put in parentheses.
| mode required | string Enum: "REAL" "DEMO" |
| gamecode required | string |
| currency required | string |
| language required | string |
| playerid | string |
| externalsessionid | string |
| ipaddress | string |
| displayname | string |
| segmentation | string |
| brand | string |
| country required | string |
| jurisdiction | string |
| channel | string Enum: "DESKTOP" "MOBILE" |
| exiturl | string |
| depositurl | string |
| historyurl | string |
| forcecountry | string |
| rtpversion | integer Enum: 86 88 90 92 94 96 |
| defaultbet | integer <int64> |
| minbet | integer <int64> |
| maxbet | integer <int64> |
| riskexposure | integer <int64> |
{- "mode": "REAL",
- "gamecode": "string",
- "currency": "string",
- "language": "string",
- "playerid": "string",
- "externalsessionid": "string",
- "ipaddress": "string",
- "displayname": "string",
- "segmentation": "string",
- "brand": "string",
- "country": "string",
- "jurisdiction": "string",
- "channel": "DESKTOP",
- "exiturl": "string",
- "depositurl": "string",
- "historyurl": "string",
- "forcecountry": "string",
- "rtpversion": 86,
- "defaultbet": 0,
- "minbet": 0,
- "maxbet": 0,
- "riskexposure": 0
}{- "sessionid": "string",
- "launchurl": "string"
}| roundid required | string |
| language | string |
| timezone | integer |
{- "roundid": "string",
- "language": "string",
- "timezone": 0
}{- "launchurl": "string"
}| playerid required | string |
| brand | string |
| externalfreebetid required | string |
| gamecode required | string |
| freebettype required | string Enum: "REGULAR" "POWERBET" "BUYFEATURE" "SPINONLYWIN" "SPINUNTILYOUWIN" |
| featurecode | string |
| numbets required | integer >= 1 |
| freebetamount required | integer <int64> |
| freebetindex | integer |
| currency required | string |
| playercurrency required | string |
| validhours required | integer |
{- "playerid": "string",
- "brand": "string",
- "externalfreebetid": "string",
- "gamecode": "string",
- "freebettype": "REGULAR",
- "featurecode": "string",
- "numbets": 1,
- "freebetamount": 0,
- "freebetindex": 0,
- "currency": "string",
- "playercurrency": "string",
- "validhours": 0
}{- "freebetid": "string"
}| playerid required | string |
{- "playerid": "string"
}{- "freebets": [
- {
- "playerid": "string",
- "freebetid": "string",
- "externalfreebetid": "string",
- "gamecode": "string",
- "created": "string",
- "expires": "string",
- "closed": "string",
- "freebettype": "string",
- "featurecode": "string",
- "numbetsoriginal": 0,
- "numbetsremaining": 0,
- "freebetcurrency": "string",
- "freebetamount": 0,
- "numwins": 0,
- "sumwin": 0
}
]
}| externalfreebetid required | string |
{- "externalfreebetid": "string"
}{- "playerid": "string",
- "freebetid": "string",
- "externalfreebetid": "string",
- "gamecode": "string",
- "created": "string",
- "expires": "string",
- "closed": "string",
- "freebettype": "string",
- "featurecode": "string",
- "numbetsoriginal": 0,
- "numbetsremaining": 0,
- "freebetcurrency": "string",
- "freebetamount": 0,
- "numwins": 0,
- "sumwin": 0
}| campaigncode required | string |
| brandcode | string |
| description required | string |
| campaigntype required | string |
| numusageperplayer required | integer |
| maxusagecount | integer |
| validfrom | string <date-time> |
| validto | string <date-time> |
| validcountries | string |
| validcurrencies | string |
| validsegments | string |
| enabled | boolean |
required | Array of objects |
{- "campaigncode": "string",
- "brandcode": "string",
- "description": "string",
- "campaigntype": "string",
- "numusageperplayer": 0,
- "maxusagecount": 0,
- "validfrom": "2019-08-24T14:15:22Z",
- "validto": "2019-08-24T14:15:22Z",
- "validcountries": "string",
- "validcurrencies": "string",
- "validsegments": "string",
- "enabled": true,
- "games": [
- {
- "gamecode": "string",
- "freebettype": "string",
- "featurecode": "string",
- "numbets": 0,
- "freebetamount": 0,
- "validhours": 0
}
]
}{- "success": true
}| campaigncode required | string |
| validfrom | string <date-time> |
| validto | string <date-time> |
| enabled | boolean |
{- "campaigncode": "string",
- "validfrom": "2019-08-24T14:15:22Z",
- "validto": "2019-08-24T14:15:22Z",
- "enabled": true
}{- "success": true
}| campaigncode required | string |
| playerid required | string |
{- "campaigncode": "string",
- "playerid": "string"
}{- "success": true
}| campaigncode required | string |
| playerids required | Array of strings |
{- "campaigncode": "string",
- "playerids": [
- "string"
]
}{- "success": true
}| campaigncode required | string |
| playerid required | string |
{- "campaigncode": "string",
- "playerid": "string"
}{- "success": true
}| campaigncode required | string |
{- "campaigncode": "string"
}{- "campaigncode": "string",
- "brandcode": "string",
- "description": "string",
- "campaigntype": "string",
- "numusageperplayer": 0,
- "maxusagecount": 0,
- "currentusagecount": 0,
- "validfrom": "string",
- "validto": "string",
- "validcountries": [
- "string"
], - "validcurrencies": [
- "string"
], - "validsegments": [
- "string"
], - "enabled": true,
- "games": [
- {
- "gamecode": "string",
- "freebettype": "string",
- "featurecode": "string",
- "numbets": 0,
- "freebetamount": 0,
- "validhours": 0
}
]
}| include | string Value: "ALL" |
{- "include": "ALL"
}{- "currencies": [
- {
- "currency": "string",
- "description": "string",
- "type": "string",
- "baserate": 0,
- "denomination": 0
}
]
}| gamecode required | string |
| playercurrency | string |
{- "gamecode": "string",
- "playercurrency": "string"
}{- "gameid": "string",
- "provider": "string",
- "gamestudio": "string",
- "gamename": "string",
- "gamecode": "string",
- "providergamecode": "string",
- "category": "string",
- "minbet": 0,
- "freebetlevels": [
- 0
], - "rtpversions": [
- 0
], - "rtpvalues": [
- 0
], - "languages": [
- "string"
], - "maxpayoutfactor": 0,
- "volatilitylevel": "string",
- "gametags": [
- "HAVE_BUY_FEATURE"
], - "status": "ENABLED"
}| include required | string Enum: "ALL" "UPDATED" |
{- "include": "ALL"
}{- "games": [
- {
- "gameid": "string",
- "provider": "string",
- "gamestudio": "string",
- "gamename": "string",
- "gamecode": "string",
- "providergamecode": "string",
- "category": "string",
- "minbet": 0,
- "freebetlevels": [
- 0
], - "rtpversions": [
- 0
], - "rtpvalues": [
- 0
], - "languages": [
- "string"
], - "maxpayoutfactor": 0,
- "volatilitylevel": "string",
- "gametags": [
- "HAVE_BUY_FEATURE"
], - "status": "ENABLED"
}
]
}| roundid required | string |
{- "roundid": "string"
}{- "roundid": "string",
- "created": "string",
- "expires": "string",
- "closed": "string",
- "playerid": "string",
- "gamecode": "string",
- "roundtype": "REGULAR",
- "status": "CLOSED_NORMAL",
- "roundended": true,
- "externalfreebetid": "string",
- "freebetcounter": 0,
- "currency": "string",
- "sumbetamount": 0,
- "sumjackpotcontribution": 0,
- "sumwinamount": 0,
- "sumjackpotamount": 0
}{- "gamerounds": [
- {
- "roundid": "string",
- "created": "string",
- "expires": "string",
- "closed": "string",
- "playerid": "string",
- "gamecode": "string",
- "roundtype": "REGULAR",
- "status": "CLOSED_NORMAL",
- "roundended": true,
- "externalfreebetid": "string",
- "freebetcounter": 0,
- "currency": "string",
- "sumbetamount": 0,
- "sumjackpotcontribution": 0,
- "sumwinamount": 0,
- "sumjackpotamount": 0
}
]
}| playerid required | string |
| sessionid required | string |
| externalsessionid | string |
| gamecode required | string |
{- "playerid": "string",
- "sessionid": "string",
- "externalsessionid": "string",
- "gamecode": "string"
}{- "currency": "string",
- "cashbalance": 0,
- "bonusbalance": 0
}| playerid required | string |
| sessionid required | string |
| externalsessionid | string |
| gamecode | string |
| reason required | string Enum: "REGULAR" "BUY_FEATURE" "FREEBET" "BURST_TRANSFER" "GAMBLE" "DEALER_TIP" "MEGAJACKPOT_BUYIN" "TOURNAMENT_BUYIN" |
| roundid required | string |
| transid required | string |
| currency required | string |
| externalfreebetid | string |
| freebetamount | integer <int64> |
| freebetended | boolean |
| debitamount | integer <int64> |
| contributionamount | integer <int64> |
| roundstarted | boolean |
| roundended | boolean |
{- "playerid": "string",
- "sessionid": "string",
- "externalsessionid": "string",
- "gamecode": "string",
- "reason": "REGULAR",
- "roundid": "string",
- "transid": "string",
- "currency": "string",
- "externalfreebetid": "string",
- "freebetamount": 0,
- "freebetended": true,
- "debitamount": 0,
- "contributionamount": 0,
- "roundstarted": true,
- "roundended": true
}{- "currency": "string",
- "cashbalance": 0,
- "bonusbalance": 0,
- "externaltransid": "string"
}| playerid required | string |
| sessionid required | string |
| externalsessionid | string |
| gamecode | string |
| reason required | string Enum: "REGULAR" "BUY_FEATURE" "FREEBET" "FREEBET_SUMMARY" "BURST_TRANSFER" "GAMBLE" "CAMPAIGN_WIN" "FREEGAME_WIN" "JACKPOT_WIN" "TOURNAMENT_WIN" |
| roundid required | string |
| transid required | string |
| debittransid | string |
| currency required | string |
| externalfreebetid | string |
| freebetended | boolean |
| creditamount | integer <int64> |
| jackpotamount | integer <int64> |
| totalbetcount | integer |
| totalbetamount | integer <int64> |
| totaljackpotcontribution | integer <int64> |
| totalwinamount | integer <int64> |
| totaljackpotamount | integer <int64> |
| roundstarted | boolean |
| roundended required | boolean |
{- "playerid": "string",
- "sessionid": "string",
- "externalsessionid": "string",
- "gamecode": "string",
- "reason": "REGULAR",
- "roundid": "string",
- "transid": "string",
- "debittransid": "string",
- "currency": "string",
- "externalfreebetid": "string",
- "freebetended": true,
- "creditamount": 0,
- "jackpotamount": 0,
- "totalbetcount": 0,
- "totalbetamount": 0,
- "totaljackpotcontribution": 0,
- "totalwinamount": 0,
- "totaljackpotamount": 0,
- "roundstarted": true,
- "roundended": true
}{- "currency": "string",
- "cashbalance": 0,
- "bonusbalance": 0,
- "externaltransid": "string"
}| playerid required | string |
| sessionid required | string |
| externalsessionid | string |
| gamecode required | string |
| reason required | string Enum: "REGULAR" "BUY_FEATURE" "GAMBLE" |
| roundid required | string |
| transid required | string |
| currency required | string |
| externalfreebetid | string |
| freebetamount | integer <int64> |
| freebetended | boolean |
| debitamount | integer <int64> |
| contributionamount | integer <int64> |
| creditamount | integer <int64> |
| jackpotamount | integer <int64> |
| roundstarted | boolean |
| roundended required | boolean |
{- "playerid": "string",
- "sessionid": "string",
- "externalsessionid": "string",
- "gamecode": "string",
- "reason": "REGULAR",
- "roundid": "string",
- "transid": "string",
- "currency": "string",
- "externalfreebetid": "string",
- "freebetamount": 0,
- "freebetended": true,
- "debitamount": 0,
- "contributionamount": 0,
- "creditamount": 0,
- "jackpotamount": 0,
- "roundstarted": true,
- "roundended": true
}{- "currency": "string",
- "cashbalance": 0,
- "bonusbalance": 0,
- "externaltransid": "string"
}| playerid required | string |
| sessionid required | string |
| externalsessionid | string |
| gamecode required | string |
| roundid required | string |
| transid required | string |
| originaltransid required | string |
| roundended required | boolean |
{- "playerid": "string",
- "sessionid": "string",
- "externalsessionid": "string",
- "gamecode": "string",
- "roundid": "string",
- "transid": "string",
- "originaltransid": "string",
- "roundended": true
}{- "currency": "string",
- "cashbalance": 0,
- "bonusbalance": 0,
- "externaltransid": "string"
}| playerid required | string |
| sessionid required | string |
| externalsessionid | string |
| gamecode | string |
| numrounds | integer |
| totalbetamount | integer <int64> |
| totalwinamount | integer <int64> |
{- "playerid": "string",
- "sessionid": "string",
- "externalsessionid": "string",
- "gamecode": "string",
- "numrounds": 0,
- "totalbetamount": 0,
- "totalwinamount": 0
}{- "success": true
}