List users

Retrieves a paginated list of users filtered by the provided query parameters.
Results are sorted by createdAt in descending order.
The response format defaults to JSON, but CSV can be requested via the Content-Type header.

count semantics: the count field in the response is the retailer's
total user count, not the filtered total. The divergence grows as
filters (status, teams, role, ...) narrow the result set — clients
must not use count to size filtered result pages.

status field semantics (read): the field remains visible to any
authenticated user of the retailer (parity with the current behavior; a
future restriction stays possible behind a flag). On the DynamoDB-served
paths, items persisted before the presence pipeline have no stored
status and are answered as LOGGEDOUT. On the Parse-served paths (the
name text-search fallback and order=-totalActiveChats), a missing
status is currently answered as absent, not LOGGEDOUT — that default
is not applied there.

Technical users (per-retailer flag user-listing-exclude-technical-users):
when active, users flagged apiUser/botUser/supportUser are excluded
from every listing by default. The pre-existing opt-in parameters
apiUser, botUser and supportUser then require the admin role
(403 otherwise). Only the literal value true is privileged —
apiUser=false is the explicit negation of the default and never
returns 403. With the flag off the behavior is unchanged (technical
users listed as before, no admin gate). The technical flags themselves
are not part of the response payload.

Index selection matrix (status × disabled × cannotStartConversation —
residual conditions are filtered in memory, recursive pagination refills
short pages):

statusdisabledcannotStartConversationIndexIn-memory residual
user-status-index (composite key)
user-status-indexcannotStartConversation
anyquery-retailer-indexstatus (+ template)
user-disabled-template-index
user-disabled-index
user-template-index
query-retailer-index

teams is always filtered in memory (intersection with the denormalized
teams[].id array).

Sparse GSI note: user-status-index only contains items that already
received a presence event (or were written after the presence pipeline).
Until the base converges, a server-side status=LOGGEDOUT query may miss
users who never generated an event — reads default those items to
LOGGEDOUT, and the in-memory residual path applies the same default.

Request examples

GET /v1/users?status=LOGGEDIN&disabled=false&limit=20
GET /v1/users?teams=team_a&teams=team_b&role=service
GET /v1/users?status=AWAY&teams=team_a&tokenPagination=eyJwayI6...
GET /v1/users?botUser=true            # admin only when the exclusion flag is on
GET /v1/users?status=ONLINE           # 400 — outside the enum
Recent Requests
Log in to see full request history
TimeStatusUser Agent
Retrieving recent requests…
LoadingLoading…
Query Params
string

Filter by user name (full-text search, served by Parse). When the
value is an e-mail address the lookup shortcuts to an exact match
on the user-by-email-index, and none of the other filters
(status, teams, role, technical opt-ins) apply on that path
— including the technical exclusion flag, so a technical user
remains reachable by e-mail even with
user-listing-exclude-technical-users on. On the non-e-mail
(Parse) path, role still applies, but technical users
(apiUser/botUser/supportUser) are always excluded
regardless of the flag or the opt-in parameters. Known gap: an
e-mail lookup with no match currently returns 500, not the
empty page documented below for the filtered paths.

role
array of strings

Filter by one or more roles.

role
boolean

Filter by disabled status.

boolean

Filter users who cannot start conversations.

boolean

Filter users who cannot send stickers.

string
enum

Filter by presence status. Values outside the enum return 400.
Combined with disabled, the query runs on the composite
user-status-index (no Scan); without disabled the status is
filtered in memory (see the index selection matrix above). Items
without a stored status count as LOGGEDOUT.

Allowed:
teams
array of strings

Filter by one or more team ids (multi-value, same pattern as
role). Filtered in memory by intersection with the user's
denormalized teams[].id; recursive pagination refills short
pages. This is a convenience filter, not access control (AD-028).

teams
boolean

Opt-in (MAN-1566): only the literal value true activates it
(1/TRUE count as absent — same string-gate convention as the
other boolean filters). When true, every returned user carries a
totalActiveChats field, read from Parse (_User.totalActiveChats,
the denormalized counter maintained by the chat hooks — pending P3
of the listing migration). One extra Parse query per page, scoped
to the page's ids. The counter is eventually consistent and does
not by itself affect ordering — to sort by the counter, use
order=-totalActiveChats. If the Parse read fails the
request fails — a silent 0 would change app behavior (bulk
selection is enabled by > 0). Omitted or false: response is
byte-for-byte unchanged and no Parse call is made.

boolean

Opt-in to include API users when the technical exclusion flag is
active. Requires the admin role once the per-retailer flag
user-listing-exclude-technical-users is on (403 otherwise).

boolean

Opt-in to include bot users. Same admin gate as apiUser when the
technical exclusion flag is active.

boolean

Opt-in to include support users. Same admin gate as apiUser when
the technical exclusion flag is active.

integer

Maximum number of users to return per page.

string

Pagination token returned from the previous request to retrieve the next page.

string
enum

Sort order. Use name for ascending or -name for descending
(both served by DynamoDB with cursor pagination).

-totalActiveChats (MAN-1566) sorts by the active-chat counter,
descending, with canonicalFullName as tie-breaker. This mode is
served by Parse (the counter's source) with offset pagination
encoded in tokenPagination — the counter is live, so items may
repeat or be skipped across pages. Technical users
(apiUser/botUser/supportUser) are included by default
(bots and support accounts hold active chats); when the
per-retailer flag user-listing-exclude-technical-users is on,
the standard listing rules apply — excluded by default, =true
opt-in (admin-gated) brings them back. Returns 400 when
combined with name or status; teams is supported (applied
inside the query, membership resolved from the Team class).

Allowed:
Responses

Language
Credentials
Header
URL
LoadingLoading…
Response
Click Try It! to start a request and see the response here! Or choose an example:
application/json