Provider API/Transaction feed
Transaction feed
API · Operator → Boss HubGET/v1/transactions
Returns the bet, win and rollback transactions sent to your wallet in time order: to reconcile your own wallet ledger transaction by transaction and to get from a transaction ID to its round. You see only your own transactions, in your key’s environment. Requires the rounds.read scope.
Headers
| Header | Description |
|---|---|
| X-Operator-Id | Your operator ID |
| X-Timestamp | Unix seconds. Rejected outside ±30 s |
| X-Signature | hex(HMAC_SHA256(secret, ts + "." + METHOD + "." + path?query + "." + body)) |
| X-Api-Key | Optional. Selects the right secret when you have several keys |
Pagination: Order is created_at, then transaction_id, ascending. If next_cursor is set, repeat the same query with cursor; null means you are on the last page. Reading a closed range from start to end returns each row once and in order.
Flags: round_closed, is_freeround, campaign_id, jackpot, promo are the values sent to you in the wallet call and do not change later. On a rollback row jackpot and promo come from the reversed transaction; round_closed is false on a rollback. For the round’s current state use round lookup.
200Transactions
{
"items": [
{
"transaction_id": "tx_01HF3K9QZ2-b1",
"round_id": "rnd_01HF3K9QZ2",
"type": "bet",
"amount": 2.00,
"currency": "USD",
"status": "ok",
"round_closed": false,
"is_freeround": false,
"campaign_id": null,
"jackpot": null,
"promo": null,
"ref_transaction_id": null,
"operator_tx_id": "op_tx_9921844",
"player_id": "u_88213",
"game_id": "sultans-ember",
"site_id": "site_mrd01",
"created_at": "2026-11-05T14:22:05Z",
"completed_at": "2026-11-05T14:22:05Z"
},
{
"transaction_id": "tx_01HF3K9QZ2-w1",
"round_id": "rnd_01HF3K9QZ2",
"type": "win",
"amount": 5.00,
"currency": "USD",
"status": "ok",
"round_closed": true,
"is_freeround": false,
"campaign_id": null,
"jackpot": null,
"promo": null,
"ref_transaction_id": null,
"operator_tx_id": "op_tx_9921845",
"player_id": "u_88213",
"game_id": "sultans-ember",
"site_id": "site_mrd01",
"created_at": "2026-11-05T14:22:09Z",
"completed_at": "2026-11-05T14:22:09Z"
}
],
"next_cursor": "eyJhdCI6IjIwMjYtMTEtMDVUMTQ6MjI6MDkuMDAwWiIsImlkIjoidHhfMDFIRjNLOVFaMi13MSJ9"
}422Range longer than 31 days
{
"code": "DATE_RANGE_TOO_LONG",
"message": "The date range is longer than allowed (at most 366 days for reports, 31 days for the transaction feed).",
"request_id": "req_01HF3Q2R",
"details": { "max_days": 31 }
}Row fields
| Field | Type | Description |
|---|---|---|
| transaction_id | string | The transaction ID from the wallet call. |
| round_id | string | Round ID. |
| type | string | bet, win, rollback. Jackpot and promotion credit are win rows. |
| amount | decimal(18,2) | Transaction amount. 0 on a free round bet. |
| currency | ISO 4217 | Session currency. |
| status | string | queued, pending, ok, rejected, ambiguous, reversed, void, manual_ok; same as the transactions in the round detail. |
| round_closed | boolean | Whether the call carried the round close signal. |
| is_freeround | boolean | Free round transaction. |
| campaign_id | string | null | Free round campaign. |
| jackpot | object | null | Jackpot win: pool_id (can be null when no pool matches), level. null on other transactions. |
| promo | object | null | Promotion credit (tournament prize): type, id, rank (integer). null on other transactions. |
| ref_transaction_id | string | null | On a rollback, the reversed transaction. |
| operator_tx_id | string | null | The transaction ID in your response. |
| player_id | string | The player ID on the operator side. |
| game_id | string | Game code. |
| site_id | string | Site ID. |
| created_at | date-time | When the transaction was created; order and range read this. |
| completed_at | date-time | null | When the result came back from your wallet; null while pending. |
Error codes
| Code | HTTP | Meaning |
|---|---|---|
| INVALID_SIGNATURE | 401 | Signature could not be verified |
| TIMESTAMP_SKEW | 401 | X-Timestamp is outside ±30 s |
| IP_NOT_ALLOWED | 403 | IP is not on the allowlist |
| SCOPE_MISSING | 403 | The rounds.read scope is missing |
| SCOPE_DENIED | 403 | site_id is not yours or is outside your key’s scope |
| VALIDATION_ERROR | 422 | from or to is missing, or a query parameter is invalid |
| DATE_RANGE_INVALID | 422 | from is not before to |
| DATE_RANGE_TOO_LONG | 422 | The range is longer than 31 days (details.max_days) |
| INVALID_CURSOR | 422 | cursor does not come from a previous response |
| RATE_LIMITED | 429 | Rate limit exceeded |