diff --git a/apps/minio/importer/importer.go b/apps/minio/importer/importer.go
new file mode 100644
index 0000000..38e0637
--- /dev/null
+++ b/apps/minio/importer/importer.go
@@ -0,0 +1,89 @@
+package importer
+
+import (
+	"bytes"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"io/ioutil"
+	"net/http"
+
+	"github.com/golang/glog"
+	"github.com/itaysk/regogo"
+)
+
+var jsonContentType = "application/json"
+
+var addImgTmpl = `mutation {
+  addImage(input: [{ objectPath: %s }]) {
+    image {
+      id
+    }
+  }
+}`
+
+type Query struct {
+	Query string
+}
+
+func EventToQuery(event string) (Query, error) {
+	key, err := regogo.Get(event, "input.Key")
+	if err != nil {
+		return Query{}, err
+	}
+	keyStr := key.String()
+	if keyStr == "" {
+		return Query{}, errors.New("Key not found")
+	}
+	objectPath, err := json.Marshal(key.String())
+	if err != nil {
+		return Query{}, err
+	}
+	return Query{fmt.Sprintf(addImgTmpl, objectPath)}, nil
+}
+
+type Handler struct {
+	ApiAddr string
+}
+
+func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
+	body, err := ioutil.ReadAll(r.Body)
+	if err != nil {
+		glog.Error(err)
+		http.Error(w, "Could not read HTTP request body", http.StatusBadRequest)
+		return
+	}
+	if len(body) == 0 {
+		// Just a health check from Minio
+		return
+	}
+	bodyStr := string(body)
+	glog.Infof("Received event from Minio: %s", bodyStr)
+	query, err := EventToQuery(bodyStr)
+	if err != nil {
+		glog.Error(err)
+		http.Error(w, "INTERNAL", http.StatusBadRequest)
+		return
+	}
+	glog.Info(query)
+	queryJson, err := json.Marshal(query)
+	if err != nil {
+		panic(err)
+	}
+	resp, err := http.Post(h.ApiAddr, jsonContentType, bytes.NewReader(queryJson))
+	if err != nil {
+		glog.Error(err)
+		http.Error(w, "Query failed", http.StatusInternalServerError)
+		return
+	}
+	if resp.StatusCode != http.StatusOK {
+		glog.Error(resp.StatusCode)
+		http.Error(w, "Query failed", resp.StatusCode)
+		return
+	}
+	respBody, err := ioutil.ReadAll(resp.Body)
+	if err != nil {
+		panic(err)
+	}
+	glog.Info(string(respBody))
+}
