diff --git a/app/controllers/projects/deploy_keys_controller.rb b/app/controllers/projects/deploy_keys_controller.rb
index d0c44e297e3b405031329db33534efd3779fccf3..a47e15a192bfffe795a281f28cd78eb4d60c8ca2 100644
--- a/app/controllers/projects/deploy_keys_controller.rb
+++ b/app/controllers/projects/deploy_keys_controller.rb
@@ -8,7 +8,12 @@ class Projects::DeployKeysController < Projects::ApplicationController
   layout "project_settings"
 
   def index
-    redirect_to_repository_settings(@project)
+    respond_to do |format|
+      format.html { redirect_to_repository_settings(@project) }
+      format.json do
+        render json: Projects::Settings::DeployKeysPresenter.new(@project, current_user: current_user).as_json
+      end
+    end
   end
 
   def new
@@ -19,7 +24,7 @@ class Projects::DeployKeysController < Projects::ApplicationController
     @key = DeployKey.new(deploy_key_params.merge(user: current_user))
 
     unless @key.valid? && @project.deploy_keys << @key
-      flash[:alert] = @key.errors.full_messages.join(', ').html_safe      
+      flash[:alert] = @key.errors.full_messages.join(', ').html_safe
     end
     redirect_to_repository_settings(@project)
   end
diff --git a/app/presenters/projects/settings/deploy_keys_presenter.rb b/app/presenters/projects/settings/deploy_keys_presenter.rb
index 86ac513b3c07e1a9210894d1cd7b7627e27e7f2c..070b0c35e3673740fbfbdbe54d0979641c038d36 100644
--- a/app/presenters/projects/settings/deploy_keys_presenter.rb
+++ b/app/presenters/projects/settings/deploy_keys_presenter.rb
@@ -48,6 +48,17 @@ module Projects
         available_public_keys.any?
       end
 
+      def as_json
+        serializer = DeployKeySerializer.new
+        opts = { user: current_user }
+
+        {
+          enabled_keys: serializer.represent(enabled_keys, opts),
+          available_project_keys: serializer.represent(available_project_keys, opts),
+          public_keys: serializer.represent(available_public_keys, opts)
+        }
+      end
+
       def to_partial_path
         'projects/deploy_keys/index'
       end
