Notell API Docs
English

Начало работы

Быстрый старт

Это руководство ведёт от нуля до игрока, запустившего игру. Замените YOUR_PARTNER_ID и YOUR_API_KEY полученными значениями; ключ храните на своём сервере. В примерах используется адрес продакшена https://notell-api.com; чтобы попробовать их в песочнице, подставьте https://slots.justsaynot.ru (Окружения).

1. Получите ключи и откройте доступ#

От владельца платформы нужны:

  • идентификатор проекта (partner) и API-ключ;
  • ваши серверные сети в списке разрешённых IP, он обязателен для /gameActions.do и /playerRtp.do. Список ведут в админ-панели владелец или ваши сотрудники с нужным правом (Аутентификация).

Затем задайте в админ-панели URL колбэка вашего кошелька (см. шаг 2). Подробности: Аутентификация и Админ-панель.

2. Реализуйте endpoint кошелька#

Платформа вызывает POST <URL колбэка>/<валюта>, например https://casino.example/wallet/EUR. Он должен за 2 секунды ответить HTTP 200 и JSON {"status":"ok","balance":<число>,"currency":"EUR"}. Минимальный пример в памяти:

Node.js
import {createServer} from 'node:http';

const API_KEY = process.env.PLATFORM_API_KEY;      // ключ, выданный вашему проекту
const balances = new Map();                        // player_id -> число (используйте свою базу)
const done = new Map();                            // id транзакции -> уже данный ответ

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;                // уникален для операции: повтор отвечайте из своей записи
    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;  // в продакшене используйте десятичный тип
      balances.set(key, next);
      answer = {status: 'ok', balance: next, currency};
    }
    done.set(tx, answer);
    send(answer);
  });
}).listen(8080);
Проверка endpoint
# платформа присылает именно такой запрос
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"}'
# ожидаемый ответ: {"status":"ok","balance":1000,"currency":"EUR"}

В админ-панели используйте Test connection (Projects → Integration): он отправляет на ваш URL запрос session_info и показывает HTTP-статус и задержку.

3. Выберите игру#

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

Ответ перечисляет все опубликованные игры: game_id, name, provider, languages, free_spins, target_outcomes и другое (Каталог). Таблица с поиском — список игр. GET-endpoints каталога не требуют ключа.

4. Запустите игру для игрока#

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()

Ответ:

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"}
}

Отправьте браузер игрока на link (редирект, новая вкладка или iframe). Считайте ссылку непрозрачной, не логируйте и не передавайте её: в ней токен сессии.

5. Следите за колбэками#

Когда игрок начинает раунд, ваш кошелёк получает bet, round_info (start), затем win (если раунд выиграл) и round_info (finish). В админ-панели API Logs показывает каждую попытку со статусом и задержкой, а Game History — раунды.

6. По желанию: фриспины#

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"
  }'

Жизненный цикл и итоговый колбэк описаны в разделе Фриспины.

Чек-лист перед запуском#

  • [ ] URL колбэка задан, Test connection проходит.
  • [ ] Кошелёк идемпотентен по meta.transaction; суммы обрабатываются как десятичные; в каждом ответе (и с ошибкой) есть balance и currency.
  • [ ] bet с суммой 0 принимается при meta.is_freespins равном true; выигрыши фриспинов приходят один раз, одним win с meta.freespins.final_credit: true.
  • [ ] INSUFFICIENT_FUNDS возвращается (HTTP 200) только при реальной нехватке средств; для временных проблем нет HTTP 4xx.
  • [ ] Запуск использует Idempotency-Key и обрабатывает все коды из справочника ошибок.
  • [ ] IP ваших серверов в списке разрешённых.
  • [ ] Игра встраивается только с разрешённых источников.
  • [ ] Лимиты ставок и RTP проверены (Лимиты ставок, RTP).
Документация для операторов и интеграторов.Платформа TEST_ONLY: невыводимые единицы, реальные платежи не используются.