# Reasons, numbers, currencies

## Reasons

| Verdict | Reason | Meaning | Your action |
| :--- | :--- | :--- | :--- |
| `rejected` | `no_idempotency_key` | no usable `event_id`, or the event is not a JSON object; not stored | fix and resend |
| `rejected` | `malformed` | wrong field type, `spec`, missing `kind`, `occurred_at`, or `round_id` of a round kind, `brand` or `player_ref` over 255 bytes | fix, send with a new `event_id` |
| `rejected` | `op_unknown` | `kind` is none of `bet`, `win`, `settled`, `refund`, `deposit`, `withdrawal`, `login` | fix, send with a new `event_id` |
| `rejected` | `no_player` | `player_ref` missing or empty | fix, send with a new `event_id` |
| `rejected` | `bad_amount` | `amount` is not an exact decimal string of the currency (§5.3), or missing where it is required | fix, send with a new `event_id` |
| `rejected` | `no_brand` | the connection carries several brands and `brand` is missing | add `brand` |
| `rejected` | `brand_unexpected` | the connection carries one brand and `brand` is present | drop `brand` |
| `rejected` | `brand_unmapped` | this `brand` is not registered for you | contact us; after we register it, resend with new `event_id`s |
| `rejected` | `operator_inactive` | the brand is not active in GA | contact us |
| `rejected` | `panic` | processing failed on our side | send us the `event_id` |
| `skipped` | `currency_unknown` | `currency` is missing or not in Appendix C | use a listed code, or ask us to add one |
| `skipped` | `zero_amount` | a `bet` or `settled` of zero | none |
| `skipped` | `game_denied`, `game_not_allowed` | the game is outside the promotion rules of the brand | none |
| `skipped` | `below_min_bet` | the bet is below the brand's minimum for promotions | none |
| `skipped` | `game_unknown` | your catalogue holds games, and this `bet` or `settled` names none of its active ones (§8.1) | add the game to your catalogue; later events of it count |
| `skipped` | `round_refunded` | the round was already refunded | none |
| `duplicate` | any or none | already decided; a `reason` here, if present, is not a new verdict | none |

## Numbers to Remember

| | |
| :--- | :--- |
| Token endpoint answer | within 1.5 s, else the page shows the guest view |
| Operator token `exp` | required; a few minutes |
| Webhook timestamp window | ±300 s |
| Webhook batch / body | 500 events / 1 MiB, unless agreed otherwise |
| `503` retry hint | `Retry-After: 1` |
| Wait for a free webhook slot | 0.5 s, then `503` |
| `brand`, `player_ref` | up to 255 bytes of UTF-8 |
| `amount` | exact decimal string; the value in minor units fits a signed 64-bit integer |
| `settled` | exactly one per round, amount = sum of the bets |
| RabbitMQ retry of an undecided message | 1 s, doubling, up to 30 s |
| GA catalogue request timestamp | up to 5 min old, up to 30 s ahead |
| GA catalogue diff `limit` | 1–1000, default 200 |

## Currencies

| Scale | Codes |
| :--- | :--- |
| 0 | `JPY` |
| 2 | `USD`, `EUR`, `GBP`, `CHF`, `CAD`, `AUD`, `NZD`, `PLN`, `CZK`, `HUF`, `RON`, `BGN`, `SEK`, `NOK`, `DKK`, `TRY`, `UAH`, `RUB`, `BRL`, `MXN`, `INR`, `ZAR` |
| 6 | `USDT`, `USDC`, `XRP`, `ADA`, `TRX` |
| 8 | `BTC`, `LTC`, `DOGE` |
| 9 | `SOL` |
| 18 | `DAI`, `ETH`, `BNB`, `MATIC` |

A currency not listed here is set aside (`skipped/currency_unknown`); ask us before you send one.
