diff --git src/bp-activity/classes/class-bp-activity-component.php src/bp-activity/classes/class-bp-activity-component.php
index a362a358c..74b81c7b6 100644
--- src/bp-activity/classes/class-bp-activity-component.php
+++ src/bp-activity/classes/class-bp-activity-component.php
@@ -461,11 +461,11 @@ class BP_Activity_Component extends BP_Component {
 	 * Init the BP REST API.
 	 *
 	 * @since 5.0.0
+	 *
+	 * @param array $controllers Optional. See BP_Component::rest_api_init() for
+	 *                           description.
 	 */
-	public function rest_api_init() {
-		$controller = new BP_REST_Activity_Endpoint();
-		$controller->register_routes();
-
-		parent::rest_api_init();
+	public function rest_api_init( $controllers = array() ) {
+		parent::rest_api_init( array( 'BP_REST_Activity_Endpoint' ) );
 	}
 }
diff --git src/bp-core/classes/class-bp-component.php src/bp-core/classes/class-bp-component.php
index 7bed39f9e..9bcddd1cb 100644
--- src/bp-core/classes/class-bp-component.php
+++ src/bp-core/classes/class-bp-component.php
@@ -867,8 +867,35 @@ class BP_Component {
 	 * Init the BP REST API.
 	 *
 	 * @since 5.0.0
-	 */
-	public function rest_api_init() {
+	 *
+	 * @param array $controllers The list of BP REST controllers to load.
+	 */
+	public function rest_api_init( $controllers = array() ) {
+		if ( is_array( $controllers ) && $controllers ) {
+			// Built-in controllers.
+			$_controllers = $controllers;
+
+			/**
+			 * Use this filter to disable all or some REST API controllers
+			 * for the component.
+			 *
+			 * This is a dynamic hook that is based on the component string ID.
+			 *
+			 * @since 5.0.0
+			 *
+			 * @param array $controllers The list of BP REST API controllers to load.
+			 */
+			$controllers = (array) apply_filters( 'bp_' . $this->id . '_rest_api_controllers', $controllers );
+
+			foreach( $controllers as $controller ) {
+				if ( ! in_array( $controller, $_controllers, true ) ) {
+					continue;
+				}
+
+				$component_controller = new $controller;
+				$component_controller->register_routes();
+			}
+		}
 
 		/**
 		 * Fires in the rest_api_init method inside BP_Component.
diff --git src/bp-groups/classes/class-bp-groups-component.php src/bp-groups/classes/class-bp-groups-component.php
index 296c4833a..b53835ea0 100644
--- src/bp-groups/classes/class-bp-groups-component.php
+++ src/bp-groups/classes/class-bp-groups-component.php
@@ -927,23 +927,17 @@ class BP_Groups_Component extends BP_Component {
 	 * Init the BP REST API.
 	 *
 	 * @since 5.0.0
+	 *
+	 * @param array $controllers Optional. See BP_Component::rest_api_init() for
+	 *                           description.
 	 */
-	public function rest_api_init() {
-		$controller = new BP_REST_Groups_Endpoint();
-		$controller->register_routes();
-
-		$controller = new BP_REST_Group_Membership_Endpoint();
-		$controller->register_routes();
-
-		$controller = new BP_REST_Group_Invites_Endpoint();
-		$controller->register_routes();
-
-		$controller = new BP_REST_Group_Membership_Request_Endpoint();
-		$controller->register_routes();
-
-		$controller = new BP_REST_Attachments_Group_Avatar_Endpoint();
-		$controller->register_routes();
-
-		parent::rest_api_init();
+	public function rest_api_init( $controllers = array() ) {
+		parent::rest_api_init( array(
+			'BP_REST_Groups_Endpoint',
+			'BP_REST_Group_Membership_Endpoint',
+			'BP_REST_Group_Invites_Endpoint',
+			'BP_REST_Group_Membership_Request_Endpoint',
+			'BP_REST_Attachments_Group_Avatar_Endpoint',
+		) );
 	}
 }
diff --git src/bp-members/classes/class-bp-members-component.php src/bp-members/classes/class-bp-members-component.php
index 4b1647976..a83344feb 100644
--- src/bp-members/classes/class-bp-members-component.php
+++ src/bp-members/classes/class-bp-members-component.php
@@ -461,21 +461,19 @@ class BP_Members_Component extends BP_Component {
 	 * Init the BP REST API.
 	 *
 	 * @since 5.0.0
+	 *
+	 * @param array $controllers Optional. See BP_Component::rest_api_init() for
+	 *                           description.
 	 */
-	public function rest_api_init() {
-		/**
-		 * As the Members component is always loaded,
-		 * let's register the Components endpoint here.
-		 */
-		$controller = new BP_REST_Components_Endpoint();
-		$controller->register_routes();
-
-		$controller = new BP_REST_Members_Endpoint();
-		$controller->register_routes();
-
-		$controller = new BP_REST_Attachments_Member_Avatar_Endpoint();
-		$controller->register_routes();
-
-		parent::rest_api_init();
+	public function rest_api_init( $controllers = array() ) {
+		parent::rest_api_init( array(
+			/**
+			 * As the Members component is always loaded,
+			 * let's register the Components endpoint here.
+			 */
+			'BP_REST_Components_Endpoint',
+			'BP_REST_Members_Endpoint',
+			'BP_REST_Attachments_Member_Avatar_Endpoint',
+		) );
 	}
 }
diff --git src/bp-messages/classes/class-bp-messages-component.php src/bp-messages/classes/class-bp-messages-component.php
index 3062d5c5d..1904bd98c 100644
--- src/bp-messages/classes/class-bp-messages-component.php
+++ src/bp-messages/classes/class-bp-messages-component.php
@@ -438,11 +438,11 @@ class BP_Messages_Component extends BP_Component {
 	 * Init the BP REST API.
 	 *
 	 * @since 5.0.0
+	 *
+	 * @param array $controllers Optional. See BP_Component::rest_api_init() for
+	 *                           description.
 	 */
-	public function rest_api_init() {
-		$controller = new BP_REST_Messages_Endpoint();
-		$controller->register_routes();
-
-		parent::rest_api_init();
+	public function rest_api_init( $controllers = array() ) {
+		parent::rest_api_init( array( 'BP_REST_Messages_Endpoint' ) );
 	}
 }
diff --git src/bp-notifications/classes/class-bp-notifications-component.php src/bp-notifications/classes/class-bp-notifications-component.php
index 2eaaba415..4333d8b30 100644
--- src/bp-notifications/classes/class-bp-notifications-component.php
+++ src/bp-notifications/classes/class-bp-notifications-component.php
@@ -320,11 +320,11 @@ class BP_Notifications_Component extends BP_Component {
 	 * Init the BP REST API.
 	 *
 	 * @since 5.0.0
+	 *
+	 * @param array $controllers Optional. See BP_Component::rest_api_init() for
+	 *                           description.
 	 */
-	public function rest_api_init() {
-		$controller = new BP_REST_Notifications_Endpoint();
-		$controller->register_routes();
-
-		parent::rest_api_init();
+	public function rest_api_init( $controllers = array() ) {
+		parent::rest_api_init( array( 'BP_REST_Notifications_Endpoint' ) );
 	}
 }
diff --git src/bp-xprofile/classes/class-bp-xprofile-component.php src/bp-xprofile/classes/class-bp-xprofile-component.php
index 3ade404aa..b43879d34 100644
--- src/bp-xprofile/classes/class-bp-xprofile-component.php
+++ src/bp-xprofile/classes/class-bp-xprofile-component.php
@@ -494,17 +494,15 @@ class BP_XProfile_Component extends BP_Component {
 	 * Init the BP REST API.
 	 *
 	 * @since 5.0.0
+	 *
+	 * @param array $controllers Optional. See BP_Component::rest_api_init() for
+	 *                           description.
 	 */
-	public function rest_api_init() {
-		$controller = new BP_REST_XProfile_Fields_Endpoint();
-		$controller->register_routes();
-
-		$controller = new BP_REST_XProfile_Field_Groups_Endpoint();
-		$controller->register_routes();
-
-		$controller = new BP_REST_XProfile_Data_Endpoint();
-		$controller->register_routes();
-
-		parent::rest_api_init();
+	public function rest_api_init( $controllers = array() ) {
+		parent::rest_api_init( array(
+			'BP_REST_XProfile_Fields_Endpoint',
+			'BP_REST_XProfile_Field_Groups_Endpoint',
+			'BP_REST_XProfile_Data_Endpoint',
+		) );
 	}
 }
diff --git tests/phpunit/assets/bp-rest-api-controllers.php tests/phpunit/assets/bp-rest-api-controllers.php
new file mode 100644
index 000000000..63d77f923
--- /dev/null
+++ tests/phpunit/assets/bp-rest-api-controllers.php
@@ -0,0 +1,54 @@
+<?php
+/**
+ * BP REST Controllers' mocks
+ */
+
+class BP_REST_Mock_Class {
+	public function __construct() {}
+
+	public function register_routes( $controller = '' ) {
+		array_push( buddypress()->unit_test_rest->controllers, $controller );
+	}
+}
+
+/**
+ * BP Member Avatar REST Controller's mock.
+ */
+class BP_REST_Attachments_Member_Avatar_Endpoint extends BP_REST_Mock_Class {
+	public function __construct() {
+		$this->namespace = bp_rest_namespace() . '/' . bp_rest_version();
+		$this->rest_base = 'members';
+    }
+
+    public function register_routes( $controller = '' ) {
+		parent::register_routes( 'BP_REST_Attachments_Member_Avatar_Endpoint' );
+	}
+}
+
+/**
+ * BP Components REST Controller's mock.
+ */
+class BP_REST_Components_Endpoint extends BP_REST_Mock_Class {
+	public function __construct() {
+		$this->namespace = bp_rest_namespace() . '/' . bp_rest_version();
+		$this->rest_base = 'components';
+    }
+
+    public function register_routes( $controller = '' ) {
+		parent::register_routes( 'BP_REST_Components_Endpoint' );
+	}
+}
+
+/**
+ * BP Members REST Controller's mock.
+ */
+class BP_REST_Members_Endpoint extends BP_REST_Mock_Class {
+	public function __construct() {
+		$this->namespace = bp_rest_namespace() . '/' . bp_rest_version();
+		$this->rest_base = 'members';
+    }
+
+    public function register_routes( $controller = '' ) {
+		parent::register_routes( 'BP_REST_Members_Endpoint' );
+	}
+}
diff --git tests/phpunit/testcases/core/class-bp-component.php tests/phpunit/testcases/core/class-bp-component.php
new file mode 100644
index 000000000..8730f8224
--- /dev/null
+++ tests/phpunit/testcases/core/class-bp-component.php
@@ -0,0 +1,71 @@
+<?php
+
+include_once BP_TESTS_DIR . '/assets/bp-rest-api-controllers.php';
+
+/**
+ * @group core
+ * @group BP_Component
+ */
+class BP_Tests_BP_Component_TestCases extends BP_UnitTestCase {
+    public function setUp() {
+		parent::setUp();
+
+		$bp = buddypress();
+        $bp->unit_test_rest = new stdClass;
+        $bp->unit_test_rest->controllers = array();
+    }
+
+    public function remove_controller( $controllers ) {
+        return array_diff( $controllers, array( 'BP_REST_Members_Endpoint' ) );
+    }
+
+    public function add_controller( $controllers ) {
+        return array_merge( $controllers, array( 'Foo_Bar' ) );
+    }
+
+    public function test_rest_api_init_for_members_component() {
+        $bp_members = new BP_Members_Component();
+        $bp         = buddypress();
+
+        $bp_members->rest_api_init();
+
+        $this->assertSame( $bp->unit_test_rest->controllers, array(
+			'BP_REST_Components_Endpoint',
+			'BP_REST_Members_Endpoint',
+			'BP_REST_Attachments_Member_Avatar_Endpoint',
+		) );
+    }
+
+    public function test_rest_api_init_for_members_component_can_remove_controller() {
+        $bp_members = new BP_Members_Component();
+        $bp         = buddypress();
+
+        add_filter( 'bp_members_rest_api_controllers', array( $this, 'remove_controller' ) );
+
+        $bp_members->rest_api_init();
+
+        remove_filter( 'bp_members_rest_api_controllers', array( $this, 'remove_controller' ) );
+
+        $this->assertSame( $bp->unit_test_rest->controllers, array(
+			'BP_REST_Components_Endpoint',
+			'BP_REST_Attachments_Member_Avatar_Endpoint',
+		) );
+    }
+
+    public function test_rest_api_init_for_members_component_cannot_add_controller() {
+        $bp_members = new BP_Members_Component();
+        $bp         = buddypress();
+
+        add_filter( 'bp_members_rest_api_controllers', array( $this, 'add_controller' ) );
+
+        $bp_members->rest_api_init();
+
+        remove_filter( 'bp_members_rest_api_controllers', array( $this, 'add_controller' ) );
+
+        $this->assertSame( $bp->unit_test_rest->controllers, array(
+			'BP_REST_Components_Endpoint',
+			'BP_REST_Members_Endpoint',
+			'BP_REST_Attachments_Member_Avatar_Endpoint',
+		) );
+    }
+}
