Boss HubBoss HubDocs
ChangelogStatus
Provider API/GGR reports

GGR reports

API · Operator → Boss Hub
GET/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

HeaderDescription
X-Operator-IdYour operator ID
X-TimestampUnix seconds. Rejected outside ±30 s
X-Signaturehex(HMAC_SHA256(secret, ts + "." + METHOD + "." + path?query + "." + body))
X-Api-KeyOptional. Selects the right secret when you have several keys

Query parameters

fromdate-time
Start. Daily totals are used, so the whole UTC day of from counts. 30 days before to if omitted.
todate-time
End time, exclusive; a mid-day value also counts that day. Now if omitted. The range is at most 366 days.
group_bystring
Grouping: day (default), game, site, provider, currency.
currencyISO 4217
USD (default), EUR, TRY.
site_idstring
Site code, e.g. site_mrd01. All sites if omitted; a site key’s own site.
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.
GET /v1/reports/ggr?from=2026-11-04T00:00:00Z&to=2026-11-06T00:00:00Z&group_by=day&currency=USD HTTP/1.1
Host: staging.example.com
X-Operator-Id: op_meridyen
X-Timestamp: 1762344000
X-Signature: 2b96e0…d41f
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

FieldTypeDescription
currencyISO 4217Currency of the amounts in the rows.
rows[].keystringGroup 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[].roundsintegerNumber of rounds, on the day they closed; void and promotional credit rounds do not count.
rows[].playersintegerUnique players in the group over the whole range.
rows[].betsdecimal(18,2)Total bets.
rows[].winsdecimal(18,2)Total wins, excluding jackpot wins, free round wins and promotional credits.
rows[].ggrdecimal(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[].rtpnumber | nullRealised 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

CodeHTTPMeaning
INVALID_SIGNATURE401Signature could not be verified
TIMESTAMP_SKEW401X-Timestamp is outside ±30 s
IP_NOT_ALLOWED403IP is not on the allowlist
SCOPE_MISSING403The reports.read scope is missing
SCOPE_DENIED403site_id is not yours or is outside your key’s scope
MODULE_DISABLED403The api module is disabled
VALIDATION_ERROR422Invalid query parameter
DATE_RANGE_INVALID422from is not before to
DATE_RANGE_TOO_LONG422The range is longer than 366 days (details.max_days)
RATE_LIMITED429Rate limit exceeded
← PreviousJackpot poolsNext →Other endpoints