diff --git a/app/serializers/deploy_key_entity.rb b/app/serializers/deploy_key_entity.rb
new file mode 100644
index 0000000000000000000000000000000000000000..cdedc2c7bd018a9c6f3de348a52fc4a71d90ea4e
--- /dev/null
+++ b/app/serializers/deploy_key_entity.rb
@@ -0,0 +1,12 @@
+class DeployKeyEntity < Grape::Entity
+  expose :id
+  expose :user_id
+  expose :title
+  expose :fingerprint
+  expose :can_push
+  expose :created_at
+  expose :updated_at
+  expose :projects, using: ProjectEntity do |deploy_key|
+    deploy_key.projects.select { |project| options[:user].can?(:read_project, project) }
+  end
+end
diff --git a/app/serializers/deploy_key_serializer.rb b/app/serializers/deploy_key_serializer.rb
new file mode 100644
index 0000000000000000000000000000000000000000..8f849eb88b717e132fb57b98d52d5ec4acb31253
--- /dev/null
+++ b/app/serializers/deploy_key_serializer.rb
@@ -0,0 +1,3 @@
+class DeployKeySerializer < BaseSerializer
+  entity DeployKeyEntity
+end
diff --git a/app/serializers/project_entity.rb b/app/serializers/project_entity.rb
new file mode 100644
index 0000000000000000000000000000000000000000..6f8061f75309533cc40b259e87dcafa9819be654
--- /dev/null
+++ b/app/serializers/project_entity.rb
@@ -0,0 +1,12 @@
+class ProjectEntity < Grape::Entity
+  expose :id
+  expose :name
+
+  expose :full_path do |project|
+    project.full_path
+  end
+
+  expose :full_name do |project|
+    project.full_name
+  end
+end
diff --git a/changelogs/unreleased/29667-deploy-keys.yml b/changelogs/unreleased/29667-deploy-keys.yml
new file mode 100644
index 0000000000000000000000000000000000000000..0f202ebf1ee56d1d39ae88a2cd43da8ff11675b3
--- /dev/null
+++ b/changelogs/unreleased/29667-deploy-keys.yml
@@ -0,0 +1,4 @@
+---
+title: Project deploy keys json end point
+merge_request:
+author:
diff --git a/spec/controllers/projects/deploy_keys_controller_spec.rb b/spec/controllers/projects/deploy_keys_controller_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..efe1a78415b7d375f3bb5e50ef2235eb4e14df8e
--- /dev/null
+++ b/spec/controllers/projects/deploy_keys_controller_spec.rb
@@ -0,0 +1,66 @@
+require 'spec_helper'
+
+describe Projects::DeployKeysController do
+  let(:project) { create(:project, :repository) }
+  let(:user) { create(:user) }
+
+  before do
+    project.team << [user, :master]
+
+    sign_in(user)
+  end
+
+  describe 'GET index' do
+    let(:params) do
+      { namespace_id: project.namespace, project_id: project }
+    end
+
+    context 'when html requested' do
+      it 'redirects to blob' do
+        get :index, params
+
+        expect(response).to redirect_to(namespace_project_settings_repository_path(params))
+      end
+    end
+
+    context 'when json requested' do
+      let(:project2) { create(:empty_project, :internal)}
+      let(:project_private) { create(:empty_project, :private)}
+
+      let(:deploy_key_internal) do
+        create(:deploy_key, key: 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQCdMHEHyhRjbhEZVddFn6lTWdgEy5Q6Bz4nwGB76xWZI5YT/1WJOMEW+sL5zYd31kk7sd3FJ5L9ft8zWMWrr/iWXQikC2cqZK24H1xy+ZUmrRuJD4qGAaIVoyyzBL+avL+lF8J5lg6YSw8gwJY/lX64/vnJHUlWw2n5BF8IFOWhiw== dummy@gitlab.com')
+      end
+      let(:deploy_key_actual) do
+        create(:deploy_key, key: 'ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAAAgQDNd/UJWhPrpb+b/G5oL109y57yKuCxE+WUGJGYaj7WQKsYRJmLYh1mgjrl+KVyfsWpq4ylOxIfFSnN9xBBFN8mlb0Fma5DC7YsSsibJr3MZ19ZNBprwNcdogET7aW9I0In7Wu5f2KqI6e5W/spJHCy4JVxzVMUvk6Myab0LnJ2iQ== dummy@gitlab.com')
+      end
+      let!(:deploy_key_public) { create(:deploy_key, public: true) }
+
+      let!(:deploy_keys_project_internal) do
+        create(:deploy_keys_project, project: project2, deploy_key: deploy_key_internal)
+      end
+
+      let!(:deploy_keys_actual_project) do
+        create(:deploy_keys_project, project: project, deploy_key: deploy_key_actual)
+      end
+
+      let!(:deploy_keys_project_private) do
+        create(:deploy_keys_project, project: project_private, deploy_key: create(:another_deploy_key))
+      end
+
+      before do
+        project2.team << [user, :developer]
+      end
+
+      it 'returns json in a correct format' do
+        get :index, params.merge(format: :json)
+
+        json = JSON.parse(response.body)
+
+        expect(json.keys).to match_array(%w(enabled_keys available_project_keys public_keys))
+        expect(json['enabled_keys'].count).to eq(1)
+        expect(json['available_project_keys'].count).to eq(1)
+        expect(json['public_keys'].count).to eq(1)
+      end
+    end
+  end
+end
diff --git a/spec/serializers/deploy_key_entity_spec.rb b/spec/serializers/deploy_key_entity_spec.rb
new file mode 100644
index 0000000000000000000000000000000000000000..da1d33b42ac80c3ad0b77d7fc720369bd926ba3b
--- /dev/null
+++ b/spec/serializers/deploy_key_entity_spec.rb
@@ -0,0 +1,29 @@
+require 'spec_helper'
+
+describe DeployKeyEntity do
+  let(:user) { create(:user) }
+  let(:project) { create(:empty_project, :internal)}
+  let(:project_private) { create(:empty_project, :private)}
+  let(:deploy_key) { create(:deploy_key) }
+  let!(:deploy_key_internal) { create(:deploy_keys_project, project: project, deploy_key: deploy_key) }
+  let!(:deploy_key_private)  { create(:deploy_keys_project, project: project_private, deploy_key: deploy_key) }
+
+  let(:entity) { described_class.new(deploy_key, user: user) }
+
+  it 'returns deploy keys with projects a user can read' do
+    expected_result = {
+      id: deploy_key.id,
+      user_id: deploy_key.user_id,
+      title: deploy_key.title,
+      fingerprint: deploy_key.fingerprint,
+      can_push: deploy_key.can_push,
+      created_at: deploy_key.created_at,
+      updated_at: deploy_key.updated_at,
+      projects: [
+        { id: project.id, name: project.name, full_path: project.full_path, full_name: project.full_name }
+      ]
+    }
+
+    expect(entity.as_json).to eq(expected_result)
+  end
+end