diff --git a/ironic/api/controllers/v1/allocation.py b/ironic/api/controllers/v1/allocation.py
index d370575fb8..d461f6d4f2 100644
--- a/ironic/api/controllers/v1/allocation.py
+++ b/ironic/api/controllers/v1/allocation.py
@@ -204,8 +204,11 @@ class AllocationsController(pecan.rest.RestController):
     @pecan.expose()
     def _route(self, args, request=None):
         if not api_utils.allow_allocations():
-            raise webob_exc.HTTPNotFound(_(
-                "The API version does not allow allocations"))
+            msg = _("The API version does not allow allocations")
+            if pecan.request.method == "GET":
+                raise webob_exc.HTTPNotFound(msg)
+            else:
+                raise webob_exc.HTTPMethodNotAllowed(msg)
         return super(AllocationsController, self)._route(args, request)
 
     def _get_allocations_collection(self, node_ident=None, resource_class=None,
diff --git a/ironic/api/controllers/v1/deploy_template.py b/ironic/api/controllers/v1/deploy_template.py
index 5b5c8a046e..b084847a07 100644
--- a/ironic/api/controllers/v1/deploy_template.py
+++ b/ironic/api/controllers/v1/deploy_template.py
@@ -259,8 +259,11 @@ class DeployTemplatesController(rest.RestController):
     @pecan.expose()
     def _route(self, args, request=None):
         if not api_utils.allow_deploy_templates():
-            raise webob_exc.HTTPNotFound(_(
-                "The API version does not allow deploy templates"))
+            msg = _("The API version does not allow deploy templates")
+            if pecan.request.method == "GET":
+                raise webob_exc.HTTPNotFound(msg)
+            else:
+                raise webob_exc.HTTPMethodNotAllowed(msg)
         return super(DeployTemplatesController, self)._route(args, request)
 
     def _update_changed_fields(self, template, rpc_template):
diff --git a/ironic/tests/unit/api/controllers/v1/test_allocation.py b/ironic/tests/unit/api/controllers/v1/test_allocation.py
index 875a531db4..05d78faa2f 100644
--- a/ironic/tests/unit/api/controllers/v1/test_allocation.py
+++ b/ironic/tests/unit/api/controllers/v1/test_allocation.py
@@ -450,7 +450,7 @@ class TestPost(test_api_base.BaseApiTest):
         response = self.post_json(
             '/allocations', adict, headers={api_base.Version.string: '1.50'},
             expect_errors=True)
-        self.assertEqual(http_client.NOT_FOUND, response.status_int)
+        self.assertEqual(http_client.METHOD_NOT_ALLOWED, response.status_int)
 
     def test_create_allocation_doesnt_contain_id(self):
         with mock.patch.object(self.dbapi, 'create_allocation',
@@ -680,7 +680,7 @@ class TestDelete(test_api_base.BaseApiTest):
         response = self.delete('/allocations/%s' % self.allocation.uuid,
                                expect_errors=True,
                                headers={api_base.Version.string: '1.14'})
-        self.assertEqual(http_client.NOT_FOUND, response.status_int)
+        self.assertEqual(http_client.METHOD_NOT_ALLOWED, response.status_int)
 
     def test_delete_allocation_invalid_api_version_without_check(self,
                                                                  mock_destroy):
@@ -688,7 +688,7 @@ class TestDelete(test_api_base.BaseApiTest):
         response = self.delete('/allocations/ba!na!na1',
                                expect_errors=True,
                                headers={api_base.Version.string: '1.14'})
-        self.assertEqual(http_client.NOT_FOUND, response.status_int)
+        self.assertEqual(http_client.METHOD_NOT_ALLOWED, response.status_int)
 
     def test_delete_allocation_by_name(self, mock_destroy):
         self.delete('/allocations/%s' % self.allocation.name,
diff --git a/ironic/tests/unit/api/controllers/v1/test_deploy_template.py b/ironic/tests/unit/api/controllers/v1/test_deploy_template.py
index 6bc77f1916..25499589b9 100644
--- a/ironic/tests/unit/api/controllers/v1/test_deploy_template.py
+++ b/ironic/tests/unit/api/controllers/v1/test_deploy_template.py
@@ -414,7 +414,7 @@ class TestPatch(BaseDeployTemplatesAPITest):
                                      'op': 'add'}],
                                    headers=headers,
                                    expect_errors=True)
-        self.assertEqual(http_client.NOT_FOUND, response.status_int)
+        self.assertEqual(http_client.METHOD_NOT_ALLOWED, response.status_int)
         self.assertFalse(mock_save.called)
 
     def test_update_by_name_old_api_version(self, mock_save):
@@ -424,7 +424,7 @@ class TestPatch(BaseDeployTemplatesAPITest):
                                      'value': name,
                                      'op': 'add'}],
                                    expect_errors=True)
-        self.assertEqual(http_client.NOT_FOUND, response.status_int)
+        self.assertEqual(http_client.METHOD_NOT_ALLOWED, response.status_int)
         self.assertFalse(mock_save.called)
 
     def test_update_not_found(self, mock_save):
@@ -715,7 +715,7 @@ class TestPost(BaseDeployTemplatesAPITest):
         response = self.post_json(
             '/deploy_templates', tdict, headers=self.invalid_version_headers,
             expect_errors=True)
-        self.assertEqual(http_client.NOT_FOUND, response.status_int)
+        self.assertEqual(http_client.METHOD_NOT_ALLOWED, response.status_int)
 
     def test_create_doesnt_contain_id(self):
         with mock.patch.object(
@@ -944,14 +944,14 @@ class TestDelete(BaseDeployTemplatesAPITest):
         response = self.delete('/deploy_templates/%s' % self.template.uuid,
                                expect_errors=True,
                                headers=self.invalid_version_headers)
-        self.assertEqual(http_client.NOT_FOUND, response.status_int)
+        self.assertEqual(http_client.METHOD_NOT_ALLOWED, response.status_int)
 
     def test_delete_old_api_version(self, mock_dpt):
         # Names like CUSTOM_1 were not valid in API 1.1, but the check should
         # go after the microversion check.
         response = self.delete('/deploy_templates/%s' % self.template.name,
                                expect_errors=True)
-        self.assertEqual(http_client.NOT_FOUND, response.status_int)
+        self.assertEqual(http_client.METHOD_NOT_ALLOWED, response.status_int)
 
     def test_delete_by_name_non_existent(self, mock_dpt):
         res = self.delete('/deploy_templates/%s' % 'blah', expect_errors=True,