Notell API Docs
English

Возможности

Управление RTP

RTP (return to player) — доля ставок, которую игры возвращают на дистанции. Платформа позволяет управлять им в диапазоне 60–100 %: для всего проекта и, по желанию, для каждого игрока. Эта страница объясняет, какой уровень получает раунд, и как управлять уровнями игроков через API.

Какой RTP получает раунд#

Уровень определяется до списания, в той же транзакции, что и платный раунд, и затем остаётся неизменным для этого раунда. Изменение действует со следующего раунда; начатые раунды завершаются на своём уровне.

  1. По умолчанию. Проект без сохранённых настроек RTP играет на 90 % (RTP провайдера). Естественная математика игр используется, только если владелец явно сохранил «нет RTP провайдера».
  2. RTP провайдера задан, персональный RTP выключен. Раунды всех игроков играются на RTP провайдера проекта. Ручные уровни игроков игнорируются.
  3. Персональный RTP включён. У каждого игрока свой уровень (ниже).

Раунды фриспинов проходят ту же логику и учитываются в адаптивном окне с номинальной ставкой. Раунды целевых исходов помечаются и в окне не учитываются.

Настройки проекта#

Задаются в админ-панели на экране RTP & players (проектные настройки меняет владелец платформы; см. Админ-панель).

НастройкаЗначение
RTP провайдераRTP проекта, 60–100 %. По умолчанию 90 %. Потолок для автоматических уровней и стартовый уровень каждого нового игрока. Уже зарегистрированные игроки сохраняют свой старт.
Персональный RTPВключает уровни по игрокам. Выключен — все играют на RTP провайдера.
Адаптивное правилоНеобязательная автоматическая коррекция уровня игрока (ниже).
Лимиты ставок по играмМинимальная и максимальная ставка по игре и валюте (Лимиты ставок).

Персональный RTP игрока#

  • Новый игрок привязывается при первом раунде к RTP провайдера, актуальному в тот момент (стартовый уровень = текущий).
  • Уровень можно менять вручную (админ-панель или API, 60–100 %, до двух знаков после запятой, с причиной, которая сохраняется в журнале игрока). Ручной уровень замораживает адаптивное правило для этого игрока, пока вы не вернёте его в auto.
  • В режиме auto игрок играет на текущем уровне, ограниченном RTP провайдера на данный момент. Если RTP провайдера снижен ниже уровня игрока, игрок играет на RTP провайдера.
  • Ручной уровень RTP провайдера не ограничивает.
  • Журнал каждого игрока фиксирует, кто менял уровень, когда и почему (привязка, шаги правила, ручные изменения).

Адаптивное правило#

Правило следит за фактической доходностью последних рассчитанных раундов игрока. Если игроку слишком везёт, оно немного снижает его уровень; когда везение заканчивается, возвращает уровень, но никогда выше стартового.

ПараметрЗначениеПо умолчанию
Окно, раундовСколько последних рассчитанных раундов анализируется (50–100 000).1000
Снижать, если RTP игрока выше, %RTP окна выше этого значения снижает уровень.150 %
Восстанавливать, если ниже, %RTP окна ниже этого значения возвращает уровень.90 %
Шаг, п.п.Изменение за шаг (0,1–20 процентных пунктов).2 п.п.
Не ниже старта минус, п.п.Уровень никогда не опускается ниже старта игрока больше чем на это значение (0–40).6 п.п.
Минимальный оборотПо валюте: правило игнорирует окна с меньшей суммой ставок.нет

За окно делается не более одного шага. Уровень никогда не опускается ниже 60 %. Игроков с ручным уровнем правило не трогает.

На коротких выборках наблюдаемый RTP может отличаться от целевого; это нормально.

POST /playerRtp.do#

Управление уровнем игрока и его личными лимитами ставок. Каждому действию нужны partner, api_key и разрешённый IP. Запрос не использует Idempotency-Key и не ограничивается по частоте. Общие поля:

ПолеТипОбязательноОписание
partner, api_keystringдаИдентификатор проекта и API-ключ.
actionenumдаget, set, auto или bet-limit.
player_idstringдаИгрок. Только латинские буквы, цифры и _ . : @ -, 1–128 символов. Строже, чем при запуске: игрок с другими символами в id может играть, но управлять им здесь нельзя.
providerenumнетendorphina, pragmatic или nolimitcity. По умолчанию endorphina, поэтому передавайте его явно.

