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"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.
Agents to bind to this participant on creation. May be empty.
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",
"displayName": "string",
"email": "string",
"relatedAgentId": "string",
"channels": [
{
"integrationConfigId": "00000000-0000-0000-0000-000000000000",
"address": "string",
"priority": 0,
"label": "string",
"disabled": 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
}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.
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.