User Reporting Plugin
As described in
VRC.Content.3, all apps with user-generated content (including synchronous or asynchronous multiplayer environments) must have a form for users to notify you about user conduct and user generated content in the application that does not adhere to Meta’s
Code of Conduct for Virtual Experiences. Examples of asynchronous multi-user environments include:
- Apps that display usernames on leaderboards
- Apps that allow users to upload their own in-app creations for other users to view
After setting up the user reporting plugin, you can also customize the
user reporting service as a backup reporting tool for your app. This means that even if your plugin isn’t fully operational, your users maintain access to a reporting method. Apps devoid of user interaction elements, such as single-player games or fitness applications without leaderboards, are not subject to this VRC.
Note: The reporting button is only available to users if your app supports multiplayer or co-op game modes. You can review and update your game modes in the
Developer Dashboard, located under
App Submissions →
App Metadata →
Specs.

The user reporting plugin connects existing reporting flows in your app to the

button. Once you connect your existing flow to this plugin, users can access your reporting flow by pressing the

button and clicking the
Report button in the universal menu.
Setting up roles and permissions
If you are an admin or have
Manage App and
Platform Services permissions, skip to
the next section. If not, follow these guidelines to establish a user reporting role and assign the necessary permissions for utilizing the user reporting plugin:
- Open your browser and navigate to the Developer Dashboard.
- If you’re in the App Manager view, expand the dropdown list of your apps, and click View All to open the Org Manager.
- From the Org Manager view, click Members in the left-side navigation.

- Click Create Role.
- Assign a name to the role and provide an optional description. You also have the option to limit access to specific apps in your organization by opting for App Constraints.

- From Permissions click App to view the list of app-specific organization permissions.
- From the list, choose both Manage App and Platform Services.

- For Members click + Add New to add the members of your organization who will use the user reporting service for the apps this role specifies.
- When you’re done adding permissions, click Create.
Note: All organization members with the Platform Services permission will have access to view and use the Platform Services page for your organization.
Setting up the user reporting plugin
Before integrating with the
Oculus Platform SDK, you must activate the user reporting plugin. Follow these steps to activate the user reporting plugin:
- Open your browser and navigate to the Developer Dashboard.
- Click My Apps from the left-side navigation and choose the app that you want to pair the user reporting service with.
- Click Platform Services in the left-side navigation and click Add Service under User Reporting.
- Click Get Started to begin customizing the user reporting service for this app.

