diff --git a/bintray/bintray.py b/bintray/bintray.py
index a487782..3f58251 100644
--- a/bintray/bintray.py
+++ b/bintray/bintray.py
@@ -514,3 +514,99 @@ class Bintray(object):
         """
         url = "{}/licenses/oss_licenses".format(Bintray.BINTRAY_URL)
         return self._requester.get(url)
+
+    # Content Signing
+
+    def get_org_gpg_public_key(self, org):
+        """ Get the organization GPG public key.
+
+            The response Content-Type format is 'application/pgp-keys'.
+
+        :param org: Organization name
+        :return: response Content-Type format as 'application/pgp-keys'.
+        """
+        url = "{}/orgs/{}/keys/gpg/public.key".format(Bintray.BINTRAY_URL, org)
+        return self._requester.get(url)
+
+    def get_user_gpg_public_key(self, user):
+        """ Get the subject GPG public key.
+
+            The response Content-Type format is 'application/pgp-keys'.
+
+        :param org: Organization name
+        :return: response Content-Type format as 'application/pgp-keys'.
+        """
+        url = "{}/users/{}/keys/gpg/public.key".format(Bintray.BINTRAY_URL, user)
+        return self._requester.get(url)
+
+    def gpg_sign_version(self, subject, repo, package, version, key_subject=None, passphrase=None,
+                         key_path=None):
+        """ GPG sign all files associated with the specified version.
+
+            GPG signing information may be needed
+
+            Security: Authenticated user with 'publish' permission.
+
+        :param subject: username or organization
+        :param repo: repository name
+        :param package: package name
+        :param version: package version
+        :param key_subject: Alternative Bintray subject for the GPG public key
+        :param passphrase: Optional private key passphrase, if required
+        :param key_path: Optional private key, if not stored in Bintray
+        :return: request response
+        """
+        url = "{}/gpg/{}/{}/{}/versions/{}".format(Bintray.BINTRAY_URL, subject, repo, package,
+                                                   version)
+        body = {}
+        if subject:
+            body['subject'] = key_subject
+        if passphrase:
+            body['passphrase'] = passphrase
+        if key_path:
+            with open(key_path, 'r') as fd:
+                body['private_key'] = fd.read()
+        body = None if body == {} else body
+        headers = None
+        if "passphrase" in body and len(body.keys()) == 1:
+            headers = {"X-GPG-PASSPHRASE": passphrase}
+            body = None
+
+        response = self._requester.post(url, json=body, headers=headers)
+
+        self._logger.info("Sign successfully: {}".format(url))
+        return response
+
+    def gpg_sign_file(self, subject, repo, file_path, key_subject=None, passphrase=None,
+                      key_path=None):
+        """ GPG sign the specified repository file.
+
+            GPG signing information may be needed
+
+        :param subject: username or organization
+        :param repo: repository name
+        :param file_path: file path to be signed
+        :param key_subject: Alternative Bintray subject for the GPG public key
+        :param passphrase: Optional private key passphrase, if required
+        :param key_path: Optional private key, if not stored in Bintray
+        :return: request response
+        """
+        url = "{}/gpg/{}/{}/{}".format(Bintray.BINTRAY_URL, subject, repo, file_path)
+        body = {}
+        if subject:
+            body['subject'] = key_subject
+        if passphrase:
+            body['passphrase'] = passphrase
+        if key_path:
+            with open(key_path, 'r') as fd:
+                body['private_key'] = fd.read()
+        body = None if body == {} else body
+        headers = None
+        if "passphrase" in body and len(body.keys()) == 1:
+            headers = {"X-GPG-PASSPHRASE": passphrase}
+            body = None
+
+        response = self._requester.post(url, json=body, headers=headers)
+
+        self._logger.info("Sign successfully: {}".format(url))
+        return response
diff --git a/bintray/requester.py b/bintray/requester.py
index 1ccfa74..1d624fe 100644
--- a/bintray/requester.py
+++ b/bintray/requester.py
@@ -1,6 +1,7 @@
 # -*- coding: utf-8 -*-
 
 import requests
+import json
 
 from requests.auth import HTTPBasicAuth
 
@@ -31,7 +32,10 @@ class Requester(object):
         :param response: Requests response
         :return: Response JSON
         """
-        json_data = response.json()
+        try:
+            json_data = response.json()
+        except json.decoder.JSONDecodeError:
+            json_data = {'message': response.content.decode()}
         if isinstance(json_data, list):
             json_data.append({"statusCode": response.status_code, "error": not response.ok})
         else:

Content Signing
https://bintray.com/docs/api/#_content_signing

