Skip to main content
Set some of a user’s attribute values, and return the ones that changed. Only the attributes sent are written. Read the user’s current values with get_user, and each attribute’s type and the labels a picklist accepts with list_user_attributes. Every value is checked before the first write, so a call writes all of its values or none; sending values the user already holds changes nothing, so the same call can be sent twice. An amount keeps the currency the user holds it in, as in the Qobra web app. A unique attribute refuses a value another user already holds, and changing one re-matches in the background the records of the data tables that match their users on it. On a user synced from an HRIS, a value written over a synced attribute is kept as an overwrite: later syncs leave it in place, and Qobra keeps the synced value beside it. Sending the synced value back, or null, cancels the overwrite. No statement is recalculated by this call, as after an edit in the web app: a calculation reading these attributes picks the change up the next time it runs. The call is refused, with a message naming the problem, when the user is archived, when an attribute is unknown or listed twice, when a value does not match its attribute’s type or picklist options, or when a unique attribute is given a value another user already holds. Requires write permission on users. Available only where the Qobra write tools beta is enabled. Every write is recorded in the audit trail as the Qobra MCP agent.
Example arguments

Parameters

Body

string
required
Id of the user whose attribute values to set — the id list_users returns. An exact email is accepted too.
object[]
required
The values to write, one per attribute. An attribute left out keeps its value.

Response

Body

object
The user whose attribute values the call set.
object[]
Every attribute whose value the call changed, with the value the user now holds, in the shape get_user serves it. Empty when every value sent was already the user’s, which is how a repeated call reads as the no-op it was.