diff --git a/src/api/client_server/media.rs b/src/api/client_server/media.rs
index c2778294c7eea2e2b67924eab7bfe4b790a8ebcd..e8fe0b695d01fb1697c120043c524854e0fcd2e4 100644
--- a/src/api/client_server/media.rs
+++ b/src/api/client_server/media.rs
@@ -42,21 +42,33 @@ pub async fn get_media_preview_route(
 		return Err(Error::BadRequest(ErrorKind::Forbidden, "URL is not allowed to be previewed"));
 	}
 
-	if let Ok(preview) = get_url_preview(url).await {
-		let res = serde_json::value::to_raw_value(&preview).map_err(|e| {
-			error!("Failed to convert UrlPreviewData into a serde json value: {}", e);
-			Error::BadRequest(ErrorKind::Unknown, "Unknown error occurred parsing URL preview")
-		})?;
-
-		return Ok(get_media_preview::v3::Response::from_raw_value(res));
-	}
+	match get_url_preview(url).await {
+		Ok(preview) => {
+			let res = serde_json::value::to_raw_value(&preview).map_err(|e| {
+				error!("Failed to convert UrlPreviewData into a serde json value: {}", e);
+				Error::BadRequest(
+					ErrorKind::LimitExceeded {
+						retry_after_ms: Some(Duration::from_secs(5)),
+					},
+					"Failed to generate a URL preview, try again later.",
+				)
+			})?;
+
+			Ok(get_media_preview::v3::Response::from_raw_value(res))
+		},
+		Err(e) => {
+			warn!("Failed to generate a URL preview: {e}");
 
-	Err(Error::BadRequest(
-		ErrorKind::LimitExceeded {
-			retry_after_ms: Some(Duration::from_secs(5)),
+			// there doesn't seem to be an agreed-upon error code in the spec.
+			// the only response codes in the preview_url spec page are 200 and 429.
+			Err(Error::BadRequest(
+				ErrorKind::LimitExceeded {
+					retry_after_ms: Some(Duration::from_secs(5)),
+				},
+				"Failed to generate a URL preview, try again later.",
+			))
 		},
-		"Retry later",
-	))
+	}
 }
 
 /// # `POST /_matrix/media/v3/upload`