diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php
index 571a2fd5f4..91ea83e78b 100644
--- a/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php
+++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php
@@ -251,6 +251,7 @@ class WP_REST_Posts_Controller extends WP_REST_Controller {
 			'search'         => 's',
 			'slug'           => 'post_name__in',
 			'status'         => 'post_status',
+			'exact_search'   => 'exact',
 		);
 
 		/*
@@ -2834,6 +2835,11 @@ class WP_REST_Posts_Controller extends WP_REST_Controller {
 			);
 		}
 
+		$query_params['exact_search'] = array(
+			'description' => __( 'Use exact search instead of full search.' ),
+			'type'        => 'boolean',
+		);
+
 		$query_params['offset'] = array(
 			'description' => __( 'Offset the result set by a specific number of items.' ),
 			'type'        => 'integer',
diff --git a/tests/phpunit/tests/rest-api/rest-attachments-controller.php b/tests/phpunit/tests/rest-api/rest-attachments-controller.php
index 27519610e8..c46e584555 100644
--- a/tests/phpunit/tests/rest-api/rest-attachments-controller.php
+++ b/tests/phpunit/tests/rest-api/rest-attachments-controller.php
@@ -216,6 +216,7 @@ class WP_Test_REST_Attachments_Controller extends WP_Test_REST_Post_Type_Control
 				'author_exclude',
 				'before',
 				'context',
+				'exact_search',
 				'exclude',
 				'include',
 				'media_type',
diff --git a/tests/phpunit/tests/rest-api/rest-pages-controller.php b/tests/phpunit/tests/rest-api/rest-pages-controller.php
index a6a9cfa3f4..1151c09e53 100644
--- a/tests/phpunit/tests/rest-api/rest-pages-controller.php
+++ b/tests/phpunit/tests/rest-api/rest-pages-controller.php
@@ -73,6 +73,7 @@ class WP_Test_REST_Pages_Controller extends WP_Test_REST_Post_Type_Controller_Te
 				'author_exclude',
 				'before',
 				'context',
+				'exact_search',
 				'exclude',
 				'include',
 				'menu_order',
diff --git a/tests/phpunit/tests/rest-api/rest-posts-controller.php b/tests/phpunit/tests/rest-api/rest-posts-controller.php
index b2a5512fba..0285457f13 100644
--- a/tests/phpunit/tests/rest-api/rest-posts-controller.php
+++ b/tests/phpunit/tests/rest-api/rest-posts-controller.php
@@ -194,6 +194,7 @@ class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te
 				'categories',
 				'categories_exclude',
 				'context',
+				'exact_search',
 				'exclude',
 				'include',
 				'modified_after',
@@ -749,6 +750,48 @@ class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te
 		}
 	}
 
+	/**
+	 * @ticket 56350
+	 */
+	public function test_get_items_exact_search() {
+
+		self::factory()->post->create(
+			array(
+				'post_title'   => 'Rye',
+				'post_content' => 'This is a post about Rye Bread',
+				'post_status'  => 'publish',
+			)
+		);
+
+		self::factory()->post->create(
+			array(
+				'post_title'   => 'Types of Bread',
+				'post_content' => 'Types of bread are White and Rye Bread',
+				'post_status'  => 'publish',
+			)
+		);
+
+		$request = new WP_REST_Request( 'GET', '/wp/v2/posts' );
+
+		// General search.
+		$request->set_param( 'search', 'Rye' );
+		$response = rest_get_server()->dispatch( $request );
+		$data     = $response->get_data();
+		$this->assertCount( 2, $data, 'Querying the API without exact_search should return all posts containing the search keyword' );
+
+		// Exact search using same search param.
+		$request->set_param( 'exact_search', true );
+		$response = rest_get_server()->dispatch( $request );
+		$data     = $response->get_data();
+		$this->assertCount( 1, $data, 'Querying the API with exact_search should return posts matching the search keyword' );
+
+		// Note that "exact_search" is still true.
+		$request->set_param( 'search', 'Rye Bread' );
+		$response = rest_get_server()->dispatch( $request );
+		$data     = $response->get_data();
+		$this->assertCount( 0, $data, 'Querying the API with exact_search should return posts matching the search keyword' );
+	}
+
 	public function test_get_items_order_and_orderby() {
 		self::factory()->post->create(
 			array(
diff --git a/tests/qunit/fixtures/wp-api-generated.js b/tests/qunit/fixtures/wp-api-generated.js
index 896322ed48..b31f3b1d8e 100644
--- a/tests/qunit/fixtures/wp-api-generated.js
+++ b/tests/qunit/fixtures/wp-api-generated.js
@@ -362,6 +362,11 @@ mockedApiResponse.Schema = {
                             "default": [],
                             "required": false
                         },
+                        "exact_search": {
+                            "description": "Use exact search instead of full search.",
+                            "type": "boolean",
+                            "required": false
+                        },
                         "offset": {
                             "description": "Offset the result set by a specific number of items.",
                             "type": "integer",
@@ -1700,6 +1705,11 @@ mockedApiResponse.Schema = {
                             "type": "integer",
                             "required": false
                         },
+                        "exact_search": {
+                            "description": "Use exact search instead of full search.",
+                            "type": "boolean",
+                            "required": false
+                        },
                         "offset": {
                             "description": "Offset the result set by a specific number of items.",
                             "type": "integer",
@@ -2782,6 +2792,11 @@ mockedApiResponse.Schema = {
                             "default": [],
                             "required": false
                         },
+                        "exact_search": {
+                            "description": "Use exact search instead of full search.",
+                            "type": "boolean",
+                            "required": false
+                        },
                         "offset": {
                             "description": "Offset the result set by a specific number of items.",
                             "type": "integer",
@@ -3509,6 +3524,11 @@ mockedApiResponse.Schema = {
                             "default": [],
                             "required": false
                         },
+                        "exact_search": {
+                            "description": "Use exact search instead of full search.",
+                            "type": "boolean",
+                            "required": false
+                        },
                         "offset": {
                             "description": "Offset the result set by a specific number of items.",
                             "type": "integer",
@@ -4306,6 +4326,11 @@ mockedApiResponse.Schema = {
                             "default": [],
                             "required": false
                         },
+                        "exact_search": {
+                            "description": "Use exact search instead of full search.",
+                            "type": "boolean",
+                            "required": false
+                        },
                         "offset": {
                             "description": "Offset the result set by a specific number of items.",
                             "type": "integer",
@@ -6457,6 +6482,11 @@ mockedApiResponse.Schema = {
                             "default": [],
                             "required": false
                         },
+                        "exact_search": {
+                            "description": "Use exact search instead of full search.",
+                            "type": "boolean",
+                            "required": false
+                        },
                         "offset": {
                             "description": "Offset the result set by a specific number of items.",
                             "type": "integer",
