Notell API Docs
Русский

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.do and /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:

Node.js
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);
Test your endpoint
# 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#

bash
curl -s https://notell-api.com/games/catalog | head -c 400

The 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
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"
  }'
Node.js
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');
Python
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:

json
{
  "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#

bash
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) has balance and currency.
  • [ ] bet with amount 0 accepted when meta.is_freespins is true; free-spin wins arrive once, as one win with meta.freespins.final_credit: true.
  • [ ] INSUFFICIENT_FUNDS returned (HTTP 200) only for a real lack of funds; no HTTP 4xx for temporary problems.
  • [ ] Launch uses an Idempotency-Key and 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).
Documentation for operators and integrators.TEST_ONLY platform: non-withdrawable units, no real payments.