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 b7b2dd79f6..41c95e946c 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
@@ -1479,6 +1479,10 @@ class WP_REST_Posts_Controller extends WP_REST_Controller {
 			$data['link'] = get_permalink( $post->ID );
 		}
 
+		if ( in_array( 'preview_link', $fields, true ) ) {
+			$data['preview_link'] = get_preview_post_link( $post );
+		}
+
 		if ( in_array( 'title', $fields, true ) ) {
 			add_filter( 'protected_title_format', array( $this, 'protected_title_format' ) );
 
@@ -1841,6 +1845,16 @@ class WP_REST_Posts_Controller extends WP_REST_Controller {
 			);
 		}
 
+		if ( is_post_type_viewable( $this->post_type ) ) {
+			$schema['properties']['preview_link'] = array(
+				'description' => __( 'Preview URL for the object.' ),
+				'type'        => 'string',
+				'format'      => 'uri',
+				'context'     => array( 'edit' ),
+				'readonly'    => true,
+			);
+		}
+
 		$post_type_attributes = array(
 			'title',
 			'editor',
diff --git a/tests/phpunit/includes/testcase-rest-post-type-controller.php b/tests/phpunit/includes/testcase-rest-post-type-controller.php
index 1336074840..900b8e6772 100644
--- a/tests/phpunit/includes/testcase-rest-post-type-controller.php
+++ b/tests/phpunit/includes/testcase-rest-post-type-controller.php
@@ -49,6 +49,13 @@ abstract class WP_Test_REST_Post_Type_Controller_Testcase extends WP_Test_REST_C
 			$this->assertFalse( isset( $data['parent'] ) );
 		}
 
+		// preview_link
+		if ( is_post_type_viewable( $post_type_obj->name ) && 'edit' === $context ) {
+			$this->assertEquals( get_preview_post_link( $post ), $data['preview_link'] );
+		} else {
+			$this->assertFalse( isset( $data['preview_link'] ) );
+		}
+
 		// page attributes
 		if ( $post_type_obj->hierarchical && post_type_supports( $post->post_type, 'page-attributes' ) ) {
 			$this->assertEquals( $post->menu_order, $data['menu_order'] );
diff --git a/tests/phpunit/tests/rest-api/rest-pages-controller.php b/tests/phpunit/tests/rest-api/rest-pages-controller.php
index dcc7c15297..67fb1bb5cb 100644
--- a/tests/phpunit/tests/rest-api/rest-pages-controller.php
+++ b/tests/phpunit/tests/rest-api/rest-pages-controller.php
@@ -673,7 +673,7 @@ class WP_Test_REST_Pages_Controller extends WP_Test_REST_Post_Type_Controller_Te
 		$response   = rest_get_server()->dispatch( $request );
 		$data       = $response->get_data();
 		$properties = $data['schema']['properties'];
-		$this->assertEquals( 22, count( $properties ) );
+		$this->assertEquals( 23, count( $properties ) );
 		$this->assertArrayHasKey( 'author', $properties );
 		$this->assertArrayHasKey( 'comment_status', $properties );
 		$this->assertArrayHasKey( 'content', $properties );
@@ -691,6 +691,7 @@ class WP_Test_REST_Pages_Controller extends WP_Test_REST_Post_Type_Controller_Te
 		$this->assertArrayHasKey( 'parent', $properties );
 		$this->assertArrayHasKey( 'password', $properties );
 		$this->assertArrayHasKey( 'ping_status', $properties );
+		$this->assertArrayHasKey( 'preview_link', $properties );
 		$this->assertArrayHasKey( 'slug', $properties );
 		$this->assertArrayHasKey( 'status', $properties );
 		$this->assertArrayHasKey( 'template', $properties );
diff --git a/tests/phpunit/tests/rest-api/rest-posts-controller.php b/tests/phpunit/tests/rest-api/rest-posts-controller.php
index 721b08292a..0dbf15d622 100644
--- a/tests/phpunit/tests/rest-api/rest-posts-controller.php
+++ b/tests/phpunit/tests/rest-api/rest-posts-controller.php
@@ -3380,7 +3380,7 @@ class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te
 		$response   = rest_get_server()->dispatch( $request );
 		$data       = $response->get_data();
 		$properties = $data['schema']['properties'];
-		$this->assertEquals( 24, count( $properties ) );
+		$this->assertEquals( 25, count( $properties ) );
 		$this->assertArrayHasKey( 'author', $properties );
 		$this->assertArrayHasKey( 'comment_status', $properties );
 		$this->assertArrayHasKey( 'content', $properties );
@@ -3397,6 +3397,7 @@ class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te
 		$this->assertArrayHasKey( 'modified_gmt', $properties );
 		$this->assertArrayHasKey( 'password', $properties );
 		$this->assertArrayHasKey( 'ping_status', $properties );
+		$this->assertArrayHasKey( 'preview_link', $properties );
 		$this->assertArrayHasKey( 'slug', $properties );
 		$this->assertArrayHasKey( 'status', $properties );
 		$this->assertArrayHasKey( 'sticky', $properties );
@@ -3473,6 +3474,7 @@ class WP_Test_REST_Posts_Controller extends WP_Test_REST_Post_Type_Controller_Te
 			'modified_gmt',
 			'password',
 			'ping_status',
+			'preview_link',
 			'slug',
 			'status',
 			'sticky',
