diff --git a/src/routes/channels/delete_channel.rs b/src/routes/channels/delete_channel.rs
index 9fd0881fc17950b14b24736c7a757e9639e5f62c..7fc65de1a5a9630d0c5ccda3e11e666b327d3134 100644
--- a/src/routes/channels/delete_channel.rs
+++ b/src/routes/channels/delete_channel.rs
@@ -12,7 +12,7 @@ pub async fn req(user: User, target: Ref) -> Result<()> {
         .for_channel()
         .await?;
     if !perm.get_view() {
-        Err(Error::LabelMe)?
+        Err(Error::MissingPermission)?
     }
 
     match &target {
diff --git a/src/routes/channels/fetch_channel.rs b/src/routes/channels/fetch_channel.rs
index d5e686741185c4c4a990c3071193ca3cda610d91..75a7d5b0229dbb23f4bc8157102c81137e60e04e 100644
--- a/src/routes/channels/fetch_channel.rs
+++ b/src/routes/channels/fetch_channel.rs
@@ -12,7 +12,7 @@ pub async fn req(user: User, target: Ref) -> Result<JsonValue> {
         .for_channel()
         .await?;
     if !perm.get_view() {
-        Err(Error::LabelMe)?
+        Err(Error::MissingPermission)?
     }
 
     Ok(json!(target))
diff --git a/src/routes/channels/group_add_member.rs b/src/routes/channels/group_add_member.rs
index 4ff36fd9f187413fab5f141c2a7e40d867e9e3b9..e925fd92a76a808949934e0fcfc3804b59cbd940 100644
--- a/src/routes/channels/group_add_member.rs
+++ b/src/routes/channels/group_add_member.rs
@@ -16,7 +16,7 @@ pub async fn req(user: User, target: Ref, member: Ref) -> Result<()> {
         .for_channel()
         .await?;
     if !perm.get_view() {
-        Err(Error::LabelMe)?
+        Err(Error::MissingPermission)?
     }
 
     if let Channel::Group { id, recipients, .. } = &channel {
diff --git a/src/routes/channels/group_remove_member.rs b/src/routes/channels/group_remove_member.rs
index 08bd4e31536c2e4684f6a2990b5e222ec0e41c1f..e12414bf3b0be3d8e6e4aac0bce0a00cc91f19fa 100644
--- a/src/routes/channels/group_remove_member.rs
+++ b/src/routes/channels/group_remove_member.rs
@@ -20,7 +20,7 @@ pub async fn req(user: User, target: Ref, member: Ref) -> Result<()> {
     {
         if &user.id != owner {
             // figure out if we want to use perm system here
-            Err(Error::LabelMe)?
+            Err(Error::MissingPermission)?
         }
 
         if recipients.iter().find(|x| *x == &member.id).is_none() {
diff --git a/src/routes/channels/message_delete.rs b/src/routes/channels/message_delete.rs
index 85bdfed986533b9e1afb3b7c9d4841db3324ace7..fa794d774d1653fd66914acafe48d499275f5da0 100644
--- a/src/routes/channels/message_delete.rs
+++ b/src/routes/channels/message_delete.rs
@@ -12,7 +12,7 @@ pub async fn req(user: User, target: Ref, msg: Ref) -> Result<()> {
         .for_channel()
         .await?;
     if !perm.get_view() {
-        Err(Error::LabelMe)?
+        Err(Error::MissingPermission)?
     }
 
     let message = msg.fetch_message(&channel).await?;
diff --git a/src/routes/channels/message_edit.rs b/src/routes/channels/message_edit.rs
index dc559c203277072ff67888e2f27a4dd55ab62a6c..15cdc48d8f91133e5d7736f8a0774b24cb356fd3 100644
--- a/src/routes/channels/message_edit.rs
+++ b/src/routes/channels/message_edit.rs
@@ -24,7 +24,7 @@ pub async fn req(user: User, target: Ref, msg: Ref, edit: Json<Data>) -> Result<
         .for_channel()
         .await?;
     if !perm.get_view() {
-        Err(Error::LabelMe)?
+        Err(Error::MissingPermission)?
     }
 
     let message = msg.fetch_message(&channel).await?;
diff --git a/src/routes/channels/message_fetch.rs b/src/routes/channels/message_fetch.rs
index 162e48dbba54d2e96f936fc0cb191508c249209b..d308c84acc0c9df2059b306cb70f34cd29ada049 100644
--- a/src/routes/channels/message_fetch.rs
+++ b/src/routes/channels/message_fetch.rs
@@ -12,7 +12,7 @@ pub async fn req(user: User, target: Ref, msg: Ref) -> Result<JsonValue> {
         .for_channel()
         .await?;
     if !perm.get_view() {
-        Err(Error::LabelMe)?
+        Err(Error::MissingPermission)?
     }
 
     let message = msg.fetch_message(&channel).await?;
diff --git a/src/routes/channels/message_query.rs b/src/routes/channels/message_query.rs
index c30967f8dddcbc86d8ebf89389012dcb9df648c8..dadf8b54e09d527d4f6f485a503f2dc9fe54fced 100644
--- a/src/routes/channels/message_query.rs
+++ b/src/routes/channels/message_query.rs
@@ -34,7 +34,7 @@ pub async fn req(user: User, target: Ref, options: Form<Options>) -> Result<Json
         .for_channel()
         .await?;
     if !perm.get_view() {
-        Err(Error::LabelMe)?
+        Err(Error::MissingPermission)?
     }
 
     let mut query = doc! { "channel": target.id() };
diff --git a/src/routes/channels/message_query_stale.rs b/src/routes/channels/message_query_stale.rs
index 300ae76524de9634d62f05dcf77c1028000eece8..2930a423a67426b9d0a4b5e95b4998bba05e0d51 100644
--- a/src/routes/channels/message_query_stale.rs
+++ b/src/routes/channels/message_query_stale.rs
@@ -14,7 +14,7 @@ pub struct Options {
 #[post("/<target>/messages/stale", data = "<data>")]
 pub async fn req(user: User, target: Ref, data: Json<Options>) -> Result<JsonValue> {
     if data.ids.len() > 150 {
-        return Err(Error::LabelMe);
+        return Err(Error::TooManyIds);
     }
 
     let target = target.fetch_channel().await?;
@@ -24,7 +24,7 @@ pub async fn req(user: User, target: Ref, data: Json<Options>) -> Result<JsonVal
         .for_channel()
         .await?;
     if !perm.get_view() {
-        Err(Error::LabelMe)?
+        Err(Error::MissingPermission)?
     }
 
     let mut cursor = get_collection("messages")
diff --git a/src/routes/channels/message_send.rs b/src/routes/channels/message_send.rs
index aaf275ed3c50ba60dda4758a5bb961cfb962f992..9f6fb93d9e50c3a996b633076a52b1e5b51338ed 100644
--- a/src/routes/channels/message_send.rs
+++ b/src/routes/channels/message_send.rs
@@ -34,7 +34,7 @@ pub async fn req(user: User, target: Ref, message: Json<Data>) -> Result<JsonVal
         .for_channel()
         .await?;
     if !perm.get_send_message() {
-        Err(Error::LabelMe)?
+        Err(Error::MissingPermission)?
     }
 
     if get_collection("messages")
diff --git a/src/routes/users/fetch_user.rs b/src/routes/users/fetch_user.rs
index 9a660719c67c7b80092eb5f0fee9ae97f2f71eb3..063ddf34d6b09bfa1ae1138d5d6486d3cb5fedca 100644
--- a/src/routes/users/fetch_user.rs
+++ b/src/routes/users/fetch_user.rs
@@ -13,7 +13,7 @@ pub async fn req(user: User, target: Ref) -> Result<JsonValue> {
         .await?;
 
     if !perm.get_access() {
-        Err(Error::LabelMe)?
+        Err(Error::MissingPermission)?
     }
 
     Ok(json!(target.from(&user).with(perm)))
diff --git a/src/routes/users/find_mutual.rs b/src/routes/users/find_mutual.rs
index 7b3f1f640a11c91e70c70366de98070eff2d0f89..2a31d4bd59cb7502c8586f55af9dbc103f8f5e36 100644
--- a/src/routes/users/find_mutual.rs
+++ b/src/routes/users/find_mutual.rs
@@ -12,8 +12,8 @@ pub async fn req(user: User, target: Ref) -> Result<JsonValue> {
         .find(
             doc! {
                 "$and": [
-                    { "relations.id": &user.id },
-                    { "relations.id": &target.id }
+                    { "relations._id": &user.id },
+                    { "relations._id": &target.id }
                 ]
             },
             FindOptions::builder().projection(doc! { "_id": 1 }).build(),
diff --git a/src/util/result.rs b/src/util/result.rs
index e69c48a5e7696da6b84888ddfe72719a431ba451..0a1e982ca4886ebf7eb8ee3ae017199326521f8b 100644
--- a/src/util/result.rs
+++ b/src/util/result.rs
@@ -50,6 +50,8 @@ pub enum Error {
     NotInGroup,
 
     // ? General errors.
+    #[snafu(display("Trying to fetch too much data."))]
+    TooManyIds,
     #[snafu(display("Failed to validate fields."))]
     FailedValidation { error: ValidationErrors },
     #[snafu(display("Encountered a database error."))]
@@ -59,6 +61,8 @@ pub enum Error {
     },
     #[snafu(display("Internal server error."))]
     InternalError,
+    #[snafu(display("Missing permission."))]
+    MissingPermission,
     #[snafu(display("Operation cannot be performed on this object."))]
     InvalidOperation,
     #[snafu(display("Already created an object with this nonce."))]
@@ -96,7 +100,9 @@ impl<'r> Responder<'r, 'static> for Error {
             Error::FailedValidation { .. } => Status::UnprocessableEntity,
             Error::DatabaseError { .. } => Status::InternalServerError,
             Error::InternalError => Status::InternalServerError,
+            Error::MissingPermission => Status::Forbidden,
             Error::InvalidOperation => Status::BadRequest,
+            Error::TooManyIds => Status::BadRequest,
             Error::DuplicateNonce => Status::Conflict,
             Error::NoEffect => Status::Ok,
         };