diff --git a/doc/api/builds.md b/doc/api/builds.md
index 99ef0882c16886c1b07f7aa480f7cf5fd33fcd2e..06ff89bea00d74bd27a0c20f97bcb576b25fb991 100644
--- a/doc/api/builds.md
+++ b/doc/api/builds.md
@@ -40,23 +40,14 @@ Parameters:
         "user": {
             "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon",
             "bio": null,
-            "can_create_group": true,
-            "can_create_project": true,
-            "color_scheme_id": 2,
             "created_at": "2015-12-21T13:14:24.077Z",
-            "current_sign_in_at": "2016-01-11T09:31:40.472Z",
-            "email": "admin@example.com",
             "id": 1,
-            "identities": [],
             "is_admin": true,
             "linkedin": "",
             "name": "Administrator",
-            "projects_limit": 100,
             "skype": "",
             "state": "active",
-            "theme_id": 3,
             "twitter": "",
-            "two_factor_enabled": false,
             "username": "root",
             "web_url": "http://gitlab.dev/u/root",
             "website_url": ""
@@ -87,23 +78,14 @@ Parameters:
         "user": {
             "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon",
             "bio": null,
-            "can_create_group": true,
-            "can_create_project": true,
-            "color_scheme_id": 2,
             "created_at": "2015-12-21T13:14:24.077Z",
-            "current_sign_in_at": "2016-01-11T09:31:40.472Z",
-            "email": "admin@example.com",
             "id": 1,
-            "identities": [],
             "is_admin": true,
             "linkedin": "",
             "name": "Administrator",
-            "projects_limit": 100,
             "skype": "",
             "state": "active",
-            "theme_id": 3,
             "twitter": "",
-            "two_factor_enabled": false,
             "username": "root",
             "web_url": "http://gitlab.dev/u/root",
             "website_url": ""
@@ -177,23 +159,14 @@ Parameters:
         "user": {
             "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon",
             "bio": null,
-            "can_create_group": true,
-            "can_create_project": true,
-            "color_scheme_id": 2,
             "created_at": "2015-12-21T13:14:24.077Z",
-            "current_sign_in_at": "2016-01-12T10:30:48.315Z",
-            "email": "admin@example.com",
             "id": 1,
-            "identities": [],
             "is_admin": true,
             "linkedin": "",
             "name": "Administrator",
-            "projects_limit": 100,
             "skype": "",
             "state": "active",
-            "theme_id": 3,
             "twitter": "",
-            "two_factor_enabled": false,
             "username": "root",
             "web_url": "http://gitlab.dev/u/root",
             "website_url": ""
@@ -241,23 +214,14 @@ Parameters:
     "user": {
         "avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon",
         "bio": null,
-        "can_create_group": true,
-        "can_create_project": true,
-        "color_scheme_id": 2,
         "created_at": "2015-12-21T13:14:24.077Z",
-        "current_sign_in_at": "2016-01-11T09:31:40.472Z",
-        "email": "admin@example.com",
         "id": 1,
-        "identities": [],
         "is_admin": true,
         "linkedin": "",
         "name": "Administrator",
-        "projects_limit": 100,
         "skype": "",
         "state": "active",
-        "theme_id": 3,
         "twitter": "",
-        "two_factor_enabled": false,
         "username": "root",
         "web_url": "http://gitlab.dev/u/root",
         "website_url": ""
diff --git a/lib/api/builds.rb b/lib/api/builds.rb
index d3f4e33ebbf579dedbeebfe57b92632dfb51c92c..1337e1bb4523c44f81fcf4bbe004e789b32808fe 100644
--- a/lib/api/builds.rb
+++ b/lib/api/builds.rb
@@ -35,6 +35,7 @@ module API
 
         builds = commit.builds.order('id DESC')
         builds = filter_builds(builds, params[:scope])
+
         present paginate(builds), with: Entities::Build,
                                   user_can_download_artifacts: can?(current_user, :download_build_artifacts, user_project)
       end
@@ -118,25 +119,26 @@ module API
 
     helpers do
       def get_build(id)
-        user_project.builds.where(id: id).first
+        user_project.builds.find_by(id: id.to_i)
       end
 
       def filter_builds(builds, scope)
-        available_scopes = Ci::Build.available_statuses
+        return builds if scope.nil? || scope.empty?
+
+        available_statuses = 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
+          if scope.is_a?(String)
+            [scope]
+          elsif scope.is_a?(Hashie::Mash)
+            scope.values
           else
-            []
+            ['unknown']
           end
 
-        return builds if scope.empty?
+        unknown = scope - available_statuses
+        render_api_error!('Scope contains invalid value(s)', 400) unless unknown.empty?
 
-        builds.where(status: scope)
+        builds.where(status: available_statuses && scope)
       end
 
       def authorize_manage_builds!
diff --git a/lib/api/entities.rb b/lib/api/entities.rb
index e19f9f8d75a5be218c330c9ad20a6a110cbd9760..f0816a4652987ffa6ed48b1f71cd1228f42a7f38 100644
--- a/lib/api/entities.rb
+++ b/lib/api/entities.rb
@@ -378,18 +378,16 @@ module API
       expose :id, :status, :stage, :name, :ref, :tag, :coverage
       expose :created_at, :started_at, :finished_at
       expose :user, with: User
+      # TODO: download_url in Ci:Build model is an GitLab Web Interface URL, not API URL. We should think on some API
+      #       for downloading of artifacts (see: https://gitlab.com/gitlab-org/gitlab-ce/issues/4255)
       expose :download_url do |repo_obj, options|
         if options[:user_can_download_artifacts]
           repo_obj.download_url
-        else
-          nil
         end
       end
       expose :commit, with: RepoCommit do |repo_obj, _options|
         if repo_obj.respond_to?(:commit)
           repo_obj.commit.commit_data
-        else
-          nil
         end
       end
       expose :runner, with: Runner
diff --git a/spec/requests/api/builds_spec.rb b/spec/requests/api/builds_spec.rb
index 587fb74750d2a3ccb84f12348d8c8bc1fb47ba9d..4bf3d2681dc4d849777b1855d4e7ce007176e36e 100644
--- a/spec/requests/api/builds_spec.rb
+++ b/spec/requests/api/builds_spec.rb
@@ -35,6 +35,12 @@ describe API::API, api: true  do
         expect(response.status).to eq(200)
         expect(json_response).to be_an Array
       end
+
+      it 'should respond 400 when scope contains invalid state' do
+        get api("/projects/#{project.id}/builds?scope[0]=pending&scope[1]=unknown_status", user)
+
+        expect(response.status).to eq(400)
+      end
     end
 
     context 'unauthorized user' do