diff --git a/app/controllers/projects/pipelines_controller.rb b/app/controllers/projects/pipelines_controller.rb
index 1780cc0233c6cf752278c8e3276b1cd937343bcc..454b8ee17af2bdbfad7a711e0d741a053e91dc56 100644
--- a/app/controllers/projects/pipelines_controller.rb
+++ b/app/controllers/projects/pipelines_controller.rb
@@ -9,19 +9,19 @@ class Projects::PipelinesController < Projects::ApplicationController
   def index
     @scope = params[:scope]
     @pipelines = PipelinesFinder
-      .new(project)
-      .execute(scope: @scope)
+      .new(project, scope: @scope)
+      .execute
       .page(params[:page])
       .per(30)
 
     @running_count = PipelinesFinder
-      .new(project).execute(scope: 'running').count
+      .new(project, scope: 'running').execute.count
 
     @pending_count = PipelinesFinder
-      .new(project).execute(scope: 'pending').count
+      .new(project, scope: 'pending').execute.count
 
     @finished_count = PipelinesFinder
-      .new(project).execute(scope: 'finished').count
+      .new(project, scope: 'finished').execute.count
 
     @pipelines_count = PipelinesFinder
       .new(project).execute.count
diff --git a/app/finders/pipelines_finder.rb b/app/finders/pipelines_finder.rb
index a9172f6767fb42ca51339d5b1af49d61559857f7..5a5416d00cc8bc836cc58aed7e2b8c880886b523 100644
--- a/app/finders/pipelines_finder.rb
+++ b/app/finders/pipelines_finder.rb
@@ -1,29 +1,21 @@
 class PipelinesFinder
-  attr_reader :project, :pipelines
+  attr_reader :project, :pipelines, :params
 
-  def initialize(project)
+  def initialize(project, params = {})
     @project = project
     @pipelines = project.pipelines
+    @params = params
   end
 
-  def execute(scope: nil)
-    scoped_pipelines =
-      case scope
-      when 'running'
-        pipelines.running
-      when 'pending'
-        pipelines.pending
-      when 'finished'
-        pipelines.finished
-      when 'branches'
-        from_ids(ids_for_ref(branches))
-      when 'tags'
-        from_ids(ids_for_ref(tags))
-      else
-        pipelines
-      end
-
-    scoped_pipelines.order(id: :desc)
+  def execute
+    items = pipelines
+    items = by_scope(items)
+    items = by_status(items)
+    items = by_ref(items)
+    items = by_user(items)
+    items = by_duration(items)
+    items = by_yaml_error(items)
+    order_and_sort(items)
   end
 
   private
@@ -43,4 +35,80 @@ class PipelinesFinder
   def tags
     project.repository.tag_names
   end
+
+  def by_scope(items)
+    case params[:scope]
+    when 'running'
+      items.running
+    when 'pending'
+      items.pending
+    when 'finished'
+      items.finished
+    when 'branches'
+      from_ids(ids_for_ref(branches))
+    when 'tags'
+      from_ids(ids_for_ref(tags))
+    else
+      items
+    end
+  end
+
+  def by_status(items)
+    case params[:status]
+    when 'running'
+      items.running
+    when 'pending'
+      items.pending
+    when 'success'
+      items.success
+    when 'failed'
+      items.failed
+    when 'canceled'
+      items.canceled
+    when 'skipped'
+      items.skipped
+    else
+      items
+    end
+  end
+
+  def by_ref(items)
+    if params[:ref].present?
+      items.where(ref: params[:ref])
+    else
+      items
+    end
+  end
+
+  def by_user(items)
+    if params[:user_id].present?
+      items.where(user_id: params[:user_id])
+    else
+      items
+    end
+  end
+  
+  def by_duration(items)
+    if params[:duration].present?
+      items.where("duration > ?", params[:duration])
+    else
+      items
+    end
+  end
+
+  def by_yaml_error(items)
+    if params[:yaml_error].present? && params[:yaml_error]
+      items.where("yaml_errors IS NOT NULL")
+    else
+      items
+    end
+  end
+
+  def order_and_sort(items)
+    if params[:order_by].present? && params[:sort].present?
+      items.order("#{params[:order_by]} #{params[:sort]}")
+    else
+      items.order(id: :desc)
+    end
+  end
 end
diff --git a/lib/api/pipelines.rb b/lib/api/pipelines.rb
index 754c3d85a04cffdab81ee37f7ddfa129498216c5..905e72a3a95844ce419f429e1629dcbe38a9cd86 100644
--- a/lib/api/pipelines.rb
+++ b/lib/api/pipelines.rb
@@ -16,11 +16,21 @@ module API
         use :pagination
         optional :scope,    type: String, values: %w(running branches tags),
                             desc: 'Either running, branches, or tags'
+        optional :status,   type: String, values: ['running', 'pending', 'success', 'failed', 'canceled', 'skipped'],
+                            desc: 'Pipeline Status'
+        optional :ref,      type: String, desc: 'Pipeline Ref'
+        optional :duration, type: Integer, desc: 'Greater than the specified duration'
+        optional :yaml_error, type: Boolean, desc: 'If true, returns only yaml error pipelines.'
+        optional :user_id,  type: String, desc: 'User who executed pipelines'
+        optional :order_by, type: String, values: ['id', 'status', 'ref', 'user_id', 'started_at', 'finished_at', 'created_at', 'updated_at'], default: 'id',
+                            desc: 'Return issues ordered by `created_at` or `updated_at` fields.'
+        optional :sort,     type: String, values: ['asc', 'desc'], default: 'desc',
+                            desc: 'Return pipelines sorted in `asc` or `desc` order.'
       end
       get ':id/pipelines' do
         authorize! :read_pipeline, user_project
 
-        pipelines = PipelinesFinder.new(user_project).execute(scope: params[:scope])
+        pipelines = PipelinesFinder.new(user_project, params).execute(scope: params[:scope])
         present paginate(pipelines), with: Entities::PipelineBasic
       end