Initial commit
diff --git a/includes/admin/class-wc-rest-stripe-tokens-controller.php b/includes/admin/class-wc-rest-stripe-tokens-controller.php
new file mode 100644
index 0000000..3dabb68
--- /dev/null
+++ b/includes/admin/class-wc-rest-stripe-tokens-controller.php
@@ -0,0 +1,59 @@
+<?php
+/***
+ * Class WC_REST_Stripe_Tokens_Controller
+ */
+
+defined( 'ABSPATH' ) || exit;
+
+/**
+ * REST controller for tokens.
+ */
+class WC_REST_Stripe_Tokens_Controller extends WC_Stripe_REST_Base_Controller {
+
+	/**
+	 * Endpoint path.
+	 */
+	protected $rest_base = 'wc_stripe/tokens';
+
+	/**
+	 * Register REST API routes for Stripe tokens.
+	 */
+	public function register_routes() {
+		register_rest_route(
+			$this->namespace,
+			// For more info on Stripe tokens, see the following:
+			// https://stripe.com/docs/api/tokens/object
+			'/' . $this->rest_base . '/(?P<token_id>[a-z]{3}_[a-zA-Z0-9]{24})',
+			[
+				'methods'             => WP_REST_Server::READABLE,
+				'callback'            => [ $this, 'get_token' ],
+				'permission_callback' => [ $this, 'check_permission' ],
+			]
+		);
+	}
+
+	/**
+	 * Retrieve a Stripe token, given a secret-key and token_id.
+	 *
+	 * @param WP_REST_Request $request Request object.
+	 *
+	 * @return WP_REST_Response Response object.
+	 */
+	public function get_token( $request ) {
+		$token_id   = $request->get_param( 'token_id' );
+		$secret_key = $request->get_header( 'X-WCStripe-Secret-Key' );
+
+		try {
+			WC_Stripe_API::set_secret_key( $secret_key );
+			$response = WC_Stripe_API::request( [], "tokens/$token_id", 'GET' );
+
+			if ( ! empty( $response->error ) ) {
+				return new WP_REST_Response( [ 'result' => 'bad_request' ], 400 );
+			}
+		} catch ( Exception $exception ) {
+			return new WP_REST_Response( [ 'result' => 'bad_request' ], 400 );
+		}
+
+		return new WP_REST_Response( $response, 200 );
+	}
+}