Initial commit
diff --git a/includes/admin/class-wc-rest-stripe-account-controller.php b/includes/admin/class-wc-rest-stripe-account-controller.php
new file mode 100644
index 0000000..4efabd0
--- /dev/null
+++ b/includes/admin/class-wc-rest-stripe-account-controller.php
@@ -0,0 +1,156 @@
+<?php
+/**
+ * Class WC_REST_Stripe_Account_Controller
+ */
+
+defined( 'ABSPATH' ) || exit;
+
+/**
+ * REST controller for retrieving Stripe's account data.
+ *
+ * @since 5.6.0
+ */
+class WC_REST_Stripe_Account_Controller extends WC_Stripe_REST_Base_Controller {
+	/**
+	 * Endpoint path.
+	 *
+	 * @var string
+	 */
+	protected $rest_base = 'wc_stripe/account';
+
+	/**
+	 * The account data utility.
+	 *
+	 * @var WC_Stripe_Account
+	 */
+	private $account;
+
+	/**
+	 * Stripe payment gateway.
+	 *
+	 * @var WC_Gateway_Stripe
+	 */
+	private $gateway;
+
+	public function __construct( WC_Gateway_Stripe $gateway, WC_Stripe_Account $account ) {
+		$this->gateway = $gateway;
+		$this->account = $account;
+	}
+
+	/**
+	 * Configure REST API routes.
+	 */
+	public function register_routes() {
+		register_rest_route(
+			$this->namespace,
+			'/' . $this->rest_base,
+			[
+				'methods'             => WP_REST_Server::READABLE,
+				'callback'            => [ $this, 'get_account' ],
+				'permission_callback' => [ $this, 'check_permission' ],
+			]
+		);
+
+		register_rest_route(
+			$this->namespace,
+			'/' . $this->rest_base . '/summary',
+			[
+				'methods'             => WP_REST_Server::READABLE,
+				'callback'            => [ $this, 'get_account_summary' ],
+				'permission_callback' => [ $this, 'check_permission' ],
+			]
+		);
+
+		register_rest_route(
+			$this->namespace,
+			'/' . $this->rest_base . '/webhook-status-message',
+			[
+				'methods'             => WP_REST_Server::READABLE,
+				'callback'            => [ $this, 'get_webhook_status_message' ],
+				'permission_callback' => [ $this, 'check_permission' ],
+			]
+		);
+
+		register_rest_route(
+			$this->namespace,
+			'/' . $this->rest_base . '/refresh',
+			[
+				'methods'             => WP_REST_Server::EDITABLE,
+				'callback'            => [ $this, 'refresh_account' ],
+				'permission_callback' => [ $this, 'check_permission' ],
+			]
+		);
+	}
+
+	/**
+	 * Retrieve the Stripe account information.
+	 *
+	 * @return WP_REST_Response
+	 */
+	public function get_account() {
+		return new WP_REST_Response(
+			[
+				'account'                => $this->account->get_cached_account_data(),
+				'testmode'               => WC_Stripe_Webhook_State::get_testmode(),
+				'webhook_status_message' => WC_Stripe_Webhook_State::get_webhook_status_message(),
+				'webhook_url'            => WC_Stripe_Helper::get_webhook_url(),
+			]
+		);
+	}
+
+	/**
+	 * Return a summary of Stripe account details.
+	 *
+	 * @return WP_REST_Response
+	 */
+	public function get_account_summary() {
+		$account = $this->account->get_cached_account_data();
+
+		// Use statement descriptor from settings, falling back to Stripe account statement descriptor if needed.
+		$statement_descriptor = WC_Stripe_Helper::clean_statement_descriptor( $this->gateway->get_option( 'statement_descriptor' ) );
+		if ( empty( $statement_descriptor ) ) {
+			$statement_descriptor = $account['settings']['payments']['statement_descriptor'];
+		}
+		if ( empty( $statement_descriptor ) ) {
+			$statement_descriptor = null;
+		}
+
+		return new WP_REST_Response(
+			[
+				'has_pending_requirements' => $this->account->has_pending_requirements(),
+				'has_overdue_requirements' => $this->account->has_overdue_requirements(),
+				'current_deadline'         => $account['requirements']['current_deadline'] ?? null,
+				'status'                   => $this->account->get_account_status(),
+				'statement_descriptor'     => $statement_descriptor,
+				'store_currencies'         => [
+					'default'   => $account['default_currency'] ?? get_woocommerce_currency(),
+					'supported' => $this->account->get_supported_store_currencies(),
+				],
+				'country'                  => $account['country'] ?? WC()->countries->get_base_country(),
+				'is_live'                  => $account['charges_enabled'] ?? false,
+				'test_mode'                => WC_Stripe_Webhook_State::get_testmode(),
+			]
+		);
+	}
+
+	/**
+	 * Retrieve the webhook status information.
+	 *
+	 * @return WP_REST_Response
+	 */
+	public function get_webhook_status_message() {
+		return new WP_REST_Response( WC_Stripe_Webhook_State::get_webhook_status_message() );
+	}
+
+	/**
+	 * Clears the cached account data and returns the updated one.
+	 *
+	 * @return WP_REST_Response
+	 */
+	public function refresh_account() {
+		$this->account->clear_cache();
+
+		// calling the same "get" method, so that the data format is the same.
+		return $this->get_account();
+	}
+}