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.

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 (admin panel, IP Whitelist, owner only) — required for /gameActions.do and /playerRtp.do.

Then, in the admin panel open Projects → your project → Integration and set the Callback URL of your wallet (see step 2). Details: Authentication and Admin: projects.

2. Implement the wallet endpoint#

The platform calls POST <callback URL>/<currency> — for example https://casino.example/wallet/UAH. It must answer HTTP 200 with JSON {"status":"ok","balance":<number>,"currency":"UAH"} 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/UAH -> UAH
    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/UAH \
  -H 'Content-Type: application/json' \
  -d '{"method":"session_info","player_id":"player-123","session_id":"test-1","api_key":"YOUR_API_KEY"}'
# expected: {"status":"ok","balance":1000,"currency":"UAH"}

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/health | head -c 400

The answer lists every published game: game_id, languages, free_spins, target_outcomes. The full table with search is on the games list. The calls to /games/health, /capabilities and /health 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-123-0001' \
  -d '{
    "provider": "own",
    "partner": "YOUR_PARTNER_ID",
    "api_key": "YOUR_API_KEY",
    "player_id": "player-123",
    "symbol": "gates-of-olympus",
    "currency": "UAH",
    "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-123', symbol: 'gates-of-olympus', currency: 'UAH', 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-123", "symbol": "gates-of-olympus", "currency": "UAH",
        "gametype": "demo", "lang": "en",
    },
    timeout=10,
)
data = r.json()

The answer:

json
{
  "status": "ok",
  "link": "https://notell-api.com/… (game client address with the session token)",
  "meta": {"session_id": "9d0c…", "currency": "UAH", "language": "en"}
}

Send the player's browser to link (redirect or new tab). Do not log or share the link — 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-123",
    "currency": "UAH",
    "symbol": "gates-of-olympus",
    "count": 10,
    "bet": "1.00",
    "external_id": "welcome-2026-10"
  }'

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.
  • [ ] bet with amount 0 accepted when meta.is_freespins is true.
  • [ ] INSUFFICIENT_FUNDS returned only for a real lack of funds.
  • [ ] Launch uses an Idempotency-Key and handles every code in the error reference.
  • [ ] Server IPs are on the allowlist.
  • [ ] Bet limits and RTP reviewed (Bet limits, RTP).
Documentation for operators and integrators.TEST_ONLY platform: non-withdrawable units, no real payments.