diff --git a/build/index.php b/build/index.php
index 71c249d..c9248fd 100644
--- a/build/index.php
+++ b/build/index.php
@@ -833,6 +833,23 @@ function system_extension_mime_type($ext) {
     $ext = strtolower($ext);
     return isset($types[$ext]) ? $types[$ext] : null;
 }
+/**
+ * Figures out whether a given http accepts header contains a
+ * specified mime type.
+ * @param	string $accept_header	The accept header to search.
+ * @param	string $mime_type		The mime type to search for.
+ * @return	bool					Whether the specified mime type was found
+ * 									in the specified accepts header.
+ */
+function accept_contains_mime($accept_header, $mime_type)
+{
+	$accepted_mimes = explode(",", $accept_header);
+	foreach($accepted_mimes as $accepted_mime) {
+		if(explode(";", $accepted_mime)[0] == $mime_type)
+			return true;
+	}
+	return false;
+}
 
 /**
  * Generates a stack trace.
@@ -1988,6 +2005,56 @@ register_module([
 
 
 
+
+register_module([
+	"name" => "API status",
+	"version" => "0.1",
+	"author" => "Starbeamrainbowlabs",
+	"description" => "Provides a basic JSON status action that provices a few useful bits of information for API consumption.",
+	"id" => "api-status",
+	"code" => function() {
+		global $settings;
+		/**
+		 * @api {get} ?action=raw&page={pageName} Get the raw source code of a page
+		 * @apiName RawSource
+		 * @apiGroup Page
+		 * @apiPermission Anonymous
+		 * 
+		 * @apiParam {string}	page	The page to return the source of.
+		 */
+		
+		
+		add_action("status", function() {
+			global $version, $env, $settings, $actions;
+			
+			// Make sure the client can accept JSON
+			if(!accept_contains_mime($_SERVER["HTTP_ACCEPT"] ?? "application/json", "application/json")) {
+				http_response_code(406);
+				header("content-type: text/plain");
+				
+				exit("Unfortunately, this API is currently only available in application/json at the moment, which you haven't indicated you accept in your http accept header. You said this in your accept header:\n" . $_SERVER["HTTP_ACCEPT"]);
+			}
+			
+			$action_names = array_keys(get_object_vars($actions));
+			sort($action_names);
+			
+			$result = new stdClass();
+			$result->status = "ok";
+			$result->version = $version;
+			$result->available_actions = $action_names;
+			$result->wiki_name = $settings->sitename;
+			$result->logo_url = $settings->favicon;
+			
+			header("content-type: application/json");
+			exit(json_encode($result, JSON_PRETTY_PRINT) . "\n");
+		});
+		
+		add_help_section("960-api-status", "Wiki Status API", "<p></p>");
+	}
+]);
+
+
+
 
 register_module([
 	"name" => "Sidebar",
diff --git a/core.php b/core.php
index c63368b..0e0644f 100644
--- a/core.php
+++ b/core.php
@@ -480,6 +480,23 @@ function system_extension_mime_type($ext) {
     $ext = strtolower($ext);
     return isset($types[$ext]) ? $types[$ext] : null;
 }
+/**
+ * Figures out whether a given http accepts header contains a
+ * specified mime type.
+ * @param	string $accept_header	The accept header to search.
+ * @param	string $mime_type		The mime type to search for.
+ * @return	bool					Whether the specified mime type was found
+ * 									in the specified accepts header.
+ */
+function accept_contains_mime($accept_header, $mime_type)
+{
+	$accepted_mimes = explode(",", $accept_header);
+	foreach($accepted_mimes as $accepted_mime) {
+		if(explode(";", $accepted_mime)[0] == $mime_type)
+			return true;
+	}
+	return false;
+}
 
 /**
  * Generates a stack trace.
diff --git a/module_index.json b/module_index.json
index c611399..d7d54d1 100755
--- a/module_index.json
+++ b/module_index.json
@@ -35,6 +35,15 @@
         "lastupdate": 1476906745,
         "optional": false
     },
+    {
+        "name": "API status",
+        "version": "0.1",
+        "author": "Starbeamrainbowlabs",
+        "description": "Provides a basic JSON status action that provices a few useful bits of information for API consumption.",
+        "id": "api-status",
+        "lastupdate": 1498472652,
+        "optional": false
+    },
     {
         "name": "Sidebar",
         "version": "0.3",
diff --git a/modules/api-status.php b/modules/api-status.php
new file mode 100644
index 0000000..a970b98
--- /dev/null
+++ b/modules/api-status.php
@@ -0,0 +1,49 @@
+<?php
+register_module([
+	"name" => "API status",
+	"version" => "0.1",
+	"author" => "Starbeamrainbowlabs",
+	"description" => "Provides a basic JSON status action that provices a few useful bits of information for API consumption.",
+	"id" => "api-status",
+	"code" => function() {
+		global $settings;
+		/**
+		 * @api {get} ?action=raw&page={pageName} Get the raw source code of a page
+		 * @apiName RawSource
+		 * @apiGroup Page
+		 * @apiPermission Anonymous
+		 * 
+		 * @apiParam {string}	page	The page to return the source of.
+		 */
+		
+		
+		add_action("status", function() {
+			global $version, $env, $settings, $actions;
+			
+			// Make sure the client can accept JSON
+			if(!accept_contains_mime($_SERVER["HTTP_ACCEPT"] ?? "application/json", "application/json")) {
+				http_response_code(406);
+				header("content-type: text/plain");
+				
+				exit("Unfortunately, this API is currently only available in application/json at the moment, which you haven't indicated you accept in your http accept header. You said this in your accept header:\n" . $_SERVER["HTTP_ACCEPT"]);
+			}
+			
+			$action_names = array_keys(get_object_vars($actions));
+			sort($action_names);
+			
+			$result = new stdClass();
+			$result->status = "ok";
+			$result->version = $version;
+			$result->available_actions = $action_names;
+			$result->wiki_name = $settings->sitename;
+			$result->logo_url = $settings->favicon;
+			
+			header("content-type: application/json");
+			exit(json_encode($result, JSON_PRETTY_PRINT) . "\n");
+		});
+		
+		add_help_section("960-api-status", "Wiki Status API", "<p></p>");
+	}
+]);
+
+?>
