diff --git a/src/core/error/mod.rs b/src/core/error/mod.rs
index 92dbdfe3..48b9b58f 100644
--- a/src/core/error/mod.rs
+++ b/src/core/error/mod.rs
@@ -141,19 +141,22 @@ impl Error {
 		use ruma::api::client::error::ErrorKind::Unknown;
 
 		match self {
-			Self::Federation(_, error) => response::ruma_error_kind(error).clone(),
+			Self::Federation(_, error) | Self::Ruma(error) => response::ruma_error_kind(error).clone(),
 			Self::BadRequest(kind, ..) | Self::Request(kind, ..) => kind.clone(),
 			_ => Unknown,
 		}
 	}
 
 	pub fn status_code(&self) -> http::StatusCode {
+		use http::StatusCode;
+
 		match self {
-			Self::Federation(_, ref error) | Self::Ruma(ref error) => error.status_code,
-			Self::Request(ref kind, _, code) => response::status_code(kind, *code),
-			Self::BadRequest(ref kind, ..) => response::bad_request_code(kind),
-			Self::Conflict(_) => http::StatusCode::CONFLICT,
-			_ => http::StatusCode::INTERNAL_SERVER_ERROR,
+			Self::Federation(_, error) | Self::Ruma(error) => error.status_code,
+			Self::Request(kind, _, code) => response::status_code(kind, *code),
+			Self::BadRequest(kind, ..) => response::bad_request_code(kind),
+			Self::Reqwest(error) => error.status().unwrap_or(StatusCode::INTERNAL_SERVER_ERROR),
+			Self::Conflict(_) => StatusCode::CONFLICT,
+			_ => StatusCode::INTERNAL_SERVER_ERROR,
 		}
 	}
 }
@@ -176,3 +179,7 @@ impl From<Infallible> for Error {
 pub fn infallible(_e: &Infallible) {
 	panic!("infallible error should never exist");
 }
+
+#[inline]
+#[must_use]
+pub fn is_not_found(e: &Error) -> bool { e.status_code() == http::StatusCode::NOT_FOUND }
diff --git a/src/core/result.rs b/src/core/result.rs
index c3eaf95b..41d1d66c 100644
--- a/src/core/result.rs
+++ b/src/core/result.rs
@@ -2,7 +2,11 @@ mod debug_inspect;
 mod log_debug_err;
 mod log_err;
 mod map_expect;
+mod not_found;
 
-pub use self::{debug_inspect::DebugInspect, log_debug_err::LogDebugErr, log_err::LogErr, map_expect::MapExpect};
+pub use self::{
+	debug_inspect::DebugInspect, log_debug_err::LogDebugErr, log_err::LogErr, map_expect::MapExpect,
+	not_found::NotFound,
+};
 
 pub type Result<T = (), E = crate::Error> = std::result::Result<T, E>;
diff --git a/src/core/result/not_found.rs b/src/core/result/not_found.rs
new file mode 100644
index 00000000..69ce821b
--- /dev/null
+++ b/src/core/result/not_found.rs
@@ -0,0 +1,12 @@
+use super::Result;
+use crate::{error, Error};
+
+pub trait NotFound<T> {
+	#[must_use]
+	fn is_not_found(&self) -> bool;
+}
+
+impl<T> NotFound<T> for Result<T, Error> {
+	#[inline]
+	fn is_not_found(&self) -> bool { self.as_ref().is_err_and(error::is_not_found) }
+}