brainCloud 4.15 is live!

Okay – we said that 4.14 was the last release before 5.X – but it turns out that there are enough under-the-hood changes happening that we feel it is best to separate the launch into two releases.

The good news is that we are making Portal-X available to all users with this release! (see details below).


Although 4.15 doesn’t have a lot of API changes – it does have an enormous amount of under-the-hood changes – including:

Upgrade from Java 8Java 11
MongoDB Atlas 5.X support
Updates to Spring, Karaf, Camel, & Vert.x frameworks and other libraries
Refactoring of Redis connections across the board
Migration to standardized apiserver images
Removal of our legacy portal SSO ← mostly affects private brainCloud deployments
Misc security and performance improvements

The release has been heavily tested (including several canary traffic tests) – but if you notice anything amiss – please report it ASAP! We will jump on it right away!

Release Highlights


Portal-X is now enabled for all users!

See the Portal Changes section for more info!

Returning Friend Platforms

The Friend Service’s ListFriends() call now returns a list of the friend platforms that each friend was found on – which helps to optimize certain usage scenarios.

Archive Deleted Accounts

When we introduced our Auto-Delete service (i.e. Dormant Account Deletion) – we added a feature to keep a temporary archive of a user’s account. We later expanded this feature – so that user accounts that were deleted programmatically were also archived if this feature was enabled.

In brainCloud 4.15 we are officially promoting this functionality into a separate Archive Account feature – so that apps can enable archiving of accounts-to-be-deleted – even if the app is not using the Auto-Delete service.

You will find the new feature under Design | Core App Info | Archive Settings in the portal.

Note that the settings for this feature are not updated or overwritten during deploys. This allows an app to have separate archive settings on a per app-instance basis.

Also note that – because this feature uses Custom Entities – it is limited to apps on Plus or Bulk+ plans.

Custom Entity “Explain” Support

Developers are now able to access Atlas “explain” information for Custom Entity GetPage() queries – via the API Explorer ONLY!

This can be useful when evaluating whether your indexes are sufficient to cover specific queries. The explain results can tell you what indexes Atlas will utilize for the query – and stats on the resulting query performance.

To request the explain data for a GetEntityPage() query – simply supply an “options” section with the desired “explain” level. For example:

The following 3 levels are supported:

  • QUERY_PLANNER – MongoDB runs the query optimizer to choose the winning plan for the operation under evaluation – and returns the queryPlanner information for the evaluated method.
  • EXECUTION_STATS – MongoDB runs the query optimizer to choose the winning plan, executes the winning plan to completion, and returns statistics describing the execution of the winning plan
  • ALL_PLANS_EXECUTION – MongoDB runs the query optimizer to choose the winning plan and executes the winning plan to completion. In “allPlansExecution” mode, MongoDB returns statistics describing the execution of the winning plan as well as statistics for the other candidate plans captured during plan selection.

The explain results are returned in a map named explain under the data section of the results JSON.

For more information on Explain and the results returned – see this MongoDB page – db.collection.explain()

Client Library Improvements

There aren’t a ton of new API calls in 4.15 – but there are some important improvements to the client libs themselves – so be sure to grab them!

  • C++ / Objective-C / Swift Library
    • RelayComms: Fix for tracking latest packetIds of ordered packets when joining an in-progress game session (BCLOUD-4584)
  • Unity Library
    • RelayComms: Fix for tracking latest packetIds of ordered packets when joining an in-progress game session (BCLOUD-4584)
    • Remember – our Unity Library is now available via Unity Package Manager for easy updates!
  • Unreal Engine
    • Migrated websockets to use Unreal’s IWebSocket for greater cross-platform compatibility (including Xbox!).
      • Note – IWebSocket is considerably less performant than the previous libwebsocket implementation. As such, we do not recommend using WebSocket for real-time RelayServer communications – use UDP instead.
      • Update – there is a configuration fix to improve IWebSocket performance – check the library source readme!
    • RelayComms: Fix for tracking latest packetIds of ordered packets when joining an in-progress game session (BCLOUD-4584)
  • Java
    • RelayComms: Fix for tracking latest packetIds of ordered packets when joining an in-progress game session (BCLOUD-4584)
    • Our Java libs are now published on Maven in 3 packages: braincloud-java, braincloud-java-android and brainclouds2s
    • S2S library improvements
      • Added standardized log message format (now includes timestamps at ms level)
      • Fixed bug where a failed request would cause future requests to be ignored
      • Fixed bug where an error in the message callback would cause future requests to be ignored
      • Fixed bug where server response would be parsed as json even when no json would be available
      • Improved error responses to more accurately reflect what actually failed
  • JavaScript
    • Improved packetId handling and unit tests

Portal Changes

Portal-X is now available to all users!

