Bets
Incremental, cursor-based sync of settled bets, and daily summaries.
Guide: read the integration guide for this area
TIP
Examples are signed with the example key and timestamp from "Authentication & signing", so you can re-check them in the Signature debugger.
Sync bets (cursor)
GET /api/tenant/v1/bets
Reads settled bets in the order they were written. Each page returns nextCursor; pass it back unchanged to continue where you left off, and persist it.
- The first call (no
cursor) starts at the first record of the current UTC month, or at the time given infrom. fromis ignored whencursoris present.- Recalculations and voids appear as a new record with the same
slipIdand a higherrev. Use(slipId, rev)as the unique key and treat the highestrevof aslipIdas final. - While
hasMoreistrueread the next page right away (it is alsotruewhile the cursor has not reached the current UTC month); when it isfalseyou have caught up, so poll again later (for example every 5–30 seconds) withnextCursor. - Recalculations and voids are written at the time they happen, so they always appear after your cursor and are never missed.
recSeqincreases within a UTC month only and restarts in the next month.- Niu Niu slips (
game: niuniu) addhold(the total hold for double bets), and theirpayoutincludes the returned hold: always take the win/loss fromwinLoss(=payout − stake − hold), never frompayout − stake.
Parameter
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
cursor | query | string | no | nextCursor from the previous page (format yyyymm.sequence).Format: ^\d{6}\.\d+$ |
limit | query | integer | no | Page size, 1–1000, default 500. Range: 1–1000 Default: 500 |
from | query | string (date-time) | no | Starting point when there is no cursor, an ISO-8601 time (for example 2026-09-24T00:00:00Z), aligned to the minute. |
Example request
GET /api/tenant/v1/bets?cursor=202609.1024 HTTP/1.1
Host: elite.ewin888.com
X-Api-Key: ek_s_1a_XXXXXXXXXXXXXXXX
X-Timestamp: 1790218800
X-Nonce: ex51afea5ebcbe22ae488641
X-Signature: e15e5d07dfda0394186395fb7417746c787626d2928ff370d99bea2883c2e46dResponse data
| Field | Type | Description |
|---|---|---|
items | BetRecord[] | |
items[].recSeq | integer | Write sequence (increases within a UTC month). |
items[].slipId | string | Slip ID. All of a player's bets in one round form one slip. Recalculations and voids keep the same slipId. |
items[].rev | integer | Revision. The highest rev of a slipId is final.Range: 1–… |
items[].status | string | settled first settlement; recalculated recalculated after a result correction; void voided (stakes refunded in full; for Niu Niu together with the hold).Values: settled, recalculated, void |
items[].username | string | Username. |
items[].currency | string | Currency. |
items[].tableId | string | Table ID, for example S01 (see GET /tables).Length: 1–… |
items[].game | string | Game: baccarat, dragontiger, holdem (Texas Hold'em) or niuniu (Niu Niu).Values: baccarat, dragontiger, holdem, niuniu |
items[].variant | string | Variant: baccarat classic (5% commission on banker wins) or nocomm (no commission; banker winning with 6 pays half, with Super Six). For dragon tiger use the table's variants. Texas Hold'em: casino (player vs dealer, Casino Hold'em), thbp (player vs dealer, Texas Hold'em Bonus Poker) or nlhe (player vs player, no-limit). Niu Niu: standard. |
items[].roundId | string | Round ID; for Texas Hold'em the hand ID. Format: ^[0-9A-Z]{26}$ |
items[].shoe | string | Shoe number; an empty string for Texas Hold'em (no shoe). Niu Niu uses a fresh deck every round, so this is the session (a new one every 60 rounds by default). |
items[].round | integer | Round number within the shoe; for Texas Hold'em the hand number at this table; for Niu Niu the round number within the session. |
items[].bets | BetLeg[] | Stake and return per bet zone. |
items[].bets[].zone | string | Bet zone. Baccarat: B banker, P player, T tie, BP banker pair, PP player pair, S6 Super Six (no-commission). Dragon tiger: D dragon, TG tiger, T tie, ST suited tie; big/small/odd/even (only on tables where you turn it on in Console Table settings): DB dragon big, DS dragon small, DO dragon odd, DE dragon even, TB tiger big, TS tiger small, TO tiger odd, TE tiger even. Texas Hold'em: player vs dealer Casino Hold'em ANTE ante, CALL call (2× the ante), AAB AA bonus; player vs dealer Texas Hold'em Bonus ANTE ante, FLOP flop bet (2× the ante), TURN turn bet (1× the ante), RIVER river bet (1× the ante), BONUS bonus bet; player vs player POT (everything put into the pot in the hand; return is the uncalled part given back). Niu Niu (each one bets that this player hand beats the banker): P1E player 1 equal, P1D player 1 double, P2E player 2 equal, P2D player 2 double, P3E player 3 equal, P3D player 3 double.Values: B, P, T, BP, PP, S6, D, TG, ST, DB, DS, DO, DE, TB, TS, TO, TE, ANTE, CALL, AAB, FLOP, TURN, RIVER, BONUS, POT, P1E, P1D, P2E, P2D, P3E, P3D |
items[].bets[].amount | string | Stake. Format: ^-?\d{1,15}(\.\d{1,4})?$ |
items[].bets[].return | string | Amount returned (stake + net win; a push returns the stake; 0 when lost). For a Niu Niu double bet it also includes the returned hold. Format: ^-?\d{1,15}(\.\d{1,4})?$ |
items[].bets[].hold | string | Niu Niu double bets only (P1D, P2D, P3D): the extra amount held from the balance when the bet was placed (stake × 2 by default); the unused part is included in return.Format: ^-?\d{1,15}(\.\d{1,4})?$ |
items[].bets[].mult | integer | Niu Niu double bets only: the multiplier actually applied — the player hand's multiplier when the player wins, the banker hand's when the player loses (by default ×1 for No Bull to Bull 6, ×2 for Bull 7–9, ×3 for Niu Niu); 0 when refunded.Range: 0–10 |
items[].stake | string | Total stake (for Niu Niu, without the hold). Format: ^-?\d{1,15}(\.\d{1,4})?$ |
items[].hold | string | Niu Niu only: the total hold on double bets (the sum of bets[].hold; 0 without double bets). A double bet can lose more than its stake (up to 3× by default), so this amount is held from the balance on top of the stake when the bet is placed, and the unused part is returned with the payout at settlement (included in payout).Format: ^-?\d{1,15}(\.\d{1,4})?$ |
items[].validStake | string | Valid (effective) stake, with banker/player hedges and pushes removed by the rules. Niu Niu: the stake for equal bets and stake × the multiplier actually applied (bets[].mult) for double bets; refunded bets do not count.Format: ^-?\d{1,15}(\.\d{1,4})?$ |
items[].rolling | string | Rolling (lost stakes; Super Six excluded). Niu Niu: the amount lost (a lost double bet loses stake × the banker hand's multiplier). Format: ^-?\d{1,15}(\.\d{1,4})?$ |
items[].payout | string | Total payout (stake included); for Niu Niu it also includes the returned hold. Format: ^-?\d{1,15}(\.\d{1,4})?$ |
items[].winLoss | string | Player win/loss = payout − stake (positive means the player won); for Niu Niu payout − stake − hold. Always reconcile with this field.Format: ^-?\d{1,15}(\.\d{1,4})?$ |
items[].delta | string | What this revision changed on the player's balance: payout for the first settlement; the payout difference for a recalculation (may be negative); stake (plus the hold for Niu Niu) minus the earlier payout for a void.Format: ^-?\d{1,15}(\.\d{1,4})?$ |
items[].result | ResultCode | |
items[].result.code | string | Result code (one hexadecimal character, see "Tables and round results"); an empty string for a void round without a result. For Texas Hold'em it is this player's outcome of the hand: player vs dealer player_wins, dealer_wins, tie, dealer_not_qualified (Casino Hold'em only), fold; player vs player win, split, lose, fold; void when the hand was voided. For Niu Niu it is 5 characters [outcome][banker][player 1][player 2][player 3]: the first is a bit mask of the winning player hands (player 1 = 1, player 2 = 2, player 3 = 4, added up: 0–7), followed by each hand's rank (0–9, A Niu Niu, B Five Face Bull, C Bomb, D Five Small Bull, - unknown), for example 5893A. |
items[].result.cardInfo | string | Card string (12 characters for baccarat, 4 for dragon tiger, see "Tables and round results"); an empty string when there is no result. For Texas Hold'em it is board|this player's two hole cards|the dealer's two cards (space-separated card codes; the dealer part only at player-vs-dealer tables), for example AS KD 7H 7C 2S|AH 7D|QS 3C. For Niu Niu it is first card|banker|player 1|player 2|player 3 (each hand's 5 cards in slot order 1–5, space-separated), for example 7H|KS QD 10C 3S 5H|4C 6D JS 9C KH|2D 8S QC AH 2C|7D 3H KD 5C 5D. |
items[].result.hands | map<string, integer> | Niu Niu only: each hand's rank (B, P1, P2, P3 → 0–13), so you do not need to decode the result code. Absent on voided slips (status: void).keys: B, P1, P2, P3 |
items[].result.winners | map<string, string> | Niu Niu only: the outcome of each player hand against the banker (P1, P2, P3 → P player wins, B banker wins). Absent on voided slips (status: void).keys: P1, P2, P3 |
items[].rake | string | Texas Hold'em only: the rake taken from this player in the hand (player-vs-player tables; 0 at player-vs-dealer tables).Format: ^-?\d{1,15}(\.\d{1,4})?$ |
items[].onsite | boolean | Texas Hold'em only: an on-site seat (a guest at the table-owner's studio, registered by the dealer on the tablet, outside the wallet; username is "現場 #seat"). |
items[].hand | object | Texas Hold'em only: a summary of the hand (the full hand history is in Console "Texas Hold'em records"). |
items[].hand.handId | string | Hand ID (same as roundId). |
items[].hand.no | integer | Hand number at this table (same as round). |
items[].hand.outcome | string | This player's outcome (same as result.code). |
items[].hand.cards | string | Board and the cards this player showed (same as result.cardInfo). |
items[].placedAt | string (date-time) | UTC time, ISO-8601 with milliseconds. |
items[].settledAt | string (date-time) | When this revision was settled (or recalculated, or voided). |
nextCursor | string | Bet sync cursor (yyyymm.sequence). Treat it as opaque; store it and send it back unchanged.Format: ^\d{6}\.\d+$ |
hasMore | boolean | true means there may be another page; read it right away. |
Example response
{
"ok": true,
"data": {
"items": [
{
"recSeq": 1024,
"slipId": "01K5Y0B8Z6R2M4N7P9Q3S5T8VW.7H3KQ2XA",
"rev": 1,
"status": "settled",
"username": "alice",
"currency": "TWD",
"tableId": "S01",
"game": "baccarat",
"variant": "nocomm",
"roundId": "01K5Y0B8Z6R2M4N7P9Q3S5T8VW",
"shoe": "260924-03",
"round": 12,
"bets": [
{
"zone": "B",
"amount": "10000",
"return": "15000"
},
{
"zone": "S6",
"amount": "1000",
"return": "13000"
}
],
"stake": "11000",
"validStake": "6000",
"rolling": "0",
"payout": "28000",
"winLoss": "17000",
"delta": "28000",
"result": {
"code": "1",
"cardInfo": "122334424000"
},
"placedAt": "2026-09-24T03:00:41.120Z",
"settledAt": "2026-09-24T03:01:20.480Z"
}
],
"nextCursor": "202609.1024",
"hasMore": false
}
}Texas Hold'em (player vs dealer, player vs player)
{
"ok": true,
"data": {
"items": [
{
"recSeq": 2048,
"slipId": "01K62H3P9R8Q7M6N5B4V3C2X1Z.9K2LM4QP",
"rev": 1,
"status": "settled",
"username": "alice",
"currency": "TWD",
"tableId": "H01",
"game": "holdem",
"variant": "casino",
"roundId": "01K62H3P9R8Q7M6N5B4V3C2X1Z",
"shoe": "",
"round": 318,
"bets": [
{
"zone": "ANTE",
"amount": "100",
"return": "200"
},
{
"zone": "CALL",
"amount": "200",
"return": "400"
},
{
"zone": "AAB",
"amount": "50",
"return": "0"
}
],
"stake": "350",
"validStake": "350",
"rolling": "350",
"payout": "600",
"winLoss": "250",
"delta": "600",
"result": {
"code": "player_wins",
"cardInfo": "AS KD 7H 7C 2S|AH 7D|QS 3C"
},
"rake": "0",
"onsite": false,
"hand": {
"handId": "01K62H3P9R8Q7M6N5B4V3C2X1Z",
"no": 318,
"outcome": "player_wins",
"cards": "AS KD 7H 7C 2S|AH 7D|QS 3C"
},
"placedAt": "2026-09-27T08:12:03.410Z",
"settledAt": "2026-09-27T08:13:10.020Z"
},
{
"recSeq": 2049,
"slipId": "01K62H9A1B2C3D4E5F6G7H8J9K.3Q7XK2PL",
"rev": 1,
"status": "settled",
"username": "bob",
"currency": "TWD",
"tableId": "H02",
"game": "holdem",
"variant": "nlhe",
"roundId": "01K62H9A1B2C3D4E5F6G7H8J9K",
"shoe": "",
"round": 77,
"bets": [
{
"zone": "POT",
"amount": "400",
"return": "0"
}
],
"stake": "400",
"validStake": "400",
"rolling": "400",
"payout": "740",
"winLoss": "340",
"delta": "740",
"result": {
"code": "win",
"cardInfo": "QS QH 5D 9C 2H|QD JC"
},
"rake": "40",
"onsite": false,
"hand": {
"handId": "01K62H9A1B2C3D4E5F6G7H8J9K",
"no": 77,
"outcome": "win",
"cards": "QS QH 5D 9C 2H|QD JC"
},
"placedAt": "2026-09-27T08:20:41.000Z",
"settledAt": "2026-09-27T08:22:05.300Z"
}
],
"nextCursor": "202609.2049",
"hasMore": false
}
}Niu Niu (equal and double bets with a hold)
{
"ok": true,
"data": {
"items": [
{
"recSeq": 3072,
"slipId": "01K65N7Q2W4E6R8T0Y1V3J5K7P.7H3KQ2XA",
"rev": 1,
"status": "settled",
"username": "alice",
"currency": "TWD",
"tableId": "N01",
"game": "niuniu",
"variant": "standard",
"roundId": "01K65N7Q2W4E6R8T0Y1V3J5K7P",
"shoe": "260928-01",
"round": 7,
"bets": [
{
"zone": "P1E",
"amount": "1000",
"return": "1950"
},
{
"zone": "P2D",
"amount": "500",
"return": "500",
"hold": "1000",
"mult": 2
},
{
"zone": "P3E",
"amount": "500",
"return": "975"
},
{
"zone": "P3D",
"amount": "1000",
"return": "5850",
"hold": "2000",
"mult": 3
}
],
"stake": "3000",
"hold": "3000",
"validStake": "5500",
"rolling": "1000",
"payout": "9275",
"winLoss": "3275",
"delta": "9275",
"result": {
"code": "5893A",
"cardInfo": "7H|KS QD 10C 3S 5H|4C 6D JS 9C KH|2D 8S QC AH 2C|7D 3H KD 5C 5D",
"hands": {
"B": 8,
"P1": 9,
"P2": 3,
"P3": 10
},
"winners": {
"P1": "P",
"P2": "B",
"P3": "P"
}
},
"placedAt": "2026-09-28T06:30:12.300Z",
"settledAt": "2026-09-28T06:30:51.640Z"
}
],
"nextCursor": "202609.3072",
"hasMore": false
}
}Error codes
| Code | HTTP | Meaning |
|---|---|---|
INVALID_CURSOR | 400 | cursor is malformed. |
INVALID_PARAMETER | 400 | A required field is missing, or a field has the wrong format or value; message names the field. |
Every endpoint can also return the common errors (UNAUTHORIZED, IP_NOT_ALLOWED, TENANT_SUSPENDED, RATE_LIMITED, INTERNAL_ERROR…).
Daily per-player summary
GET /api/tenant/v1/bets/summary
Per-player totals for one date (in your tenant's time zone). Only the latest version of each bet slip counts, and voided slips add nothing to stake. Useful for daily reconciliation.
- Returns at most 1,000 players (ordered by win/loss).
- Texas Hold'em on-site seats (slips with
onsite: true) are not your members and are left out of the summary; list the bet slips to see them. - Niu Niu slips count towards the summary
payoutas stake + win/loss, without the returned hold (the same basis as every other game); a slip's ownpayoutdoes include the returned hold.
Parameter
| Parameter | In | Type | Required | Description |
|---|---|---|---|---|
date | query | string | yes | Date YYYY-MM-DD (tenant time zone); it must be a real date.Format: ^\d{4}-\d{2}-\d{2}$ |
Example request
GET /api/tenant/v1/bets/summary?date=2026-09-24 HTTP/1.1
Host: elite.ewin888.com
X-Api-Key: ek_s_1a_XXXXXXXXXXXXXXXX
X-Timestamp: 1790218800
X-Nonce: exff72e1c4c7919a1f829231
X-Signature: 319627c263a261afc9c99a4ba68b1d781ffe994bc6cc6b7770c1705598f05acfResponse data
| Field | Type | Description |
|---|---|---|
date | string | A date YYYY-MM-DD.Format: ^\d{4}-\d{2}-\d{2}$ |
timezone | string | Tenant time zone (IANA, for example Asia/Taipei). |
players | PlayerDaySummary[] | |
players[].username | string | Username. |
players[].slips | integer | Number of slips (voided ones included). |
players[].stake | string | Total stake (voided slips excluded). Format: ^-?\d{1,15}(\.\d{1,4})?$ |
players[].validStake | string | A player amount as a decimal string with at most 4 decimals. Responses drop trailing zeros (for example "100", "0.95", "1000.5").Format: ^-?\d{1,15}(\.\d{1,4})?$ |
players[].rolling | string | A player amount as a decimal string with at most 4 decimals. Responses drop trailing zeros (for example "100", "0.95", "1000.5").Format: ^-?\d{1,15}(\.\d{1,4})?$ |
players[].payout | string | Total payout (stake included). Niu Niu slips count as stake + win/loss, without the returned hold (a slip's own payout includes the hold).Format: ^-?\d{1,15}(\.\d{1,4})?$ |
players[].winLoss | string | A player amount as a decimal string with at most 4 decimals. Responses drop trailing zeros (for example "100", "0.95", "1000.5").Format: ^-?\d{1,15}(\.\d{1,4})?$ |
players[].rake | string | Total rake from Texas Hold'em player-vs-player tables (0 for other games).Format: ^-?\d{1,15}(\.\d{1,4})?$ |
Example response
{
"ok": true,
"data": {
"date": "2026-09-24",
"timezone": "Asia/Taipei",
"players": [
{
"username": "alice",
"slips": 42,
"stake": "52000",
"validStake": "31500",
"rolling": "18000",
"payout": "55200",
"winLoss": "3200",
"rake": "0"
}
]
}
}Error codes
| Code | HTTP | Meaning |
|---|---|---|
INVALID_PARAMETER | 400 | A required field is missing, or a field has the wrong format or value; message names the field. |
Every endpoint can also return the common errors (UNAUTHORIZED, IP_NOT_ALLOWED, TENANT_SUSPENDED, RATE_LIMITED, INTERNAL_ERROR…).