Features
Target outcomes
A target outcome tells the platform: on this player's n-th paid spin in this game, produce a round whose win is about X times the bet. Use it for test scenarios, promotions and QA.
- Available for games with
target_outcomes: truein/games/health(974 of 1010 games). - All methods are
POST https://notell-api.com/gameActions.dowith amethodfield. They needpartner,api_keyand an allowlisted IP. - The optional
Idempotency-Keyheader is supported by every method on this page (Conventions). Common errors (UNAUTHORIZED,IP_NOT_ALLOWED,INVALID_IDEMPOTENCY_KEY,IDEMPOTENCY_CONFLICT,RATE_LIMITED) are listed in Errors and not repeated in the tables below. - The round is always the game's own natural outcome, found for this one entry: boards and features are never constructed by hand, and the result is not revealed in advance.
- Target outcomes apply to wallet sessions only, not to demo mode.
How an entry is applied#
Statuses:
| Status | Meaning |
|---|---|
pending | The platform is still searching for a suitable round. Paid spins are not counted yet. |
ready | A round was found. The player's paid spins in this game are now counted towards spin_number. |
unreachable | No round was found within the search budget (for example x50 in a regular spin of a game that cannot pay that much). Choose another multiplier or kind. |
applied | The round was played; applied_at and round_id are set. |
expired | expires_at passed before the entry was applied. |
cancelled | Cancelled with outcome_cancel or in the admin panel. |
Rules:
- The count starts when the entry becomes
ready, not when it is scheduled. Only the player's paid spins in that game count; free-spin rounds do not. - The
spin_number-th counted spin pays multiplier × the spin's bet, with a tolerance of ±2 %. The multiplier does not depend on the bet size. - When a spin does not fit the entry (for example an ante bet, a bonus buy for a
spinentry, or no suitable round), the entry is postponed to the next paid spin. - Several entries are allowed. Entries due on the same spin fire one per spin, oldest first.
- If the game asks the player to choose after the debit, the target applies to every option.
- Target-outcome rounds are marked and excluded from the player's adaptive RTP window (RTP). Their
round_infonotifications carry"forced": true(Wallet callbacks). - Gamble after a target-outcome win is allowed in the games that offer it.
outcome_schedule#
POST
/gameActions.domethodoutcome_scheduleSchedules a target outcome for a player in a game.
Request#
curl -s -X POST https://notell-api.com/gameActions.do \
-H 'Content-Type: application/json' \
-d '{
"method": "outcome_schedule",
"partner": "demo-casino",
"api_key": "YOUR_API_KEY",
"player_id": "player-1024",
"symbol": "gates-of-olympus",
"multiplier": "50",
"kind": "bonus",
"spin_number": 3,
"external_id": "qa-case-17",
"comment": "QA: big bonus on spin 3"
}'{
"method": "outcome_schedule",
"partner": "demo-casino",
"api_key": "YOUR_API_KEY",
"player_id": "player-1024",
"symbol": "gates-of-olympus",
"multiplier": "50",
"kind": "bonus",
"spin_number": 3,
"external_id": "qa-case-17",
"comment": "QA: big bonus on spin 3"
}| Field | Type | Required | Description |
|---|---|---|---|
method | string | yes | "outcome_schedule". |
partner, api_key | string | yes | Your project id and API key. |
player_id | string | yes | Your player id, 1–128 printable ASCII characters (spaces allowed). |
symbol | string | yes | Game id with target_outcomes: true. |
multiplier | string or number | yes | Target win as a multiple of the spin's bet: greater than 0, up to 7 integer digits and up to 2 decimals ("50", "2.5", "12.34"). It must not exceed the game's maximum win where the game has a known cap. |
kind | enum | no | spin (default): a win without a feature. bonus: a win that comes with a feature (a natural trigger, or the feature the player buys). bonus needs a game that has a feature. |
spin_number | integer | no | Which counted paid spin of the player, 1–100000. Default: 1. |
expires_at | string | no | ISO 8601 date-time with a zone. From 1 hour to 90 days after the call. Default: now + 7 days. |
external_id | string | no | Your id, unique within the project, 1–128 printable ASCII characters without whitespace. |
comment | string | no | Free text, 1–500 printable ASCII characters. |
Response#
{
"status": "ok",
"outcome": {
"outcome_id": "5a3e91d2-7c4b-4e08-b6a1-3f9d2c8e1a70",
"external_id": "qa-case-17",
"player_id": "player-1024",
"symbol": "gates-of-olympus",
"provider": "pragmatic",
"kind": "bonus",
"multiplier": "50.00",
"spin_number": 3,
"paid_spins_since": 0,
"status": "pending",
"variants": [],
"comment": "QA: big bonus on spin 3",
"created_at": "2027-02-15T10:00:00.000Z",
"expires_at": "2027-02-28T12:00:00.000Z",
"applied_at": null,
"round_id": null
}
}| Field | Type | Description |
|---|---|---|
outcome.outcome_id | string | Id of the entry (UUID). |
outcome.external_id | string or null | Your id, if you sent one. |
outcome.player_id, outcome.symbol, outcome.provider | string | Player, game and its provider. |
outcome.kind | enum | spin or bonus. |
outcome.multiplier | string | The target multiplier, always with two decimals ("50.00"), whatever you sent. |
outcome.spin_number | integer | The requested counted spin. |
outcome.paid_spins_since | integer | Paid spins counted since the entry became ready. |
outcome.status | enum | pending, ready, unreachable, applied, expired or cancelled. |
outcome.variants | array<string> | The kinds of round the platform found (for example a regular spin and a bought feature). Empty while pending. |
outcome.comment | string or null | Your comment. |
outcome.created_at, outcome.expires_at | string | ISO 8601, UTC. |
outcome.applied_at | string or null | When the entry was applied. |
outcome.round_id | string or null | The round that carried the target outcome, once applied. |
Errors#
| Code | HTTP | When |
|---|---|---|
INVALID_REQUEST | 400 | A field is missing, has the wrong type or format. |
GAME_NOT_FOUND | 404 | symbol is not a catalog game. |
FORCED_OUTCOMES_UNSUPPORTED | 400 | The game does not support target outcomes (target_outcomes: false). |
INVALID_KIND | 400 | kind is neither spin nor bonus. |
GAME_HAS_NO_BONUS | 400 | kind is bonus but the game has no feature. |
INVALID_MULTIPLIER | 400 | multiplier is not a positive number with up to 2 decimals. |
MULTIPLIER_ABOVE_MAX_WIN | 400 | multiplier exceeds the maximum win of the game. Checked only for games with a known maximum win; for other games a too large multiplier is accepted and the entry ends unreachable. |
INVALID_SPIN_NUMBER | 400 | spin_number is not an integer from 1 to 100000. |
INVALID_EXPIRY | 400 | expires_at has no zone, or is less than 1 hour or more than 90 days ahead. |
DUPLICATE_EXTERNAL_ID | 409 | An entry with this external_id already exists in the project. |
outcome_get#
POST
/gameActions.domethodoutcome_getReturns one entry by outcome_id or by your external_id.
Request#
curl -s -X POST https://notell-api.com/gameActions.do \
-H 'Content-Type: application/json' \
-d '{"method":"outcome_get","partner":"demo-casino","api_key":"YOUR_API_KEY","external_id":"qa-case-17"}'{
"method": "outcome_get",
"partner": "demo-casino",
"api_key": "YOUR_API_KEY",
"external_id": "qa-case-17"
}| Field | Type | Required | Description |
|---|---|---|---|
outcome_id | string | exactly one of outcome_id / external_id | Entry id (UUID). |
external_id | string | exactly one of outcome_id / external_id | Your id. |
Response#
{
"status": "ok",
"outcome": {
"outcome_id": "5a3e91d2-7c4b-4e08-b6a1-3f9d2c8e1a70",
"external_id": "qa-case-17",
"player_id": "player-1024",
"symbol": "gates-of-olympus",
"provider": "pragmatic",
"kind": "bonus",
"multiplier": "50.00",
"spin_number": 3,
"paid_spins_since": 1,
"status": "ready",
"variants": ["bonus"],
"comment": "QA: big bonus on spin 3",
"created_at": "2027-02-15T10:00:00.000Z",
"expires_at": "2027-02-28T12:00:00.000Z",
"applied_at": null,
"round_id": null
}
}The outcome object is described under outcome_schedule.
Errors#
| Code | HTTP | When |
|---|---|---|
INVALID_REQUEST | 400 | Both or neither of outcome_id and external_id were sent. |
OUTCOME_NOT_FOUND | 404 | No such entry in your project. |
outcome_list#
POST
/gameActions.domethodoutcome_listLists entries of your project, newest first, at most 200.
Request#
curl -s -X POST https://notell-api.com/gameActions.do \
-H 'Content-Type: application/json' \
-d '{"method":"outcome_list","partner":"demo-casino","api_key":"YOUR_API_KEY","player_id":"player-1024","status":"ready"}'{
"method": "outcome_list",
"partner": "demo-casino",
"api_key": "YOUR_API_KEY",
"player_id": "player-1024",
"status": "ready"
}| Field | Type | Required | Description |
|---|---|---|---|
player_id | string | no | Only entries of this player. |
symbol | string | no | Only entries for this game. |
status | string | no | pending, ready, unreachable, applied, expired or cancelled. |
Response#
{
"status": "ok",
"outcomes": [
{
"outcome_id": "5a3e91d2-7c4b-4e08-b6a1-3f9d2c8e1a70",
"external_id": "qa-case-17",
"player_id": "player-1024",
"symbol": "gates-of-olympus",
"provider": "pragmatic",
"kind": "bonus",
"multiplier": "50.00",
"spin_number": 3,
"paid_spins_since": 1,
"status": "ready",
"variants": ["bonus"],
"comment": "QA: big bonus on spin 3",
"created_at": "2027-02-15T10:00:00.000Z",
"expires_at": "2027-02-28T12:00:00.000Z",
"applied_at": null,
"round_id": null
}
]
}| Field | Type | Description |
|---|---|---|
outcomes | array<object> | Entry objects, see outcome_schedule. Empty when nothing matches. |
Errors#
| Code | HTTP | When |
|---|---|---|
INVALID_REQUEST | 400 | A filter has the wrong type. |
outcome_cancel#
POST
/gameActions.domethodoutcome_cancelCancels an entry that is pending, ready or unreachable. For any other status the entry is returned unchanged.
Request#
curl -s -X POST https://notell-api.com/gameActions.do \
-H 'Content-Type: application/json' \
-d '{"method":"outcome_cancel","partner":"demo-casino","api_key":"YOUR_API_KEY","outcome_id":"5a3e91d2-7c4b-4e08-b6a1-3f9d2c8e1a70"}'{
"method": "outcome_cancel",
"partner": "demo-casino",
"api_key": "YOUR_API_KEY",
"outcome_id": "5a3e91d2-7c4b-4e08-b6a1-3f9d2c8e1a70"
}| Field | Type | Required | Description |
|---|---|---|---|
outcome_id | string | exactly one of outcome_id / external_id | Entry id (UUID). |
external_id | string | exactly one of outcome_id / external_id | Your id. |
Response#
{
"status": "ok",
"outcome": {
"outcome_id": "5a3e91d2-7c4b-4e08-b6a1-3f9d2c8e1a70",
"external_id": "qa-case-17",
"player_id": "player-1024",
"symbol": "gates-of-olympus",
"provider": "pragmatic",
"kind": "bonus",
"multiplier": "50.00",
"spin_number": 3,
"paid_spins_since": 1,
"status": "cancelled",
"variants": ["bonus"],
"comment": "QA: big bonus on spin 3",
"created_at": "2027-02-15T10:00:00.000Z",
"expires_at": "2027-02-28T12:00:00.000Z",
"applied_at": null,
"round_id": null
}
}Errors#
| Code | HTTP | When |
|---|---|---|
INVALID_REQUEST | 400 | Both or neither of outcome_id and external_id were sent. |
OUTCOME_NOT_FOUND | 404 | No such entry in your project. |
See also#
- RTP: why these rounds are excluded from the adaptive window.
- Wallet callbacks: the
forcedflag ofround_info. - Admin: the same entries can be managed in the admin panel.