Our legacy portal is still the default for 4.15 – but Portal-X is available as an alternate UI for everyone. Here is how to access it:

Launching Portal-X

After logging into the legacy portal, just click on your user image in the top-right hand corner, and click Open Portal-X to try out our new Portal. You can also navigate to it directly via

You can switch back to the legacy portal at any time by clicking Switch to Legacy View from the top-right menu – or by navigating to

Portal-X Menus

One of the biggest changes to Portal-X is in the area of navigation.

In Portal-X, we have collapsed (and expanded) the main menus to a single left-hand menu system. You first switch between the Team and App menus via the tabs at the top. From there, the main sections are:

  • Design ← this is the old Design menu, much as it was in legacy portal
  • Global ← this is the old Monitoring | Global Monitoring menu
  • Groups ← this is the old Monitoring | Group Monitoring menu
  • Users ← this is the old Monitoring | User Monitoring menu
  • Reports ← this is the old Reports menu, largely unchanged

To aid in navigation – we have added fly-outs to the app menus. Click on a fly-out to expand it and quickly view all of its sub-menus!


Portal-X features improved Team and App Dashboards – providing more information at a glance!

The smart search bar at the top of the screen allows you to quickly search across the system for apps, users, screens and more!


Click the star in the breadcrumb menu to add a screen to your favorites list. Clicking Favorites from the menu shows you your list – plus the most recent screens you have visited.

Dark Mode

You can toggle between Light/Dark Themes via the right-hand menu (click on your profile pic in the top-right corner)

Getting Help!

Click the :question_mark: icon to display a list of help resources – or click the chat bubble next to it to talk to Support!

More Portal-X Features

Be sure to check out these additional Portal-X features:

  • Brand new multi-pane Script Editor with Intellisense!
  • New API Explorer with RTT support!
  • New User Browser with more ways to look up users
  • New Profile screen gives a deeper overview of brainCloud resource utilization for your app
  • New Script Usage screen makes it easier to assess, prioritize and track script optimizations over time

API Changes

There are very few API changes in this release:

  • Friend Service
    • ListFriends() – now returns the platforms that a friend was discovered upon as part of the results
  • HTTPClient
    • New PostTextResponseJson() – call fills in this missing usage scenario
    • General – a default accept header is now added to all calls to improve overall compatibility. This new behaviour is disabled by the new compatibility flag – which is enabled by default for existing apps: [x] Do not add default response media type accept header for responses (can interfere with request signatures if apps are not aware)

