diff --git a/app/services/create_tag_service.rb b/app/services/create_tag_service.rb
new file mode 100644
index 0000000000000000000000000000000000000000..9776667740529278503fcd9b375bd95fe93ae775
--- /dev/null
+++ b/app/services/create_tag_service.rb
@@ -0,0 +1,13 @@
+class CreateTagService
+  def execute(project, tag_name, ref, current_user)
+    repository = project.repository
+    repository.add_tag(tag_name, ref)
+    new_tag = repository.find_tag(tag_name)
+
+    if new_tag
+      Event.create_ref_event(project, current_user, new_tag, 'add', 'refs/tags')
+    end
+
+    new_tag
+  end
+end
diff --git a/lib/api/repositories.rb b/lib/api/repositories.rb
index 076a9ceeb744e9f0bb158d366e40408b57c1ca6c..e90d7c66125eff0235af6e375375f3d42e041691 100644
--- a/lib/api/repositories.rb
+++ b/lib/api/repositories.rb
@@ -25,6 +25,22 @@ module API
         present user_project.repo.tags.sort_by(&:name).reverse, with: Entities::RepoObject, project: user_project
       end
 
+      # Create tag
+      #
+      # Parameters:
+      #   id (required) - The ID of a project
+      #   tag_name (required) - The name of the tag
+      #   ref (required) - Create tag from commit sha or branch
+      # Example Request:
+      #   POST /projects/:id/repository/tags
+      post ':id/repository/tags' do
+        authorize_push_project
+        @tag = CreateTagService.new.execute(user_project, params[:tag_name],
+                                            params[:ref], current_user)
+
+        present @tag, with: Entities::RepoObject, project: user_project
+      end
+
       # Get a project repository tree
       #
       # Parameters: