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 — EXTERNAL (customer/contact) vs INTERNAL (staff/operator).
Null leaves it unchanged (patch semantics), matching the other optional fields here.
"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",
"displayNameSource": "SYNCED",
"bioSource": "SYNCED",
"environmentSource": "SYNCED",
"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,
"enrolled": false,
"autoEnrolled": false,
"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.
Evaluates the participant placeholder vocabulary against this participant.
The participant-side mirror of pinned `{{sender.*}}` / `{{venue.*}}` tool parameters: every placeholder in the closed vocabulary (scalar profile fields plus `account.<provider>` / `address.<provider>` selectors for the union of the participant's own providers and the tenant's connected channels) evaluated through the same resolver a real tool call uses. Each row carries either the value that would be injected or the verbatim fail-closed error the tool call would die with — so "why did a pinned tool fail for this person" is answered from the Directory instead of a trace dig. Groups evaluate under the `venue.` root; people and AI agents under `sender.`. Returns 404 when the participant does not exist.