replaceUserMetadata()
Replaces the metadata associated with the specified user. Unlike updateUserMetadata(), which deep-merges into the existing metadata, this method uses replace semantics: when a metadata field is provided, its previous value is overwritten in full with no merging at any level.
The distinction is at two layers:
- Top-level field omission preserves the existing value. Each top-level field (
publicMetadata,privateMetadata,unsafeMetadata) is handled independently. If you don't include a field in the request, the stored value for that field is left untouched. - The value inside a provided field is replaced in full. When you do include a field, its previous content is discarded — any nested keys present before but absent in the new value are dropped. There is no merge.
For the provided field, you can also send:
{}(empty object) to clear the field.nullto overwrite the field with a JSONnullvalue. Prefer{}unless you specifically need a storednull.
Returns the updated User.
function replaceUserMetadata(userId: string, params: { privateMetadata?: UserPrivateMetadata; publicMetadata?: UserPublicMetadata; unsafeMetadata?: UserUnsafeMetadata }): Promise<User>- Name
userId- Type
string- Description
The ID of the user to replace the metadata for.
- Name
params- Type
{ privateMetadata?: UserPrivateMetadata; publicMetadata?: UserPublicMetadata; unsafeMetadata?: UserUnsafeMetadata; }- Description
The metadata to replace.
- Name
params.privateMetadata?- Type
- UserPrivateMetadata
- Description
Metadata that can be read and set only from the Backend API.
- Name
params.publicMetadata?- Type
- UserPublicMetadata
- Description
Metadata that can be read from the Frontend API and Backend API and can be set only from the Backend API.
- Name
params.unsafeMetadata?- Type
- UserUnsafeMetadata
- Description
Metadata that can be read and set from the Frontend API. It's considered unsafe because it can be modified from the Frontend API.
const userId = 'user_123'
const response = await clerkClient.users.replaceUserMetadata(userId, {
publicMetadata: {
role: 'admin',
},
})Backend API (BAPI) endpoint
This method in the SDK is a wrapper around the BAPI endpoint PUT/users/{user_id}/metadata. See the BAPI reference for more information.
Here's an example of making a request directly to the endpoint using cURL.
Replace YOUR_SECRET_KEY with your Clerk Secret Key. You can find your Secret Key on the API keys page in the Clerk Dashboard.
curl -XPUT -H 'Authorization: Bearer YOUR_SECRET_KEY' -H "Content-type: application/json" -d '{
"public_metadata": {
"role": "admin"
}
}' 'https://api.clerk.com/v1/users/{user_id}/metadata'Feedback
Last updated on