diff --git a/crates/handlers/src/admin/v1/mod.rs b/crates/handlers/src/admin/v1/mod.rs
index be3f1922f..02586368b 100644
--- a/crates/handlers/src/admin/v1/mod.rs
+++ b/crates/handlers/src/admin/v1/mod.rs
@@ -136,6 +136,10 @@ where
get_with(
self::user_registration_tokens::get,
self::user_registration_tokens::get_doc,
+ )
+ .put_with(
+ self::user_registration_tokens::update,
+ self::user_registration_tokens::update_doc,
),
)
.api_route(
diff --git a/crates/handlers/src/admin/v1/user_registration_tokens/mod.rs b/crates/handlers/src/admin/v1/user_registration_tokens/mod.rs
index 89df0c416..3d61e10e6 100644
--- a/crates/handlers/src/admin/v1/user_registration_tokens/mod.rs
+++ b/crates/handlers/src/admin/v1/user_registration_tokens/mod.rs
@@ -8,6 +8,7 @@ mod get;
mod list;
mod revoke;
mod unrevoke;
+mod update;
pub use self::{
add::{doc as add_doc, handler as add},
@@ -15,4 +16,5 @@ pub use self::{
list::{doc as list_doc, handler as list},
revoke::{doc as revoke_doc, handler as revoke},
unrevoke::{doc as unrevoke_doc, handler as unrevoke},
+ update::{doc as update_doc, handler as update},
};
diff --git a/crates/handlers/src/admin/v1/user_registration_tokens/update.rs b/crates/handlers/src/admin/v1/user_registration_tokens/update.rs
new file mode 100644
index 000000000..444c7ae6b
--- /dev/null
+++ b/crates/handlers/src/admin/v1/user_registration_tokens/update.rs
@@ -0,0 +1,511 @@
+// Copyright 2025 The Matrix.org Foundation C.I.C.
+//
+// SPDX-License-Identifier: AGPL-3.0-only
+// Please see LICENSE in the repository root for full details.
+
+use aide::{OperationIo, transform::TransformOperation};
+use axum::{Json, response::IntoResponse};
+use chrono::{DateTime, Utc};
+use hyper::StatusCode;
+use mas_axum_utils::record_error;
+use schemars::JsonSchema;
+use serde::{Deserialize, Deserializer};
+use ulid::Ulid;
+
+use crate::{
+ admin::{
+ call_context::CallContext,
+ model::{Resource, UserRegistrationToken},
+ params::UlidPathParam,
+ response::{ErrorResponse, SingleResponse},
+ },
+ impl_from_error_for_route,
+};
+
+// Any value that is present is considered Some value, including null.
+fn deserialize_some<'de, T, D>(deserializer: D) -> Result