diff --git a/src/metabase/public_settings.clj b/src/metabase/public_settings.clj
index 897e1d438bc453b53521583c2adb02835e145a01..507c5346cc3931ca852f998e83a4f162145517ba 100644
--- a/src/metabase/public_settings.clj
+++ b/src/metabase/public_settings.clj
@@ -108,7 +108,10 @@
   :type    :integer
   :default 1000
   :setter  (fn [new-value]
-             (when (> new-value global-max-caching-kb)
+             (when (and new-value
+                        (> (cond-> new-value
+                             (string? new-value) Integer/parseInt)
+                           global-max-caching-kb))
                (throw (IllegalArgumentException.
                        (str
                         (tru "Failed setting `query-caching-max-kb` to {0}." new-value)
diff --git a/test/metabase/public_settings_test.clj b/test/metabase/public_settings_test.clj
index dd3badfd9e80923ec26c2c8c561441932b247a0c..f5914711b636f747047c2ab44a2aad6746ec4bf7 100644
--- a/test/metabase/public_settings_test.clj
+++ b/test/metabase/public_settings_test.clj
@@ -49,3 +49,10 @@
     (i18n/with-user-locale zz
       [(= zz (i18n/user-locale))
        (tru "Host")])))
+
+;; Make sure Max Cache Entry Size can be set via with a string value, which is what comes back from the API (#9143)
+(expect
+  "1000"
+  ;; use with temp value macro so original value gets reset after test run
+  (tu/with-temporary-setting-values [query-caching-max-kb nil]
+    (public-settings/query-caching-max-kb "1000")))