Two APIs, running in opposite directions
Integrating an aggregator is usually described as one thing. It is two, and only one of them is a product. Understanding which is which is the whole reason this platform is sold without an aggregator attached.
The direction that is a client, and the direction that is a service
Games API — we call them
Four endpoints and a thin HTTP client. If one is slow, a page is slow. Nothing here can lose a transaction, and nothing here is hard.
POST /operator/generic/v2/game/url
open a game session
POST /operator/generic/v2/game/list
the catalog, rate-limited to one request a minute
POST /operator/generic/v2/game/round
replay a settled round
POST /operator/generic/v2/products/list
the providers enabled on your account
Wallet API — they call us
Five endpoints we host and operate, with no JWT on them. The signature and the IP allowlist are the entire authentication, and the signature is verified over the raw body — never over re-serialised JSON, which is a different string.
POST /user/info
who this token belongs to
POST /user/balance
the only endpoint exempt from idempotency
POST /transaction/bet
debit, live token required
POST /transaction/win
credit, an expired token is still valid
POST /transaction/rollback
always answers RS_OK, even for a transaction never seen
The bet and the win never reach the player app. The balance moves server-side while the app is showing an iframe it cannot see into — which is why every balance on screen carries a refresh control and the app re-fetches when a game closes. A platform that does not account for this shows players a stale number after every spin.
Every callback answers HTTP 200, with the status in the body
RS_OK
The only success value there is.
RS_ERROR_INVALID_SIGNATURE
The body did not verify against your public key.
RS_ERROR_INVALID_TOKEN
Unknown token, or a token belonging to a different player.
RS_ERROR_TOKEN_EXPIRED
Known, but past its life. Distinct from unknown, deliberately.
RS_ERROR_NOT_ENOUGH_MONEY
Refused, and the real balance is sent alongside it.
RS_ERROR_USER_DISABLED
The account is blocked or frozen.
RS_ERROR_INVALID_PARTNER
The operator id on the request is not one of ours.
RS_ERROR_INVALID_GAME
The game code is not in the catalog.
RS_ERROR_WRONG_CURRENCY
The wallet does not hold that currency.
RS_ERROR_DUPLICATE_TRANSACTION
Same id, different content. A conflict, not a retry.
RS_ERROR_TRANSACTION_DOES_NOT_EXIST
A win with no bet behind it, and no replay of its own.
RS_ERROR_WRONG_SYNTAX
The body is not the shape the contract describes.
RS_ERROR_WRONG_TYPES
Right fields, wrong types.
RS_ERROR_LIMIT_REACHED
An operator limit stopped it.
RS_ERROR_UNKNOWN
Implemented, and deliberately never sent — it is graded as an operator system failure.
Three token rules that are easy to implement backwards
What each callback does when it arrives twice
What the first week looks like
01 · Day one
Credentials and a staging pointing
You create the Operator ID and key pair on your own Hub88 account — they are yours, and they stay yours. We take the public key, you take ours, and the wallet endpoints are pointed at a staging deployment.
02 · Day two
Catalog sync and curation
The game list is pulled once, categories are mapped, and anything that does not map is reported to you by name rather than filed under a default. You curate the lobby; a later re-sync cannot undo that, because a sync only overwrites provider-owned fields.
03 · Day three
The chaos suite against your credentials
A retried bet, a win with no bet, an unreferenced rollback, a late win on an expired token, a bad signature, a blocked-country game, an unmapped category. This runs before certification is requested, not after it fails.
04 · Day four
Certification, under your Operator ID
Hub88’s own certification tests, run twice — once on staging and once on production — per region you operate in. We drive the run; the account, the credentials and the pass are yours.
05 · Day five
Brand, themes, content and staff accounts
Brand name, theme, banners, promotions, bonus policies, VIP tiers, payment channels and the staff roles that can touch each of them. All of it is data, so none of it is a deploy.
Certification runs under your Operator ID and your key pair, per region, because those credentials belong to you and not to us. Each brand you launch is its own technical integration and each operating entity is invoiced separately by the aggregator — a two-brand, two-region plan is four integrations, not one. Worth knowing before anybody promises a date.
If you are not on Hub88
null and is reported — never defaulted.Tell us which aggregator you run and we will tell you what that adapter costs before you commit to anything.