Give any player free spins with one call
Your system decides who and when. We handle how each studio does it. We do not bill the free spins.
What you can run with it
Any campaign your system already runs can end in free spins. Six that operators run.
Welcome offer
A player makes a first deposit. Your system grants 20 spins on your top game, valid seven days, tagged with your campaign id. Deposit reversed before they played? Cancel the grant and nothing has been spent.
Bringing back dormant players
The segment that has not logged in for 30 days gets 10 spins on each of two popular games, valid 72 hours. The short window is the deadline that brings them back. Every grant carries the same campaign id.
VIP gifts
The host picks a player, a game and 50 spins in the player's own currency. No file to send, no ticket to the studio. The spins are there when the player opens the game.
Launching a new studio
A studio goes live on Monday. You grant 5 spins on each of 3 of its games to your active players, valid for launch week. It is the same call you used for last month's studio, even though this one does free spins its own way underneath.
Tournament prizes
The leaderboard closes and your system grants prizes by rank: 100, 50 and 20 spins. The campaign id is the tournament id, and the grant list shows who has not played their prize yet.
Making up for an incident
A game was down for an hour. You owe the affected players a gesture, not a refund process. Grant spins to everyone on the list, one call per player, with a short window. Compensated someone in cash instead? Cancel their grant before they play.
Grant. Check. Take back.
Three things your system can do, and two things it never has to worry about.
Grant
Name the player, the games, how many spins on each, the stake per spin, the window and your campaign id. One call. The reply shows which games took the grant; re-issue any that did not. The player opens the game as usual and the spins are waiting: no special link, no separate launch.
Check
List what you have granted, by player or by status: active, played, expired, cancelled. Each grant carries your campaign id, so you can check a whole wave against your own records.
Take back
Wrong player, wrong amount, a deposit that never cleared? Cancel the unplayed spins of any grant, at any time. What has been played stays settled: the win is the player's.
Sent twice? Issued once.
Every grant carries a key you choose. A retry after a timeout returns the original grant instead of a second one. Free spins are money, and a network blip should not cost you a campaign.
Valid only in the window you set
Every grant has a start and an end, up to 90 days. Unplayed spins expire on their own. Nothing stays live longer than you decided.
What a free spin costs you
The winnings, and nothing else. You pay us for spins your players stake. Free spins are not billed and do not draw down your spin package. The Operator Service Offer says so, and the code that counts spins skips them.
Each free spin plays at a bet size you set. Nobody pays that bet; it only sets how much a win pays. So a campaign costs what the players win. You set the count, the games, the stake and the window. The game's RTP does the rest.
You keep the brain. We do the plumbing.
We do not replace your bonus engine or your Telegram bot. We give it one more action, the same one for every studio that takes free spins.
You decide
- Who qualifies, and when
- Which games, and how many spins on each
- The stake behind each spin
- How long the offer stays open
- Which balance the win lands on, and any wagering terms
- What you call it in front of the player
We handle
- Each studio's own way of doing free spins. There are three. You see one.
- The player opens the game as always and the spins are there
- No duplicate grant when your system retries
- Cancel unplayed spins at any time. Played spins stay settled.
- A record of every grant, by player and by status
- The win, in the wallet flow you already run, marked as a free-round win
Which studios take free spins
Two live, one paused, two without. Each game that takes them is marked "Free rounds supported" in the cabinet and in the Mini App.
TRUE LABS
SpinGO
Apparat
Megafair
Ebaka
For your engineer, or your coding agent
Three operations, one header, and nothing new on the wallet side.
POST /v1/free-roundsissues a grant. Body: provider_code, player_id, games (our ids, up to 50), count per game, currency, country, coin_level or bet_amount as the game's stakes endpoint says, start_at, end_at, campaign_id. Header: Idempotency-Key, required.GET /v1/free-roundslists grants, filtered by player_id and status, paged.POST /v1/free-rounds/{grant_id}/cancelcancels the unplayed rounds of a grant.
Supported connectors deliver free-round events with is_free: true and the grant reference; some flows deliver only the win event. Never debit a free bet. Commit any wallet credit and its idempotent response before success. Available readiness checks are advisory evidence, not permission to issue a key or launch. Supply a protected AGGREGATOR_API_KEY and a persisted AGGREGATOR_IDEMPOTENCY_KEY for the request below; reuse that key and the same body on retries.
(
if [ -z "${AGGREGATOR_API_KEY:-}" ]; then
printf '%s\n' 'AGGREGATOR_API_KEY is required.' >&2
exit 1
fi
if [ -z "${AGGREGATOR_IDEMPOTENCY_KEY:-}" ]; then
printf '%s\n' 'AGGREGATOR_IDEMPOTENCY_KEY is required.' >&2
exit 1
fi
printf 'Authorization: Bearer %s\nIdempotency-Key: %s\n' "$AGGREGATOR_API_KEY" "$AGGREGATOR_IDEMPOTENCY_KEY" |
curl -X POST https://api.aggregator.gg/v1/free-rounds \
-H @- \
-H "Content-Type: application/json" \
-d '{
"provider_code": "truelabs",
"player_id": "player-123",
"games": ["550e8400-e29b-41d4-a716-446655440000"],
"count": 10,
"currency": "EUR",
"country": "DE",
"coin_level": 1,
"start_at": "2026-10-01T00:00:00Z",
"end_at": "2026-10-08T00:00:00Z",
"campaign_id": "welcome-q4"
}'
) Paste into your coding agent
Read https://docs.aggregator.gg/guides/free-rounds/ and add a "grant free rounds" action to our bonus system. It calls POST /v1/free-rounds with player_id, games (our game ids), count per game, currency, country, the stake field the game expects (check GET /v1/games/{id}/stakes), start_at, end_at and campaign_id, sends an Idempotency-Key we generate and store, and keeps the returned grant_id with its per-game status. Add a cancel action for POST /v1/free-rounds/{grant_id}/cancel. In our wallet handler, never debit a bet callback with is_free: true and credit a win with is_free: true like any win. Questions operators ask
Who pays for a free spin?
You pay the winnings through your wallet, as with any promotion. The free spins themselves are not billed and do not reduce your spin package balance. Operators often apply wagering requirements to free-spin winnings. Where these apply, players must meet the requirements stated in the campaign terms before withdrawing those winnings.
What stops bonus abuse?
Your system does. The API does not know your players and does not segment them. What it gives you: every grant names one player. A retry never issues twice. You can cancel unplayed spins at any time. The window limits how long a grant stays live. By default no player gets more than 50 grants on one game in a day.
We already have a bonus engine.
Keep it. This is not a bonus engine. It is one more action your bonus engine or your Telegram bot calls. The call is the same on every studio that takes free spins.
How do we reconcile a campaign?
Each win from a free spin reaches your wallet marked as free, with the grant it belongs to. Each grant carries your campaign id, the player, the currency and the country. There is no grant screen in the cabinet today: your reporting pulls the grant list through the API.
Does the player need a special link?
No. The player opens the game the way they always do. The studio shows the spins.
What about the word "free" and wagering terms?
The API grants spins the player does not stake and delivers wins as wins. It attaches no terms. What you call the offer, which terms you add and what you disclose is your compliance team's call, and markets differ.