- [x] Get GPG public key
- [x] GPG Sign a Version
- [x] GPG Sign a File
diff --git a/tests/test_content_signing.py b/tests/test_content_signing.py
new file mode 100644
index 0000000..c851c08
--- /dev/null
+++ b/tests/test_content_signing.py
@@ -0,0 +1,34 @@
+# -*- coding: utf-8 -*-
+
+import os
+from bintray.bintray import Bintray
+
+
+def test_get_org_gpg_public_key():
+    bintray = Bintray()
+    response = bintray.get_org_gpg_public_key("jfrog")
+    assert response.get("error") == False
+    assert response.get("statusCode") == 200
+    assert "BEGIN PGP PUBLIC KEY BLOCK" in response.get("message")
+
+
+def test_get_user_gpg_public_key():
+    bintray = Bintray()
+    response = bintray.get_user_gpg_public_key("bintray")
+    assert response.get("error") == False
+    assert response.get("statusCode") == 200
+    assert "BEGIN PGP PUBLIC KEY BLOCK" in response.get("message")
+
+
+def test_gpg_sign_version():
+    bintray = Bintray()
+    response = bintray.gpg_sign_version("uilianries", "generic", "statistics", "test")
+    assert {'error': False, 'message': 'success', 'statusCode': 200} == response or \
+           {'error': False, 'message': 'success', 'statusCode': 201} == response
+
+
+def test_gpg_sign_file():
+    bintray = Bintray()
+    response = bintray.gpg_sign_file("uilianries", "generic", "packages.json")
+    assert {'error': False, 'message': 'success', 'statusCode': 200} == response or \
+           {'error': False, 'message': 'success', 'statusCode': 201} == response

pip install -e .[test]
parse_log_pytest_v2
requirements.txt
apt-get update apt-get install -y gcc
3.9
bintray/requirements.txt bintray/requirements_test.txt
pytest -v -s tests
atomicwrites==1.4.1
attrs==25.3.0
-e git+https://github.com/uilianries/bintray-python.git@ac98c4b69e6c5d46ec828099d604e40b332de499#egg=bintray_python
certifi==2025.1.31
chardet==3.0.4
coverage==7.8.0
idna==2.8
importlib_metadata==8.6.1
more-itertools==10.6.0
packaging==24.2
pluggy==0.13.1
py==1.11.0
pytest==5.0.0
pytest-cov==2.7.1
requests==2.22.0
urllib3==1.25.11
wcwidth==0.2.13
zipp==3.21.0

name: bintray-python
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - atomicwrites==1.4.1
      - attrs==25.3.0
      - certifi==2025.1.31
      - chardet==3.0.4
      - coverage==7.8.0
      - idna==2.8
      - importlib-metadata==8.6.1
      - more-itertools==10.6.0
      - packaging==24.2
      - pluggy==0.13.1
      - py==1.11.0
      - pytest==5.0.0
      - pytest-cov==2.7.1
      - requests==2.22.0
      - urllib3==1.25.11
      - wcwidth==0.2.13
      - zipp==3.21.0
prefix: /opt/conda/envs/bintray-python

tests/test_content_signing.py::test_get_user_gpg_public_key
tests/test_content_downloading.py::test_download_content tests/test_content_downloading.py::test_bad_credentials_for_download_content tests/test_content_downloading.py::test_dynamic_download tests/test_content_downloading.py::test_bad_credentials_for_dynamic_download tests/test_content_downloading.py::test_url_signing tests/test_content_signing.py::test_get_org_gpg_public_key tests/test_content_signing.py::test_gpg_sign_version tests/test_content_signing.py::test_gpg_sign_file tests/test_files.py::test_get_package_files tests/test_files.py::test_bad_credentials_for_get_package_files tests/test_files.py::test_get_version_files tests/test_files.py::test_bad_credentials_for_get_version_files tests/test_files.py::test_file_search_by_name tests/test_files.py::test_bad_credentials_file_search_by_name tests/test_files.py::test_file_search_by_checksum tests/test_files.py::test_bad_credentials_file_search_by_checksum tests/test_files.py::test_file_in_download_list tests/test_licenses.py::test_get_oss_licenses tests/test_licenses.py::test_get_org_proprietary_licenses tests/test_licenses.py::test_get_user_proprietary_licenses tests/test_licenses.py::test_bad_credentials_for_get_oss_licenses tests/test_licenses.py::test_create_org_proprietary_licenses tests/test_licenses.py::test_create_user_proprietary_licenses tests/test_licenses.py::test_update_org_proprietary_licenses tests/test_licenses.py::test_update_user_proprietary_licenses tests/test_licenses.py::test_delete_org_proprietary_licenses tests/test_licenses.py::test_delete_user_proprietary_licenses tests/test_upload_publishing.py::test_upload_content tests/test_upload_publishing.py::test_bad_credentials_for_upload_content tests/test_upload_publishing.py::test_maven_upload tests/test_upload_publishing.py::test_debian_upload tests/test_upload_publishing.py::test_publish_uploaded_content tests/test_upload_publishing.py::test_discard_uploaded_content tests/test_upload_publishing.py::test_delete_content
bintray/bintray.py bintray/requester.py
bintray/bintray.py bintray/requester.py