Stitchflow
Dixa logo

Dixa User Management API Guide

API workflow

How to automate user lifecycle operations through APIs with caveats that matter in production.

UpdatedMar 11, 2026

Summary and recommendation

Dixa exposes a REST API at https://dev.dixa.io/v1 - note the dev.dixa.io host, not app.dixa.io; using the wrong host returns 404. Authentication is a static org-scoped Bearer token issued from Settings → Integrations → API; there is no per-user OAuth flow.

The user object includes fields for id (UUID), email, displayName, role (AGENT, TEAM_LEAD, ADMIN), active (boolean), teamIds, and queueIds, giving enough surface area to build a functional identity graph that maps agents to their team and queue memberships across the organization.

Pagination is cursor-based using pageToken and limit parameters (default 20, max 100); offset pagination is not supported.

API quick reference

Has user APIYes
Auth methodAPI Key (Bearer token) — a static API token issued per Dixa organization, passed as Authorization: Bearer <token>
Base URLOfficial docs
SCIM availableYes
SCIM plan requiredEnterprise (Custom pricing)

Authentication

Auth method: API Key (Bearer token) - a static API token issued per Dixa organization, passed as Authorization: Bearer

Setup steps

  1. Log in to Dixa as an administrator.
  2. Navigate to Settings → Integrations → API.
  3. Generate a new API token; copy and store it securely.
  4. Include the token in all requests as the HTTP header: Authorization: Bearer .

User object / data model

Field Type Description On create On update Notes
id string (UUID) Unique agent identifier system-generated immutable Used as path parameter in agent endpoints
email string Agent email address required optional Must be unique within the organization
displayName string Full display name of the agent required optional
firstName string Agent first name optional optional
lastName string Agent last name optional optional
phoneNumber string Agent phone number optional optional
role string (enum) Agent role: AGENT, TEAM_LEAD, ADMIN required optional
active boolean Whether the agent account is active optional (default true) optional Setting false deactivates the agent
teamIds array[string] IDs of teams the agent belongs to optional optional
queueIds array[string] IDs of queues assigned to the agent optional optional
avatarUrl string (URL) URL of the agent's avatar image optional optional Read-only; set via UI
createdAt string (ISO 8601) Timestamp of agent creation system-generated immutable
updatedAt string (ISO 8601) Timestamp of last update system-generated system-generated

Core endpoints

List agents

  • Method: GET
  • URL: https://dev.dixa.io/v1/agents
  • Watch out for: Returns only active agents by default; pass ?active=false to include deactivated agents.

Request example

GET /v1/agents?limit=20 HTTP/1.1
Host: dev.dixa.io
Authorization: Bearer <token>

Response example

{
  "data": [
    {"id": "uuid", "email": "agent@co.com", "displayName": "Jane Doe", "role": "AGENT", "active": true}
  ],
  "nextPageToken": "abc123"
}

Get agent by ID

  • Method: GET
  • URL: https://dev.dixa.io/v1/agents/{agentId}
  • Watch out for: Returns 404 if the agent ID does not exist or belongs to a different organization.

Request example

GET /v1/agents/uuid-1234 HTTP/1.1
Host: dev.dixa.io
Authorization: Bearer <token>

Response example

{
  "id": "uuid-1234",
  "email": "agent@co.com",
  "displayName": "Jane Doe",
  "role": "AGENT",
  "active": true
}

Create agent

  • Method: POST
  • URL: https://dev.dixa.io/v1/agents
  • Watch out for: An invitation email is sent to the new agent automatically; there is no way to suppress this via the API.

Request example

POST /v1/agents HTTP/1.1
Host: dev.dixa.io
Authorization: Bearer <token>
Content-Type: application/json

{"email":"new@co.com","displayName":"New Agent","role":"AGENT"}

Response example

{
  "id": "uuid-5678",
  "email": "new@co.com",
  "displayName": "New Agent",
  "role": "AGENT",
  "active": true
}

Update agent

  • Method: PATCH
  • URL: https://dev.dixa.io/v1/agents/{agentId}
  • Watch out for: Only fields included in the request body are updated (partial update semantics).

Request example

PATCH /v1/agents/uuid-5678 HTTP/1.1
Host: dev.dixa.io
Authorization: Bearer <token>
Content-Type: application/json

{"role":"TEAM_LEAD"}

Response example

{
  "id": "uuid-5678",
  "role": "TEAM_LEAD",
  "active": true
}

