Index: includes/AutoLoader.php
===================================================================
--- includes/AutoLoader.php	(date 1311902152000)
+++ includes/AutoLoader.php	(revision )
@@ -353,6 +353,7 @@
 	'ApiResult' => 'includes/api/ApiResult.php',
 	'ApiRollback' => 'includes/api/ApiRollback.php',
 	'ApiRsd' => 'includes/api/ApiRsd.php',
+	'ApiTokens' => 'includes/api/ApiTokens.php',
 	'ApiUnblock' => 'includes/api/ApiUnblock.php',
 	'ApiUndelete' => 'includes/api/ApiUndelete.php',
 	'ApiUpload' => 'includes/api/ApiUpload.php',
Index: includes/api/ApiMain.php
===================================================================
--- includes/api/ApiMain.php	(date 1311902152000)
+++ includes/api/ApiMain.php	(revision )
@@ -66,6 +66,7 @@
 		'paraminfo' => 'ApiParamInfo',
 		'rsd' => 'ApiRsd',
 		'compare' => 'ApiComparePages',
+		'tokens' => 'ApiTokens',
 
 		// Write modules
 		'purge' => 'ApiPurge',
Index: includes/api/ApiTokens.php
===================================================================
--- includes/api/ApiTokens.php	(revision )
+++ includes/api/ApiTokens.php	(revision )
@@ -0,0 +1,89 @@
+<?php
+/**
+ *
+ *
+ * Created on Jul 29, 2011
+ *
+ * Copyright © 2011 John Du Hart john@johnduhart.me
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+
+/**
+ * @ingroup API
+ */
+class ApiTokens extends ApiBase {
+
+	public function __construct( $main, $action ) {
+		parent::__construct( $main, $action );
+	}
+
+	public function execute() {
+		$params = $this->extractRequestParams();
+		$res = array();
+
+		foreach ( $params['type'] as $t ) {
+			$func = 'get' .
+					ucfirst(strtolower($t)) .
+					'Token';
+			$val = call_user_func(array('ApiQueryInfo', $func), null, null);
+			if ( $val === false ) {
+				$this->setWarning( "Action '$t' is not allowed for the current user" );
+			} else {
+				$res[$t . 'token'] = $val;
+			}
+		}
+
+		$this->getResult()->addValue( null, $this->getModuleName(), $res );
+	}
+
+	public function getAllowedParams() {
+		return array(
+			'type' => array(
+				ApiBase::PARAM_DFLT => 'edit',
+				ApiBase::PARAM_ISMULTI => true,
+				ApiBase::PARAM_TYPE => array(
+					'edit', 'delete', 'protect', 'move', 'block', 'unblock',
+					'email', 'import', 'watch'
+				)
+			)
+		);
+	}
+
+	public function getParamDescription() {
+		return array(
+			'type' => 'Type of token(s) to request'
+		);
+	}
+
+	public function getDescription() {
+		return 'Gets tokens for data-modifying actions';
+	}
+
+	protected function getExamples() {
+		return array(
+			'api.php?action=tokens',
+			'api.php?action=tokens&type=email|move'
+		);
+	}
+
+	public function getVersion() {
+		return __CLASS__ . ': $Id$';
+	}
+}
\ No newline at end of file
