Skip to main content

Setup

Enable Allow HTTP Requests in Roblox Studio → Game Settings → Security.
API Keys are issued per game from the PlayWave admin console. Contact your PlayWave operations representative to request one.
EnvironmentURLStatus
Devhttps://wave-api.playwave.dev/v1Available
QAhttps://wave-api-qa.playwave.dev/v1Coming soon
Livehttps://wave-api.playwave.io/v1Coming soon
API Keys are issued separately for each environment.

Sessions

LaunchData will be empty, so OTT extraction returns nil. This is normal behavior — simply don’t grant PC cafe benefits to these users. Normal gameplay is unaffected.
OTT must be verified within 1 minute of issuance. If your game has long loading times, make sure you’re calling verify immediately in the PlayerAdded event.
The game session’s Redis TTL is 4 minutes. Without heartbeats, the session is automatically deleted after 4 minutes and billing is abnormally terminated. Always send heartbeats at 2-minute intervals.
Yes. The server has a 2-minute grace period before auto-termination. Continue sending heartbeats during the grace period to keep the session properly maintained. Notify the user about G-coin depletion, but don’t kick them immediately.
Currently, PlayWave is a PC cafe-only platform, so is_pc_cafe is always true on successful verification. However, we recommend checking the flag in your code for future extensibility.
On Roblox server restart, game:BindToClose calls the end session API for all active sessions. Even if the calls fail, sessions are automatically cleaned up via TTL expiration after 4 minutes.

Teleport

You must include PlayWave session data in TeleportOptions when teleporting. Call PlayWaveServer.prepareForTeleport(player, teleportOptions) before TeleportAsync. See the Teleport integration guide for details.
Yes. PlayWave SDK must be installed on every SubPlace that is a teleport destination so it can receive session data and maintain authentication.
Clicking Install SDK resets the PlayWaveSetup and PlayWaveClient scripts. Always back up your existing callback code before reinstalling the SDK, then restore it afterward.
Sessions will not persist after teleporting to a SubPlace, so billing will not apply. This can result in revenue loss.

Roblox-specific

OTTs are in UUID format (36 characters), well within any length limits.
When an individual player leaves, the server is still alive so HTTP calls complete normally. For the case when the last player leaves and the server shuts down, use game:BindToClose. BindToClose has a 30-second time limit — HTTP calls must complete within that window.
The task.spawn + task.wait loop pattern is stable for long-running sessions in Roblox. The loop continues while the player is in-game and automatically terminates when the session is removed from the activeSessions table.
Enabling Allow HTTP Requests in Game Settings → Security is sufficient. No separate domain whitelist is needed.