Deactivate agent

  • Method: PATCH
  • URL: https://dev.dixa.io/v1/agents/{agentId}
  • Watch out for: Dixa does not support hard-deleting agents via the REST API; deactivation (active=false) is the supported offboarding method.

Request example

PATCH /v1/agents/uuid-5678 HTTP/1.1
Host: dev.dixa.io
Authorization: Bearer <token>
Content-Type: application/json

{"active":false}

Response example

{
  "id": "uuid-5678",
  "active": false
}

List teams

  • Method: GET
  • URL: https://dev.dixa.io/v1/teams
  • Watch out for: Team membership is managed by updating the team object, not the agent object directly.

Request example

GET /v1/teams HTTP/1.1
Host: dev.dixa.io
Authorization: Bearer <token>

Response example

{
  "data": [
    {"id": "team-uuid", "name": "Support Team", "agentIds": ["uuid-1","uuid-2"]}
  ]
}

Add agent to team

  • Method: POST
  • URL: https://dev.dixa.io/v1/teams/{teamId}/agents
  • Watch out for: Adding an agent to a team does not automatically assign them to the team's queues.

Request example

POST /v1/teams/team-uuid/agents HTTP/1.1
Host: dev.dixa.io
Authorization: Bearer <token>
Content-Type: application/json

{"agentId":"uuid-5678"}

Response example

{
  "teamId": "team-uuid",
  "agentId": "uuid-5678"
}

Get current authenticated agent (me)

  • Method: GET
  • URL: https://dev.dixa.io/v1/agents/me
  • Watch out for: Returns the agent associated with the API token, not a caller identity; all tokens are org-level.

Request example

GET /v1/agents/me HTTP/1.1
Host: dev.dixa.io
Authorization: Bearer <token>

Response example

{
  "id": "uuid-owner",
  "email": "admin@co.com",
  "role": "ADMIN",
  "active": true
}

Rate limits, pagination, and events

  • Rate limits: Dixa enforces rate limits on the REST API; exact per-plan limits are not publicly documented in detail.
  • Rate-limit headers: Yes
  • Retry-After header: No
  • Rate-limit notes: When a rate limit is exceeded, Dixa returns HTTP 429. Clients should inspect response headers for limit context and implement exponential back-off. Specific numeric limits are not published in official docs as of the policy date.
  • Pagination method: cursor
  • Default page size: 20
  • Max page size: 100
  • Pagination pointer: pageToken / limit
Plan Limit Concurrent
All plans Not publicly specified 0
  • Webhooks available: Yes
  • Webhook notes: Dixa supports webhooks for conversation and contact events. Agent/user lifecycle events (create, update, deactivate) are not explicitly listed as webhook triggers in official documentation.
  • Alternative event strategy: Poll GET /v1/agents with a timestamp filter or use SCIM provisioning events via your IdP (Okta) for agent lifecycle notifications.
  • Webhook events: conversation.created, conversation.assigned, conversation.closed, message.created, contact.created, contact.updated

SCIM API status

  • SCIM available: Yes

  • SCIM version: 2.0

  • Plan required: Enterprise (Custom pricing)

  • Endpoint: https://dev.dixa.io/scim/v2

  • Supported operations: GET /Users, GET /Users/{id}, POST /Users, PUT /Users/{id}, PATCH /Users/{id}, DELETE /Users/{id}, GET /Groups, POST /Groups, PATCH /Groups/{id}, DELETE /Groups/{id}, GET /Schemas, GET /ServiceProviderConfig

Limitations:

  • SAML SSO must be configured and active before SCIM provisioning can be enabled.
  • Only Okta is officially documented as a supported IdP for SCIM; Microsoft Entra ID and Google Workspace are not listed.
  • SCIM Groups map to Dixa Teams; group-to-queue assignment is not managed via SCIM.
  • Hard-delete via SCIM DELETE deactivates the agent rather than permanently removing the record.
  • Schema discovery is supported via GET /Schemas endpoint.
  • Requires Enterprise (Custom) plan - not available on Essential, Growth, or Ultimate tiers.

Common scenarios

Three automation scenarios are well-supported by the API. For provisioning, POST /v1/agents creates the agent and triggers an invitation email automatically - suppression is not possible via the API.

Capture the returned agent id, then POST /v1/teams/{teamId}/agents to assign team membership; queue assignment requires a separate PATCH /v1/agents/{agentId} with queueIds. For offboarding, PATCH /v1/agents/{agentId} with {"active": false} deactivates the account; hard deletion is not supported via the REST API.

