diff --git a/doc/api/errors.rst b/doc/api/errors.rst
index 26a5960..6cabdfa 100644
--- a/doc/api/errors.rst
+++ b/doc/api/errors.rst
@@ -36,5 +36,5 @@ Predefined Errors
         HTTPBadRequest, HTTPUnauthorized, HTTPForbidden, HTTPNotFound,
         HTTPMethodNotAllowed, HTTPNotAcceptable, HTTPConflict,
         HTTPLengthRequired, HTTPPreconditionFailed, HTTPUnsupportedMediaType,
-        HTTPRangeNotSatisfiable, HTTPInternalServerError, HTTPBadGateway,
-        HTTPServiceUnavailable
+        HTTPRangeNotSatisfiable, HTTPUnprocessableEntity, HTTPInternalServerError,
+        HTTPBadGateway, HTTPServiceUnavailable
diff --git a/doc/api/status.rst b/doc/api/status.rst
index 9e72add..0aa6c68 100644
--- a/doc/api/status.rst
+++ b/doc/api/status.rst
@@ -95,6 +95,7 @@ string objects that must be created when preparing responses.
     HTTP_REQUESTED_RANGE_NOT_SATISFIABLE = HTTP_416
     HTTP_EXPECTATION_FAILED = HTTP_417
     HTTP_IM_A_TEAPOT = HTTP_418
+    HTTP_UNPROCESSABLE_ENTITY = HTTP_422
     HTTP_UPGRADE_REQUIRED = HTTP_426
     HTTP_PRECONDITION_REQUIRED = HTTP_428
     HTTP_TOO_MANY_REQUESTS = HTTP_429
@@ -119,6 +120,7 @@ string objects that must be created when preparing responses.
     HTTP_416 = '416 Range Not Satisfiable'
     HTTP_417 = '417 Expectation Failed'
     HTTP_418 = "418 I'm a teapot"
+    HTTP_422 = "422 Unprocessable Entity"
     HTTP_426 = '426 Upgrade Required'
     HTTP_428 = '428 Precondition Required'
     HTTP_429 = '429 Too Many Requests'
diff --git a/falcon/errors.py b/falcon/errors.py
index 49f2747..7f75b3e 100644
--- a/falcon/errors.py
+++ b/falcon/errors.py
@@ -306,6 +306,24 @@ class HTTPRangeNotSatisfiable(NoRepresentation, HTTPError):
                                                       headers=headers)
 
 
