diff --git a/core/api/main.go b/core/api/main.go
new file mode 100644
index 0000000..db4f841
--- /dev/null
+++ b/core/api/main.go
@@ -0,0 +1,106 @@
+package main
+
+import (
+	"errors"
+	"flag"
+	"fmt"
+	"io"
+	"io/ioutil"
+	"log"
+	"net/http"
+
+	"github.com/giolekva/pcloud/core/api/schema"
+
+	"github.com/golang/glog"
+	"github.com/itaysk/regogo"
+)
+
+var kubeconfig = flag.String("kubeconfig", "", "Absolute path to the kubeconfig file.")
+
+var port = flag.Int("port", 123, "Port to listen on.")
+var dgraphGqlAddress = flag.String("graphql_address", "", "GraphQL server address.")
+var dgraphSchemaAddress = flag.String("dgraph_admin_address", "", "Dgraph server admin address.")
+
+const imgJson = `{ objectPath: \"%s\"}`
+const insertQuery = `mutation { add%s(input: [%s]) { %s { id } } }`
+const getQuery = `{ "query": "{ get%s(id: \"%s\") { id objectPath } } " }`
+
+type ApiHandler struct {
+	gql schema.GraphQLClient
+}
+
+type query struct {
+	query     string
+	operation string
+	variables string
+}
+
+func extractQuery(r *http.Request) (*query, error) {
+	if r.Method == "GET" {
+		if err := r.ParseForm(); err != nil {
+			return nil, err
+		}
+		q, ok := r.Form["query"]
+		if !ok || len(q) != 1 {
+			return nil, errors.New("Exactly one query must be provided")
+		}
+		return &query{query: q[0]}, nil
+	} else {
+		body, err := ioutil.ReadAll(r.Body)
+		if err != nil {
+			return nil, err
+		}
+		q, err := regogo.Get(string(body), "input.query")
+		if err != nil {
+			return nil, err
+		}
+		return &query{query: q.String()}, nil
+	}
+}
+
+func (a *ApiHandler) graphql(w http.ResponseWriter, r *http.Request) {
+	glog.Infof("New GraphQL query received: %s", r.Method)
+	q, err := extractQuery(r)
+	if err != nil {
+		glog.Error(err.Error())
+		http.Error(w, "Could not extract query", http.StatusBadRequest)
+	}
+	resp, err := a.gql.RunQuery(q.query)
+	if err != nil {
+		glog.Error(err)
+		http.Error(w, err.Error(), http.StatusInternalServerError)
+		return
+	}
+	io.WriteString(w, resp)
+	w.Header().Set("Content-Type", "application/json")
+}
+
+func (a *ApiHandler) addSchema(w http.ResponseWriter, r *http.Request) {
+	if r.Method != "POST" {
+		http.Error(w, "Only POST requests are accepted in /add_schema", http.StatusBadRequest)
+		return
+	}
+	body, err := ioutil.ReadAll(r.Body)
+	if err != nil {
+		http.Error(w, "Could not read request", http.StatusInternalServerError)
+		return
+	}
+	err = a.gql.AddSchema(string(body))
+	if err != nil {
+		http.Error(w, err.Error(), http.StatusPreconditionFailed)
+		return
+	}
+}
+
+func main() {
+	flag.Parse()
+	gqlClient, err := schema.NewDgraphClient(
+		*dgraphGqlAddress, *dgraphSchemaAddress)
+	if err != nil {
+		panic(err)
+	}
+	api := ApiHandler{gqlClient}
+	http.HandleFunc("/graphql", api.graphql)
+	http.HandleFunc("/add_schema", api.addSchema)
+	log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", *port), nil))
+}
