Sessions
session.start
Starts a game for one player. Returns a session and a game link.
Who calls it
You → us
POST /v1/session.startThe player taps a game. Your server calls this. Sign the call with your API key. See Authentication.
Request
| Field | Type | What it is |
|---|---|---|
requestId | string | Your id for this change. Send it again after a timeout and you get the first answer back. |
firstSentAt | string, UTC time | When you first sent this request. It stays the same on every retry. A request older than 7 days is refused. |
playerId | string | Your id for the player. We send it back in every wallet call, so you know whose balance to use. |
casinoSessionId | string | Your own session. We send it back in every wallet call and event. |
gameId | string | Which game to open. |
currency | string | Which money the wallet calls use, and how the game shows amounts. |
language | string | The game’s words in the player’s language. A language we do not have falls back to English. |
market | string | Required: UK, SE or none. Only for rules the game itself must follow in that market. It is required, so a forgotten field can’t switch off a law. |
betSettings | object | Min, max and default bet for this player. See Bet settings. |
exitUrl | string, optional | Where the exit button goes when you can’t get client messages: a full browser page, or a Unity app that opens the browser. |
Answer
| Field | Type | What it is |
|---|---|---|
sessionId | string | You need it to close the session. You find it in every wallet call. |
url | string | The game link. Open it to show the game. |
linkExpiresAt | string, UTC time | When the link stops working (2 minutes). Do not open a link that has expired, for example one from a late retry. |
The balance is not in the answer. Our server asks your wallet when the game opens. The bet settings are not in the answer: you already have them. They are in session.get.
The game link
- The link works once. The first open uses it up. Refresh in the same page works.
- Any other open (another browser, a copied link) shows “This game link was already used.” Start a new session.
- The link must be opened within 2 minutes. If it is not, the session closes as not_opened.
- A copied link can’t be used to play with your player’s money.
- A retry of session.start can return a link that has already expired. Check linkExpiresAt, then start a new session with a new requestId.
- An app whose web view was killed starts a new session. See Events.
Errors
| Code | When | Your next step |
|---|---|---|
invalid_request | A field is missing or wrong, for example a firstSentAt more than 5 minutes in the future. message names the field. | Fix the call. Sending it again unchanged fails again. |
request_expired | firstSentAt is older than 7 days. Nothing is done. | A bug or a stuck job on your side. Look up the result with session.get or round.get. |
duplicate_mismatch | A requestId we have seen comes with a different body. | A bug on your side: each new change needs a new id. |
game_not_found | No game with this gameId for your account. | Pull games.list again. |
game_disabled | The game is turned off in the back office. | Hide the game. A player with an open Mines round can still start it. |
bet_settings_invalid | min is above max, default is outside them, or a value is 0 or less. | Fix the bet settings. |
currency_not_supported | The currency is not set up for your account. | Set it up in the back office, or use another currency. |
Every call can also return the codes that guard all calls. See Error codes.
Example
Request
{
"requestId": "rq-77120",
"firstSentAt": "2026-10-31T09:02:10Z",
"playerId": "p-82731",
"casinoSessionId": "c-5531",
"gameId": "mines",
"currency": "EUR",
"language": "en",
"market": "UK",
"betSettings": { "min": 10, "max": 10000, "default": 100 },
"exitUrl": "https://casino.example/lobby"
}
Answer
{
"ok": true,
"result": {
"sessionId": "s-01JC8Z…",
"url": "https://play.nartifacts.com/s/s-01JC8Z…",
"linkExpiresAt": "2026-10-31T09:04:10Z"
},
"traceId": "tr-01JC…"
}