diff --git a/README.md b/README.md
index d2063aa..5a80a20 100644
--- a/README.md
+++ b/README.md
@@ -3,15 +3,30 @@
 ## Structure du projet
 
  * .env : fichier de configuration
+ * controllers : actions possibles par l'API REST
+ * docs : doc swagger (swagger -i)
+ * routes : configuration des routes
  * views : fichiers html dynamiques
  * dao : fichiers pour faire des requetes en BDD
  * models : structures utilisées pour manipuler le contenu de la base de données
 
 ## Lancement
 
+### Backend
+
 Il faut mettre en place une base de données [MongoDB](https://www.mongodb.com/).
 Il est nécessaire d'avoir [une application Discord](https://discord.com/developers/) 
 et [une clé d'API Steam](https://steamcommunity.com/dev).
 Configurez ensuite le fichier `example.env` et renommez le en `.env`.
 
 Lancez le serveur avec `go run main.go`.
+
+### Documentation
+
+Installer swager avec Go et lancer le. Vous pouvez démarrer le serveur et aller
+sur le lien [de la documentation](localhost:8080/swagger) pour pouvoir la lire en ligne.
+
+```
+go install github.com/swaggo/swag
+swag init
+```
diff --git a/controllers/group.go b/controllers/group.go
new file mode 100644
index 0000000..a162a5c
--- /dev/null
+++ b/controllers/group.go
@@ -0,0 +1,169 @@
+package controllers
+
+import (
+	"cds/dao"
+	"fmt"
+
+	"github.com/gofiber/fiber/v2"
+	"go.mongodb.org/mongo-driver/mongo"
+)
+
+type Groupe struct {
+	Name   int `json:"name"`
+	Max    int `json:"max"`
+	Leader int `json:"leader"`
+	//Players []Account `json:"players"`
+	//Events  []Event   `json:events`
+}
+
+/*
+type Event struct {
+	Id    int `json:"id"`
+	Start int `json:"start"`
+	End   int `json:"end"`
+}
+*/
+
+// @Summary Renvoie les informations sur un groupe
+// @Tags groups
+// @Produce json
+// @Success 200 {json} Groupe
+// @Failure 400
+// @Failure 404
+// @Router /groups/{id} [get]
+func GetInfos(c *fiber.Ctx) error {
+	token := checkCookie(c)
+	if token == "" {
+		return c.SendStatus(fiber.StatusForbidden)
+	} else {
+		id := c.Params("id")
+		group, err := dao.GetGroupById(id)
+		if err == mongo.ErrNoDocuments {
+			return c.SendStatus(fiber.StatusNotFound)
+		} else if err != nil {
+			return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
+				"error": fmt.Sprint(err),
+			})
+		} else {
+			return c.Status(fiber.StatusOK).JSON(group)
+		}
+	}
+}
+
+// @Summary Renvoie les events d'un groupe
+// @Tags groups
+// @Produce json
+// @Success 200 {json} Groupe
+// @Failure 400
+// @Failure 404
+// @Router /groups/{id}/events [get]
+func GetEvents(c *fiber.Ctx) error {
+	return nil
+}
+
+// @Summary Créer un groupe
+// @Tags groups
+// @Accept json
+// @Success 200
+// @Failure 400
+// @Failure 404
+// @Router /groups/create [put]
+func CreateGroup(c *fiber.Ctx) error {
+	return nil
+}
+
+// @Summary Rejoindre un groupe
+// @Tags groups
+// @Accept json
+// @Produce json
+// @Success 200
+// @Failure 400
+// @Failure 404
+// @Router /groups/join [put]
+func JoinGroup(c *fiber.Ctx) error {
+	return nil
+}
+
+// @Summary Quitte un groupe
+// @Tags groups
+// @Accept json
+// @Produce json
+// @Success 200
+// @Failure 400
+// @Failure 404
+// @Router /groups/leave [put]
+func LeaveGroupe(c *fiber.Ctx) error {
+	return nil
+}
+
+// @Summary Change le chef d'un groupe
+// @Tags groups
+// @Accept json
+// @Produce json
+// @Success 200
+// @Failure 400
+// @Failure 404
+// @Router /groups/switch [put]
+func ChangeLeader(c *fiber.Ctx) error {
+	return nil
+}
+
+// @Summary Prépare un event
+// @Tags groups
+// @Accept json
+// @Produce json
+// @Success 200
+// @Failure 400
+// @Failure 404
+// @Router /groups/events/plan [put]
+func CreateEvent(c *fiber.Ctx) error {
+	return nil
+}
+
+// @Summary Change un event
+// @Tags groups
+// @Accept json
+// @Produce json
+// @Success 200
+// @Failure 400
+// @Failure 404
+// @Router /groups/events/change [put]
+func ChangeEvent(c *fiber.Ctx) error {
+	return nil
+}
+
+// @Summary Ferme un groupe et distribue les points CDS
+// @Tags groups
+// @Accept json
+// @Produce json
+// @Success 200
+// @Failure 400
+// @Failure 404
+// @Router /groups/end [put]
+func EndGroup(c *fiber.Ctx) error {
+	return nil
+}
+
+// @Summary Supprime un groupe sans distribuer de points
+// @Tags groups
+// @Accept json
+// @Produce json
+// @Success 200
+// @Failure 400
+// @Failure 404
+// @Router /groups/cancel [delete]
+func DeleteGroup(c *fiber.Ctx) error {
+	return nil
+}
+
+// @Summary Supprime un event
+// @Tags groups
+// @Accept json
+// @Produce json
+// @Success 200
+// @Failure 400
+// @Failure 404
+// @Router /groups/events/cancel [delete]
+func DeleteEvent(c *fiber.Ctx) error {
+	return nil
+}
diff --git a/controllers/user.go b/controllers/user.go
new file mode 100644
index 0000000..564a2a3
--- /dev/null
+++ b/controllers/user.go
@@ -0,0 +1,105 @@
+package controllers
+
+import (
+	"cds/dao"
+	"fmt"
+
+	"github.com/gofiber/fiber/v2"
+	"go.mongodb.org/mongo-driver/mongo"
+)
+
+func GetUsers(c *fiber.Ctx) error {
+	token := checkCookie(c)
+	if token == "" {
+		return c.SendStatus(fiber.StatusForbidden)
+	} else {
+		id := c.Params("id")
+		group, err := dao.GetGroupById(id)
+		if err == mongo.ErrNoDocuments {
+			return c.SendStatus(fiber.StatusNotFound)
+		} else if err != nil {
+			return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
+				"error": fmt.Sprint(err),
+			})
+		} else {
+			return c.Status(fiber.StatusOK).JSON(group)
+		}
+	}
+}
+
+// @Summary Renvoie les informations sur le compte se trouvant sur le cookie.
+// @Produce json
+// @Success 200 {object} models.User
+// @Failure 403
+// @Failure 404
+// @Failure 500
+// @Router /users/current [get]
+func GetCurrentUser(c *fiber.Ctx) error {
+	token := c.Cookies("token", "")
+	if token == "" {
+		return c.SendStatus(fiber.StatusForbidden)
+	} else {
+		user, err := dao.GetById(token)
+		if err == mongo.ErrNoDocuments {
+			return c.SendStatus(fiber.StatusNotFound)
+		} else if err != nil {
+			return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
+				"error": fmt.Sprint(err),
+			})
+		} else {
+			return c.Status(fiber.StatusOK).JSON(user)
+		}
+	}
+}
+
+// @Summary Renvoie les informations sur le compte
+// @Produce json
+// @Success 200 {object} models.User
+// @Failure 403
+// @Failure 404
+// @Failure 500
+// @Router /users/{id} [get]
+func GetUser(c *fiber.Ctx) error {
+	token := checkCookie(c)
+	if token == "" {
+		return c.SendStatus(fiber.StatusForbidden)
+	} else {
+		id := c.Params("id")
+		user, err := dao.GetById(id)
+		if err == mongo.ErrNoDocuments {
+			return c.SendStatus(fiber.StatusNotFound)
+		} else if err != nil {
+			return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
+				"error": fmt.Sprint(err),
+			})
+		} else {
+			return c.Status(fiber.StatusOK).JSON(user)
+		}
+	}
+}
+
+// @Summary Renvoie la liste des groupes d'un utilisateur
+// @Produce json
+// @Success 200 {array} primitive.ObjectID "Liste des ids des groupes"
+// @Failure 403
+// @Failure 404
+// @Failure 500
+// @Router /users/{id}/groups [get]
+func GetGroupsUser(c *fiber.Ctx) error {
+	token := checkCookie(c)
+	if token == "" {
+		return c.SendStatus(fiber.StatusForbidden)
+	} else {
+		id := c.Params("id")
+		groups, err := dao.GetGroupByMember(id)
+		if err == mongo.ErrNoDocuments {
+			return c.SendStatus(fiber.StatusNotFound)
+		} else if err != nil {
+			return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
+				"error": fmt.Sprint(err),
+			})
+		} else {
+			return c.Status(fiber.StatusOK).JSON(groups)
+		}
+	}
+}
diff --git a/controllers/utils.go b/controllers/utils.go
new file mode 100644
index 0000000..36e645d
--- /dev/null
+++ b/controllers/utils.go
@@ -0,0 +1,7 @@
+package controllers
+
+import "github.com/gofiber/fiber/v2"
+
+func checkCookie(c *fiber.Ctx) string {
+	return c.Cookies("token", "")
+}
diff --git a/main.go b/main.go
index e360c74..fe895ea 100644
--- a/main.go
+++ b/main.go
@@ -4,14 +4,14 @@ import (
 	"cds/controllers"
 	"cds/dao"
 	"cds/models"
+	"cds/routes"
 	"fmt"
 	"os"
-	"time"
 
 	_ "cds/docs"
 
 	"github.com/gofiber/fiber/v2"
-	"github.com/gofiber/template/django"
+	"github.com/gofiber/swagger"
 	"github.com/joho/godotenv"
 	"github.com/markbates/goth"
 	"github.com/markbates/goth/providers/discord"
@@ -23,12 +23,11 @@ import (
 //const DISCORD_API = "https://discord.com/api/v10/"
 
 func setupRoutes(app *fiber.App) {
-	app.Get("/", index)
-
-	//api := app.Group("/api")
-	//routes.AccountRoute(api.Group("/accounts"))
-	//routes.GroupeRoute(api.Group("/groups"))
-	//app.Get("/swagger/*", swagger.HandlerDefault)
+	//app.Get("/", index)
+	api := app.Group("/api")
+	routes.GroupRoute(api.Group("/groups"))
+	routes.UserRoute(api.Group("/users"))
+	app.Get("/swagger/*", swagger.HandlerDefault)
 
 	app.Get("/login/:provider", goth_fiber.BeginAuthHandler)
 	app.Get("/auth/:provider", controllers.Auth)
@@ -98,7 +97,7 @@ func main() {
 		panic(err)
 	}
 
-	app := fiber.New(fiber.Config{Views: django.New("./views", ".django")})
+	app := fiber.New()
 	goth.UseProviders(
 		discord.New(
 			os.Getenv("DISCORD_ID"),
@@ -109,6 +108,8 @@ func main() {
 	)
 
 	setupRoutes(app)
+	app.Static("/", "./dist")
+	app.Static("/*", "./dist")
 
 	err = app.Listen(":8080")
 	if err != nil {
diff --git a/routes/accounts.go b/routes/accounts.go
new file mode 100644
index 0000000..26c3ba4
--- /dev/null
+++ b/routes/accounts.go
@@ -0,0 +1,13 @@
+package routes
+
+import (
+	"cds/controllers"
+
+	"github.com/gofiber/fiber/v2"
+)
+
+func UserRoute(route fiber.Router) {
+	route.Get("/current", controllers.GetCurrentUser)
+	route.Get("/:id", controllers.GetUser)
+	route.Get("/:id/groups", controllers.GetGroupsUser)
+}
diff --git a/routes/groupe.go b/routes/groupe.go
new file mode 100644
index 0000000..f2cac2b
--- /dev/null
+++ b/routes/groupe.go
@@ -0,0 +1,21 @@
+package routes
+
+import (
+	"cds/controllers"
+
+	"github.com/gofiber/fiber/v2"
+)
+
+func GroupRoute(route fiber.Router) {
+	route.Get("/:id", controllers.GetInfos)
+	route.Get("/:id/events", controllers.GetEvents)
+	route.Put("/create", controllers.CreateGroup)
+	route.Put("/join", controllers.JoinGroup)
+	route.Put("/leave", controllers.LeaveGroupe)
+	route.Put("/switch", controllers.ChangeLeader)
+	route.Put("/events/plan", controllers.CreateEvent)
+	route.Put("/events/change", controllers.ChangeEvent)
+	route.Put("/end", controllers.EndGroup)
+	route.Delete("/cancel", controllers.DeleteGroup)
+	route.Delete("/events/cancel", controllers.DeleteEvent)
+}