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 4a00336e34..306afe4161 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
@@ -2261,8 +2261,34 @@ class WP_REST_Posts_Controller extends WP_REST_Controller {
 			$schema['links'] = $schema_links;
 		}
 
+		$schema = $this->add_additional_fields_schema( $schema );
+
+		/**
+		 * Filter the post's schema.
+		 *
+		 * The dynamic part of the filter `$this->post_type` refers to the post
+		 * type slug for the controller.
+		 *
+		 * @since 5.3.0
+		 *
+		 * @param array  $schema          Item schema data.
+		 * @param string $this->post_type Post type slug.
+		 */
+
+		$schema_fields = array_keys( $schema['properties'] );
+
+		$schema = apply_filters( "rest_{$this->post_type}_item_schema", $schema );
+
+		$new_fields = array_diff( array_keys( $schema['properties']), $schema_fields );
+
+		// Emit a _doing_it_wrong warning if user tries to add new properties using this filter.
+		if ( count($new_fields) > 0 ) {
+			_doing_it_wrong(__METHOD__, __( 'Please use register_rest_field to add new properties.' ), '5.3.0' );
+		}
+
 		$this->schema = $schema;
-		return $this->add_additional_fields_schema( $this->schema );
+
+		return $schema;
 	}
 
 	/**