+class HTTPUnprocessableEntity(HTTPError):
+    """422 Unprocessable Entity.
+
+    The request was well-formed but was unable to be followed due to semantic
+    errors. See also: http://www.ietf.org/rfc/rfc4918.
+
+    Args:
+        title (str): Error title (e.g., 'Missing title field').
+        description (str): Human-friendly description of the error, along with
+            a helpful suggestion or two.
+        kwargs (optional): Same as for ``HTTPError``.
+    """
+
+    def __init__(self, title, description, **kwargs):
+        super(HTTPUnprocessableEntity, self).__init__(status.HTTP_422, title,
+                                                      description, **kwargs)
+
+
 class HTTPInternalServerError(HTTPError):
     """500 Internal Server Error.
 
diff --git a/falcon/status_codes.py b/falcon/status_codes.py
index f0c87a4..c27c602 100644
--- a/falcon/status_codes.py
+++ b/falcon/status_codes.py
@@ -90,6 +90,8 @@ HTTP_417 = '417 Expectation Failed'
 HTTP_EXPECTATION_FAILED = HTTP_417
 HTTP_418 = "418 I'm a teapot"
 HTTP_IM_A_TEAPOT = HTTP_418
+HTTP_422 = "422 Unprocessable Entity"
+HTTP_UNPROCESSABLE_ENTITY = HTTP_422
 HTTP_426 = '426 Upgrade Required'
 HTTP_UPGRADE_REQUIRED = HTTP_426
 HTTP_428 = '428 Precondition Required'

Adding HTTP_422, Unprocessable Entity
I guess we need such response support.
diff --git a/tests/test_httperror.py b/tests/test_httperror.py
index 1a99ccb..e48d4b0 100644
--- a/tests/test_httperror.py
+++ b/tests/test_httperror.py
@@ -676,5 +676,6 @@ class TestHTTPError(testing.TestBase):
         self._misc_test(falcon.HTTPPreconditionFailed, falcon.HTTP_412)
         self._misc_test(falcon.HTTPUnsupportedMediaType, falcon.HTTP_415,
                         needs_title=False)
+        self._misc_test(falcon.HTTPUnprocessableEntity, falcon.HTTP_422)
         self._misc_test(falcon.HTTPInternalServerError, falcon.HTTP_500)
         self._misc_test(falcon.HTTPBadGateway, falcon.HTTP_502)

pip install -e .
parse_log_pytest
requirements.txt
nose coverage ddt pyyaml requests testtools pytest
apt-get update apt-get install -y gcc
3.9
tools/test-requires
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
certifi==2025.1.31
charset-normalizer==3.4.1
coverage==7.8.0
ddt==1.7.2
exceptiongroup==1.2.2
-e git+https://github.com/falconry/falcon.git@3a6ce66edb68261f66bd74f2f0f756900da78225#egg=falcon
idna==3.10
iniconfig==2.1.0
nose==1.3.7
packaging==24.2
pluggy==1.5.0
pytest==8.3.5
python-mimeparse==2.0.0
PyYAML==6.0.2
requests==2.32.3
six==1.17.0
testtools==2.7.2
tomli==2.2.1
urllib3==2.3.0

name: falcon
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:
      - certifi==2025.1.31
      - charset-normalizer==3.4.1
      - coverage==7.8.0
      - ddt==1.7.2
      - exceptiongroup==1.2.2
      - idna==3.10
      - iniconfig==2.1.0
      - nose==1.3.7
      - packaging==24.2
      - pluggy==1.5.0
      - pytest==8.3.5
      - python-mimeparse==2.0.0
      - pyyaml==6.0.2
      - requests==2.32.3
      - six==1.17.0
      - testtools==2.7.2
      - tomli==2.2.1
      - urllib3==2.3.0
prefix: /opt/conda/envs/falcon

tests/test_httperror.py::TestHTTPError::test_misc
tests/test_httperror.py::TestHTTPError::test_401 tests/test_httperror.py::TestHTTPError::test_404_with_body tests/test_httperror.py::TestHTTPError::test_404_without_body tests/test_httperror.py::TestHTTPError::test_405_with_body tests/test_httperror.py::TestHTTPError::test_405_without_body tests/test_httperror.py::TestHTTPError::test_405_without_body_with_extra_headers tests/test_httperror.py::TestHTTPError::test_405_without_body_with_extra_headers_double_check tests/test_httperror.py::TestHTTPError::test_411 tests/test_httperror.py::TestHTTPError::test_413 tests/test_httperror.py::TestHTTPError::test_416 tests/test_httperror.py::TestHTTPError::test_503_datetime_retry_after tests/test_httperror.py::TestHTTPError::test_503_integer_retry_after tests/test_httperror.py::TestHTTPError::test_base_class tests/test_httperror.py::TestHTTPError::test_client_does_not_accept_anything tests/test_httperror.py::TestHTTPError::test_client_does_not_accept_json_or_xml tests/test_httperror.py::TestHTTPError::test_custom_error_serializer tests/test_httperror.py::TestHTTPError::test_epic_fail_json tests/test_httperror.py::TestHTTPError::test_epic_fail_xml_1_text_xml tests/test_httperror.py::TestHTTPError::test_epic_fail_xml_2_application_xml tests/test_httperror.py::TestHTTPError::test_epic_fail_xml_3_application_vnd_company_system_project_resource_xml_v_1_1 tests/test_httperror.py::TestHTTPError::test_epic_fail_xml_4_application_atom_xml tests/test_httperror.py::TestHTTPError::test_forbidden_1_application_json tests/test_httperror.py::TestHTTPError::test_forbidden_2_application_vnd_company_system_project_resource_json_v_1_1 tests/test_httperror.py::TestHTTPError::test_forbidden_3_application_json_patch_json tests/test_httperror.py::TestHTTPError::test_invalid_header tests/test_httperror.py::TestHTTPError::test_invalid_param tests/test_httperror.py::TestHTTPError::test_missing_header tests/test_httperror.py::TestHTTPError::test_missing_param tests/test_httperror.py::TestHTTPError::test_no_description_json tests/test_httperror.py::TestHTTPError::test_no_description_xml tests/test_httperror.py::TestHTTPError::test_temporary_413_datetime_retry_after tests/test_httperror.py::TestHTTPError::test_temporary_413_integer_retry_after tests/test_httperror.py::TestHTTPError::test_unicode_json tests/test_httperror.py::TestHTTPError::test_unicode_xml
doc/api/status.rst falcon/errors.py falcon/status_codes.py doc/api/errors.rst
doc/api/status.rst falcon/errors.py falcon/status_codes.py doc/api/errors.rst