Каждое действие отвечает {"status": "ok", "player": {…}}; объект игрока описан в разделе get.

Ошибки, общие для всех действий: INVALID_ACTION (400) для неизвестного action, INVALID_PLAYER (400) для player_id с недопустимыми символами, RTP_PROVIDER_UNSUPPORTED (400) для другого provider.

get#

POST/playerRtp.doactionget

Возвращает состояние игрока по одному провайдеру.

Запрос#

curl
curl -s -X POST https://notell-api.com/playerRtp.do \
  -H 'Content-Type: application/json' \
  -d '{"partner":"demo-casino","api_key":"YOUR_API_KEY","action":"get","player_id":"player-1024","provider":"pragmatic"}'
JSON
{
  "partner": "demo-casino",
  "api_key": "YOUR_API_KEY",
  "action": "get",
  "player_id": "player-1024",
  "provider": "pragmatic"
}

Других полей, кроме общих, нет.

Ответ#

json
{
  "status": "ok",
  "player": {
    "partner": "demo-casino",
    "player": "player-1024",
    "nickname": null,
    "bound": true,
    "provider": "pragmatic",
    "startBps": 9000,
    "currentBps": 8800,
    "mode": "auto",
    "roundsSinceAdjust": 120,
    "providerBps": 9000,
    "effective": {"bps": 8800, "source": "player"},
    "betLimits": [{"currency": "EUR", "minMinor": "10", "maxMinor": "5000"}],
    "journal": [
      {
        "provider": "pragmatic",
        "actor": "bind",
        "reason": "bound before the first round by a level change",
        "fromBps": null,
        "toBps": 9000,
        "fromMode": null,
        "toMode": "auto",
        "windowRounds": null,
        "windowRtpPpm": null,
        "at": "2027-02-15T10:00:00.000Z"
      }
    ],
    "providers": [
      {"provider": "pragmatic", "startBps": 9000, "currentBps": 8800, "mode": "auto", "roundsSinceAdjust": 120, "effective": {"bps": 8800, "source": "player"}, "updatedAt": "2027-02-15T10:00:00.000Z"}
    ]
  }
}
ПолеТипОписание
player.partner, player.playerstringИдентификатор проекта и id игрока.
player.nicknamestring or nullНикнейм игрока собственного сайта платформы, иначе null.
player.boundbooleanУ игрока уже есть уровень по этому провайдеру. При false startBps и currentBps равны 0, а effective — null.
player.providerstringПровайдер, для которого показан этот вид.
player.startBps, player.currentBpsintegerСтартовый и текущий уровень в базисных пунктах (9450 = 94,50 %).
player.modeenumauto или manual.
player.roundsSinceAdjustintegerРаундов с последнего шага правила.
player.providerBpsinteger or nullRTP провайдера проекта в базисных пунктах или null, если у проекта нет RTP провайдера.
player.effectiveobject or null{bps, source}: уровень, который действует при включённом персональном RTP. source — player, provider-cap (уровень ограничен RTP провайдера) или manual.
player.betLimitsarray<object>Лимиты игрока по валютам, {currency, minMinor, maxMinor} в минорных единицах (строки).
player.journalarray<object>Последние изменения, новые первыми, до 100.
player.providersarray<object>Строки игрока по каждому провайдеру, у которого они есть.

Ошибки#

КодHTTPКогда
INVALID_PLAYER400player_id отсутствует или содержит символы вне A-Z a-z 0-9 _ . : @ -.
RTP_PROVIDER_UNSUPPORTED400provider — не один из трёх провайдеров.

set#

POST/playerRtp.doactionset

Задаёт ручной уровень (режим manual). При первом использовании игрок привязывается к провайдеру.

Запрос#

curl
curl -s -X POST https://notell-api.com/playerRtp.do \
  -H 'Content-Type: application/json' \
  -d '{"partner":"demo-casino","api_key":"YOUR_API_KEY","action":"set","player_id":"player-1024","provider":"pragmatic","rtp":94.5,"reason":"VIP agreement"}'
JSON
{
  "partner": "demo-casino",
  "api_key": "YOUR_API_KEY",
  "action": "set",
  "player_id": "player-1024",
  "provider": "pragmatic",
  "rtp": 94.5,
  "reason": "VIP agreement"
}
ПолеТипОбязательноОписание
rtpnumberдаПроцент, 60–100, не более 2 знаков после запятой, JSON-числом (94.5, не строкой).
reasonstringнетДо 200 символов, сохраняется в журнале. По умолчанию: manual change.

