From 98d4a290cec56b644fcf8ef5fa419f764f3f2b36 Mon Sep 17 00:00:00 2001 From: Hugh Nimmo-Smith Date: Fri, 17 Oct 2025 12:08:29 +0200 Subject: [PATCH 1/8] M_CAPABILITY_NOT_ENABLED error code for when capability is not enabled on an API endpoint --- proposals/0000-capability-error-code.md | 53 +++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 proposals/0000-capability-error-code.md diff --git a/proposals/0000-capability-error-code.md b/proposals/0000-capability-error-code.md new file mode 100644 index 00000000000..1a5c4811a8d --- /dev/null +++ b/proposals/0000-capability-error-code.md @@ -0,0 +1,53 @@ +# MSC0000: M_CAPABILITY_NOT_ENABLED error code for when capability is not enabled on an API endpoint + +The [capabilities negotiation] feature in the [Client-Server API] provides a mechanism for clients +to discover whether specific capabilities are available to a user. + +However, the endpoints that use capabilities do not currently specify what error response a client +should expect if they try to use an API that does not have the capability enabled for the user. + +I believe this is an omission in the current spec that should be addressed for existing capabilites +and be checked for future MSCs that use capabilities. + +For background: this MSC originates from a +[spec PR](https://github.com/matrix-org/matrix-spec/pull/2212) that has since been closed. + +## Proposal + +Define a new [other error code] of `M_CAPABILITY_NOT_ENABLED`. + +Define the following behaviour for existing API endpoints that use capabilities: + +Capability|Endpoint(s)|Current spec|Proposed behaviour +-|-|-|- +[`m.change_password`](https://spec.matrix.org/v1.16/client-server-api/#mchange_password-capability)|[`POST /_matrix/client/v3/account/password`](https://pr2212--matrix-spec-previews.netlify.app/client-server-api/#post_matrixclientv3accountpassword)|Not defined|Return `403` with `M_CAPABILITY_NOT_ENABLED` if `m.change_password`.`enabled` is `false` +[`m.profile_fields`](https://spec.matrix.org/v1.16/client-server-api/#mprofile_fields-capability) +[`m.set_displayname`](https://spec.matrix.org/v1.16/client-server-api/#mset_displayname-capability) +[`m.set_avatar_url`](https://spec.matrix.org/v1.16/client-server-api/#mset_avatar_url-capability) +[`m.3pid_changes`](https://spec.matrix.org/v1.16/client-server-api/#m3pid_changes-capability)|[`POST /_matrix/client/v3/account/3pid`](https://spec.matrix.org/v1.16/client-server-api/#post_matrixclientv3account3pid) [`POST /_matrix/client/v3/account/3pid/add`](https://spec.matrix.org/v1.16/client-server-api/#post_matrixclientv3account3pidadd) [`POST /_matrix/client/v3/account/3pid/delete`](https://spec.matrix.org/v1.16/client-server-api/#post_matrixclientv3account3piddelete)|Not defined|Return `400` with `M_CAPABILITY_NOT_ENABLED` if `m.3pid_changes`.`enabled` is `false` +[`m.get_login_token`](https://spec.matrix.org/v1.16/client-server-api/#mget_login_token-capability)|[`POST /_matrix/client/v1/login/get_token`](https://spec.matrix.org/v1.16/client-server-api/#post_matrixclientv1loginget_token)|Maybe `400` with undefined error code if `m.get_login_token`.`enabled` is `false`|`403` with `M_CAPABILITY_NOT_ENABLED` if `m.get_login_token`.`enabled` is `false` + +## Potential issues + +TODO: Change in behaviour on `m.get_login_token`. + +## Alternatives + +Base on existing implementations. This is what was originally in https://github.com/matrix-org/matrix-spec/pull/2212 + +## Security considerations + +None. + +## Unstable prefix + +Whilst this proposal is under development the `IO.ELEMENT.MSCXXXX_CAPABILITY_NOT_ENABLED` value +should be used instead of `CAPABILITY_NOT_ENABLED`. + +## Dependencies + +None. + +[capabilities negotiation]: https://spec.matrix.org/v1.16/client-server-api/#capabilities-negotiation +[Client-Server API]: https://spec.matrix.org/v1.16/client-server-api/ +[other error code]: https://spec.matrix.org/v1.16/client-server-api/#other-error-codes From c1018f1cd057959abc65643208eea3df41fa8252 Mon Sep 17 00:00:00 2001 From: Hugh Nimmo-Smith Date: Fri, 17 Oct 2025 16:36:14 +0200 Subject: [PATCH 2/8] Fill out rest of table --- proposals/0000-capability-error-code.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/proposals/0000-capability-error-code.md b/proposals/0000-capability-error-code.md index 1a5c4811a8d..973be358359 100644 --- a/proposals/0000-capability-error-code.md +++ b/proposals/0000-capability-error-code.md @@ -21,9 +21,9 @@ Define the following behaviour for existing API endpoints that use capabilities: Capability|Endpoint(s)|Current spec|Proposed behaviour -|-|-|- [`m.change_password`](https://spec.matrix.org/v1.16/client-server-api/#mchange_password-capability)|[`POST /_matrix/client/v3/account/password`](https://pr2212--matrix-spec-previews.netlify.app/client-server-api/#post_matrixclientv3accountpassword)|Not defined|Return `403` with `M_CAPABILITY_NOT_ENABLED` if `m.change_password`.`enabled` is `false` -[`m.profile_fields`](https://spec.matrix.org/v1.16/client-server-api/#mprofile_fields-capability) -[`m.set_displayname`](https://spec.matrix.org/v1.16/client-server-api/#mset_displayname-capability) -[`m.set_avatar_url`](https://spec.matrix.org/v1.16/client-server-api/#mset_avatar_url-capability) +[`m.profile_fields`](https://spec.matrix.org/v1.16/client-server-api/#mprofile_fields-capability)|[`PUT /_matrix/client/v3/profile/{userId}/{keyName}`](https://spec.matrix.org/v1.16/client-server-api/#put_matrixclientv3profileuseridkeyname) [`DELETE /_matrix/client/v3/profile/{userId}/{keyName}`](https://spec.matrix.org/v1.16/client-server-api/#delete_matrixclientv3profileuseridkeyname)|`403` for `PUT`. Maybe `403` for `DELETE`. Error code not specified for either|Return `403` with `M_CAPABILITY_NOT_ENABLED` if: `m.profile_fields`.`enabled` is `false`; or, `m.profile_fields`.`disallowed` contains `{keyName}`; +[`m.set_displayname`](https://spec.matrix.org/v1.16/client-server-api/#mset_displayname-capability)|As per `m.profile_fields`|As per `m.profile_fields`|Return `403` with `M_CAPABILITY_NOT_ENABLED` if: `m.profile_fields`.`enabled` is `false`; or, `m.profile_fields`.`disallowed` contains `{keyName}`; or, `m.set_displayname`.`enabled` is `false`; +[`m.set_avatar_url`](https://spec.matrix.org/v1.16/client-server-api/#mset_avatar_url-capability)|As per `m.profile_fields`|As per `m.profile_fields`|Return `403` with `M_CAPABILITY_NOT_ENABLED` if: `m.profile_fields`.`enabled` is `false`; or, `m.profile_fields`.`disallowed` contains `{keyName}`; or, `m.set_avatar_url`.`enabled` is `false`; [`m.3pid_changes`](https://spec.matrix.org/v1.16/client-server-api/#m3pid_changes-capability)|[`POST /_matrix/client/v3/account/3pid`](https://spec.matrix.org/v1.16/client-server-api/#post_matrixclientv3account3pid) [`POST /_matrix/client/v3/account/3pid/add`](https://spec.matrix.org/v1.16/client-server-api/#post_matrixclientv3account3pidadd) [`POST /_matrix/client/v3/account/3pid/delete`](https://spec.matrix.org/v1.16/client-server-api/#post_matrixclientv3account3piddelete)|Not defined|Return `400` with `M_CAPABILITY_NOT_ENABLED` if `m.3pid_changes`.`enabled` is `false` [`m.get_login_token`](https://spec.matrix.org/v1.16/client-server-api/#mget_login_token-capability)|[`POST /_matrix/client/v1/login/get_token`](https://spec.matrix.org/v1.16/client-server-api/#post_matrixclientv1loginget_token)|Maybe `400` with undefined error code if `m.get_login_token`.`enabled` is `false`|`403` with `M_CAPABILITY_NOT_ENABLED` if `m.get_login_token`.`enabled` is `false` From ee89705d0cff87f79a7b2b761b63a4442d2492d4 Mon Sep 17 00:00:00 2001 From: Hugh Nimmo-Smith Date: Fri, 17 Oct 2025 16:36:36 +0200 Subject: [PATCH 3/8] Assign 4369 --- ...000-capability-error-code.md => 4369-capability-error-code.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename proposals/{0000-capability-error-code.md => 4369-capability-error-code.md} (100%) diff --git a/proposals/0000-capability-error-code.md b/proposals/4369-capability-error-code.md similarity index 100% rename from proposals/0000-capability-error-code.md rename to proposals/4369-capability-error-code.md From 76873b20712feb2e75c407bc8d93afbe551239e8 Mon Sep 17 00:00:00 2001 From: Hugh Nimmo-Smith Date: Fri, 17 Oct 2025 16:37:13 +0200 Subject: [PATCH 4/8] Spelling --- proposals/4369-capability-error-code.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proposals/4369-capability-error-code.md b/proposals/4369-capability-error-code.md index 973be358359..409d96f909e 100644 --- a/proposals/4369-capability-error-code.md +++ b/proposals/4369-capability-error-code.md @@ -6,7 +6,7 @@ to discover whether specific capabilities are available to a user. However, the endpoints that use capabilities do not currently specify what error response a client should expect if they try to use an API that does not have the capability enabled for the user. -I believe this is an omission in the current spec that should be addressed for existing capabilites +I believe this is an omission in the current spec that should be addressed for existing capabilities and be checked for future MSCs that use capabilities. For background: this MSC originates from a From 97e4bb82e3c6c4c39ea9dadb8affc6cc9c6c9346 Mon Sep 17 00:00:00 2001 From: Hugh Nimmo-Smith Date: Fri, 17 Oct 2025 16:38:28 +0200 Subject: [PATCH 5/8] Title --- proposals/4369-capability-error-code.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/proposals/4369-capability-error-code.md b/proposals/4369-capability-error-code.md index 409d96f909e..6ede91c7c83 100644 --- a/proposals/4369-capability-error-code.md +++ b/proposals/4369-capability-error-code.md @@ -1,4 +1,4 @@ -# MSC0000: M_CAPABILITY_NOT_ENABLED error code for when capability is not enabled on an API endpoint +# MSC4369: M_CAPABILITY_NOT_ENABLED error code for when capability is not enabled on an API endpoint The [capabilities negotiation] feature in the [Client-Server API] provides a mechanism for clients to discover whether specific capabilities are available to a user. From d99d9c2d5366838b56bb15ca0a7c9272b31bcb5f Mon Sep 17 00:00:00 2001 From: Hugh Nimmo-Smith Date: Wed, 22 Oct 2025 15:45:06 +0100 Subject: [PATCH 6/8] Clean up and add alternatives --- proposals/4369-capability-error-code.md | 92 ++++++++++++++++++++++--- 1 file changed, 83 insertions(+), 9 deletions(-) diff --git a/proposals/4369-capability-error-code.md b/proposals/4369-capability-error-code.md index 6ede91c7c83..9c70ea9d37e 100644 --- a/proposals/4369-capability-error-code.md +++ b/proposals/4369-capability-error-code.md @@ -20,20 +20,80 @@ Define the following behaviour for existing API endpoints that use capabilities: Capability|Endpoint(s)|Current spec|Proposed behaviour -|-|-|- -[`m.change_password`](https://spec.matrix.org/v1.16/client-server-api/#mchange_password-capability)|[`POST /_matrix/client/v3/account/password`](https://pr2212--matrix-spec-previews.netlify.app/client-server-api/#post_matrixclientv3accountpassword)|Not defined|Return `403` with `M_CAPABILITY_NOT_ENABLED` if `m.change_password`.`enabled` is `false` -[`m.profile_fields`](https://spec.matrix.org/v1.16/client-server-api/#mprofile_fields-capability)|[`PUT /_matrix/client/v3/profile/{userId}/{keyName}`](https://spec.matrix.org/v1.16/client-server-api/#put_matrixclientv3profileuseridkeyname) [`DELETE /_matrix/client/v3/profile/{userId}/{keyName}`](https://spec.matrix.org/v1.16/client-server-api/#delete_matrixclientv3profileuseridkeyname)|`403` for `PUT`. Maybe `403` for `DELETE`. Error code not specified for either|Return `403` with `M_CAPABILITY_NOT_ENABLED` if: `m.profile_fields`.`enabled` is `false`; or, `m.profile_fields`.`disallowed` contains `{keyName}`; -[`m.set_displayname`](https://spec.matrix.org/v1.16/client-server-api/#mset_displayname-capability)|As per `m.profile_fields`|As per `m.profile_fields`|Return `403` with `M_CAPABILITY_NOT_ENABLED` if: `m.profile_fields`.`enabled` is `false`; or, `m.profile_fields`.`disallowed` contains `{keyName}`; or, `m.set_displayname`.`enabled` is `false`; -[`m.set_avatar_url`](https://spec.matrix.org/v1.16/client-server-api/#mset_avatar_url-capability)|As per `m.profile_fields`|As per `m.profile_fields`|Return `403` with `M_CAPABILITY_NOT_ENABLED` if: `m.profile_fields`.`enabled` is `false`; or, `m.profile_fields`.`disallowed` contains `{keyName}`; or, `m.set_avatar_url`.`enabled` is `false`; -[`m.3pid_changes`](https://spec.matrix.org/v1.16/client-server-api/#m3pid_changes-capability)|[`POST /_matrix/client/v3/account/3pid`](https://spec.matrix.org/v1.16/client-server-api/#post_matrixclientv3account3pid) [`POST /_matrix/client/v3/account/3pid/add`](https://spec.matrix.org/v1.16/client-server-api/#post_matrixclientv3account3pidadd) [`POST /_matrix/client/v3/account/3pid/delete`](https://spec.matrix.org/v1.16/client-server-api/#post_matrixclientv3account3piddelete)|Not defined|Return `400` with `M_CAPABILITY_NOT_ENABLED` if `m.3pid_changes`.`enabled` is `false` -[`m.get_login_token`](https://spec.matrix.org/v1.16/client-server-api/#mget_login_token-capability)|[`POST /_matrix/client/v1/login/get_token`](https://spec.matrix.org/v1.16/client-server-api/#post_matrixclientv1loginget_token)|Maybe `400` with undefined error code if `m.get_login_token`.`enabled` is `false`|`403` with `M_CAPABILITY_NOT_ENABLED` if `m.get_login_token`.`enabled` is `false` +[`m.change_password`]|[`POST /_matrix/client/v3/account/password`]|Not defined|Return `403` with `M_CAPABILITY_NOT_ENABLED` if `m.change_password`.`enabled` is `false` +[`m.profile_fields`]|[`PUT /_matrix/client/v3/profile/{userId}/{keyName}`] [`DELETE /_matrix/client/v3/profile/{userId}/{keyName}`]|`403` for `PUT`. Maybe `403` for `DELETE`. Error code not specified for either|Return `403` with `M_CAPABILITY_NOT_ENABLED` if: `m.profile_fields`.`enabled` is `false`; or, `m.profile_fields`.`disallowed` contains `{keyName}`; +[`m.set_displayname`]|As per `m.profile_fields`|As per `m.profile_fields`|Return `403` with `M_CAPABILITY_NOT_ENABLED` if: `m.profile_fields`.`enabled` is `false`; or, `m.profile_fields`.`disallowed` contains `{keyName}`; or, `m.set_displayname`.`enabled` is `false`; +[`m.set_avatar_url`]|As per `m.profile_fields`|As per `m.profile_fields`|Return `403` with `M_CAPABILITY_NOT_ENABLED` if: `m.profile_fields`.`enabled` is `false`; or, `m.profile_fields`.`disallowed` contains `{keyName}`; or, `m.set_avatar_url`.`enabled` is `false`; +[`m.3pid_changes`]|[`POST /_matrix/client/v3/account/3pid`] [`POST /_matrix/client/v3/account/3pid/add`] [`POST /_matrix/client/v3/account/3pid/delete`]|Not defined|Return `403` with `M_CAPABILITY_NOT_ENABLED` if `m.3pid_changes`.`enabled` is `false` +[`m.get_login_token`]|[`POST /_matrix/client/v1/login/get_token`]|Maybe `400` with undefined error code if `m.get_login_token`.`enabled` is `false`|`403` with `M_CAPABILITY_NOT_ENABLED` if `m.get_login_token`.`enabled` is `false` ## Potential issues -TODO: Change in behaviour on `m.get_login_token`. +### Possible change in behaviour on `m.get_login_token` + +The spec for [`POST /_matrix/client/v1/login/get_token`] says: + +> **Status** 400 +> The request was malformed, or the user does not have an ability to generate tokens for their devices, as implied by +> the User-Interactive Authentication API. +> Clients should verify whether the user has an ability to call this endpoint with the m.get_login_token capability. + +So, it doesn't explicitly say that `400` is the expected response if the capability is not available to the user. But, +it might imply it and it is possible that some implementations might rely on this. + +However, a mitigation is that since [`POST /_matrix/client/v1/login/get_token`] was introduced by [MSC3882] it has +always had a capability associated with it and so clients should know to check the capability in advance. + +### Changes from implementations in the wild + +Endpoint(s)|Synapse current +-|- +[`POST /_matrix/client/v3/account/password`]|`403` with `M_FORBIDDEN` +[`PUT /_matrix/client/v3/profile/{userId}/{keyName}`] [`DELETE /_matrix/client/v3/profile/{userId}/{keyName}`]|`400` with `M_FORBIDDEN` +[`POST /_matrix/client/v3/account/3pid`] [`POST /_matrix/client/v3/account/3pid/add`] [`POST /_matrix/client/v3/account/3pid/delete`]|`400` with `M_FORBIDDEN` +[`POST /_matrix/client/v1/login/get_token`]|`404` with `M_UNRECOGNIZED` ## Alternatives -Base on existing implementations. This is what was originally in https://github.com/matrix-org/matrix-spec/pull/2212 +### Codify existing Synapse behaviour + +We could simply codify what is in the existing Synapse implementation (see above). This is what was originally proposed +in https://github.com/matrix-org/matrix-spec/pull/2212. + +However, that doesn't consider non-Synapse implementations. + +### Increment version on affected endpoints + +Deprecate the old version and introduce a new version with the updated error responses. + +e.g. +`POST /_matrix/client/`**`v3`**`/account/password` would be deprecated and continue to return `403` with `M_FORBIDDEN` and +`POST /_matrix/client/`**`v4`**`/account/password` would return `403` with `M_CAPABILITY_NOT_ENABLED` + +### Allow client to specify versions + +Perhaps this has been discussed elsewhere previously, but clients could specify a spec version alongside each request +(perhaps in an HTTP header) and the server used that to determine what error code to return. + +e.g. + +```http +POST /_matrix/client/v3/account/password +Host: example.com +Matrix-Version: v1.16 +``` + +Would return `403` with `M_FORBIDDEN`. But if a later version specified then the new error code is given: + +```http +POST /_matrix/client/v3/account/password +Host: example.com +Matrix-Version: v1.17 +``` + +Could return `403` with `M_CAPABILITY_NOT_ENABLED`. + +That way clients effectively opt-in to the change in format. ## Security considerations @@ -41,7 +101,7 @@ None. ## Unstable prefix -Whilst this proposal is under development the `IO.ELEMENT.MSCXXXX_CAPABILITY_NOT_ENABLED` value +Whilst this proposal is under development the `IO.ELEMENT.MSC4369_CAPABILITY_NOT_ENABLED` value should be used instead of `CAPABILITY_NOT_ENABLED`. ## Dependencies @@ -51,3 +111,17 @@ None. [capabilities negotiation]: https://spec.matrix.org/v1.16/client-server-api/#capabilities-negotiation [Client-Server API]: https://spec.matrix.org/v1.16/client-server-api/ [other error code]: https://spec.matrix.org/v1.16/client-server-api/#other-error-codes +[MSC3882]: https://github.com/matrix-org/matrix-spec-proposals/pull/3882 +[`m.change_password`]: https://spec.matrix.org/v1.16/client-server-api/#mchange_password-capability +[`m.profile_fields`]: https://spec.matrix.org/v1.16/client-server-api/#mprofile_fields-capability +[`m.set_displayname`]: https://spec.matrix.org/v1.16/client-server-api/#mset_displayname-capability +[`m.set_avatar_url`]: https://spec.matrix.org/v1.16/client-server-api/#mset_avatar_url-capability +[`m.3pid_changes`]: https://spec.matrix.org/v1.16/client-server-api/#m3pid_changes-capability +[`m.get_login_token`]: https://spec.matrix.org/v1.16/client-server-api/#mget_login_token-capability +[`POST /_matrix/client/v3/account/password`]: https://pr2212--matrix-spec-previews.netlify.app/client-server-api/#post_matrixclientv3accountpassword +[`PUT /_matrix/client/v3/profile/{userId}/{keyName}`]: https://spec.matrix.org/v1.16/client-server-api/#put_matrixclientv3profileuseridkeyname +[`DELETE /_matrix/client/v3/profile/{userId}/{keyName}`]: https://spec.matrix.org/v1.16/client-server-api/#delete_matrixclientv3profileuseridkeyname +[`POST /_matrix/client/v3/account/3pid`]: https://spec.matrix.org/v1.16/client-server-api/#post_matrixclientv3account3pid +[`POST /_matrix/client/v3/account/3pid/add`]: https://spec.matrix.org/v1.16/client-server-api/#post_matrixclientv3account3pidadd +[`POST /_matrix/client/v3/account/3pid/delete`]: https://spec.matrix.org/v1.16/client-server-api/#post_matrixclientv3account3piddelete +[`POST /_matrix/client/v1/login/get_token`]: https://spec.matrix.org/v1.16/client-server-api/#post_matrixclientv1loginget_token From a7ae48a5680ccbb87b739e7a3cf97aad76eadda8 Mon Sep 17 00:00:00 2001 From: Hugh Nimmo-Smith Date: Wed, 22 Oct 2025 15:47:25 +0100 Subject: [PATCH 7/8] Extra notes --- proposals/4369-capability-error-code.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/proposals/4369-capability-error-code.md b/proposals/4369-capability-error-code.md index 9c70ea9d37e..5be31ddea60 100644 --- a/proposals/4369-capability-error-code.md +++ b/proposals/4369-capability-error-code.md @@ -46,6 +46,8 @@ always had a capability associated with it and so clients should know to check t ### Changes from implementations in the wild +This is what Synapse currently returns: + Endpoint(s)|Synapse current -|- [`POST /_matrix/client/v3/account/password`]|`403` with `M_FORBIDDEN` @@ -53,6 +55,9 @@ Endpoint(s)|Synapse current [`POST /_matrix/client/v3/account/3pid`] [`POST /_matrix/client/v3/account/3pid/add`] [`POST /_matrix/client/v3/account/3pid/delete`]|`400` with `M_FORBIDDEN` [`POST /_matrix/client/v1/login/get_token`]|`404` with `M_UNRECOGNIZED` +The [`POST /_matrix/client/v1/login/get_token`] one is interesting as it suggests that the `400` from the previous +section isn't used in the wild. + ## Alternatives ### Codify existing Synapse behaviour From 5f5e15c8d057dc9d273482583c0c26fa80c336cc Mon Sep 17 00:00:00 2001 From: Hugh Nimmo-Smith Date: Wed, 22 Oct 2025 15:50:11 +0100 Subject: [PATCH 8/8] Formatting --- proposals/4369-capability-error-code.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/proposals/4369-capability-error-code.md b/proposals/4369-capability-error-code.md index 5be31ddea60..e8eb199f4bd 100644 --- a/proposals/4369-capability-error-code.md +++ b/proposals/4369-capability-error-code.md @@ -60,14 +60,14 @@ section isn't used in the wild. ## Alternatives -### Codify existing Synapse behaviour +### Codify existing Synapse behaviour We could simply codify what is in the existing Synapse implementation (see above). This is what was originally proposed in https://github.com/matrix-org/matrix-spec/pull/2212. However, that doesn't consider non-Synapse implementations. -### Increment version on affected endpoints +### Increment version on affected endpoints Deprecate the old version and introduce a new version with the updated error responses.