diff --git src/wp-admin/js/widgets/media-video-widget.js src/wp-admin/js/widgets/media-video-widget.js
index 547c4efc48..d74145eee1 100644
--- src/wp-admin/js/widgets/media-video-widget.js
+++ src/wp-admin/js/widgets/media-video-widget.js
@@ -98,7 +98,7 @@
 		 */
 		fetchEmbed: function fetchEmbed() {
 			var control = this, url;
-			url = control.model.get( 'url' );
+			url = jQuery.trim( control.model.get( 'url' ) );
 
 			// If we already have a local cache of the embed response, return.
 			if ( control.oembedResponses[ url ] ) {
@@ -113,7 +113,7 @@
 			control.fetchEmbedDfd = jQuery.ajax({
 				url: wp.media.view.settings.oEmbedProxyUrl,
 				data: {
-					url: control.model.get( 'url' ),
+					url: url,
 					maxwidth: control.model.get( 'width' ),
 					maxheight: control.model.get( 'height' ),
 					_wpnonce: wp.media.view.settings.nonce.wpRestApi,
@@ -142,7 +142,7 @@
 		renderPreview: function renderPreview() {
 			var control = this, previewContainer, previewTemplate, attachmentId, attachmentUrl, poster, isHostedEmbed = false, parsedUrl, mime, error;
 			attachmentId = control.model.get( 'attachment_id' );
-			attachmentUrl = control.model.get( 'url' );
+			attachmentUrl = jQuery.trim( control.model.get( 'url' ) );
 			error = control.model.get( 'error' );
 
 			if ( ! attachmentId && ! attachmentUrl ) {
diff --git src/wp-admin/js/widgets/media-widgets.js src/wp-admin/js/widgets/media-widgets.js
index cd03b09633..7dd10f154a 100644
--- src/wp-admin/js/widgets/media-widgets.js
+++ src/wp-admin/js/widgets/media-widgets.js
@@ -142,13 +142,11 @@ wp.mediaWidgets = ( function( $ ) {
 					/**
 					 * Fetch media.
 					 *
-					 * This is a TEMPORARY measure until the WP API supports an oEmbed proxy endpoint. See #40450.
-					 *
-					 * @see https://core.trac.wordpress.org/ticket/40450
 					 * @returns {void}
 					 */
 					fetch: function() {
-						var embedLinkView = this, fetchSuccess, matches, fileExt, urlParser; // eslint-disable-line consistent-this
+						var embedLinkView = this, fetchSuccess, matches, fileExt, urlParser, url; // eslint-disable-line consistent-this
+						url = $.trim( embedLinkView.model.get( 'url' ) );
 
 						if ( embedLinkView.dfd && 'pending' === embedLinkView.dfd.state() ) {
 							embedLinkView.dfd.abort();
@@ -167,7 +165,7 @@ wp.mediaWidgets = ( function( $ ) {
 						};
 
 						urlParser = document.createElement( 'a' );
-						urlParser.href = embedLinkView.model.get( 'url' );
+						urlParser.href = url;
 						matches = urlParser.pathname.toLowerCase().match( /\.(\w+)$/ );
 						if ( matches ) {
 							fileExt = matches[1];
@@ -184,7 +182,7 @@ wp.mediaWidgets = ( function( $ ) {
 						embedLinkView.dfd = $.ajax({
 							url: wp.media.view.settings.oEmbedProxyUrl,
 							data: {
-								url: embedLinkView.model.get( 'url' ),
+								url: url,
 								maxwidth: embedLinkView.model.get( 'width' ),
 								maxheight: embedLinkView.model.get( 'height' ),
 								_wpnonce: wp.media.view.settings.nonce.wpRestApi,
@@ -779,6 +777,11 @@ wp.mediaWidgets = ( function( $ ) {
 				mediaFramePropToModelPropMap[ fieldSchema.media_prop || modelProp ] = modelProp;
 			});
 
+			// Trim whitespace from url since it causes problems with oembeds.
+			if ( mediaFrameProps.url ) {
+				mediaFrameProps.url = $.trim( mediaFrameProps.url );
+			}
+
 			_.each( mediaFrameProps, function( value, mediaProp ) {
 				var propName = mediaFramePropToModelPropMap[ mediaProp ] || mediaProp;
 				if ( control.model.schema[ propName ] ) {
diff --git src/wp-includes/media.php src/wp-includes/media.php
index 6843c61b21..be6c328167 100644
--- src/wp-includes/media.php
+++ src/wp-includes/media.php
@@ -3424,7 +3424,7 @@ function wp_enqueue_media( $args = array() ) {
 			'audio' => ( $show_audio_playlist ) ? 1 : 0,
 			'video' => ( $show_video_playlist ) ? 1 : 0,
 		),
-		'oEmbedProxyUrl' => rest_url( 'oembed/1.0/proxy' ),
+		'oEmbedProxyUrl' => preg_replace( '#^\w+:#', '', rest_url( 'oembed/1.0/proxy' ) ),
 		'embedExts'    => $exts,
 		'embedMimes'   => $ext_mimes,
 		'contentWidth' => $content_width,
diff --git tests/qunit/wp-admin/js/widgets/test-media-video-widget.js tests/qunit/wp-admin/js/widgets/test-media-video-widget.js
index f3b111ecc5..69d9ff6197 100644
--- tests/qunit/wp-admin/js/widgets/test-media-video-widget.js
+++ tests/qunit/wp-admin/js/widgets/test-media-video-widget.js
@@ -28,10 +28,11 @@
 		equal( mappedProps.preload, 'meta', 'mapModelToMediaFrameProps should set preload' );
 
 		// Test mapMediaToModelProps().
-		mappedProps = videoWidgetControlInstance.mapMediaToModelProps( { loop: false, preload: 'meta', url: testVideoUrl, title: 'random movie file title' } );
+		mappedProps = videoWidgetControlInstance.mapMediaToModelProps( { loop: false, preload: 'meta', url: testVideoUrl + ' ', title: 'random movie file title' } );
 		equal( mappedProps.title, undefined, 'mapMediaToModelProps should ignore title inputs' );
 		equal( mappedProps.loop, false, 'mapMediaToModelProps should set loop' );
 		equal( mappedProps.preload, 'meta', 'mapMediaToModelProps should set preload' );
+		equal( mappedProps.url, testVideoUrl, 'mapMediaToModelProps should trim whitespace from urls' );
 	});
 
 	test( 'video widget control renderPreview', function( assert ) {
