diff --git a/src/database/user.rs b/src/database/user.rs
index 56eff95c8dc7265d5a1a4f5faa3ac02ac5483e63..8f199f61927e3d2316d44e18c84873c1e8b817cc 100644
--- a/src/database/user.rs
+++ b/src/database/user.rs
@@ -1,7 +1,7 @@
 use bson::UtcDateTime;
 use serde::{Deserialize, Serialize};
 
-#[derive(Serialize, Deserialize, Debug)]
+#[derive(Serialize, Deserialize, Debug, Clone)]
 pub struct UserEmailVerification {
     pub verified: bool,
     pub target: Option<String>,
@@ -10,13 +10,13 @@ pub struct UserEmailVerification {
     pub code: Option<String>,
 }
 
-#[derive(Serialize, Deserialize, Debug)]
+#[derive(Serialize, Deserialize, Debug, Clone)]
 pub struct UserRelationship {
     pub id: String,
     pub status: u8,
 }
 
-#[derive(Serialize, Deserialize, Debug)]
+#[derive(Serialize, Deserialize, Debug, Clone)]
 pub struct User {
     #[serde(rename = "_id")]
     pub id: String,
diff --git a/src/guards/guild.rs b/src/guards/guild.rs
index daa277d5ced8aefd760ab31e77571414f47e1c99..58c258386cae63365dfdc361ce0d48b612451e90 100644
--- a/src/guards/guild.rs
+++ b/src/guards/guild.rs
@@ -1,38 +1,24 @@
-use rocket::http::{ RawStr };
-use rocket::request::{ FromParam };
-use bson::{ bson, doc, from_bson };
+use bson::{bson, doc, from_bson};
+use rocket::http::RawStr;
+use rocket::request::FromParam;
 
 use crate::database;
 
-use database::channel::Channel;
-use database::message::Message;
+use database::guild::Guild;
 
-impl<'r> FromParam<'r> for Channel {
+impl<'r> FromParam<'r> for Guild {
     type Error = &'r RawStr;
 
     fn from_param(param: &'r RawStr) -> Result<Self, Self::Error> {
-		let col = database::get_db().collection("channels");
-		let result = col.find_one(doc! { "_id": param.to_string() }, None).unwrap();
-
-		if let Some(channel) = result {
-			Ok(from_bson(bson::Bson::Document(channel)).expect("Failed to unwrap channel."))
-		} else {
-			Err(param)
-		}
-    }
-}
-
-impl<'r> FromParam<'r> for Message {
-    type Error = &'r RawStr;
-
-    fn from_param(param: &'r RawStr) -> Result<Self, Self::Error> {
-		let col = database::get_db().collection("messages");
-		let result = col.find_one(doc! { "_id": param.to_string() }, None).unwrap();
-
-		if let Some(message) = result {
-			Ok(from_bson(bson::Bson::Document(message)).expect("Failed to unwrap message."))
-		} else {
-			Err(param)
-		}
+        let col = database::get_db().collection("guilds");
+        let result = col
+            .find_one(doc! { "_id": param.to_string() }, None)
+            .unwrap();
+
+        if let Some(guild) = result {
+            Ok(from_bson(bson::Bson::Document(guild)).expect("Failed to unwrap guild."))
+        } else {
+            Err(param)
+        }
     }
 }
diff --git a/src/guards/mod.rs b/src/guards/mod.rs
index 4ea651acb778e1d9aff8e83e5b38e01bde561a7e..3924edfc5fbec7ec222cc8977cacf85d42605eaf 100644
--- a/src/guards/mod.rs
+++ b/src/guards/mod.rs
@@ -1,2 +1,3 @@
 pub mod auth;
 pub mod channel;
+pub mod guild;
diff --git a/src/routes/guild.rs b/src/routes/guild.rs
index 478b76116a6ea3e3fa7d74b1b12b38adaf816657..684b8b49564fef2552cfdc6b86dec8a4dad6361b 100644
--- a/src/routes/guild.rs
+++ b/src/routes/guild.rs
@@ -1,12 +1,89 @@
-use crate::database::{self, user::User};
+use crate::database::{self, channel::Channel, guild::Guild, user::User};
 
-use bson::{bson, doc};
+use bson::{bson, doc, from_bson, Bson};
 use rocket_contrib::json::{Json, JsonValue};
 use serde::{Deserialize, Serialize};
 use ulid::Ulid;
 
 use super::channel::ChannelType;
 
+/// fetch your guilds
+#[get("/@me")]
+pub fn my_guilds(user: User) -> JsonValue {
+    let col = database::get_collection("guilds");
+    let guilds = col
+        .find(
+            doc! {
+                "members": {
+                    "$elemMatch": {
+                        "id": user.id,
+                    }
+                }
+            },
+            None,
+        )
+        .unwrap();
+
+    let mut parsed = vec![];
+    for item in guilds {
+        let doc = item.unwrap();
+        parsed.push(json!({
+            "id": doc.get_str("_id").unwrap(),
+            "name": doc.get_str("name").unwrap(),
+            "description": doc.get_str("description").unwrap(),
+            "owner": doc.get_str("owner").unwrap(),
+        }));
+    }
+
+    json!(parsed)
+}
+
+/// fetch a guild
+#[get("/<target>")]
+pub fn guild(user: User, target: Guild) -> JsonValue {
+    let mut targets = vec![];
+    for channel in target.channels {
+        targets.push(Bson::String(channel));
+    }
+
+    let col = database::get_collection("channels");
+    match col.find(
+        doc! {
+            "_id": {
+                "$in": targets,
+            }
+        },
+        None,
+    ) {
+        Ok(results) => {
+            let mut channels = vec![];
+            for item in results {
+                let channel: Channel = from_bson(bson::Bson::Document(item.unwrap()))
+                    .expect("Failed to unwrap channel.");
+
+                channels.push(json!({
+                    "_id": channel.id,
+                    "last_message": channel.last_message,
+                    "name": channel.name,
+                    "description": channel.description,
+                }));
+            }
+
+            json!({
+                "id": target.id,
+                "name": target.name,
+                "description": target.description,
+                "owner": target.owner,
+                "channels": channels,
+            })
+        }
+        Err(_) => json!({
+            "success": false,
+            "error": "Failed to fetch channels."
+        }),
+    }
+}
+
 #[derive(Serialize, Deserialize)]
 pub struct CreateGuild {
     name: String,
@@ -47,7 +124,7 @@ pub fn create_guild(user: User, info: Json<CreateGuild>) -> JsonValue {
     if let Err(_) = channels.insert_one(
         doc! {
             "_id": channel_id.clone(),
-            "channel_type": ChannelType::GUILDCHANNEL as u32,
+            "type": ChannelType::GUILDCHANNEL as u32,
             "name": "general",
         },
         None,
@@ -71,7 +148,9 @@ pub fn create_guild(user: User, info: Json<CreateGuild>) -> JsonValue {
                     channel_id.clone()
                 ],
                 "members": [
-                    user.id
+                    {
+                        "id": user.id,
+                    }
                 ],
                 "invites": [],
             },
diff --git a/src/routes/mod.rs b/src/routes/mod.rs
index b6e409e87987e87ba11c9ac5e7c9b1e8141e9dbe..171155b5bda232b6bf34bfbd5bb989e8bc1ae0d9 100644
--- a/src/routes/mod.rs
+++ b/src/routes/mod.rs
@@ -45,5 +45,8 @@ pub fn mount(rocket: Rocket) -> Rocket {
                 channel::delete_message
             ],
         )
-        .mount("/api/guild", routes![guild::create_guild])
+        .mount(
+            "/api/guild",
+            routes![guild::my_guilds, guild::guild, guild::create_guild],
+        )
 }