Skip to main content

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.
  • null to overwrite the field with a JSON null value. Prefer {} unless you specifically need a stored null.

Returns a User object.

function replaceUserMetadata(userId: string, params: UserMetadataParams): Promise<User>
  • Name
    userId
    Type
    string
    Description

    The ID of the user to update.

  • Name
    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. When provided, the entire stored publicMetadata is overwritten with this value. When omitted, the existing publicMetadata is preserved.

  • Name
    privateMetadata?
    Type
    UserPrivateMetadata
    Description

    Metadata that can be read and set only from the Backend API. When provided, the entire stored privateMetadata is overwritten with this value. When omitted, the existing privateMetadata is preserved.

  • Name
    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. When provided, the entire stored unsafeMetadata is overwritten with this value. When omitted, the existing unsafeMetadata is preserved.

Note

Using clerkClient varies based on the SDK you're using. Refer to the overview for usage details, including guidance on how to access the userId and other properties.

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.

curl.sh
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

What did you think of this content?

Last updated on