diff --git a/AUTHORS.md b/AUTHORS.md
index ed65e3a..d78bcb2 100644
--- a/AUTHORS.md
+++ b/AUTHORS.md
@@ -50,6 +50,7 @@ Patches and Suggestions
 - [@Tobiaqs](https://github.com/Tobiaqs)
 - Tuan Pham [@tuanvpham](https://github.com/tuanvpham)
 - Tyler Wallace [@wallacetyler](https://github.com/wallacetyler)
+- [@us91](https://github.com/us91)
 - Weining Li [@weining-li](https://github.com/weining-li)
 - William Funk [@WilliamRADFunk](https://github.com/WilliamRADFunk)
 - William Wesley Monroe [@purpleHey](https://github.com/purpleHey)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 497c655..b653134 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -25,6 +25,7 @@
 - Added [Code of Conduct](https://github.com/ucfopen/canvasapi/blob/develop/CODE_OF_CONDUCT.md)
 - Added CODEOWNERS file
 - Added generic error handling for unhandled 4XX+ HTTP errors
+- Added support for PATCH methods (Thanks, [@us91](https://github.com/us91))
 
 ### Deprecation Warnings
 
diff --git a/canvasapi/requester.py b/canvasapi/requester.py
index 1b6e0e1..9e19343 100644
--- a/canvasapi/requester.py
+++ b/canvasapi/requester.py
@@ -4,8 +4,13 @@ from datetime import datetime
 import requests
 
 from canvasapi.exceptions import (
-    BadRequest, CanvasException, Conflict, Forbidden, InvalidAccessToken,
-    ResourceDoesNotExist, Unauthorized
+    BadRequest,
+    CanvasException,
+    Conflict,
+    Forbidden,
+    InvalidAccessToken,
+    ResourceDoesNotExist,
+    Unauthorized,
 )
 
 
@@ -27,8 +32,15 @@ class Requester(object):
         self._cache = []
 
     def request(
-            self, method, endpoint=None, headers=None, use_auth=True,
-            _url=None, _kwargs=None, **kwargs):
+        self,
+        method,
+        endpoint=None,
+        headers=None,
+        use_auth=True,
+        _url=None,
+        _kwargs=None,
+        **kwargs
+    ):
         """
         Make a request to the Canvas API and return the response.
 
@@ -85,6 +97,8 @@ class Requester(object):
             req_method = self._delete_request
         elif method == 'PUT':
             req_method = self._put_request
+        elif method == 'PATCH':
+            req_method = self._patch_request
 
         # Call the request method
         response = req_method(full_url, headers, _kwargs)
@@ -161,6 +175,16 @@ class Requester(object):
         """
         return self._session.delete(url, headers=headers, data=data)
 
+    def _patch_request(self, url, headers, data=None):
+        """
+        Issue a PATCH request to the specified endpoint with the data provided.
+
+        :param url: str
+        :pararm headers: dict
+        :param data: dict
+        """
+        return self._session.patch(url, headers=headers, data=data)
+
     def _put_request(self, url, headers, data=None):
         """
         Issue a PUT request to the specified endpoint with the data provided.

PATCH method should be added
PATCH method should be added to the list of supported request methods. This should be done in the file canvasapi/requester.py, line 176, by adding:
```
      elif method == 'PATCH':
            req_method = self._patch_request
```

In addition, at the end of the same file, add the  following lines:
```   
 def _patch_request(self, url, headers, data=None):
        """
        Issue a PATCH request to the specified endpoint with the data provided.

        :param url: str
        :pararm headers: dict
        :param data: dict
        """
        return self._session.patch(url, headers=headers, data=data)
```

The PATCH method is useful when e.g., patching a late policy.
diff --git a/tests/fixtures/requests.json b/tests/fixtures/requests.json
index 09bbfd0..5d00c69 100644
--- a/tests/fixtures/requests.json
+++ b/tests/fixtures/requests.json
@@ -74,6 +74,12 @@
 		"data": {},
 		"status_code": 200
 	},
+	"patch": {
+		"method": "PATCH",
+		"endpoint": "fake_patch_request",
+		"data": {},
+		"status_code": 200
+	},
 	"put": {
 		"method": "PUT",
 		"endpoint": "fake_put_request",
diff --git a/tests/test_requester.py b/tests/test_requester.py
index c9adfae..a1b3a4a 100644
--- a/tests/test_requester.py
+++ b/tests/test_requester.py
@@ -8,8 +8,12 @@ from six.moves.urllib.parse import quote
 
 from canvasapi import Canvas
 from canvasapi.exceptions import (
-    BadRequest, CanvasException, Conflict, InvalidAccessToken, ResourceDoesNotExist,
-    Unauthorized
+    BadRequest,
+    CanvasException,
+    Conflict,
+    InvalidAccessToken,
+    ResourceDoesNotExist,
+    Unauthorized,
 )
 from tests import settings
 from tests.util import register_uris
@@ -17,7 +21,6 @@ from tests.util import register_uris
 
 @requests_mock.Mocker()
 class TestRequester(unittest.TestCase):
-
     def setUp(self):
         self.canvas = Canvas(settings.BASE_URL, settings.API_KEY)
         self.requester = self.canvas._Canvas__requester
@@ -71,6 +74,12 @@ class TestRequester(unittest.TestCase):
         response = self.requester.request('DELETE', 'fake_delete_request')
         self.assertEqual(response.status_code, 200)
 
+    def test_request_patch(self, m):
+        register_uris({'requests': ['patch']}, m)
+
+        response = self.requester.request('PATCH', 'fake_patch_request')
+        self.assertEqual(response.status_code, 200)
+
     def test_request_put(self, m):
         register_uris({'requests': ['put']}, m)
 
@@ -103,12 +112,7 @@ class TestRequester(unittest.TestCase):
 
         m.add_matcher(custom_matcher)
 
-        response = self.requester.request(
-            'POST',
-            'test',
-            test=True,
-            test2=False
-        )
+        response = self.requester.request('POST', 'test', test=True, test2=False)
         self.assertEqual(response.status_code, 200)
 
     def test_request_400(self, m):

pip install -e .[dev]
parse_log_pytest
requirements.txt
coverage flake8 requests-mock pytest
3.6
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
attrs==22.2.0
-e git+https://github.com/ucfopen/canvasapi.git@7e5d429f4b3bf54c3dc8e7a8f0f7bd09610f43fb#egg=canvasapi
certifi==2021.5.30
charset-normalizer==2.0.12
coverage==6.2
flake8==5.0.4
idna==3.10
importlib-metadata==4.2.0
iniconfig==1.1.1
mccabe==0.7.0
packaging==21.3
pluggy==1.0.0
py==1.11.0
pycodestyle==2.9.1
pyflakes==2.5.0
pyparsing==3.1.4
pytest==7.0.1
pytz==2025.2
requests==2.27.1
requests-mock==1.12.1
six==1.17.0
tomli==1.2.3
typing_extensions==4.1.1
urllib3==1.26.20
zipp==3.6.0

name: canvasapi
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
  - certifi=2021.5.30=py36h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.3=he6710b0_2
  - 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=1.1.1w=h7f8727e_0
  - pip=21.2.2=py36h06a4308_0
  - python=3.6.13=h12debd9_1
  - readline=8.2=h5eee18b_0
  - setuptools=58.0.4=py36h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.37.1=pyhd3eb1b0_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - attrs==22.2.0
      - charset-normalizer==2.0.12
      - coverage==6.2
      - flake8==5.0.4
      - idna==3.10
      - importlib-metadata==4.2.0
      - iniconfig==1.1.1
      - mccabe==0.7.0
      - packaging==21.3
      - pluggy==1.0.0
      - py==1.11.0
      - pycodestyle==2.9.1
      - pyflakes==2.5.0
      - pyparsing==3.1.4
      - pytest==7.0.1
      - pytz==2025.2
      - requests==2.27.1
      - requests-mock==1.12.1
      - six==1.17.0
      - tomli==1.2.3
      - typing-extensions==4.1.1
      - urllib3==1.26.20
      - zipp==3.6.0
prefix: /opt/conda/envs/canvasapi

tests/test_requester.py::TestRequester::test_request_patch
tests/test_requester.py::TestRequester::test_request_400 tests/test_requester.py::TestRequester::test_request_401_InvalidAccessToken tests/test_requester.py::TestRequester::test_request_401_Unauthorized tests/test_requester.py::TestRequester::test_request_404 tests/test_requester.py::TestRequester::test_request_409 tests/test_requester.py::TestRequester::test_request_500 tests/test_requester.py::TestRequester::test_request_cache tests/test_requester.py::TestRequester::test_request_cache_clear_after_5 tests/test_requester.py::TestRequester::test_request_delete tests/test_requester.py::TestRequester::test_request_generic tests/test_requester.py::TestRequester::test_request_get tests/test_requester.py::TestRequester::test_request_get_datetime tests/test_requester.py::TestRequester::test_request_lowercase_boolean tests/test_requester.py::TestRequester::test_request_post tests/test_requester.py::TestRequester::test_request_post_datetime tests/test_requester.py::TestRequester::test_request_put
AUTHORS.md canvasapi/requester.py CHANGELOG.md
AUTHORS.md canvasapi/requester.py CHANGELOG.md