diff --git src/wp-includes/embed.php src/wp-includes/embed.php
index cdeaf79..f3916e7 100644
--- src/wp-includes/embed.php
+++ src/wp-includes/embed.php
@@ -343,13 +343,17 @@ function wp_oembed_register_route() {
  * @since 4.4.0
  */
 function wp_oembed_add_discovery_links() {
+	$post      = get_post( $post );
+	$post_type = get_post_type( $post );
 	$output = '';
 
 	if ( is_singular() ) {
-		$output .= '<link rel="alternate" type="application/json+oembed" href="' . esc_url( get_oembed_endpoint_url( get_permalink() ) ) . '" />' . "\n";
+		if(  is_post_type_embeddable($post_type) ) {
+			$output .= '<link rel="alternate" type="application/json+oembed" href="' . esc_url( get_oembed_endpoint_url( get_permalink() ) ) . '" />' . "\n";
 
-		if ( class_exists( 'SimpleXMLElement' ) ) {
-			$output .= '<link rel="alternate" type="text/xml+oembed" href="' . esc_url( get_oembed_endpoint_url( get_permalink(), 'xml' ) ) . '" />' . "\n";
+			if ( class_exists( 'SimpleXMLElement' ) ) {
+				$output .= '<link rel="alternate" type="text/xml+oembed" href="' . esc_url( get_oembed_endpoint_url( get_permalink(), 'xml' ) ) . '" />' . "\n";
+			}
 		}
 	}
 
@@ -516,7 +520,8 @@ JS;
  * @return array|false Response data on success, false if post doesn't exist.
  */
 function get_oembed_response_data( $post, $width ) {
-	$post = get_post( $post );
+	$post      = get_post( $post );
+	$post_type = get_post_type( $post );
 
 	if ( ! $post ) {
 		return false;
@@ -526,6 +531,10 @@ function get_oembed_response_data( $post, $width ) {
 		return false;
 	}
 
+	if( ! is_post_type_embeddable($post_type) ) {
+		return false;
+	}
+
 	/**
 	 * Filter the allowed minimum and maximum widths for the oEmbed response.
 	 *
diff --git src/wp-includes/post.php src/wp-includes/post.php
index 70a7d73..51a26d2 100644
--- src/wp-includes/post.php
+++ src/wp-includes/post.php
@@ -962,6 +962,8 @@ function get_post_types( $args = array(), $output = 'names', $operator = 'and' )
  *     @type bool|string $has_archive          Whether there should be post type archives, or if a string, the
  *                                             archive slug to use. Will generate the proper rewrite rules if
  *                                             $rewrite is enabled. Default false.
+ *     @type bool        $is_embeddable        Whether this post type should be embeddable through oembed.
+ *                                             Default is value of $public.
  *     @type bool|array  $rewrite              {
  *         Triggers the handling of rewrites for this post type. To prevent rewrite, set to false.
  *         Defaults to true, using $post_type as slug. To specify rewrite rules, an array can be
@@ -1039,6 +1041,7 @@ function register_post_type( $post_type, $args = array() ) {
 		'register_meta_box_cb' => null,
 		'taxonomies'           => array(),
 		'has_archive'          => false,
+		'is_embeddable'        => null,
 		'rewrite'              => true,
 		'query_var'            => true,
 		'can_export'           => true,
@@ -1158,11 +1161,16 @@ function register_post_type( $post_type, $args = array() ) {
 				add_rewrite_rule( "{$archive_slug}/{$wp_rewrite->pagination_base}/([0-9]{1,})/?$", "index.php?post_type=$post_type" . '&paged=$matches[1]', 'top' );
 		}
 
+
 		$permastruct_args = $args->rewrite;
 		$permastruct_args['feed'] = $permastruct_args['feeds'];
 		add_permastruct( $post_type, "{$args->rewrite['slug']}/%$post_type%", $permastruct_args );
 	}
 
+	// If not set, default to the setting for public.
+	if ( null === $args->is_embeddable )
+		$args->is_embeddable = $args->public;
+
 	// Register the post type meta box if a custom callback was specified.
 	if ( $args->register_meta_box_cb )
 		add_action( 'add_meta_boxes_' . $post_type, $args->register_meta_box_cb, 10, 1 );
@@ -1687,6 +1695,25 @@ function is_post_type_viewable( $post_type ) {
 }
 
 /**
+ * Determines whether a post type is considered "embeddable".
+ *
+ * For all post types the 'is_embeddable' value will be evaluated.
+ *
+ * @param object $post_type Post type name or object.
+ * @return bool Whether the post type should be considered embeddable.
+ */
+function is_post_type_embeddable( $post_type ) {
+	if ( is_scalar( $post_type ) ) {
+		$post_type = get_post_type_object( $post_type );
+		if ( ! $post_type ) {
+			return false;
+		}
+	}
+
+	return $post_type->is_embeddable;
+}
+
+/**
  * Retrieve list of latest posts or posts matching criteria.
  *
  * The defaults are as follows:
