diff --git a/changelogs/unreleased/22018-api-milestone-merge-requests.yml b/changelogs/unreleased/22018-api-milestone-merge-requests.yml
new file mode 100644
index 0000000000000000000000000000000000000000..ccad2ec838ce415da268d2d345a6f94ef47c29fa
--- /dev/null
+++ b/changelogs/unreleased/22018-api-milestone-merge-requests.yml
@@ -0,0 +1,4 @@
+---
+title: Adds API endpoint to fetch all merge request for a single milestone
+merge_request:
+author: Joren De Groof
diff --git a/doc/api/milestones.md b/doc/api/milestones.md
index 12497acff9845b44e6a8cf9ce6179ebc41dc8585..bf7dcc008e96c2b611640a464e4329ab9ddc6974 100644
--- a/doc/api/milestones.md
+++ b/doc/api/milestones.md
@@ -103,3 +103,16 @@ Parameters:
 
 - `id` (required) - The ID of a project
 - `milestone_id` (required) - The ID of a project milestone
+
+## Get all merge requests assigned to a single milestone
+
+Gets all merge requests assigned to a single project milestone.
+
+```
+GET /projects/:id/milestones/:milestone_id/merge_requests
+```
+
+Parameters:
+
+- `id` (required) - The ID of a project
+- `milestone_id` (required) - The ID of a project milestone
\ No newline at end of file
diff --git a/lib/api/milestones.rb b/lib/api/milestones.rb
index 3c373a84ec528614152a0bd04ff091077234e430..0b4ed76b35cab7a349a03778bc79600f35c0fd64 100644
--- a/lib/api/milestones.rb
+++ b/lib/api/milestones.rb
@@ -120,6 +120,28 @@ module API
         issues = IssuesFinder.new(current_user, finder_params).execute
         present paginate(issues), with: Entities::Issue, current_user: current_user, project: user_project
       end
+
+      desc 'Get all merge requests for a single project milestone' do
+        detail 'This feature was introduced in GitLab 9.'
+        success Entities::MergeRequest
+      end
+      params do
+        requires :milestone_id, type: Integer, desc: 'The ID of a project milestone'
+        use :pagination
+      end
+      get ':id/milestones/:milestone_id/merge_requests' do
+        authorize! :read_milestone, user_project
+
+        milestone = user_project.milestones.find(params[:milestone_id])
+
+        finder_params = {
+          project_id: user_project.id,
+          milestone_id: milestone.id
+        }
+
+        merge_requests = MergeRequestsFinder.new(current_user, finder_params).execute
+        present paginate(merge_requests), with: Entities::MergeRequest, current_user: current_user, project: user_project
+      end
     end
   end
 end
diff --git a/spec/requests/api/milestones_spec.rb b/spec/requests/api/milestones_spec.rb
index 8beef821d6c257aeeba8e17b34692dd53bc47778..7bb208721a19d15fa7b4a210a5774c99f1551269 100644
--- a/spec/requests/api/milestones_spec.rb
+++ b/spec/requests/api/milestones_spec.rb
@@ -229,4 +229,40 @@ describe API::Milestones, api: true  do
       end
     end
   end
+
+  describe 'GET /projects/:id/milestones/:milestone_id/merge_requests' do
+    let(:merge_request) { create(:merge_request, source_project: project) }
+    before do
+      milestone.merge_requests << merge_request
+    end
+
+    it 'returns project merge_requests for a particular milestone' do
+      get api("/projects/#{project.id}/milestones/#{milestone.id}/merge_requests", user)
+
+      expect(response).to have_http_status(200)
+      expect(json_response).to be_an Array
+      expect(json_response.size).to eq(1)
+      expect(json_response.first['title']).to eq(merge_request.title)
+      expect(json_response.first['milestone']['title']).to eq(milestone.title)
+    end
+
+    it 'returns a 404 error if milestone id not found' do
+      get api("/projects/#{project.id}/milestones/1234/merge_requests", user)
+
+      expect(response).to have_http_status(404)
+    end
+
+    it 'returns a 404 if the user has no access to the milestone' do
+      new_user = create :user
+      get api("/projects/#{project.id}/milestones/#{milestone.id}/merge_requests", new_user)
+
+      expect(response).to have_http_status(404)
+    end
+
+    it 'returns a 401 error if user not authenticated' do
+      get api("/projects/#{project.id}/milestones/#{milestone.id}/merge_requests")
+
+      expect(response).to have_http_status(401)
+    end
+  end
 end