Getting started
Quick start
This guide takes you from nothing to a player running a game. Replace YOUR_PARTNER_ID and YOUR_API_KEY with the values you received; keep the key on your server. The examples use the production address https://notell-api.com; to try them on the sandbox use https://slots.justsaynot.ru (Environments).
1. Get your credentials and open access#
You need from the platform owner:
- your project id (
partner) and API key; - your server networks added to the IP allowlist, required for
/gameActions.doand/playerRtp.do. The owner or your own staff with the right permission manage it in the admin panel (Authentication).
Then set the Callback URL of your wallet in the admin panel (see step 2). Details: Authentication and Admin panel.
2. Implement the wallet endpoint#
The platform calls POST <callback URL>/<currency>, for example https://casino.example/wallet/EUR. It must answer HTTP 200 with JSON {"status":"ok","balance":<number>,"currency":"EUR"} within 2 seconds. A minimal, in-memory example:
import {createServer} from 'node:http';
const API_KEY = process.env.PLATFORM_API_KEY; // the key issued to your project
const balances = new Map(); // player_id -> number (use your database)
const done = new Map(); // transaction id -> answer already given
createServer((req, res) => {
let raw = '';
req.on('data', c => raw += c);
req.on('end', () => {
const currency = req.url.split('/').pop(); // /wallet/EUR -> EUR
const p = JSON.parse(raw);
const send = o => { res.setHeader('content-type', 'application/json'); res.end(JSON.stringify(o)); };
if (p.api_key !== API_KEY) return send({status: 'error', message: 'UNAUTHORIZED', balance: 0, currency});
const key = p.player_id + ':' + currency;
const balance = balances.get(key) ?? 1000;
if (p.method === 'session_info') return send({status: 'ok', balance, currency});
if (p.method === 'round_info' || p.method === 'freespins_finished') return send({status: 'ok', balance, currency});
const tx = p.meta?.transaction; // unique per operation: answer repeats from your record
if (done.has(tx)) return send(done.get(tx));
let answer;
if (p.method === 'bet' && balance < p.amount) answer = {status: 'error', message: 'INSUFFICIENT_FUNDS', balance, currency};
else {
const next = p.method === 'bet' ? balance - p.amount : balance + p.amount; // use a decimal type in production
balances.set(key, next);
answer = {status: 'ok', balance: next, currency};
}
done.set(tx, answer);
send(answer);
});
}).listen(8080);# the platform sends exactly this kind of request
curl -s -X POST https://casino.example/wallet/EUR \
-H 'Content-Type: application/json' \
-d '{"method":"session_info","player_id":"player-1024","session_id":"9d0c3f7e-41b8-4a52-9c0e-6d3f5a7b8c21","api_key":"YOUR_API_KEY"}'
# expected: {"status":"ok","balance":1000,"currency":"EUR"}In the admin panel use Test connection (Projects → Integration): it sends a session_info request to your URL and shows the HTTP status and latency.
3. Pick a game#
curl -s https://notell-api.com/games/catalog | head -c 400The answer lists every published game: game_id, name, provider, languages, free_spins, target_outcomes and more (Catalog). The searchable table is the games list. The GET endpoints of the catalog need no key.
4. Launch the game for a player#
curl -s -X POST https://notell-api.com/playGame.do \
-H 'Content-Type: application/json' \
-H 'Idempotency-Key: launch-player-1024-0001' \
-d '{
"provider": "own",
"partner": "YOUR_PARTNER_ID",
"api_key": "YOUR_API_KEY",
"player_id": "player-1024",
"symbol": "gates-of-olympus",
"currency": "EUR",
"gametype": "demo",
"lang": "en"
}'const r = await fetch('https://notell-api.com/playGame.do', {
method: 'POST',
headers: {'Content-Type': 'application/json', 'Idempotency-Key': crypto.randomUUID()},
body: JSON.stringify({
provider: 'own', partner: 'YOUR_PARTNER_ID', api_key: process.env.PLATFORM_API_KEY,
player_id: 'player-1024', symbol: 'gates-of-olympus', currency: 'EUR', gametype: 'demo', lang: 'en',
}),
});
const {status, link, meta} = await r.json();
if (status !== 'ok') throw new Error('launch failed');import os, uuid, requests
r = requests.post(
"https://notell-api.com/playGame.do",
headers={"Idempotency-Key": str(uuid.uuid4())},
json={
"provider": "own", "partner": "YOUR_PARTNER_ID", "api_key": os.environ["PLATFORM_API_KEY"],
"player_id": "player-1024", "symbol": "gates-of-olympus", "currency": "EUR",
"gametype": "demo", "lang": "en",
},
timeout=10,
)
data = r.json()The answer:
{
"status": "ok",
"link": "https://notell-api.com/gs2c/html5Game.do?symbol=vs20olympgate&mgckey=4c9e1f0a7b3d58e2a6c4d09f13b87e5a2d6f40c8b1e97a35d0f2c64b8e1a93d7",
"meta": {"session_id": "9d0c3f7e-41b8-4a52-9c0e-6d3f5a7b8c21", "currency": "EUR", "language": "en"}
}Send the player's browser to link (redirect, new tab or iframe). Treat the link as opaque, and do not log or share it: it carries the session token.
5. Watch the callbacks#
When the player starts a round your wallet receives bet, round_info (start), then win (if the round pays) and round_info (finish). In the admin panel, API Logs shows every attempt with status and latency, and Game History shows the rounds.
6. Optional: free spins#
curl -s -X POST https://notell-api.com/gameActions.do \
-H 'Content-Type: application/json' \
-d '{
"method": "freespins_create",
"partner": "YOUR_PARTNER_ID",
"api_key": "YOUR_API_KEY",
"player_id": "player-1024",
"currency": "EUR",
"symbol": "gates-of-olympus",
"count": 10,
"bet": "1.00",
"external_id": "welcome-2027-01"
}'See Free spins for the lifecycle and the summary callback.
Go-live checklist#
- [ ] Callback URL set and Test connection is green.
- [ ] Wallet is idempotent by
meta.transaction; amounts handled as decimals; every answer (also errors) hasbalanceandcurrency. - [ ]
betwith amount0accepted whenmeta.is_freespinsistrue; free-spin wins arrive once, as onewinwithmeta.freespins.final_credit: true. - [ ]
INSUFFICIENT_FUNDSreturned (HTTP 200) only for a real lack of funds; no HTTP 4xx for temporary problems. - [ ] Launch uses an
Idempotency-Keyand handles every code in the error reference. - [ ] Server IPs are on the allowlist.
- [ ] Game pages are embedded only from allowed origins.
- [ ] Bet limits and RTP reviewed (Bet limits, RTP).