diff --git wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-meetup/class-wp-rest-meetups-controller.php wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-meetup/class-wp-rest-meetups-controller.php
new file mode 100644
index 000000000..52a307947
--- /dev/null
+++ wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-meetup/class-wp-rest-meetups-controller.php
@@ -0,0 +1,90 @@
+<?php
+
+/**
+ * Class to access Meetup CPT posts via the v2 REST API.
+ *
+ * @see WP_REST_Posts_Controller
+ */
+class WordCamp_REST_Meetups_Controller extends WP_REST_Posts_Controller {
+	/**
+	 * Retrieves the Meetup post's schema, conforming to JSON Schema.
+	 *
+	 * Meetup-specific modifications to the standard post schema.
+	 *
+	 * @access public
+	 *
+	 * @return array Item schema data.
+	 */
+	public function get_item_schema() {
+		$schema = parent::get_item_schema();
+
+		// Since there is more than one public post status, show it in REST response
+		if ( false === array_search( 'view', $schema['properties']['status']['context'] ) ) {
+			$schema['properties']['status']['context'][] = 'view';
+		}
+
+		return $this->add_additional_fields_schema( $schema );
+	}
+
+	/**
+	 * Sanitizes and validates the list of post statuses, including whether the
+	 * user can query private statuses.
+	 *
+	 * Based on the method in WP_REST_Posts_Controller, but takes into account that
+	 * there are multiple public statuses for the Meetup CPT.
+	 *
+	 * @access public
+	 *
+	 * @param  string|array    $statuses  One or more post statuses.
+	 * @param  WP_REST_Request $request   Full details about the request.
+	 * @param  string          $parameter Additional parameter to pass to validation.
+	 * @return array|WP_Error A list of valid statuses, otherwise WP_Error object.
+	 */
+	public function sanitize_post_statuses( $statuses, $request, $parameter ) {
+		$statuses = wp_parse_slug_list( $statuses );
+
+		$public_statuses = Meetup_Loader::get_public_post_statuses();
+
+		foreach ( $statuses as $status ) {
+			if ( in_array( $status, $public_statuses ) ) {
+				continue;
+			}
+
+			$post_type_obj = get_post_type_object( $this->post_type );
+
+			if ( current_user_can( $post_type_obj->cap->edit_posts ) ) {
+				$result = rest_validate_request_arg( $status, $request, $parameter );
+				if ( is_wp_error( $result ) ) {
+					return $result;
+				}
+			} else {
+				return new WP_Error( 'rest_forbidden_status', __( 'Status is forbidden.' ), array( 'status' => rest_authorization_required_code() ) );
+			}
+		}
+
+		return $statuses;
+	}
+
+	/**
+	 * Checks if user can read the Meetup post.
+	 *
+	 * First make our custom check against public Meetup statuses and
+	 * after that fallback to default WP_REST_Posts_Controller for assurance.
+	 *
+	 * @access public
+	 *
+	 * @param object $post Post object.
+	 * @return bool Whether the post can be read.
+	 */
+	public function check_read_permission( $post ) {
+		$public_statuses = Meetup_Loader::get_public_post_statuses();
+
+		// If post status is not listed as public, it cannot be read
+		if ( ! in_array( $post->post_status, $public_statuses ) ) {
+			return false;
+		}
+
+		// Fallback to default read permission check
+		return WP_REST_Posts_Controller::check_read_permission( $post );
+	}
+}
diff --git wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-meetup/meetup-loader.php wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-meetup/meetup-loader.php
index 5a196f96f..bd63c17e9 100644
--- wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-meetup/meetup-loader.php
+++ wordcamp.org/public_html/wp-content/plugins/wcpt/wcpt-meetup/meetup-loader.php
@@ -25,6 +25,7 @@ if ( ! class_exists( 'Meetup_Loader' ) ) :
 			parent::__construct();
 			add_action( 'init', array( $this, 'register_meetup_taxonomy' ) );
 			add_action( 'set_object_terms', array( $this, 'log_meetup_tags' ), 10, 6 );
+			add_filter( 'rest_wp_meetup_collection_params', array( $this, 'set_rest_post_status_default' ) );
 		}
 
 		/**
@@ -105,6 +106,7 @@ if ( ! class_exists( 'Meetup_Loader' ) ) :
 		 * Include files specific for meetup event
 		 */
 		public function includes() {
+			require_once ( WCPT_DIR . 'wcpt-meetup/class-wp-rest-meetups-controller.php' );
 		}
 
 		/**
@@ -141,24 +143,25 @@ if ( ! class_exists( 'Meetup_Loader' ) ) :
 				'author',
 			);
 
-			// Register WordCamp post type
+			// Register meetup post type
 			register_post_type(
 				Meetup_Application::POST_TYPE, array(
-					'labels'          => $wcpt_labels,
-					'rewrite'         => $wcpt_rewrite,
-					'supports'        => $wcpt_supports,
-					'menu_position'   => '100',
-					'public'          => true,
-					'show_ui'         => true,
-					'can_export'      => true,
-					'capability_type' => Meetup_Application::POST_TYPE,
-					'map_meta_cap'    => true,
-					'hierarchical'    => false,
-					'has_archive'     => true,
-					'query_var'       => true,
-					'menu_icon'       => 'dashicons-wordpress',
-					'show_in_rest'    => true,
-					'rest_base'       => 'meetups',
+					'labels'          			=> $wcpt_labels,
+					'rewrite'         			=> $wcpt_rewrite,
+					'supports'        			=> $wcpt_supports,
+					'menu_position'   			=> '100',
+					'public'          			=> true,
+					'show_ui'         			=> true,
+					'can_export'      			=> true,
+					'capability_type' 			=> Meetup_Application::POST_TYPE,
+					'map_meta_cap'    			=> true,
+					'hierarchical'    			=> false,
+					'has_archive'     			=> true,
+					'query_var'       			=> true,
+					'menu_icon'       			=> 'dashicons-wordpress',
+					'show_in_rest'          => true,
+					'rest_base'             => 'meetups',
+					'rest_controller_class' => 'WordCamp_REST_Meetups_Controller',
 				)
 			);
 		}
@@ -181,6 +184,23 @@ if ( ! class_exists( 'Meetup_Loader' ) ) :
 			return Meetup_Application::get_public_post_statuses();
 		}
 
+		/**
+		 * Change the default status used for the Meetup CPT in the v2 REST API.
+		 *
+		 * @hooked filter rest_wp_meetup_collection_params
+		 *
+		 * @param array $query_params
+		 *
+		 * @return array
+		 */
+		public function set_rest_post_status_default( $query_params ) {
+			if ( isset( $query_params['status'] ) ) {
+				$query_params['status']['default'] = Meetup_Loader::get_public_post_statuses();
+			}
+
+			return $query_params;
+		}
+
 	}
 
 endif;
