Provider API/GGR reports
GGR reports
API · Operator → Boss HubGET/v1/reports/ggr
Returns bet, win and GGR totals for the range you choose, grouped by day, game, site, provider or currency. Requires the api module and the reports.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 |
Accounting date: Amounts are recorded on the transaction’s accounting date (booked_at); bets and wins get this date when the round closes. A later rollback lands as a negative entry on its own date, and the rows of a closed month never change. Days are UTC. Today’s row is not final; the daily totals are refreshed every few minutes. Days or groups without activity are left out (not filled with zeros); rows are sorted by key.
200Report rows
{
"currency": "USD",
"rows": [
{
"key": "2026-11-04",
"rounds": 18420,
"players": 1204,
"bets": 48210.00,
"wins": 46329.81,
"ggr": 1880.19,
"rtp": 96.10
},
{
"key": "2026-11-05",
"rounds": 19377,
"players": 1261,
"bets": 51240.00,
"wins": 49190.40,
"ggr": 2049.60,
"rtp": 96.00
}
]
}Response fields
| Field | Type | Description |
|---|---|---|
| currency | ISO 4217 | Currency of the amounts in the rows. |
| rows[].key | string | Group value: the day for group_by=day, the game code for game, the site code for site, the provider code for provider, the original currency of the transactions for currency (amounts are still in the requested currency). |
| rows[].rounds | integer | Number of rounds, on the day they closed; void and promotional credit rounds do not count. |
| rows[].players | integer | Unique players in the group over the whole range. |
| rows[].bets | decimal(18,2) | Total bets. |
| rows[].wins | decimal(18,2) | Total wins, excluding jackpot wins, free round wins and promotional credits. |
| rows[].ggr | decimal(18,2) | Bets minus wins; jackpot and free round wins do not reduce GGR. Calculated from the USD amount at transaction time, while bets and wins are converted at the day’s rate; in non-USD currencies ggr may not equal bets − wins exactly. |
| rows[].rtp | number | null | Realised RTP, as a percentage with two decimals, e.g. 96.10; on the same basis as GGR. null when there are no bets. |
Comparing with your own ledger
An operator ledger follows the transaction date. This report follows the accounting date, so rounds near a day boundary can fall on different days on each side. For the transaction date on your side, use the created_at field of the callbacks.
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 reports.read scope is missing |
| SCOPE_DENIED | 403 | site_id is not yours or is outside your key’s scope |
| MODULE_DISABLED | 403 | The api module is disabled |
| VALIDATION_ERROR | 422 | Invalid query parameter |
| DATE_RANGE_INVALID | 422 | from is not before to |
| DATE_RANGE_TOO_LONG | 422 | The range is longer than 366 days (details.max_days) |
| RATE_LIMITED | 429 | Rate limit exceeded |