diff --git a/ios/chrome/browser/supervised_user/coordinator/parent_access_coordinator.mm b/ios/chrome/browser/supervised_user/coordinator/parent_access_coordinator.mm
index 21551b0bf9f4f..882d310067da1 100644
--- a/ios/chrome/browser/supervised_user/coordinator/parent_access_coordinator.mm
+++ b/ios/chrome/browser/supervised_user/coordinator/parent_access_coordinator.mm
@@ -157,7 +157,8 @@
 
 #pragma mark - ParentAccessBottomSheetViewControllerPresentationDelegate
 
-- (void)closeButtonTapped:(ParentAccessBottomSheetViewController*)controller {
+- (void)closeBottomSheetRequested:
+    (ParentAccessBottomSheetViewController*)controller {
   [self hideParentAccessBottomSheetWithResult:supervised_user::
                                                   LocalApprovalResult::kCanceled
                                     errorType:std::nullopt];
diff --git a/ios/chrome/browser/supervised_user/model/supervised_user_with_parental_controls_egtest.mm b/ios/chrome/browser/supervised_user/model/supervised_user_with_parental_controls_egtest.mm
index 300fa28a7faf5..4450c02205c53 100644
--- a/ios/chrome/browser/supervised_user/model/supervised_user_with_parental_controls_egtest.mm
+++ b/ios/chrome/browser/supervised_user/model/supervised_user_with_parental_controls_egtest.mm
@@ -798,10 +798,22 @@ static const char* kInterstitialDetails = "Details";
       waitForUIElementToDisappearWithMatcher:
           grey_accessibilityID(kParentAccessViewAccessibilityIdentifier)];
 
+  // Reopen the local web approval bottom sheet.
+  [ChromeEarlGrey tapWebStateElementWithID:@"local-approvals-button"];
+  [ChromeEarlGrey
+      waitForSufficientlyVisibleElementWithMatcher:
+          grey_accessibilityID(kParentAccessViewAccessibilityIdentifier)];
+
+  // Close the bottom sheet by keyboard.
+  [ChromeEarlGrey simulatePhysicalKeyboardEvent:@"escape" flags:0];
+  [ChromeEarlGrey
+      waitForUIElementToDisappearWithMatcher:
+          grey_accessibilityID(kParentAccessViewAccessibilityIdentifier)];
+
   // Verify that metrics are recorded on bottom sheet dismissal.
   GREYAssertNil(
       [MetricsAppInterface
-          expectUniqueSampleWithCount:1
+          expectUniqueSampleWithCount:2
                             forBucket:static_cast<int>(
                                           supervised_user::LocalApprovalResult::
                                               kCanceled)
@@ -809,7 +821,7 @@ static const char* kInterstitialDetails = "Details";
       @"Unexpected value for local web approval result histogram.");
   GREYAssertNil(
       [MetricsAppInterface
-          expectTotalCount:1
+          expectTotalCount:2
               forHistogram:@"FamilyLinkUser.LocalWebApprovalResult"],
       @"Unexpected total count for local web approval result histogram.");
   GREYAssertNil(
diff --git a/ios/chrome/browser/supervised_user/ui/BUILD.gn b/ios/chrome/browser/supervised_user/ui/BUILD.gn
index 87a93661bac9b..2293203ecae18 100644
--- a/ios/chrome/browser/supervised_user/ui/BUILD.gn
+++ b/ios/chrome/browser/supervised_user/ui/BUILD.gn
@@ -12,6 +12,7 @@ source_set("ui") {
   deps = [
     ":constants",
     "//components/strings:components_strings_grit",
+    "//ios/chrome/browser/keyboard/ui_bundled",
     "//ios/chrome/browser/shared/ui/bottom_sheet:bottom_sheet_view_controller",
     "//ios/chrome/browser/shared/ui/symbols",
     "//ios/chrome/browser/shared/ui/util",
diff --git a/ios/chrome/browser/supervised_user/ui/parent_access_bottom_sheet_view_controller.mm b/ios/chrome/browser/supervised_user/ui/parent_access_bottom_sheet_view_controller.mm
index 37c3d580315a3..fafefeac1bfda 100644
--- a/ios/chrome/browser/supervised_user/ui/parent_access_bottom_sheet_view_controller.mm
+++ b/ios/chrome/browser/supervised_user/ui/parent_access_bottom_sheet_view_controller.mm
@@ -6,6 +6,7 @@
 
 #import "base/functional/callback.h"
 #import "components/strings/grit/components_strings.h"
+#import "ios/chrome/browser/keyboard/ui_bundled/UIKeyCommand+Chrome.h"
 #import "ios/chrome/browser/shared/ui/symbols/symbols.h"
 #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h"
 #import "ios/chrome/browser/supervised_user/ui/constants.h"
@@ -114,6 +115,30 @@ UIImage* CloseButtonImage(BOOL highlighted) {
   }
 }
 
+#pragma mark - UIAccessibilityAction
+
+// Dismiss the bottom sheet via the escape accessibility gesture.
+- (BOOL)accessibilityPerformEscape {
+  [self closeBottomSheetRequested];
+  return YES;
+}
+
+#pragma mark - UIResponder
+
+// To always be able to register key commands via -keyCommands, the VC must be
+// able to become first responder.
+- (BOOL)canBecomeFirstResponder {
+  return YES;
+}
+
+- (NSArray<UIKeyCommand*>*)keyCommands {
+  return @[ UIKeyCommand.cr_close ];
+}
+
+- (void)keyCommand_close {
+  [self closeBottomSheetRequested];
+}
+
 #pragma mark - Private
 
 // Returns a custom detent between the medium and large detents.
@@ -145,10 +170,10 @@ UIImage* CloseButtonImage(BOOL highlighted) {
       kCustomBottomSheetDetentIdentifier;
 }
 
-- (void)closeButtonTapped {
+- (void)closeBottomSheetRequested {
   // Hide the WebView to prevent a white flash in dark mode.
   [self setWebViewHidden:YES];
-  [self.presentationDelegate closeButtonTapped:self];
+  [self.presentationDelegate closeBottomSheetRequested:self];
 }
 
 // Creates, initializes, and adds `_closeButton` to the bottom sheet.
@@ -164,7 +189,7 @@ UIImage* CloseButtonImage(BOOL highlighted) {
   _closeButton = [UIButton
       buttonWithConfiguration:closeButtonConfiguration
                 primaryAction:[UIAction actionWithHandler:^(UIAction* action) {
-                  [weakSelf closeButtonTapped];
+                  [weakSelf closeBottomSheetRequested];
                 }]];
 
   _closeButton.translatesAutoresizingMaskIntoConstraints = NO;
diff --git a/ios/chrome/browser/supervised_user/ui/parent_access_bottom_sheet_view_controller_presentation_delegate.h b/ios/chrome/browser/supervised_user/ui/parent_access_bottom_sheet_view_controller_presentation_delegate.h
index e2adf60eb789a..83d805bcbe03e 100644
--- a/ios/chrome/browser/supervised_user/ui/parent_access_bottom_sheet_view_controller_presentation_delegate.h
+++ b/ios/chrome/browser/supervised_user/ui/parent_access_bottom_sheet_view_controller_presentation_delegate.h
@@ -10,8 +10,10 @@
 // Delegate for presentation events related to the Parent Access bottom sheet.
 @protocol ParentAccessBottomSheetViewControllerPresentationDelegate <NSObject>
 
-// Called when the user taps on the Close (X) button.
-- (void)closeButtonTapped:(ParentAccessBottomSheetViewController*)controller;
+// Called when the bottom sheet receives a dismiss signal (e.g., (x) button,
+// accessibility gesture, or escape key)
+- (void)closeBottomSheetRequested:
+    (ParentAccessBottomSheetViewController*)controller;
 
 @end