first_name, last_name, avatar_url, timezone, locale, and manager. Every other user field—email, role, phone number—is ungoverned: the last write wins.
Who wins
Three classes of writer compete for a governed field. The highest-ranked writer that has touched the field owns it.
A pin protects a field from automation. It doesn’t protect it from directory sync: if your IdP supplies a value, change it in the IdP.
Pinning depends on your token
Whether a write pins by default depends on how you authenticated:- User token: pins by default. A person editing their own profile owns that value.
- API key or worker token: doesn’t pin. Your write stays automation-class unless you ask for a pin explicitly.
locale looks identical to ingestion writing locale, so the next sync is free to replace it.
Pin a field
List the field inpinFields on PUT /v2/users/{id}:
A pinned field must be set in the same request. You can’t pin a value that’s already stored. Send the value and the pin together, so the request’s outcome doesn’t depend on state you can’t see.
avatar_urlcan’t be pinned. Avatars live under a predictable key that automation can overwrite in place, so a pin wouldn’t protect the image. Listing it returns400.managerpins through the relationship endpoints, not here. See Manager.
POST /v2/users accepts pinFields for the two fields you can seed there, first_name and last_name:
When your write doesn’t land
An API-key write to a field someone else owns doesn’t fail. Serval applies the rest of the update and tells you what it skipped:200. Check these two arrays if your workflow depends on the write landing.
skippedPinnedFields: a person, or another deliberate edit, owns this field. SendpinFieldsto take ownership.skippedDirectoryLockedFields: your IdP supplies this field. Change it there. No API call can take it.
- If you write the value a pin already holds, the request succeeds cleanly and the field isn’t reported as skipped. Re-asserting the current state is a no-op, not a conflict.
- A directory-locked field is always reported, even when your value matches. Serval checks the lock before comparing values.
Release a field
Releasing hands a field back to automation. The current value stays, but loses its protection, so the next sync may replace it.Manager
manager is written through the relationship endpoints rather than PUT /v2/users/{id}, so its pin lives there too.
Assign a manager with POST /v2/user-relationships and pin the assignment:
DELETE /v2/user-relationships/{user_id}, passing pin as a query parameter. Pinning a delete pins the cleared state, so ingestion can’t re-assign the manager it thinks the user should have.
The same token defaults apply: user tokens pin, API keys don’t. Pass pin: false from a user token to assign a manager without taking ownership of the field.
To hand the manager field back to ingestion, release it through PUT /v2/users/{id}:
What’s next
Update User
Full request and response schema, including
pinFields and releaseFields.Create User Relationship
Assign a manager and pin the reporting line.
Connect your IdP
Directory sync outranks every pin. Fields your IdP supplies are changed there.
Databases field precedence
The equivalent model for Databases item types.

