diff --git a/.clj-kondo/config.edn b/.clj-kondo/config.edn
index 0422b6e03482069f4345d1420268424c8e444e39..7dc70c9d7325c462169782f2ff016cc18688d5be 100644
--- a/.clj-kondo/config.edn
+++ b/.clj-kondo/config.edn
@@ -143,7 +143,7 @@
    ;;
    ;; `nil` or an empty set  Otherwise this should be a set of namespace symbols.
    :api-namespaces
-   {metabase.actions               :any
+   {metabase.actions               #{metabase.actions.core}
     metabase.analytics             :any
     metabase.analyze               :any
     metabase.api                   :any
diff --git a/src/metabase/actions/core.clj b/src/metabase/actions/core.clj
new file mode 100644
index 0000000000000000000000000000000000000000..e02a146d9201cecc47c9da280e8ec98f4caf88dc
--- /dev/null
+++ b/src/metabase/actions/core.clj
@@ -0,0 +1,32 @@
+(ns metabase.actions.core
+  "API namespace for the `metabase.actions` module."
+  (:require
+   [metabase.actions :as actions]
+   [metabase.actions.error :as actions.error]
+   [metabase.actions.execution :as actions.execution]
+   [metabase.actions.http-action :as actions.http-action]
+   [potemkin :as p]))
+
+(comment
+  actions/keep-me
+  actions.error/keep-me
+  actions.execution/keep-me
+  actions.http-action/keep-me)
+
+(p/import-vars
+  [actions
+   cached-value
+   check-actions-enabled!
+   check-actions-enabled-for-database!
+   perform-action!*]
+  [actions.error
+   incorrect-value-type
+   violate-foreign-key-constraint
+   violate-not-null-constraint
+   violate-unique-constraint]
+  [actions.execution
+   execute-action!
+   execute-dashcard!
+   fetch-values]
+  [actions.http-action
+   apply-json-query])
diff --git a/src/metabase/api/action.clj b/src/metabase/api/action.clj
index 87559b645cae9327dbe062ef6a68a903db3137ae..b4d4a8351c30436606486ef25458b94b225c84cb 100644
--- a/src/metabase/api/action.clj
+++ b/src/metabase/api/action.clj
@@ -3,9 +3,7 @@
   (:require
    [cheshire.core :as json]
    [compojure.core :as compojure :refer [POST]]
-   [metabase.actions :as actions]
-   [metabase.actions.execution :as actions.execution]
-   [metabase.actions.http-action :as http-action]
+   [metabase.actions.core :as actions]
    [metabase.analytics.snowplow :as snowplow]
    [metabase.api.common :as api]
    [metabase.api.common.validation :as validation]
@@ -25,7 +23,7 @@
   [:and
    string?
    (mu/with-api-error-message
-     [:fn #(http-action/apply-json-query {} %)]
+    [:fn #(actions/apply-json-query {} %)]
      (deferred-tru "must be a valid json-query, something like ''.item.title''"))])
 
 (def ^:private supported-action-type
@@ -207,7 +205,7 @@
   (actions/check-actions-enabled! action-id)
   (-> (action/select-action :id action-id :archived false)
       api/read-check
-      (actions.execution/fetch-values (json/parse-string parameters))))
+      (actions/fetch-values (json/parse-string parameters))))
 
 (api/defendpoint POST "/:id/execute"
   "Execute the Action.
@@ -220,6 +218,6 @@
     (snowplow/track-event! ::snowplow/action-executed api/*current-user-id* {:source    :model_detail
                                                                              :type      type
                                                                              :action_id id})
-    (actions.execution/execute-action! action (update-keys parameters name))))
+    (actions/execute-action! action (update-keys parameters name))))
 
 (api/define-routes)
diff --git a/src/metabase/api/dashboard.clj b/src/metabase/api/dashboard.clj
index bf894e8485d9cfcf0ddb4c4ce1400e55d1776a51..ac54aaa1d8cce8b4cfeb206b57ba9efe9f79d46c 100644
--- a/src/metabase/api/dashboard.clj
+++ b/src/metabase/api/dashboard.clj
@@ -5,7 +5,7 @@
    [clojure.set :as set]
    [compojure.core :refer [DELETE GET POST PUT]]
    [medley.core :as m]
-   [metabase.actions.execution :as actions.execution]
+   [metabase.actions.core :as actions]
    [metabase.analytics.snowplow :as snowplow]
    [metabase.api.common :as api]
    [metabase.api.common.validation :as validation]
@@ -1122,7 +1122,7 @@
    dashcard-id  ms/PositiveInt
    parameters   ms/JSONString}
   (api/read-check :model/Dashboard dashboard-id)
-  (actions.execution/fetch-values
+  (actions/fetch-values
    (api/check-404 (action/dashcard->action dashcard-id))
    (json/parse-string parameters)))
 
@@ -1137,7 +1137,7 @@
    parameters  [:maybe [:map-of :string :any]]}
   (api/read-check :model/Dashboard dashboard-id)
   ;; Undo middleware string->keyword coercion
-  (actions.execution/execute-dashcard! dashboard-id dashcard-id parameters))
+  (actions/execute-dashcard! dashboard-id dashcard-id parameters))
 
 ;;; ---------------------------------- Running the query associated with a Dashcard ----------------------------------
 
diff --git a/src/metabase/api/public.clj b/src/metabase/api/public.clj
index 280e684797748067e8d36b6ecc26cc7effe2cc13..2015ffdec8963a86fa5dd40ae89853b50ce29767 100644
--- a/src/metabase/api/public.clj
+++ b/src/metabase/api/public.clj
@@ -4,8 +4,7 @@
    [cheshire.core :as json]
    [compojure.core :refer [GET]]
    [medley.core :as m]
-   [metabase.actions :as actions]
-   [metabase.actions.execution :as actions.execution]
+   [metabase.actions.core :as actions]
    [metabase.analytics.snowplow :as snowplow]
    [metabase.api.card :as api.card]
    [metabase.api.common :as api]
@@ -301,7 +300,7 @@
    parameters  ms/JSONString}
   (validation/check-public-sharing-enabled)
   (api/check-404 (t2/select-one-pk Dashboard :public_uuid uuid :archived false))
-  (actions.execution/fetch-values
+  (actions/fetch-values
    (api/check-404 (action/dashcard->action dashcard-id))
    (json/parse-string parameters)))
 
@@ -334,7 +333,7 @@
           ;; you're by definition allowed to run it without a perms check anyway
           (binding [api/*current-user-permissions-set* (delay #{"/"})]
             ;; Undo middleware string->keyword coercion
-            (actions.execution/execute-dashcard! dashboard-id dashcard-id (update-keys parameters name))))))))
+            (actions/execute-dashcard! dashboard-id dashcard-id (update-keys parameters name))))))))
 
 (api/defendpoint GET "/oembed"
   "oEmbed endpoint used to retreive embed code and metadata for a (public) Metabase URL."
@@ -654,7 +653,7 @@
                                                                                      :type      (:type action)
                                                                                      :action_id (:id action)})
             ;; Undo middleware string->keyword coercion
-            (actions.execution/execute-action! action (update-keys parameters name))))))))
+            (actions/execute-action! action (update-keys parameters name))))))))
 
 
 ;;; ----------------------------------------- Route Definitions & Complaints -----------------------------------------
diff --git a/src/metabase/driver/h2/actions.clj b/src/metabase/driver/h2/actions.clj
index f7590fbcb592760470fae044edc1a60e8aac2d17..0d838752d1da50016eb54702f12f7131d03a69da 100644
--- a/src/metabase/driver/h2/actions.clj
+++ b/src/metabase/driver/h2/actions.clj
@@ -3,7 +3,7 @@
   (:require
    [clojure.java.jdbc :as jdbc]
    [clojure.string :as str]
-   [metabase.actions.error :as actions.error]
+   [metabase.actions.core :as actions]
    [metabase.driver.sql-jdbc.actions :as sql-jdbc.actions]
    [metabase.driver.sql-jdbc.connection :as sql-jdbc.conn]
    [metabase.util :as u]
@@ -63,7 +63,7 @@
       [[] nil nil]
       (jdbc/reducible-query jdbc-spec sql-args {:identifers identity, :transaction? false})))))
 
-(defmethod sql-jdbc.actions/maybe-parse-sql-error [:h2 actions.error/violate-not-null-constraint]
+(defmethod sql-jdbc.actions/maybe-parse-sql-error [:h2 actions/violate-not-null-constraint]
   [_driver error-type _database _action-type error-message]
   (when-let [[_ column]
              (re-find #"NULL not allowed for column \"([^\"]+)\"" error-message)]
@@ -71,7 +71,7 @@
      :message (tru "{0} must have values." (str/capitalize column))
      :errors  {column (tru "You must provide a value.")}}))
 
-(defmethod sql-jdbc.actions/maybe-parse-sql-error [:h2 actions.error/violate-unique-constraint]
+(defmethod sql-jdbc.actions/maybe-parse-sql-error [:h2 actions/violate-unique-constraint]
   [_driver error-type database _action-type error-message]
   (when-let [[_match constraint-name table]
              (re-find #"Unique index or primary key violation: \"[^.]+.(.+?) ON [^.]+.\"\"(.+?)\"\"" error-message)]
@@ -83,7 +83,7 @@
                         {}
                         columns)})))
 
-(defmethod sql-jdbc.actions/maybe-parse-sql-error [:h2 actions.error/violate-foreign-key-constraint]
+(defmethod sql-jdbc.actions/maybe-parse-sql-error [:h2 actions/violate-foreign-key-constraint]
   [_driver error-type _database action-type error-message]
   (when-let [[_match column]
              (re-find #"Referential integrity constraint violation: \"[^\:]+: [^\s]+ FOREIGN KEY\(([^\s]+)\)" error-message)]
@@ -102,7 +102,7 @@
               {:message (tru "Unable to update the record.")
                :errors  {column (tru "This {0} does not exist." (str/capitalize column))}})))))
 
-(defmethod sql-jdbc.actions/maybe-parse-sql-error [:h2 actions.error/incorrect-value-type]
+(defmethod sql-jdbc.actions/maybe-parse-sql-error [:h2 actions/incorrect-value-type]
   [_driver error-type _database _action-type error-message]
   (when-let [[_ _expected-type _value]
              (re-find #"Data conversion error converting .*" error-message)]
diff --git a/src/metabase/driver/mysql/actions.clj b/src/metabase/driver/mysql/actions.clj
index 66319a00dfc15c3c3851a8bd45f3e042c8529484..b10ffe6e1522224d2b2353baba8e64272ac27169 100644
--- a/src/metabase/driver/mysql/actions.clj
+++ b/src/metabase/driver/mysql/actions.clj
@@ -3,7 +3,7 @@
   (:require
    [clojure.java.jdbc :as jdbc]
    [clojure.string :as str]
-   [metabase.actions.error :as actions.error]
+   [metabase.actions.core :as actions]
    [metabase.driver.sql-jdbc.actions :as sql-jdbc.actions]
    [metabase.driver.sql-jdbc.connection :as sql-jdbc.conn]
    [metabase.driver.sql-jdbc.execute :as sql-jdbc.execute]
@@ -48,7 +48,7 @@
       [[] nil nil]
       (jdbc/reducible-query jdbc-spec sql-args {:identifers identity, :transaction? false})))))
 
-(defmethod sql-jdbc.actions/maybe-parse-sql-error [:mysql actions.error/violate-not-null-constraint]
+(defmethod sql-jdbc.actions/maybe-parse-sql-error [:mysql actions/violate-not-null-constraint]
   [_driver error-type _database _action-type error-message]
   (or
    (when-let [[_ column]
@@ -62,7 +62,7 @@
       :message (tru "{0} must have values." (str/capitalize column))
       :errors  {column (tru "You must provide a value.")}})))
 
-(defmethod sql-jdbc.actions/maybe-parse-sql-error [:mysql actions.error/violate-unique-constraint]
+(defmethod sql-jdbc.actions/maybe-parse-sql-error [:mysql actions/violate-unique-constraint]
   [_driver error-type database _action-type error-message]
   (when-let [[_match constraint]
              (re-find #"Duplicate entry '.+' for key '(.+)'" error-message)]
@@ -75,7 +75,7 @@
                         {}
                         columns)})))
 
-(defmethod sql-jdbc.actions/maybe-parse-sql-error [:mysql actions.error/violate-foreign-key-constraint]
+(defmethod sql-jdbc.actions/maybe-parse-sql-error [:mysql actions/violate-foreign-key-constraint]
   [_driver error-type _database action-type error-message]
   (or
    (when-let [[_match _ref-table _constraint _fkey-cols column _key-cols]
@@ -102,7 +102,7 @@
                    (tru "Unable to update the record."))
         :errors  {(remove-backticks column) (tru "This {0} does not exist." (str/capitalize (remove-backticks column)))}}))))
 
-(defmethod sql-jdbc.actions/maybe-parse-sql-error [:mysql actions.error/incorrect-value-type]
+(defmethod sql-jdbc.actions/maybe-parse-sql-error [:mysql actions/incorrect-value-type]
   [_driver error-type _database _action-type error-message]
   (when-let [[_ expected-type _value _database _table column _row]
              (re-find #"Incorrect (.+?) value: '(.+)' for column (?:(.+)\.)??(?:(.+)\.)?(.+) at row (\d+)"  error-message)]
diff --git a/src/metabase/driver/postgres/actions.clj b/src/metabase/driver/postgres/actions.clj
index 4eb99c4db314430934108f850903019f624d7f99..cc915aac6d8eb7b74443119bfac941eb03af2c85 100644
--- a/src/metabase/driver/postgres/actions.clj
+++ b/src/metabase/driver/postgres/actions.clj
@@ -3,7 +3,7 @@
   (:require
    [clojure.java.jdbc :as jdbc]
    [clojure.string :as str]
-   [metabase.actions.error :as actions.error]
+   [metabase.actions.core :as actions]
    [metabase.driver.sql-jdbc.actions :as sql-jdbc.actions]
    [metabase.driver.sql-jdbc.connection :as sql-jdbc.conn]
    [metabase.util :as u]
@@ -23,7 +23,7 @@
           (map :column_name)
           (jdbc/reducible-query jdbc-spec sql-args {:identifers identity, :transaction? false}))))
 
-(defmethod sql-jdbc.actions/maybe-parse-sql-error [:postgres actions.error/violate-not-null-constraint]
+(defmethod sql-jdbc.actions/maybe-parse-sql-error [:postgres actions/violate-not-null-constraint]
   [_driver error-type _database _action-type error-message]
   (when-let [[_ column]
              (re-find #"null value in column \"([^\"]+)\".*violates not-null constraint"  error-message)]
@@ -31,7 +31,7 @@
      :message (tru "{0} must have values." (str/capitalize column))
      :errors  {column (tru "You must provide a value.")}}))
 
-(defmethod sql-jdbc.actions/maybe-parse-sql-error [:postgres actions.error/violate-unique-constraint]
+(defmethod sql-jdbc.actions/maybe-parse-sql-error [:postgres actions/violate-unique-constraint]
   [_driver error-type database _action-type error-message]
   (when-let [[_match constraint _value]
              (re-find #"duplicate key value violates unique constraint \"([^\"]+)\"" error-message)]
@@ -43,7 +43,7 @@
                         {}
                         columns)})))
 
-(defmethod sql-jdbc.actions/maybe-parse-sql-error [:postgres actions.error/violate-foreign-key-constraint]
+(defmethod sql-jdbc.actions/maybe-parse-sql-error [:postgres actions/violate-foreign-key-constraint]
   [_driver error-type _database action-type error-message]
   (or (when-let [[_match _table _constraint _ref-table column _value _ref-table-2]
                  (re-find #"update or delete on table \"([^\"]+)\" violates foreign key constraint \"([^\"]+)\" on table \"([^\"]+)\"\n  Detail: Key \((.*?)\)=\((.*?)\) is still referenced from table \"([^\"]+)\"" error-message)]
@@ -67,7 +67,7 @@
                       (tru "Unable to update the record."))
            :errors  {column (tru "This {0} does not exist." (str/capitalize column))}})))
 
-(defmethod sql-jdbc.actions/maybe-parse-sql-error [:postgres actions.error/incorrect-value-type]
+(defmethod sql-jdbc.actions/maybe-parse-sql-error [:postgres actions/incorrect-value-type]
   [_driver error-type _database _action-type error-message]
   (when-let [[_] (re-find #"invalid input syntax for .*" error-message)]
     {:type    error-type
diff --git a/src/metabase/driver/sql_jdbc/actions.clj b/src/metabase/driver/sql_jdbc/actions.clj
index f5c91df8614219945f226756679853ad7f533d4f..c41060f3ab64901e34b881bd9b9e94841e65a59e 100644
--- a/src/metabase/driver/sql_jdbc/actions.clj
+++ b/src/metabase/driver/sql_jdbc/actions.clj
@@ -5,7 +5,7 @@
    [clojure.string :as str]
    [flatland.ordered.set :as ordered-set]
    [medley.core :as m]
-   [metabase.actions :as actions]
+   [metabase.actions.core :as actions]
    [metabase.driver :as driver]
    [metabase.driver.sql-jdbc.execute :as sql-jdbc.execute]
    [metabase.driver.sql.query-processor :as sql.qp]