diff --git a/web.go b/web.go
index 35e58a5e3a46182143d4a2144de5e40712950f42..1a2c2121380b6f71de098a6ccf02f60b57a34753 100644
--- a/web.go
+++ b/web.go
@@ -70,23 +70,43 @@ func (p *pagination) End() int {
 	return end + 1
 }
 
-func (s *uiServer) handleSearch(w http.ResponseWriter, req *http.Request) {
+var pageSize = 15
+
+func executeSearch(s *uiServer, req *http.Request) (*SearchResult, error) {
 	query := req.FormValue("q")
 	page, _ := strconv.Atoi(req.FormValue("p"))
-	pageSize := 15
+	pageSize := pageSize
 
 	result, err := s.db.Search(query, page*pageSize, pageSize)
+	return result, err
+}
+
+func (s *uiServer) handleApiSearch(w http.ResponseWriter, req *http.Request){
+	result, _ := executeSearch(s, req)
+
+	books := []*flatBook{}
+	for id := range result.Results {
+		book := flatten(result.Results[id])
+		books = append(books, book)
+	}
+	json, _ := json.Marshal(books)
+	fmt.Fprint(w, string(json))
+}
+
+func (s *uiServer) handleSearch(w http.ResponseWriter, req *http.Request) {
+	result, err := executeSearch(s, req)
 	if err != nil {
 		http.Error(w, err.Error(), http.StatusInternalServerError)
 		return
 	}
 
+	page, _ := strconv.Atoi(req.FormValue("p"))
 	ctx := struct {
 		Query      string
 		Results    []*Book
 		Pagination *pagination
 	}{
-		Query:   query,
+		Query:   req.FormValue("q"),
 		Results: result.Results,
 		Pagination: &pagination{
 			PageSize: pageSize,
@@ -384,6 +404,7 @@ func NewHttpServer(db *Database, storage, cache *RWFileStorage, addr string) *ht
 	r.HandleFunc("/opensearch.xml", handleOpenSearchXml)
 	r.HandleFunc("/suggest", uisrv.handleSuggest)
 	r.HandleFunc("/search", uisrv.handleSearch)
+	r.HandleFunc("/search_api", uisrv.handleApiSearch)
 	r.HandleFunc("/", uisrv.handleHome)
 
 	return &http.Server{