diff --git a/src/metabase/api/card.clj b/src/metabase/api/card.clj
index 242f34358762ebe7d779a091925b1641da5d2963..d98c9c63e50e11b5377420491616f05df4313b22 100644
--- a/src/metabase/api/card.clj
+++ b/src/metabase/api/card.clj
@@ -258,6 +258,7 @@
 ;;; ------------------------------------------------------------ Running a Query ------------------------------------------------------------
 
 (defn- run-query-for-card [card-id parameters]
+  {:pre [(u/maybe? sequential? parameters)]}
   (let [card    (read-check Card card-id)
         query   (assoc (:dataset_query card)
                   :parameters  parameters
@@ -276,5 +277,12 @@
   [card-id :as {{:keys [parameters]} :body}]
   (dataset-api/as-csv (run-query-for-card card-id parameters)))
 
+(defendpoint GET "/:card-id/json"
+  "Fetch the results of a Card as JSON."
+  [card-id]
+  (let [{{:keys [columns rows]} :data} (run-query-for-card card-id nil)]
+    (for [row rows]
+      (zipmap columns row))))
+
 
 (define-routes)
diff --git a/test/metabase/api/card_test.clj b/test/metabase/api/card_test.clj
index 6e8aee1b02ef7ec256044ba9e069aff4368e9876..596e5b1729326d1d455f065758fc84ae31add59d 100644
--- a/test/metabase/api/card_test.clj
+++ b/test/metabase/api/card_test.clj
@@ -340,3 +340,13 @@
   (do-with-temp-native-card
     (fn [database-id card]
       ((user->client :rasta) :post 403 (format "card/%d/query/csv" (u/get-id card))))))
+
+
+;;; Tests for GET /api/card/:id/json
+;; endpoint should return an array of maps, one for each row
+(expect
+  [{(keyword "COUNT(*)") 75}]
+  (do-with-temp-native-card
+    (fn [database-id card]
+      (perms/grant-native-read-permissions! (perms-group/all-users) database-id)
+      ((user->client :rasta) :get 200 (format "card/%d/json" (u/get-id card))))))