Open conversations are not automatically reassigned on deactivation, so a conversation reassignment step should precede the PATCH call. For full lifecycle automation, SCIM 2.

0 is available at https://dev.dixa.io/scim/v2 on the Enterprise plan with Okta as the only officially documented IdP; SAML SSO must be active before SCIM can be enabled. SCIM Groups map to Dixa Teams - not to Queues - so queue assignment remains outside SCIM scope and must be handled via the REST API.

Provision a new agent and assign to a team

  1. POST /v1/agents with email, displayName, and role to create the agent (invitation email sent automatically).
  2. Capture the returned agent id.
  3. POST /v1/teams/{teamId}/agents with the new agentId to add them to the appropriate team.
  4. Optionally PATCH /v1/agents/{agentId} to assign queueIds if queue assignment is needed.

Watch out for: The agent must accept the invitation email before they can log in; the API does not expose an 'invitation accepted' status field.

Offboard a departing agent

  1. GET /v1/agents/{agentId} to confirm the agent exists and retrieve current team/queue assignments.
  2. PATCH /v1/agents/{agentId} with {"active": false} to deactivate the account.
  3. Reassign open conversations via the conversations API or Dixa UI before deactivation to avoid orphaned tickets.

Watch out for: Deactivation does not automatically reassign open conversations; unassigned conversations may fall into an unmonitored state.

Automate agent lifecycle via SCIM with Okta

  1. Confirm Dixa Enterprise plan is active and SAML SSO is configured in Dixa Settings.
  2. In Okta, add the Dixa SCIM application and configure the SCIM base URL (https://dev.dixa.io/scim/v2) and Bearer token.
  3. Enable provisioning features: Create Users, Update User Attributes, Deactivate Users, Push Groups.
  4. Assign Okta groups to the Dixa app; groups will sync as Dixa Teams via SCIM /Groups.
  5. Test with a single user push before enabling for the full organization.

Watch out for: SCIM group push maps Okta groups to Dixa Teams, not to Dixa Queues. Queue assignment must still be managed manually or via the REST API.

Why building this yourself is a trap

Several non-obvious constraints can break integrations built against this API. Rate limit numeric thresholds are not publicly documented; the API returns HTTP 429 on breach, and clients must implement exponential back-off without a Retry-After header to guide timing.

The GET /v1/agents endpoint returns only active agents by default - omitting the ?active=false parameter will silently exclude deactivated agents from any identity graph sync, producing an incomplete picture of org membership.

SCIM provisioning has a hard dependency chain: Enterprise plan must be active and SAML SSO must be configured first; missing either condition blocks SCIM setup entirely. Microsoft Entra ID and Google Workspace are not officially supported IdPs for SCIM; teams not using Okta should treat SCIM integration as unsupported and untested.

Automate Dixa workflows without one-off scripts

Stitchflow builds and maintains end-to-end IT automation across your SaaS stack, including apps without APIs. Built for exactly how your company works, with human approvals where they matter.

Every app coverage, including apps without APIs
60+ app integrations plus browser automation for apps without APIs
IT graph reconciliation across apps and your IdP
Less than a week to launch, maintained as APIs and admin consoles change
SOC 2 Type II. ~2 hours of your team's time

UpdatedMar 11, 2026

* Details sourced from official product documentation and admin references.

Keep exploring

Related apps

15Five logo

15Five

Full API + SCIM
AutomationAPI + SCIM
Last updatedFeb 2026

15Five uses a fixed role-based permission model with six predefined roles: Account Admin, HR Admin, Billing Admin, Group Admin, Manager, and Employee. No custom roles can be constructed. User management lives at Settings gear → People → Manage people p

1Password logo

1Password

Full API + SCIM
AutomationAPI + SCIM
Last updatedFeb 2026

1Password's admin console at my.1password.com covers the full user lifecycle — invitations, group assignments, vault access, suspension, and deletion — without any third-party tooling. Like every app that mixes role-based and resource-level permissions

8x8 logo

8x8

Full API + SCIM
AutomationAPI + SCIM
Last updatedFeb 2026

8x8 Admin Console supports full lifecycle user management — create, deactivate, and delete — across its X Series unified communications platform. Every app a user can access (8x8 Work desktop, mobile, web, Agent Workspace) is gated by license assignmen