first_name, last_name, avatar_url, timezone, locale, department, job_title, manager, and primary_phone. Email and role aren’t governed by field pinning.
email is ungoverned but not unprotected, because it is the address people log in with. Two rules apply to changing it on PUT /v2/users/{id}:
- If the user came from your directory, change their email in your identity provider. Serval rejects the write rather than let the next sync silently revert it.
- Two users in one organization cannot share an address, and deactivating a user does not release theirs. If the address you want is already taken, the error names the user holding it. Move that user to another address first, then retry.
- Change email by itself. A rename crosses the user database and login system, so Serval rejects requests that combine it with other profile changes.
- A user who belongs to multiple organizations can’t be renamed through this endpoint. Login identity is global, while the API caller is scoped to one organization.
department and job_title the same way as locale: list USER_PROFILE_FIELD_DEPARTMENT or USER_PROFILE_FIELD_JOB_TITLE in pinFields. Any department value you save joins the org’s set of department options automatically.
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.Primary phone
A phone number can belong to only one user in an organization. If connected-app ingestion supplies a primary phone that another user already owns, Serval skips that phone and publishes the remaining profile fields. The existing phone assignments stay unchanged. Direct phone edits still reject duplicate assignments. The skipped value remains in the source data. Resolving the conflicting assignment alone doesn’t retry an unchanged profile; the phone is reconsidered when the source profile changes or the user is explicitly republished.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.

