Lists participants in the tenant
Returns participants ordered by display name, each with its inline channels and current agent bindings. Pass `agentId` to narrow the result to the participants bound to a single agent — the Agent Network UI uses this to render an agent's contact list. Always paged (an agent's roster can run to thousands): each response carries `nextPageToken` and `totalCount`, and an omitted `pageSize` takes the server default rather than returning everything. Consumers that need the whole roster page through `nextPageToken`.
Authorization
Bearer JWT Authorization header using the Bearer scheme. Enter 'Bearer' [space] and then your token.
In: header
Path Parameters
The tenant identifier
Query Parameters
If supplied, only participants bound to this agent are returned.
The maximum number of items to return per page
int32int32Opaque cursor token from an external system (e.g. RAG API). When set, M:Fruxon.Common.Collections.PageToken.AsString returns this value directly instead of encoding Fruxon.Common.Collections.PageToken.Skip.
Sort order (AIP-132 orderBy); defaults to display name ascending — powers the Directory table's sortable column headers.
Optional case-insensitive substring filter (search query parameter) matched against the participant display name — powers the Executions participant filter's typeahead. Omit for the unfiltered roster.
Optional participant-kind filter (PERSON / GROUP / AI_AGENT) — powers the Directory's per-kind tabs. Omit for all kinds.
"UNSPECIFIED" | "PERSON" | "GROUP" | "AI_AGENT"Optional environment filter (environmentId query parameter) — narrows the roster to contacts in one workspace environment, pushed to the (TenantId, EnvironmentId) index. Omit for all environments.
uuidResponse Body
curl -X GET "https://api.fruxon.com/v1/tenants/string/participants"{
"items": [
{
"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": [],
"addresses": [],
"isDebugOnly": false,
"agentIds": [
"string"
],
"disabledAt": 0,
"health": {
"reachable": false,
"channels": [],
"reason": null
},
"channelActivations": [],
"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
}
],
"nextPageToken": "string",
"totalCount": 0
}{
"type": "string",
"title": "string",
"status": 0,
"detail": "string",
"instance": "string",
"property1": null,
"property2": null
}The support KPIs bucketed over time — the trend behind the operational-detail sparklines.
One point per UTC day (or per week when bucket is `Week`). Only the additive counters are bucketed — volume, resolution, containment, escalation, degrade, cost — with rates recomputed per bucket (null when the denominator is zero). The point-in-time gauges (operator load, awaiting) and time-to-human live on the rollup endpoint. `from`/`to` are Unix ms (half-open), defaulting to the last 30 days; `origin` filters spend only.
Enqueues a real directory import and returns the job to poll
A full import can sweep up to 100k contacts (each creating a participant + environment), which far exceeds a single HTTP request budget — so this does not run the sweep inline. It enqueues a job and returns `202 Accepted` with the run; a background worker then enumerates the integration's contacts, gets-or-creates each contact's environment, and creates a participant (External audience) where none already exists at its address — so a re-run is safe and creates no duplicates. Poll `GET directory/importRuns/{importRun}` for progress and the final counters. Only one import per `(provider, integrationConfigId)` may be in flight; a second request returns `409 Conflict` until the first finishes. Run the dry-run preview first and review the report before importing.