Index: tests/phpunit/tests/rest-api/rest-posts-controller.php
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- tests/phpunit/tests/rest-api/rest-posts-controller.php	(revision 1f4ed43c65f618bae1507ac62880f28a45a12972)
+++ tests/phpunit/tests/rest-api/rest-posts-controller.php	(date 1538639528000)
@@ -3992,6 +3992,130 @@
 		$this->assertArrayHasKey( 'https://api.w.org/action-assign-tags', $links );
 	}
 
+	public function test_generated_permalink_template_and_slug_for_non_viewable_posts() {
+
+		$post_type = 'private-post';
+
+		register_post_type(
+			$post_type,
+			array(
+				'label'              => 'Private Posts',
+				'supports'           => array( 'title', 'editor', 'author' ),
+				'show_in_rest'       => true,
+				'publicly_queryable' => false,
+				'public'             => true,
+				'rest_base'          => 'private-post',
+			)
+		);
+
+		create_initial_rest_routes();
+
+		$this->generated_permalink_template_and_slug_tests( $post_type );
+
+		_unregister_post_type( 'private-post' );
+
+	}
+
+	public function test_generated_permalink_template_and_slug_for_non_public_posts() {
+
+		$post_type = 'private-post';
+
+		register_post_type(
+			$post_type,
+			array(
+				'label'        => 'Private Posts',
+				'supports'     => array( 'title', 'editor', 'author' ),
+				'show_in_rest' => true,
+				'public'       => false,
+				'rest_base'    => 'private-post',
+			)
+		);
+
+		create_initial_rest_routes();
+
+		$this->generated_permalink_template_and_slug_tests( $post_type );
+
+		_unregister_post_type( 'private-post' );
+
+	}
+
+	public function test_generated_permalink_template_and_slug_for_edit_posts() {
+
+		$this->generated_permalink_template_and_slug_tests( 'post' );
+	}
+
+	public function generated_permalink_template_and_slug_tests( $post_type ) {
+
+		$permalink_structure         = '%postname%';
+		$expected_permalink_template = trailingslashit( home_url( $permalink_structure ) );
+		$this->set_permalink_structure( "/$permalink_structure/" );
+
+		$post_type_obj = get_post_type_object( $post_type );
+
+		wp_set_current_user( self::$editor_id );
+
+		$post_id = $this->factory->post->create(
+			array(
+				'post_title' => 'Permalink Template',
+				'post_type'  => $post_type,
+			)
+		);
+
+		$post_endpoint_route = sprintf( '/wp/v2/%s/%d', $post_type_obj->rest_base, $post_id );
+
+		$request = new WP_REST_Request( 'GET', $post_endpoint_route );
+		$request->set_param( 'context', 'edit' );
+		$response = rest_get_server()->dispatch( $request );
+		$this->check_get_post_response( $response, 'edit' );
+		$read_data = $response->get_data();
+
+
+
+		if ( is_post_type_viewable( $post_type_obj ) && $post_type_obj->public  ) {
+
+			$this->assertArrayHasKey( 'permalink_template', $read_data );
+			$this->assertArrayHasKey( 'generated_slug', $read_data );
+
+			$this->assertEquals( $expected_permalink_template, $read_data['permalink_template'] );
+			$this->assertEquals( 'permalink-template', $read_data['generated_slug'] );
+		} else {
+
+			$this->assertArrayNotHasKey( 'permalink_template', $read_data );
+			$this->assertArrayNotHasKey( 'generated_slug', $read_data );
+		}
+
+		$request = new WP_REST_Request( 'POST', $post_endpoint_route );
+		$params  = array(
+			'title' => 'Permalink Template Slug',
+		);
+		$request->set_body_params( $params );
+		$response     = rest_get_server()->dispatch( $request );
+		$updated_data = $response->get_data();
+
+		if ( is_post_type_viewable( $post_type_obj ) && $post_type_obj->public  ) {
+
+			$this->assertArrayHasKey( 'permalink_template', $updated_data );
+			$this->assertArrayHasKey( 'generated_slug', $updated_data );
+			$this->assertArrayHasKey( 'slug', $updated_data );
+
+			$this->assertEquals( $expected_permalink_template, $updated_data['permalink_template'] );
+			$this->assertEquals( 'permalink-template-slug', $updated_data['generated_slug'] );
+			$this->assertEquals( 'permalink-template', $updated_data['slug'] );
+		} else {
+
+			$this->assertArrayNotHasKey( 'permalink_template', $updated_data );
+			$this->assertArrayNotHasKey( 'generated_slug', $updated_data );
+		}
+
+		$request  = new WP_REST_Request( 'GET', $post_endpoint_route );
+		$response = rest_get_server()->dispatch( $request );
+		$this->check_get_post_response( $response, 'view' );
+		$read_data = $response->get_data();
+
+		$this->assertArrayNotHasKey( 'permalink_template', $read_data );
+		$this->assertArrayNotHasKey( 'generated_slug', $read_data );
+	}
+
 	public function tearDown() {
 		_unregister_post_type( 'youseeeme' );
 		if ( isset( $this->attachment_id ) ) {
Index: src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php
IDEA additional info:
Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP
<+>UTF-8
===================================================================
--- src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php	(revision 1f4ed43c65f618bae1507ac62880f28a45a12972)
+++ src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php	(date 1538639528000)
@@ -1587,6 +1587,20 @@
 			}
 		}
 
+		$post_type_obj = get_post_type_object( $post->post_type );
+
+		if ( is_post_type_viewable( $post_type_obj ) && $post_type_obj->public  ) {
+
+			if ( ! function_exists( 'get_sample_permalink' ) ) {
+				require_once ABSPATH . '/wp-admin/includes/post.php';
+			}
+
+			$sample_permalink = get_sample_permalink( $post->ID, $post->post_title, '' );
+
+			$data['permalink_template'] = $sample_permalink[0];
+			$data['generated_slug']     = $sample_permalink[1];
+		}
+
 		$context = ! empty( $request['context'] ) ? $request['context'] : 'view';
 		$data    = $this->add_additional_fields_to_object( $data, $request );
 		$data    = $this->filter_response_by_context( $data, $context );
@@ -1915,6 +1929,23 @@
 
 		$post_type_obj = get_post_type_object( $this->post_type );
 
+		if ( is_post_type_viewable( $post_type_obj ) && $post_type_obj->public ) {
+
+			$schema['properties']['permalink_template'] = array(
+				'description' => __( 'Permalink template for the object.' ),
+				'type'        => 'string',
+				'context'     => array( 'edit' ),
+				'readonly'    => true,
+			);
+
+			$schema['properties']['generated_slug'] = array(
+				'description' => __( 'Autogenerated slug from post title.' ),
+				'type'        => 'string',
+				'context'     => array( 'edit' ),
+				'readonly'    => true,
+			);
+		}
+
 		if ( $post_type_obj->hierarchical ) {
 			$schema['properties']['parent'] = array(
 				'description' => __( 'The ID for the parent of the object.' ),
