diff --git a/index.php b/index.php
index 7b62f17e5bd589bfb088039b3b80891e221ae938..cf6329f6e53d5b119922d201e18551beb7ff7978 100644
--- a/index.php
+++ b/index.php
@@ -30,6 +30,8 @@
  */
 require_once __DIR__ . '/lib/versioncheck.php';
 
+use OCP\Security\Bruteforce\MaxDelayReached;
+
 try {
 	require_once __DIR__ . '/lib/base.php';
 
@@ -67,6 +69,21 @@ try {
 		exit();
 	}
 	OC_Template::printErrorPage($ex->getMessage(), $ex->getMessage(), 401);
+} catch (MaxDelayReached $ex) {
+	$request = \OC::$server->getRequest();
+	/**
+	 * Routes with the @CORS annotation and other API endpoints should
+	 * not return a webpage, so we only print the error page when html is accepted,
+	 * otherwise we reply with a JSON array like the BruteForceMiddleware would do.
+	 */
+	if (stripos($request->getHeader('Accept'), 'html') === false) {
+		http_response_code(429);
+		header('Content-Type: application/json; charset=utf-8');
+		echo json_encode(['message' => $ex->getMessage()]);
+		exit();
+	}
+	http_response_code(429);
+	OC_Template::printGuestPage('core', '429');
 } catch (Exception $ex) {
 	\OC::$server->getLogger()->logException($ex, ['app' => 'index']);
 
diff --git a/ocs/v1.php b/ocs/v1.php
index 055398993729a044addce9b80fbed70cc19330dd..55e9f426aba8de20a7d879d240972ac963675e83 100644
--- a/ocs/v1.php
+++ b/ocs/v1.php
@@ -41,8 +41,9 @@ if (\OCP\Util::needUpgrade()
 	exit;
 }
 
-use Symfony\Component\Routing\Exception\ResourceNotFoundException;
+use OCP\Security\Bruteforce\MaxDelayReached;
 use Symfony\Component\Routing\Exception\MethodNotAllowedException;
+use Symfony\Component\Routing\Exception\ResourceNotFoundException;
 
 /*
  * Try the appframework routes
@@ -62,6 +63,9 @@ try {
 	}
 
 	OC::$server->get(\OC\Route\Router::class)->match('/ocsapp'.\OC::$server->getRequest()->getRawPathInfo());
+} catch (MaxDelayReached $ex) {
+	$format = \OC::$server->getRequest()->getParam('format', 'xml');
+	OC_API::respond(new \OC\OCS\Result(null, OCP\AppFramework\Http::STATUS_TOO_MANY_REQUESTS, $ex->getMessage()), $format);
 } catch (ResourceNotFoundException $e) {
 	OC_API::setContentType();