- On the Customize User Reporting page, choose Use Reporting Plugin from the primary reporting tool dropdown at the top of the page.
- Click Activate to enable the user reporting plugin.
After activating the user reporting plugin, you can begin integrating with the feature in the Platform SDK. The following implementation details are for
Unity or
native development. while support for Unreal Engine is available, the specific technical implementation is currently in progress.
Unity implementation of the user reporting plugin After a user initiates the reporting flow, a notification is sent to your application and a timer of less than 3 seconds begins. This timer checks for a developer response to be returned following the receipt of the initial report notification.
You must respond to this report notification by displaying your in-app reporting flow and using AbuseReport.ReportRequestHandled
to notify the platform that you have handled the notification.
Your app startup path must contain the following register for the report notification from the pause menu:
/**
* Listen for when user clicks AUI report button
*/
AbuseReport.SetReportButtonPressedNotificationCallback(<insert callback function here>);
When users press the Report button, it invokes the callback function you pass in as a parameter to this function, which fires when the user presses the report button.
Once the notification has been fired, you must send a request to the Platform SDK notifying the platform how you plan to handle the notification.
Use AbuseReport.ReportRequestHandled
with either Handled
or Unhandled
.
Returning Handled
indicates that your in-app reporting flow has launched the user reporting plugin and will handle the report flow initialized by the user.
// Notify that you are handling the request and dismiss the AUI
AbuseReport.ReportRequestHandled(ReportRequestResponse.Handled);
Returning Unhandled
will notify the user to reach out to the developer directly to file their abuse report.
// Notify that you are not handling the report request, dismiss the AUI
AbuseReport.ReportRequestHandled(ReportRequestResponse.Unhandled);
AbuseReport.SetReportButtonPressedNotificationCallback
notifies you that your report flow should be displayed. This function asynchronously notifies that the report view has been requested and sets a timer (<3 seconds) to respond to the request. It also notifies the user to reach out to the developer if True
isn’t returned or if False
is returned.
User reporting plugin example (Unity) The following is an example of the user reporting plugin flow including AbuseReport.ReportRequestHandled
and AbuseReport.SetReportButtonPressedNotificationCallback:
using System;
using Oculus.Platform;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
public class ReportingCallbackSample : MonoBehaviour
{
// Start is called before the first frame update
void Start()
{
Core.AsyncInitialize().OnComplete(message => {
if (!message.IsError)
{
/**
* Listen for when user clicks AUI report button
*/
AbuseReport.SetReportButtonPressedNotificationCallback(OnReportButtonIntentNotif);
}
});
}
// User has interacted with the AUI outside this app
void OnReportButtonIntentNotif(Message<string> message)
{
if (!message.IsError)
{
// Show in-app report flow here
// Inform SDK that you've handled the request
AbuseReport.ReportRequestHandled(ReportRequestResponse.Handled);
}
}
When returning Unhandled
for AbuseReport.ReportRequestHandled
, or if no response is received before the response timer expires (<3 seconds) a message informing the user to contact the developer directly is displayed.
Returning Unhandled
for AbuseReport.ReportRequestHandled
allows you to respond to a user indicating why a report in the current state of the app does not make sense. This includes instances such as reports initiated during tutorials or loading screens.
Native implementation of the user reporting plugin Next, set up the message queue polling. For more information on how the message system works, visit
Requests and Messages. We recommend that you check the queue every frame for new messages and notifications. The user reporting plugin leverages this queue by appending the
ovrMessage_Notification_AbuseReport_ReportButtonPressed
message to the queue when a user presses the
Report Abuse button.
After a user initiates the reporting flow, the ovrMessage_Notification_AbuseReport_ReportButtonPressed
message is sent to the queue and a timer of less than 3 seconds begins. This timer checks for a developer response to be returned following the receipt of the initial report notification.
You must respond to this report notification by displaying your in-app reporting flow and using ovr_AbuseReport_ReportRequestHandled(ovrReportRequestResponse_Handled)
to notify the platform that you have handled the notification.
Once the notification has been fired, you’ll have to send a request to the Platform SDK notifying the platform of how you plan to handle the notification. To do so, call ovr_AbuseReport_ReportRequestHandled()
with either ovrReportRequestResponse_Handled
or ovrReportRequestResponse_Unhandled
.
Returning ovrReportRequestResponse_Handled
indicates that your in-app reporting flow has launched the user reporting plugin and will handle the report flow initiated by the user.
// Notify that you are handling the request and dismiss the AUI
ovr_AbuseReport_ReportRequestHandled(ovrReportRequestResponse_Handled);
Returning ovrReportRequestResponse_Unhandled
will notify the user to reach out to the developer directly to file their abuse report.
// Notify that you are not handling the report request, dismiss the AUI
ovr_AbuseReport_ReportRequestHandled(ovrReportRequestResponse_Unhandled);
User reporting plugin example (Native) The following is an example of the user reporting plugin flow:
ovrMessageHandle message = nullptr;
while ((message = ovr_PopMessage()) != nullptr)
{
switch (ovr_Message_GetType(message))
{
case ovrMessage_Entitlement_GetIsViewerEntitled:
if (!ovr_Message_IsError(message))
{
// User is entitled. Continue with normal game behaviour
}
else
{
// User is NOT entitled. Exit
}
break;
case ovrMessage_Notification_AbuseReport_ReportButtonPressed:
if (!ovr_Message_IsError(message))
{
// Show in-app report flow here
// Inform SDK that you’ve handled the request
ovr_AbuseReport_ReportRequestHandled(ovrReportRequestResponse_Handled);
}
break;
default:
break;
}
}
When returning ovrReportRequestResponse_Unhandled
, a message informing the user to contact the developer directly displays.
Returning Unhandled
for ovr_AbuseReport_ReportRequestHandled
allows you to respond to a user indicating why a report in the current state of the app does not make sense. This includes instances such as reports initiated during tutorials or loading screens.
For more information, see the following resources: