Начало работы
Быстрый старт
Это руководство ведёт от нуля до игрока в игре. Замените YOUR_PARTNER_ID и YOUR_API_KEY полученными значениями; ключ храните только на сервере.
1. Получите учётные данные и откройте доступ#
От владельца платформы вам нужны:
- id проекта (
partner) и API-ключ; - ваши серверные сети в списке разрешённых IP (админ-панель, IP Whitelist, только владелец) — нужно для
/gameActions.doи/playerRtp.do.
Затем в админ-панели откройте Projects → ваш проект → Integration и укажите Callback URL своего кошелька (шаг 2). Подробнее: Аутентификация и Админ: проекты.
2. Реализуйте endpoint кошелька#
Платформа вызывает POST <callback URL>/<валюта> — например, https://casino.example/wallet/UAH. Он должен за 2 секунды ответить HTTP 200 и JSON {"status":"ok","balance":<число>,"currency":"UAH"}. Минимальный пример в памяти:
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/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; // уникален для операции: повтор отвечайте из своей записи
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);# платформа отправляет именно такие запросы
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"}'
# ожидается: {"status":"ok","balance":1000,"currency":"UAH"}В админ-панели используйте Test connection (Projects → Integration): он отправляет на ваш адрес запрос session_info и показывает HTTP-статус и задержку.
3. Выберите игру#
curl -s https://notell-api.com/games/health | head -c 400В ответе — все опубликованные игры: game_id, languages, free_spins, target_outcomes. Полная таблица с поиском — в списке игр. Вызовы /games/health, /capabilities и /health не требуют ключа.
4. Запустите игру для игрока#
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"
}'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');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()Ответ:
{
"status": "ok",
"link": "https://notell-api.com/… (адрес клиента игры с токеном сессии)",
"meta": {"session_id": "9d0c…", "currency": "UAH", "language": "en"}
}Отправьте браузер игрока на link (редирект или новая вкладка). Не логируйте и не показывайте ссылку третьим лицам — в ней токен сессии.
5. Наблюдайте за callbacks#
Когда игрок начинает раунд, ваш кошелёк получает bet, round_info (start), затем win (если раунд выиграл) и round_info (finish). В админ-панели API Logs показывает каждую попытку со статусом и задержкой, а Game History — раунды.
6. По желанию: фриспины#
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"
}'Жизненный цикл и итоговый callback — в разделе Фриспины.
Чек-лист перед запуском в продакшен#
- [ ] Callback URL задан, Test connection зелёный.
- [ ] Кошелёк идемпотентен по
meta.transaction; суммы обрабатываются как десятичные. - [ ]
betс суммой0принимается, когдаmeta.is_freespinsравноtrue. - [ ]
INSUFFICIENT_FUNDSвозвращается только при реальной нехватке средств. - [ ] Запуск использует
Idempotency-Keyи обрабатывает все коды из справочника ошибок. - [ ] IP серверов добавлены в список разрешённых.
- [ ] Лимиты ставок и RTP проверены (Лимиты ставок, RTP).