FruxonDocs
Agent NetworkParticipants

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.

PATCH
/v1/tenants/{tenant}/participants/{participant}
AuthorizationBearer <token>

JWT Authorization header using the Bearer scheme. Enter 'Bearer' [space] and then your token.

In: header

Path Parameters

participant*string

The participant identifier.

Formatuuid
tenant*string

The tenant identifier

The patch payload — null fields are left unchanged.

displayName?string|null
Lengthlength <= 150
email?string|null

Contact email. Patch semantics: null leaves it unchanged; an empty string explicitly clears it (normalized to null); any other value replaces it.

Lengthlength <= 4000
relatedAgentId?string|null
audience?string

Trust 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.

Value in"UNSPECIFIED" | "UNKNOWN" | "INTERNAL" | "EXTERNAL"
avatarFileId?string|null

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.

addresses?|null

When provided, replaces the participant's address list entirely. Pass null to leave unchanged; pass an empty list to clear.

agentIds?|null

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.

description?string|null

New advisor description. Null leaves it unchanged; an empty string clears it.

Lengthlength <= 4000
expertise?|null

When provided, replaces the participant's consult expertise (capability names). Null leaves it unchanged; an empty list clears it.

area?string|null

New profile area of work (Phase 0). Null leaves it unchanged; an empty string clears it.

Lengthlength <= 150
bio?string|null

New profile bio (Phase 0). Null leaves it unchanged; an empty string clears it.

Lengthlength <= 4000
preferredLanguage?string|null

New 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).

Lengthlength <= 16
preferences?|null

When provided, replaces the participant's preference tags. Null leaves it unchanged; an empty list clears it.

accounts?|null

When provided, replaces the participant's external account links. Null leaves it unchanged; an empty list clears it.

environmentId?string|null

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).

Formatuuid
environmentSpecified?boolean

True 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.

[key: string]?never

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
}
Empty
Empty
{
  "type": "string",
  "title": "string",
  "status": 0,
  "detail": "string",
  "instance": "string",
  "property1": null,
  "property2": null
}