Ответ#

{"status": "ok", "player": {…}} с mode: "manual", currentBps: 9450 и effective.source: "manual". Объект описан в разделе get.

json
{
  "status": "ok",
  "player": {
    "partner": "demo-casino",
    "player": "player-1024",
    "nickname": null,
    "bound": true,
    "provider": "pragmatic",
    "startBps": 9000,
    "currentBps": 9450,
    "mode": "manual",
    "roundsSinceAdjust": 0,
    "providerBps": 9000,
    "effective": {"bps": 9450, "source": "manual"},
    "betLimits": [],
    "journal": [],
    "providers": []
  }
}

(journal и providers здесь сокращены; в реальном ответе они заполнены.)

Ошибки#

КодHTTPКогда
RTP_LEVEL_INVALID400rtp — не число или имеет больше 2 знаков после запятой.
RTP_LEVEL_OUT_OF_RANGE400rtp ниже 60 или выше 100.
INVALID_REASON400reason — не строка до 200 символов.
RTP_POLICY_REQUIRED400У проекта нет RTP провайдера (он явно выключен).

auto#

POST/playerRtp.doactionauto

Возвращает игрока в автоматический режим: адаптивное правило продолжает работу с текущего уровня. При первом использовании игрок привязывается к провайдеру.

Запрос#

curl
curl -s -X POST https://notell-api.com/playerRtp.do \
  -H 'Content-Type: application/json' \
  -d '{"partner":"demo-casino","api_key":"YOUR_API_KEY","action":"auto","player_id":"player-1024","provider":"pragmatic","reason":"VIP period over"}'
JSON
{
  "partner": "demo-casino",
  "api_key": "YOUR_API_KEY",
  "action": "auto",
  "player_id": "player-1024",
  "provider": "pragmatic",
  "reason": "VIP period over"
}
ПолеТипОбязательноОписание
reasonstringнетДо 200 символов, сохраняется в журнале. По умолчанию: manual change.

Ответ#

{"status": "ok", "player": {…}} с mode: "auto". Объект описан в разделе get.

Ошибки#

КодHTTPКогда
INVALID_REASON400reason — не строка до 200 символов.
RTP_POLICY_REQUIRED400У проекта нет RTP провайдера (он явно выключен).

bet-limit#

POST/playerRtp.doactionbet-limit

Задаёт или снимает личный лимит ставки игрока для одной валюты. Лимит действует вместе с лимитами проекта; побеждает наименьший максимум (Лимиты ставок).

Запрос#

curl
curl -s -X POST https://notell-api.com/playerRtp.do \
  -H 'Content-Type: application/json' \
  -d '{"partner":"demo-casino","api_key":"YOUR_API_KEY","action":"bet-limit","player_id":"player-1024","provider":"pragmatic","currency":"EUR","min_minor":"10","max_minor":"5000"}'
JSON
{
  "partner": "demo-casino",
  "api_key": "YOUR_API_KEY",
  "action": "bet-limit",
  "player_id": "player-1024",
  "provider": "pragmatic",
  "currency": "EUR",
  "min_minor": "10",
  "max_minor": "5000"
}
ПолеТипОбязательноОписание
currencystringдаКод ISO 4217, три заглавные буквы.
min_minorstring or nullдаМинимальная ставка на спин в минорных единицах, только цифры, не менее "1". "10" = 0,10.
max_minorstring or nullдаМаксимальная ставка на спин в минорных единицах, только цифры, не меньше min_minor. "5000" = 50,00.

Оба предела обязательны: передайте оба строками либо оба как null, чтобы снять лимит.

Ответ#

{"status": "ok", "player": {…}}; betLimits показывает новый лимит. Объект описан в разделе get.

Ошибки#

КодHTTPКогда
INVALID_CURRENCY400currency — не три заглавные буквы.
INVALID_BET_LIMIT400min_minor / max_minor — не обе строки из цифр (и не оба null), min_minor меньше 1 либо max_minor меньше min_minor.

См. также#

Документация для операторов и интеграторов.Платформа TEST_ONLY: невыводимые единицы, реальные платежи не используются.