diff --git a/server/api/api.go b/server/api/api.go
new file mode 100644
index 0000000..fd78ee4
--- /dev/null
+++ b/server/api/api.go
@@ -0,0 +1,67 @@
+package api
+
+import (
+	"fmt"
+	"log"
+	"net/http"
+
+	"github.com/gin-gonic/gin"
+	"github.com/iomodo/staff/app"
+)
+
+const APIURLSuffix = "/api/v1"
+const HealthCheckPath = "/healthcheck"
+
+type API struct {
+	Logger  *log.Logger
+	Root    *gin.Engine
+	APIRoot *gin.RouterGroup // 'api/v1'
+	Auth    *gin.RouterGroup // 'api/v1/auth'
+}
+
+// Init initializes api
+func Init(router *gin.Engine, application *app.App) error {
+	apiObj := API{}
+	apiObj.Root = router
+	apiObj.Root.Use(func(c *gin.Context) {
+		c.Set("app", application)
+		c.Next()
+	})
+	apiObj.APIRoot = router.Group(APIURLSuffix)
+	apiObj.initHealthCheck()
+
+	apiObj.Root.NoRoute(func(c *gin.Context) {
+		c.JSON(http.StatusNotFound, "Page not found")
+	})
+
+	return nil
+}
+
+func (apiObj *API) initHealthCheck() {
+	apiObj.Root.GET(HealthCheckPath, healthCheck)
+}
+
+func healthCheck(c *gin.Context) {
+	_, err := getApp(c)
+	if err != nil {
+		responseFormat(c, http.StatusInternalServerError, err.Error())
+		return
+	}
+	responseFormat(c, http.StatusOK, "OK")
+}
+
+func responseFormat(c *gin.Context, respStatus int, data interface{}) {
+	c.JSON(respStatus, data)
+}
+
+func getApp(c *gin.Context) (*app.App, error) {
+	appInt, ok := c.Get("app")
+	if !ok {
+		return nil, fmt.Errorf("missing application in the context")
+	}
+	a, ok := appInt.(*app.App)
+	if !ok {
+		return nil, fmt.Errorf("wrong data type of the application in the context")
+	}
+	return a, nil
+}
