Changelog
All notable changes to this project will be documented in this file.
[0.19.3] - 2026-11-04
Fixed
- Report, mute and block requests no longer fail with a 400. The SDK was sending
sourceandplatformas objects instead of the stringsunity-sdkandin-game, soReportPlayerAsync(),MutePlayerAsync(),BlockPlayerAsync()and their undo counterparts could be rejected and returnnull. Ban appeals and manual actions were affected the same way. No code changes are needed on your side; update the package to pick up the fix.
Server-side changes affecting SDK callers
- The moderation endpoints (
/report,/mute,/blockand their/undoroutes) now acceptsourceandplatformin either the string form or the old object form ({"Value": "unity-sdk"}), so reports from earlier SDK versions are accepted once this is deployed.
[0.19.2] - 2026-11-04
Added
- Optional
reasonargument on all six typed wrappers:ReportPlayerAsync(),UndoReportPlayerAsync(),MutePlayerAsync(),UnmutePlayerAsync(),BlockPlayerAsync()andUnblockPlayerAsync(). It defaults tonull, and when null it is left out of the request, so existing calls compile unchanged.
Removed
- Generic moderation-event methods. The event type is now chosen by the typed wrappers, so these are no longer public. If your project calls any of them, switch to the matching wrapper before updating, or it will no longer compile:
ReportUserAsync(targetUserId, eventType)andUnReportUserAsync(targetUserId, eventType): useReportPlayerAsync,MutePlayerAsyncorBlockPlayerAsyncto apply, andUndoReportPlayerAsync,UnmutePlayerAsyncorUnblockPlayerAsyncto undo.- The deprecated coroutine
ReportUser(reporterUserId, targetUserId, eventType), which was already marked obsolete. The reporter is always the local player from yourGetTelemetrydelegate.
ModerationEventTyperemains in the package, but with the generic methods gone you no longer need to pass it.
See Reporting, Muting and Blocking Players.
[0.18.0] - 2026-11-03
Added
- Block event type. Players can now block each other, and PlaySafe records it alongside reports and mutes. Blocks by other players count towards a player's respect score, the same as reports and mutes.
ModerationEventTypeconstants (Report,Mute,Block) for use with the genericReportUserAsync(targetUserId, eventType)andUnReportUserAsync(targetUserId, eventType).- Typed wrappers on
PlaySafeManager, so you don't have to pass an event type string:ReportPlayerAsync()/UndoReportPlayerAsync()MutePlayerAsync()/UnmutePlayerAsync()BlockPlayerAsync()/UnblockPlayerAsync()
Existing callers of ReportUserAsync() and UnReportUserAsync() need no changes. See Reporting, Muting and Blocking Players.
Server-side changes affecting SDK callers
- New endpoints
POST /products/moderation/blockandPOST /products/moderation/block/undo, which the block wrappers call. Older SDK versions can send"block"throughReportUserAsync(targetUserId, "block")against the same backend.
[0.17.0] - 2026-09-24
Removed
- Playtest notes. Note-taking has been retired from PlaySafe, so the SDK no longer supports it. If your project calls any of these, delete those calls before updating, or it will no longer compile:
StartTakingNotesAsync()andStopTakingNotesAsync()ShouldRecordPlayTestNotesPlayTestNotesResponse,PlayTestNotesData,PlayTestProductIsTakingNotesResponseandPlayTestProductIsTakingNotesData
- Dev players no longer poll for an active notes session every 5 seconds, and recording always follows the remote-config sampling rate (or
alwaysModerate) rather than switching to continuous recording for notes.
Dev status itself is unchanged. ForgivePlayerAsync() still requires the calling player to be a dev. See Marking Players as Devs.
[0.16.8] - 2026-09-15
Fixed
- Audio moderation requests now send the correct
sourceandplatformvalues. The Opus upload was sending the C# object names instead of the API values, so audio events were not attributed tounity-sdk/ in-game. No code changes are needed on your side; update the package to pick up the fix.
[0.16.7] - 2026-09-02
Added
alwaysModerateflag onPlaySafeManager- Records every chance instead of following the remote-config sampling rate, for players or game modes that should be moderated 100% of the time. Exposed in the inspector as Always Moderate, so it can also be toggled while play-testing in the editor.- Read fresh on every tick, so setting it from game logic takes effect on the next tick with no restart needed.
- Still gated by your
CanRecorddelegate - it overrides sampling, not mute/consent/lobby state. - Only controls whether a new recording starts; it will not cut off a recording already in progress.
- Purely client-side. The flag is never sent to the backend.
[0.15.2] - 2026-07-16
Added
ForgivePlayerAsync()now automatically attributes the acting player on the resulting action log. The SDK readsUserIdandUserNamefromGetTelemetryand sends them asactionByPlayerUserIdandactionByPlayerUsername. The username is hashed server-side before being stored. This mirrors the attribution added toTakeManualActionOnPlayerAsync()in 0.15.0.
[0.15.0] - 2026-05-15
Added
TakeManualActionOnPlayerAsync()now automatically attributes the acting player on the resulting action log. The SDK readsUserIdandUserNamefromGetTelemetryand sends them asactionByPlayerUserIdandactionByPlayerUsername. The username is hashed server-side before being stored.TakeManualActionOnPlayerAsync()accepts an optionaltimeoutSecondsparameter (default15). The value is applied to the underlyingUnityWebRequest.timeout. Pass0to disable the client-side timeout.ApiRequestOptions.TimeoutSecondsfor settingUnityWebRequest.timeouton any request routed throughSendApiRequest(default15).
Server-side changes affecting SDK callers
- The
/manual-action/playerendpoint is now rate-limited at 12 requests per minute per IP. Callers exceeding the limit will receive a429response. This pairs with the new 15-second client-side timeout to make the endpoint robust against unresponsive clients and aggressive retries. - Request payload fields on
/manual-action/playerare now bounded. Requests will be rejected with a400if any of the following are exceeded:playerUserId,playerUsername,productActionId,actionByPlayerUserId,actionByPlayerUsername: max 255 charactersdescription: max 2000 charactersdurationInMinutes: integer between 1 and 525,600 (1 year)numberOfStrikes: integer between 0 and 100
[0.14.1] - 2026-05-08
Fixed
- Opus encoding no longer freezes the Unity main thread.
OpusEncoder.Encodeis pure managed C# (Concentus runs at ~40-50% of native libopus speed) and was running synchronously on the main thread. Encoding now runs on a thread-pool worker and the coroutine polls for completion, so frame ticks continue while audio is being encoded.
Changed
- The
OpusEncoderinstance is now cached and reused across encodes instead of being constructed per recording window, removing the SILK/CELT state and resampler setup cost from every encode. - Encoder complexity reduced from the default
10to5per Xiph's mobile-VOIP recommendation. - Per-encode allocations (packet buffer, output stream, tail frame) are now reused.
- Microphone capture and Opus encoding both run at 16 kHz, eliminating the in-encoder resampler.
Removed
- The deprecated WAV upload path (
AudioClipToFile,WriteWavHeader, and the relatedAudioClipconstruction step) has been removed now that the Opus path is verified across Unity client implementations.
[0.14.0] - 2026-05-06
Added
Transcriptfield on the audio moderation responseHasSpeechfield on the audio moderation responseConfidencefield on the audio moderation response
[0.13.1] - 2026-05-01
Fixed
GetProductActionsAsync()andTakeManualActionOnPlayerAsync()no longer require the caller to be a dev player. Both methods can now be called by any client.
[0.13.0] - 2026-04-20
Changed
- Audio uploads now use Opus encoding - Audio is encoded with Opus and sent to a dedicated moderation endpoint instead of the legacy WAV path
- Microphone recording now runs at 48kHz where supported, falling back to the device default with a warning otherwise
- WAV upload path is retained but deprecated and will be removed once the Opus path is verified across multiple Unity client implementations
Internal
- Added
PlaySafeOpusEncoderand bundled theConcentus2.2.2 dependency underRuntime/Plugins
[0.12.0] - 2026-03-25
Added
- Manual player actions - Added
TakeManualActionOnPlayerAsync()method for applying moderation actions on players directly from the game - Forgive player - Added
ForgivePlayerAsync()method for forgiving players and optionally resetting their strikes - Get product actions - Added
GetProductActionsAsync()method for retrieving available moderation actions that can be taken against players
Internal
- Added explicit platform and source attribution to
AppealBanAsync(),ReportUserAsync(),UnReportUserAsync(), and audio moderation requests - System language is now passed as the language used for moderation
[0.11.4]- 2026-03-05
Internal
- Added additional
nullcheck when stopping a recording, preventsAudioClipisnullerrors when trying to send audios for processing.
[0.11.3]- 2026-03-05
Added
ViolationTypefield toActionItem
[0.11.2]- 2026-02-23
Added
ViolationTypefield toActionLog
Fixed
- Issue with
ViolationTypebeing passed in asActionValue - Actually returning the
ActionValue, which corresponds to the product action value asActionValue
[0.11.1]- 2026-02-03
Added
- Internal: Added ability to share audio clip length when sending audio for processing.
In future this should allow for flexible audio length processing
[0.11.0] - 2026-02-02
Added
- Added
Idfield toActionLogtype. - Added
ActionFriendlyNamefield toActionLogtype. - Added
TriggersStrikefield toActionLogtype. - Added
Triggerfield toActionLogtype. - Added
Descriptionfield toActionLogtype. - Added
Transcriptfield toActionLogtype. - Added
DelayInSecondsfield toActionLogtype. - Added
CreatedAtfield toActionLogtype. - Added
UpdatedAtfield toActionLogtype.
These are all usable when using GetPlayerStatusAsync()
[0.10.0] - 2025-11-07
Breaking changes
- Renamed
OnActionEventtoOnPolicyViolationEventto represent its functionality more accurately.
[0.9.0] - 2025-11-07
Added
- Setup custom auth - Added
SetupCustomAuth()method for setting up custom authentication with PlaySafe.
[0.8.0] - 2025-10-28
Added
- Playtest note functionality - Added
StartTakingNotesAsync()andStopTakingNotesAsync()methods for recording and transcribing user sessions during playtesting - UnReportUserAsync() method - Added ability to undo user reports with async functionality
- Asset support in Sensei Polls - Added
AssetUrlandAssetTypeproperties to active Sensei poll responses for image support
Changed
- ReportUserAsync() method - Fixed async reporting functionality that was previously returning null
- Recording behavior during playtest notes - Removed recording intermission when taking playtest notes to enable continuous recording
Fixed
- PlaySafeManagerResponse file format - Corrected invalid file format issues
- Syntax errors - Fixed syntax errors in PlaySafeManager
[0.6.0] - 2025-10-03
Added
-
Ban appeal functionality - Players can now appeal bans through the PlaySafe system
- New
AppealBanAsync()method for submitting ban appeals programmatically - Optional appeal reason parameter for providing context
- Returns
BanAppealResponsewith appeal status and details - Updated documentation with details on how to use this functionality
- New
-
Image support in Sensei Polls - Studios can now add images to sensei polls These are accessible via the sensei poll through the
AssetUrlandAssetType(defaultimage) attributes
[0.5.3] - 2025-09-23
Changed
- [Internal]
PhotonVoiceCreatedfunction has been renamed toSetupPhotonVoice- This change prevents photon initialization from happening automatically when
- If building using
Photonthe client will need to callSetupPhotonVoicein thePhotonVoiceCreatedevent handler in your game's Photon integration.
[0.5.2] - 2025-09-04
Fixed
- Username backwards compatibility by making the
Usernamefield optional inGetTelemetry()`
[0.5.1] - 2025-09-03
Added
- [Internal] Session pulse logic to send pulses that determine whether a client still has an active session
- The goal of this is to make session timing logic more accurate than the previous case where session time was incorrectly calculated
No changes needed at an integration level
- The goal of this is to make session timing logic more accurate than the previous case where session time was incorrectly calculated
Removed
- [Internal] manual start session logic
- [Internal] manual start session logic
No changes needed at an integration level
[0.5.0] - 2025-08-29
Added
- OnPlaySafeInitialized callback - New callback event triggered when PlaySafeManager is successfully initialized
- Allows developers to respond to initialization completion
- Demonstrated in updated
PlaySafeDemoIntegration.csandPlaySafeNormcoreDemoIntegration.cs
Changed
- SendTextForAnalysisCoroutine visibility - Method is now public, allowing direct text analysis calls from game clients
[0.4.2] - 2025-08-29
Changed
- SendTextForAnalysisCoroutine made public - Developers can now directly send text for moderation analysis
[0.4.1] - 2025-08-27
Added
- GetPlayerPollVotesAsync() method - New async method to retrieve a specific player's votes for a poll
- Returns
SenseiPlayerPollVotesResponsewith player's voting history - Includes vote details with timestamps and responses
- Returns
- Text moderation support - Added
SendTextForAnalysisCoroutine()for analyzing text content - Enhanced data structures - Added
SenseiPlayerPollVoteandSenseiPlayerPollVotesResponseclasses
Changed
- Improved response data structure - Refactored
SenseiPollCastVoteResponseValuetoSenseiPollVoteResponsefor consistency
[0.4.0] - 2025-08-18
Changed
- BREAKING: Session management simplified -
TryStartSession()andTryEndSession()methods no longer requireplayerUserIdparameter, automatically uses current player from telemetry - Username support in telemetry - Added
UserNamefield toAudioEventRequestDatafor better player identification in dashboard
Added
- Enhanced session management - Session requests now include both
playerUserIdandplayerUserNamefor improved tracking
Documentation
- Updated demo integration examples to show proper usage of new session management methods
- Added explanations for username field usage in telemetry data
[0.3.2] - 2025-08-15
Added
- Normcore integration support - Added PlaySafeNormcoreDemoIntegration.cs for Normcore networking framework
- Improved namespace organization - Wrapped PlaySafeManagerResponse with DL.PlaySafe namespace for better code organization
Fixed
- Compilation safety - Added compile-time checks for Normcore existence to prevent build errors
[0.3.1] - 2025-08-06
Fixed
- Unity 2021 support has been restored
Added
- Added Normcore demo integration file
- Updated Normcore integration docs
[0.3.0] - 2025-07-16
Changed
- BREAKING: GetPlayerStatusAsync() simplified - Method no longer requires
playerUserIdparameter, automatically uses current player from telemetry
Added
- Enhanced demo integration examples - Added comprehensive async function examples in PlaySafeDemoIntegration.cs
- Player status retrieval example with
GetPlayerStatusAsync() - Sensei poll management examples including
GetActivePollAsync(),CastVoteAsync(), andGetPollResultsAsync()
- Player status retrieval example with
Documentation
- Updated demo integration file with additional examples on how to use various async functions
- Added inline comments explaining async function consumption in game clients
[0.2.4] - 2025-07-15
Added
- Async player status endpoints
- UTC server time support
- Log level support for better debugging
- Focus checks only in build mode (improved development experience)
- Clearer logging messages for better debugging
Fixed
- Converted all Sensei IEnumerator functions to async tasks that are now consumable by your game client.
- Updated poll API endpoints and response structure
[0.2.3] - 2025-06-19
Added
- Enhanced player status async functionality
- Author name updated to "PlaySafe AI"
Performance Improvements
- Improved frame distribution for better performance
- Performance optimizations for package manifest updates
[0.2.2] - 2025-06-19
Performance Improvements
- Audio processing boost for better client side performance
[0.2.1] - 2025-06-19
Added
- Smart sampling feature - Intelligent sampling of audio
- This is integrated into the PlaySafe dashboard and allows you to monitor newer players & repeat offenders more than the larger player base
- Player user ID in AI config requests for better personalization
Fixed
- Editor spam when swapping recording
- Stop recording players when they are muted
[0.2.0] - 2025-06-19
Added
- Enhanced audio recording controls
Fixed
- Recording audio when muted - Players are now properly stopped from recording when muted
[0.1.9] - 2025-06-19
Added
- Console feedback when PlaySafe is running for better developer experience
[0.1.8] - 2025-06-19
Fixed
- Renamed PlaySafeDemoIntegration to match file name for consistency
[0.1.7] - 2025-06-19
Fixed
- Restored PlaySafe asmdef files that were accidentally removed
[0.1.6] - 2025-06-19
Added
- Threading safety improvements
Fixed
- PhotonPlaySafe functionality - Fixed critical issue where Photon integration was not working
- Removed buffer locks & permissions code that couldn't be called off main thread
- Added safety checks and removed coroutine safety temporarily
[0.1.5] - 2025-04-01
Added
- Audio silence threshold - Configurable threshold for audio detection
- Updated PlaySafe base URL for improved connectivity
[0.1.4] - 2025-03-26
Fixed
- Race conditions in session management - Fixed critical timing issues when starting sessions
[0.1.3] - 2025-03-26
Added
- Photon networking support - Full integration with Photon for multiplayer games
- Get player status endpoint - New API endpoint to retrieve player status
- Ban exploit protection - Fixed system ban time-based exploit
Security
- Enhanced ban system to prevent time-based exploits
[0.1.1] - 2025-03-19
Added
- Multilingual support - Added system language detection for Unity SDK
- Improved internationalization capabilities
Changed
- Updated Unity project structure
[0.1.0] - 2025-03-19
Added
- Initial PlaySafe Unity SDK release
- AI-powered moderation suite for video games
- Character intelligence capabilities
- Session management system
- Unity 2021.3 compatibility
- Complete documentation and licensing structure
Features
- Core AI moderation functionality
- Real-time content analysis
- Player behavior monitoring
- Seamless Unity integration
- Comprehensive API integration
Platform Support
- Unity 2021.3 and later
- Cross-platform compatibility