Partial update
Applies a partial update: only the non-null fields of the request are written, so callers can patch a single property without resending the whole resource. Supplying `Channels` replaces the channel list wholesale. `Kind` cannot be changed here. Agent bindings are managed through the nested `bindings` sub-resource, not this endpoint.
Authorization
Bearer JWT Authorization header using the Bearer scheme. Enter 'Bearer' [space] and then your token.
In: header
Path Parameters
The participant identifier.
uuidThe tenant identifier
The patch payload — null fields are left unchanged.
length <= 150Contact email. Patch semantics: null leaves it unchanged; an empty string explicitly clears it (normalized to null); any other value replaces it.
length <= 4000Trust boundary a Fruxon.Model.Participants.Participant sits on (design participant-audience-and-roles.md §1) —
a platform-owned, security-relevant axis distinct from Fruxon.Model.Participants.ParticipantTier (how it was admitted)
and the tenant's own Segment directory. A customer and a support operator are both
Fruxon.Model.Participants.ParticipantTier.Curated; only Audience separates them.
Gates the operator-eligibility predicate (only an Fruxon.Model.Participants.ParticipantAudience.Internal + Fruxon.Model.Participants.ParticipantTier.CuratedFruxon.Model.Participants.ParticipantKind.Person may be an escalation operator), which fixes "a customer can be selected as an operator." Defaults Fruxon.Model.Participants.ParticipantAudience.Unknown on existing rows so eligibility is fail-closed; the I4 backfill promotes participants already wired as operators to Fruxon.Model.Participants.ParticipantAudience.Internal so live escalation is not stranded.
"UNSPECIFIED" | "UNKNOWN" | "INTERNAL" | "EXTERNAL"Operator-uploaded avatar. Patch semantics: null leaves the
existing value alone; an empty string clears it (e.g. when the
operator removes the upload). To match this, the service treats the
empty string as "explicit clear" rather than coalescing it.
When provided, replaces the participant's address list entirely. Pass null to leave unchanged; pass an empty list to clear.
When provided, reconciles agent bindings to exactly this set in the same call as the rest of the patch — additions and removals are computed against the current bindings. Pass null to leave bindings unchanged; pass an empty list to unbind every agent.
Closes the partial-commit window the FE used to fall into: when the
participant dialog used to write the participant PATCH and then
fan-out individual PUT/DELETE /bindings/{agent} calls in
parallel, a single failing binding op left the operator with a
half-applied state. With this field, both the entity update and
the binding reconciliation run inside one service call — the
granular per-binding endpoints stay for callers that prefer them.
New advisor description. Null leaves it unchanged; an empty string clears it.
length <= 4000When provided, replaces the participant's consult expertise (capability names). Null leaves it unchanged; an empty list clears it.
New profile area of work (Phase 0). Null leaves it unchanged; an empty string clears it.
length <= 150New profile bio (Phase 0). Null leaves it unchanged; an empty string clears it.
length <= 4000New preferred language for notices sent to this participant (ISO 639-1, e.g. "en", "he"). Null leaves it unchanged; an empty string clears it (falls back to auto-detect from the customer's turns).
length <= 16When provided, replaces the participant's preference tags. Null leaves it unchanged; an empty list clears it.
When provided, replaces the participant's external account links. Null leaves it unchanged; an empty list clears it.
Re-file the contact under a different environment (directory grouping). Authoritative only when
Fruxon.Model.Participants.UpdateParticipantRequest.EnvironmentSpecified is true — a non-null value moves the contact (validated against the
tenant's environments), an explicit null unaffiliates it. When false the current affiliation is
preserved. A plain Guid? can't express "leave unchanged" vs "clear" on its own, so this mirrors
the access-request approve payload (RecordAccessRequestCommand.EnvironmentSpecified).
uuidTrue when the client set Fruxon.Model.Participants.UpdateParticipantRequest.EnvironmentId deliberately (so an explicit null clears the affiliation). False leaves the current environment untouched — the default for a patch that doesn't touch grouping.
Response Body
curl -X PATCH "https://api.fruxon.com/v1/tenants/string/participants/497f6eca-6276-4993-bfeb-53cbbbba6f08" \ -H "Content-Type: application/json" \ -d '{}'{
"id": "00000000-0000-0000-0000-000000000000",
"kind": "PERSON",
"tier": "CURATED",
"audience": "UNKNOWN",
"displayName": "string",
"email": "string",
"relatedAgentId": "string",
"description": "string",
"expertise": [
"string"
],
"area": "string",
"bio": "string",
"preferredLanguage": "string",
"environmentId": "00000000-0000-0000-0000-000000000000",
"preferences": [
"string"
],
"accounts": [
{
"provider": "string",
"identifier": "string",
"handle": "string",
"profileUrl": "string",
"source": "MANUAL",
"verifiedAt": 0
}
],
"addresses": [
{
"provider": "string",
"address": "string",
"priority": 0,
"label": "string",
"disabled": false
}
],
"isDebugOnly": false,
"agentIds": [
"string"
],
"disabledAt": 0,
"health": {
"reachable": false,
"channels": [
{
"address": "string",
"reason": null,
"keyStatus": "UNSPECIFIED",
"keyPrefix": "string",
"lastMessageAt": null
}
],
"reason": "INVALID_FORMAT"
},
"channelActivations": [
{
"agentId": "string",
"bindingId": "00000000-0000-0000-0000-000000000000",
"integrationConfigId": "00000000-0000-0000-0000-000000000000",
"provider": "string",
"address": "string",
"webhookUrl": "string",
"webhookUrlTemplate": "string",
"webhookKeyPrefix": "string",
"scope": "PER_BINDING"
}
],
"avatarFileId": "string",
"avatarSource": "UPLOADED",
"avatarSourceConfigId": "00000000-0000-0000-0000-000000000000",
"avatarSourceAddress": "string",
"avatarSyncedAt": 0,
"avatarAutoSync": {
"synced": false,
"provider": "string",
"address": "string"
},
"createdAt": 0,
"modifiedAt": 0
}{
"type": "string",
"title": "string",
"status": 0,
"detail": "string",
"instance": "string",
"property1": null,
"property2": null
}{
"type": "string",
"title": "string",
"status": 0,
"detail": "string",
"instance": "string",
"property1": null,
"property2": null
}Returns a single participant with their channels and current agent bindings.
Fetches one participant by id, including its inline channel list and the set of agents it is currently bound to. Returns 404 when no participant with that id exists in the tenant.
Creates a participant and optionally binds it to a set of agents atomically.
Creates the participant together with its channels and any initial agent bindings supplied in the request — all in one transaction, so a participant is never persisted half-bound. `Kind` is fixed at creation: switching a participant between Person, Group, and AI Agent requires recreating it.