---
title: "Merge attributes into an identified user"
method: PATCH
path: "/users/{userId}"
tags: ["Users"]
---

# Merge attributes into an identified user

`PATCH /users/{userId}`

## Request

- Base URL: `https://api.produktly.com/api/v1`
- URL: `https://api.produktly.com/api/v1/users/{userId}`
- Auth: HTTP bearer

Shallow-merges the given attributes into the user's metadata (RFC 7386 style at the top level): keys overwrite, null removes a key, omitted keys are kept. Creates the user if it doesn't exist (201).

## Path parameters

- `userId` string, required: The user's external ID — the same value you pass to window.Produktly.identifyUser(). URL-encode it.

## Request body

- object
  - `metadata` object, required: Attributes to merge (shallow, top level): keys overwrite, a key set to null is removed, omitted keys are kept, nested objects replace wholesale. Merged result max 32 KB serialized.

## Response `200`

Updated

- User
  - `userId` string, required
  - `metadata` object, nullable, required
  - `createdAt` string, date-time, required
  - `updatedAt` string, date-time, required

## Other responses

- `201`: Created (the patch was merged into an empty object)
- `400`: Validation error
- `401`: Unauthorized
- `429`: Rate limit exceeded

---

[API](https://skmtc.dev/produktly/apis/produktly-api.md) · [All operations](https://skmtc.dev/produktly/apis/produktly-api/llms.txt) · [OpenAPI document](https://skmtc.dev/produktly/apis/produktly-api/revisions/fd942a97a7d1?raw)