Miscellaneous Changes / Fixes

  • Updated libraries
    • All libraries have been updated with the latest API enhancements. Go get ’em!
  • Documentation updates
    • The Learn More help pages have largely been updated for Portal-X – though additional updates are still in progress
  • Important Fixes
    • BCLOUD-26 Modify RTT event server to use session-based S2S calls
    • BCLOUD-1308 Add Custom Entity API support for explain() for paging queries
    • BCLOUD-3253 Move to Camel 3.11.7 (from 2.25.4)
    • BCLOUD-3436 Add more checking to Ultra Identity Validator
    • BCLOUD-3697 Review use of IGameDao getAllGames() and optimize where possible (especially if only gameId required)
    • BCLOUD-4182 Audit log paged read requests should only returns logs for apps non-admin team member has access to
    • BCLOUD-4294 Tighten up PSN service type with an enum and server side validation <- I think this might have been released in 4.14, but didn’t make it into release notes?
    • BCLOUD-4370 Further work on segregating redis connections
    • BCLOUD-4371 Retire the old spring oauth support to get rid of deprecation warnings and possible security vulnerabilities ← need to change prod-baas before traffic test
    • BCLOUD-4372 Retire jets3t component as it is no longer required and has not been updated since 2015
    • BCLOUD-4545 Implement super property caching for Client API Dispatcher
    • BCLOUD-4557 Add trackable New Relic events (errors?) for Portal Login failures
    • BCLOUD-4563 Look for blank gameId as well as null in checking logic in the S2S dispatcher
    • BCLOUD-4575 Marketplace – Products fail to load AND globalApp PRELOAD fails if BAD defaultPriceId — need to use readMultipleRobust DAO method to skip products that fail on deserialize
    • BCLOUD-4700 Fix for NPE in Global Monitoring->S2SLogs
    • BCLOUD-4701 User should not be able to delete currency when it is added to Item Catalog
    • BCLOUD-4751 Convert DeferredMessage processing to Newer DeferredCallback mechanism (includes OneWayMatch)
    • BCLOUD-4769 Orphan Room Server instances are not being terminated
    • BCLOUD-4777 New sysMetrics collection to collect nightly global (and some app) collections totals
    • BCLOUD-4780 New server endpoint to delete “INVITED”, “REQUESTED” users in groups screen
    • BCLOUD-4784 Update libraries identified in docker hub vulnerability report (snakeyaml, commons-collections, google auth client (1.33.3), spring (5.1.X->5.3.27), jason-smart (1.3.3->1.5), commons-fileupload(1.3.3->1.5))
    • BCLOUD-4785 Update Redisson library to 3.15.6 -> 3.16.8
    • BCLOUD-4791 NPE from AnalyticsEventConsumer process
    • BCLOUD-4799 Remove DeferredMessage karaf component and core service as it is obsolete
    • BCLOUD-4800 Implement a “system” RTT connection for non-player RTT interactions
    • BCLOUD-4804 Evs healthcheck now returns non-200 status code if connectivity is lost with RTTManager or S2S server
    • BCLOUD-4806 Server changes to move to MongoDB 5
    • BCLOUD-4818 Make SEDA queue sizes configurable via brainCloud property
    • BCLOUD-4826 Update vertx version from 4.2.1 to 4.2.7
    • BCLOUD-4834 Improve some less efficient queries (including queries that don’t require collections to be checked / created)
    • BCLOUD-4835 Create a start/poll version of direct api call method used by API explorer
    • BCLOUD-4836 Support audit logging from purge project and log team update for unlinking app from team for Auto Hard Deletion processing (excluding before and after snapshots)
    • BCLOUD-4851 Configurable security checking of packetId -1 (being used for deferred message handling)
    • BCLOUD-4852 Event server doesn’t handle failed S2S calls very well with new session-based S2S client
    • BCLOUD-4853 Added friendPlatforms to FriendService->ListFriends call
    • BCLOUD-4854 Make S2S local dispatcher asynchronous
    • BCLOUD-4862 Add Http client method postTextResponseJson
    • BCLOUD-4873 Improve bc-tools support for argo-rollouts
    • BCLOUD-4874 NPE when saving unset PSN integration
    • BCLOUD-4880 Getting ClassNotFoundException with memcache locks in karaf
    • BCLOUD-4851 Configurable security checking of packetId -1 (being used for deferred message handling)
    • BCLOUD-4872 Add server support for updating of a players “createdAt” timestamp from portal
    • BCLOUD-4890 Legacy Portal – Support auto redirect to Portal-X when hitting the “/login” JSP.
    • BCLOUD-4915 Remove @Required annotations from server classes and do applicable clean up of imports
    • BCLOUD-4916 Breakup existing LogProducer class into a log producer for api servers and one for everybody else
    • BCLOUD-4966 Provide support to make S2S Explorer session based similar to API Explorer
    • BCLOUD-4970 Need more Dowloader stats to better report errors – add gameId and profileId to new relic transactions
    • BCLOUD-4979 Change audit log for Quests to include serialized Tasks data
    • BCLOUD-5010 Update deprecated Nimbus JWT support – affects auths – Apple, FacebookLimited, GoogleOpenId, Ultra, PSN4/5, Nintendo
    • BCLOUD-5018 Update deprecated code for braincloud-camel-sqs component
    • BCLOUD-5020 Update Spring ExposablePropertyPlaceholderConfigurer based on deprecated PropertyPlaceholderConfigurer
    • BCLOUD-5022 Updated deprecated JsonParser reference
    • BCLOUD-5023 Update Microsoft client to use non-deprecated security and reflection mechanisms <– NOTE – test by verifying Microsoft store receipt! (probably cannot do!)
    • BCLOUD-5024 Update Saml service to use non-deprecated auth method
    • BCLOUD-5032 A couple more misc deprecation updates – CustomOidcUserService & FacebookCreditService <- test with Forum Login and Facebook purchase
    • BCLOUD-5039 Server build script does not recognize failures properly
    • BCLOUD-5043 Added support for Google Analytics 4
    • BCLOUD-5051 Fix camel http client code that the camel 3 update broke
    • BCLOUD-5054 Standardize apiserver images ← ensure deployment dir is ready for this
    • BCLOUD-5061 More direct error reporting when webhook output is wrong
    • BCLOUD-5063 Remove activemq/sqs replacement classes
    • BCLOUD-5073 When scheduling a script inside another script, the client wants the scriptData shown inside the Context of error log
    • BCLOUD-5081 Provide support to make S2S Explorer session based similar to API Explorer
    • BCLOUD-5082 Assign unique session ids to webhook calls
    • BCLOUD-5083 [Portal-X, Legacy] Design | Servers | My Servers – When user change Server Type from ‘Custom Server’ to ‘Relay Server (hosted)’ or ‘Room Server (hosted)’ an error message display
    • BCLOUD-5115 Make Oauth client auth method configurable
    • BCLOUD-5123 System metrics indexes
  • Plus miscellaneous fixes and performance enhancements…