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.
Authorization
Bearer JWT Authorization header using the Bearer scheme. Enter 'Bearer' [space] and then your token.
In: header
Path Parameters
The tenant identifier
What sort of entity a Fruxon.Model.Participants.Participant represents. The Agent Network treats all three uniformly — they're the "things that talk to agents" — but the kind disambiguates UX and downstream routing rules.
"UNSPECIFIED" | "PERSON" | "GROUP" | "AI_AGENT"Trust boundary — EXTERNAL (customer/contact) vs INTERNAL (staff/operator).
Defaults to Fruxon.Model.Participants.ParticipantAudience.Unknown so operator eligibility stays
fail-closed until an operator classifies the person. See Fruxon.Model.Participants.ParticipantAudience.
"UNSPECIFIED" | "UNKNOWN" | "INTERNAL" | "EXTERNAL"1 <= length <= 150length <= 4000Operator-uploaded avatar file id (in platform storage). Optional; AI-agent participants without one fall back to the backing agent's avatar at projection time.
Identity addresses (provider + address) the participant can be reached at. The bot/app is derived from the bound agents' endpoints, not picked here.
Agents to bind to this participant on creation. May be empty.
Whether the initial bindings also place this participant on each agent's consult roster. Defaults false so binding a customer for conversation access does not inject peer-network tools. Advisor creation must opt in explicitly.
Consult advisor identity (PLAN-consult-roster): a free-text description of what this participant can help with, plus the capability names they carry (the expertise the consult resolver matches).
length <= 4000Profile (PLAN-identity-normalization, Phase 0): area of work (or role), a longer bio, and working-preference tags — distinct from the consult Fruxon.Model.Participants.CreateParticipantRequest.Description/Fruxon.Model.Participants.CreateParticipantRequest.Expertise above.
length <= 150length <= 4000Optional preferred language (ISO 639-1, e.g. "en", "he") for platform-authored notices sent to this participant — set on an operator so bridge notices render in their language, not the customer's.
length <= 16Optional environment (served end-customer / account) this contact belongs to — the unified grouping (docs/design/environments-directory-unification.md). A logical reference (no FK, partition-friendly), null = unaffiliated. Set at onboarding by the per-provider environment resolver, or by an operator picking one on approve.
uuidNon-routing external account links (github, jira, gitlab, …) — correlation keys, never routed. Kept separate from Fruxon.Model.Participants.CreateParticipantRequest.Addresses on purpose.
Response Body
curl -X POST "https://api.fruxon.com/v1/tenants/string/participants" \ -H "Content-Type: application/json" \ -d '{ "displayName": "string" }'{
"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
}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.
Smoke-tests the outbound dispatch pipeline — picks a channel via the channel selector, decrypts the integration config, and routes through the per-provider sender (currently a logging stub for every provider — real senders land in Phase 3d.3)
Smoke-tests the outbound dispatch pipeline end to end: the channel selector picks a channel for the participant, the integration config is decrypted, and the message is handed to the per-provider sender. Use it to confirm a participant is reachable before relying on it in a flow. Returns 404 when the participant does not exist.