diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb
index 3e67b2771c1d7322328286c2c88b23edc822509e..8fb68743a9be2f5d92c7e4c32917a9c78195afe2 100644
--- a/app/models/ci/build.rb
+++ b/app/models/ci/build.rb
@@ -94,6 +94,10 @@ module Ci
         new_build.save
         new_build
       end
+
+      def available_statuses
+        state_machines[:status].states.map &:value
+      end
     end
 
     state_machine :status, initial: :pending do
diff --git a/doc/api/builds.md b/doc/api/builds.md
index b716499dd3670c4582b542bcc72be9697cf425e7..c52266714d044f31061527090324cdf44dd2ccf6 100644
--- a/doc/api/builds.md
+++ b/doc/api/builds.md
@@ -11,7 +11,7 @@ GET /projects/:id/builds
 Parameters:
 
 - `id` (required) - The ID of a project
-- `scope` (optional) - The scope of builds to show (one of: `all`, `finished`, `running`; default: `all`)
+- `scope` (optional) - The scope of builds to show (one or array of: pending, running, failed, success, canceled; if none provided showing all builds)
 
 ```json
 [
@@ -64,8 +64,7 @@ Parameters:
 
 - `id` (required) - The ID of a project
 - `sha` (required) - The SHA id of a commit
-- `scope` (optional) - The scope of builds to show (one of: `all`, `finished`, `running`; default: `all`)
-
+- `scope` (optional) - The scope of builds to show (one or array of: pending, running, failed, success, canceled; if none provided showing all builds)
 
 ```json
 [
diff --git a/lib/api/builds.rb b/lib/api/builds.rb
index 6b0edcff8204c4fb90e71733870ca465ab434eb9..6aae1856953b6dac0be4354672c785772f80b2ed 100644
--- a/lib/api/builds.rb
+++ b/lib/api/builds.rb
@@ -8,9 +8,8 @@ module API
       #
       # Parameters:
       #   id (required) - The ID of a project
-      #   scope (optional) - The scope of builds to show (one of: all, finished, running; default: all)
-      #   page (optional) - The page number for pagination
-      #   per_page (ooptional) - The value of items per page to show
+      #   scope (optional) - The scope of builds to show (one or array of: pending, running, failed, success, canceled;
+      #                      if none provided showing all builds)
       # Example Request:
       #   GET /projects/:id/builds
       get ':id/builds' do
@@ -24,7 +23,8 @@ module API
       # Parameters:
       #   id (required) - The ID of a project
       #   sha (required) - The SHA id of a commit
-      #   scope (optional) - The scope of builds to show (one of: all, finished, running; default: all)
+      #   scope (optional) - The scope of builds to show (one or array of: pending, running, failed, success, canceled;
+      #                      if none provided showing all builds)
       # Example Request:
       #   GET /projects/:id/builds/commit/:sha
       get ':id/builds/commit/:sha' do
@@ -112,14 +112,21 @@ module API
       end
 
       def filter_builds(builds, scope)
-        case scope
-        when 'finished'
-          builds.finished
-        when 'running'
-          builds.running
-        else
-          builds
-        end
+        available_scopes = Ci::Build.available_statuses
+        scope =
+          if scope.is_a?(String) || scope.is_a?(Symbol)
+            available_scopes & [scope.to_s]
+          elsif scope.is_a?(Array)
+            available_scopes & scope
+          elsif scope.respond_to?(:to_h)
+            available_scopes & scope.to_h.values
+          else
+            []
+          end
+
+        return builds if scope.empty?
+
+        builds.where(status: scope)
       end
 
       def authorize_manage_builds!
diff --git a/spec/requests/api/builds_spec.rb b/spec/requests/api/builds_spec.rb
index d4af7639d4bffc46abf1ba39d99780e384300dc6..a953eb2fac29479d96df55b8aaf3a21b79cf069e 100644
--- a/spec/requests/api/builds_spec.rb
+++ b/spec/requests/api/builds_spec.rb
@@ -18,7 +18,20 @@ describe API::API, api: true  do
       it 'should return project builds' do
         get api("/projects/#{project.id}/builds", user)
 
-        puts json_response
+        expect(response.status).to eq(200)
+        expect(json_response).to be_an Array
+      end
+
+      it 'should filter project with one scope element' do
+        get api("/projects/#{project.id}/builds?scope=pending", user)
+
+        expect(response.status).to eq(200)
+        expect(json_response).to be_an Array
+      end
+
+      it 'should filter project with array of scope elements' do
+        get api("/projects/#{project.id}/builds?scope[0]=pending&scope[1]=running", user)
+
         expect(response.status).to eq(200)
         expect(json_response).to be_an Array
       end