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), repeatable (?kind=PERSON&kind=GROUP) — powers the Directory's contact-kind filter, whose "all contacts" is the two human kinds rather than literally every kind. Omit for all kinds.
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.
uuidOptional rollup-group filter (environmentGroup query parameter, exact match) — narrows the roster to every contact in one chain / holding / district, i.e. across all of that group's environments. Combines with environmentId as an AND. Omit for all groups.
Optional enrollment filter (enrolled=true / enrolled=false) — narrows the roster to the contacts an agent currently answers, or to the ones nobody has been turned on for yet (the state a directory import leaves behind). Network-agnostic, matching the enrolled flag on each row; see Fruxon.Model.Participants.ParticipantResponse.Enrolled. Omit for both.
Optional directory-tier filter (CURATED / AMBIENT), repeatable (?tier=CURATED&tier=AMBIENT). Omitting it keeps the tenant-wide default of CURATED only — ambient identities are auto-created (embed web visitors, memory-minted channel senders) and are deliberately not directory citizens, so they surface only when asked for by tier. That ask is what powers the Directory's Visitors view. Under agentId there is no default: the panel lists whatever is bound to the agent, and this filter simply narrows it.
Response 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",
"displayNameSource": "SYNCED",
"bioSource": "SYNCED",
"environmentSource": "SYNCED",
"preferences": [
"string"
],
"accounts": [],
"addresses": [],
"isDebugOnly": false,
"agentIds": [
"string"
],
"disabledAt": 0,
"enrolled": false,
"autoEnrolled": false,
"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
}Config/credential health across the caller's Applications, for the Mission control nav badge.
Distinct unhealthy LLM configs / credentials across every runnable (Active or Draining) agent in the Applications the caller can open — a shared broken default counts once. `configIssues` is the single number the badge shows; zero means nothing needs attention. Pure read of the health already persisted on the config rows by the execution path — no live probing. A caller with no accessible Application gets zeroes rather than a 403: the badge is ambient chrome, not a resource.
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.