diff --git a/doc/api/merge_requests.md b/doc/api/merge_requests.md
index f4167403c2cd0d2ce11a69992a999b915d28213b..66d91732cc6792bf5980dfe8552f56300158708e 100644
--- a/doc/api/merge_requests.md
+++ b/doc/api/merge_requests.md
@@ -10,7 +10,7 @@ The pagination parameters `page` and `per_page` can be used to restrict the list
 GET /projects/:id/merge_requests
 GET /projects/:id/merge_requests?state=opened
 GET /projects/:id/merge_requests?state=all
-GET /projects/:id/merge_requests?iid=42
+GET /projects/:id/merge_requests?iid[]=42
 ```
 
 Parameters:
diff --git a/doc/api/milestones.md b/doc/api/milestones.md
index ae7d22a4be554dc0dffd5feab4bde8466efd2f6e..ad80d7c4c014e97fa744d46e66dcf3a69917d7d6 100644
--- a/doc/api/milestones.md
+++ b/doc/api/milestones.md
@@ -6,7 +6,7 @@ Returns a list of project milestones.
 
 ```
 GET /projects/:id/milestones
-GET /projects/:id/milestones?iid=42
+GET /projects/:id/milestones?iid[]=42
 GET /projects/:id/milestones?state=active
 GET /projects/:id/milestones?state=closed
 ```
@@ -16,7 +16,7 @@ Parameters:
 | Attribute | Type | Required | Description |
 | --------- | ---- | -------- | ----------- |
 | `id` | integer | yes | The ID of a project |
-| `iid` | integer | optional | Return only the milestone having the given `iid` |
+| `iid` | Array[integer] | optional | Return only the milestone having the given `iid` |
 | `state` | string | optional | Return  only `active` or `closed` milestones` |
 
 ```bash
diff --git a/lib/api/merge_requests.rb b/lib/api/merge_requests.rb
index 4176c7eec0676e5ac7037644d1f9072968f2a2c9..009913c62425372e3d900e427209d5f765c8997d 100644
--- a/lib/api/merge_requests.rb
+++ b/lib/api/merge_requests.rb
@@ -41,15 +41,13 @@ module API
                             desc: 'Return merge requests ordered by `created_at` or `updated_at` fields.'
         optional :sort, type: String, values: %w[asc desc], default: 'desc',
                         desc: 'Return merge requests sorted in `asc` or `desc` order.'
-        optional :iid, type: Integer, desc: 'The IID of the merge requests'
+        optional :iid, type: Array[Integer], desc: 'The IID of the merge requests'
       end
       get ":id/merge_requests" do
         authorize! :read_merge_request, user_project
-        merge_requests = user_project.merge_requests.inc_notes_with_associations
 
-        unless params[:iid].nil?
-          merge_requests = filter_by_iid(merge_requests, params[:iid])
-        end
+        merge_requests = user_project.merge_requests.inc_notes_with_associations
+        merge_requests = filter_by_iid(merge_requests, params[:iid]) if params[:iid].present?
 
         merge_requests =
           case params[:state]
diff --git a/lib/api/milestones.rb b/lib/api/milestones.rb
index 937c118779d5df70d8ae9b685e834c4dbd640fd6..29bf73934d215106d5454547faf396b886a48c2c 100644
--- a/lib/api/milestones.rb
+++ b/lib/api/milestones.rb
@@ -28,7 +28,7 @@ module API
       params do
         optional :state, type: String, values: %w[active closed all], default: 'all',
                          desc: 'Return "active", "closed", or "all" milestones'
-        optional :iid, type: Integer, desc: 'The IID of the milestone'
+        optional :iid, type: Array[Integer], desc: 'The IID of the milestone'
       end
       get ":id/milestones" do
         authorize! :read_milestone, user_project
diff --git a/spec/requests/api/merge_requests_spec.rb b/spec/requests/api/merge_requests_spec.rb
index 7b3d1460c9084de5f895a594f36ef4f18e6b3887..37fcb2bc3a931b39febd02ac8507ac19163da645 100644
--- a/spec/requests/api/merge_requests_spec.rb
+++ b/spec/requests/api/merge_requests_spec.rb
@@ -169,6 +169,16 @@ describe API::API, api: true  do
       expect(json_response.first['id']).to eq merge_request.id
     end
 
+    it 'returns merge_request by iid array' do
+      get api("/projects/#{project.id}/merge_requests", user), iid: [merge_request.iid, merge_request_closed.iid]
+
+      expect(response).to have_http_status(200)
+      expect(json_response).to be_an Array
+      expect(json_response.length).to eq(2)
+      expect(json_response.first['title']).to eq merge_request_closed.title
+      expect(json_response.first['id']).to eq merge_request_closed.id
+    end
+
     it "returns a 404 error if merge_request_id not found" do
       get api("/projects/#{project.id}/merge_requests/999", user)
       expect(response).to have_http_status(404)
diff --git a/spec/requests/api/milestones_spec.rb b/spec/requests/api/milestones_spec.rb
index 62327f64e5099b69ae63d73105c1162227afc897..5d7b39e71b8e16f2d28e13d2c9471048b75e620a 100644
--- a/spec/requests/api/milestones_spec.rb
+++ b/spec/requests/api/milestones_spec.rb
@@ -61,6 +61,15 @@ describe API::API, api: true  do
       expect(json_response.first['id']).to eq closed_milestone.id
     end
 
+    it 'returns a project milestone by iid array' do
+      get api("/projects/#{project.id}/milestones", user), iid: [milestone.iid, closed_milestone.iid]
+
+      expect(response).to have_http_status(200)
+      expect(json_response.size).to eq(2)
+      expect(json_response.first['title']).to eq milestone.title
+      expect(json_response.first['id']).to eq milestone.id
+    end
+
     it 'returns 401 error if user not authenticated' do
       get api("/projects/#{project.id}/milestones/#{milestone.id}")