Skip to content
Docs
Users

List users

List users

zones.users.list(strzone_id, UserListParams**kwargs) -> UserListResponse
GET/zones/{zoneId}/users

Returns a list of users in the specified zone.

Note: cursor pagination, search, and sort are not yet enabled for all zones. Where they are not enabled, the response returns all users in the zone (capped at 100) in items, with after_cursor and before_cursor set to null and total_count of 0; filter[email] and filter[identifier] are still applied, while the pagination, search, and sort parameters below are accepted but ignored.

Use cursor pagination via after/before. Sort: comma-separated field list; prefix with - for descending. Use expand[]=total_count to include the matching row count, expand[]=session_count to include per-user session counts, expand[]=grant_count to include per-user delegated-grant counts, expand[]=role-assignments to include each user's structured role grants, expand[]=credentials to include each user's authentication credentials (each with its provider_id), and expand[]=credentials.provider to additionally inline the full identity provider on each federation credential. Filter by exact email via filter[email] and by exact identifier via filter[identifier]; search via query[email] / query[subject] / query[] (substring match, OR'd across repeated values). query[] matches against email and federation credential subject. Pass filter[id] (repeatable, max 100) to restrict results to a known set of users — mutually exclusive with after/before (returns 400 if combined). When filter[id] is set, limit is ignored and the response contains every requested user that exists in the zone, in a single page. IDs not in the zone are silently omitted.

ParametersExpand Collapse
zone_id: str
after: Optional[str]

Cursor for forward pagination

minLength1
maxLength255
before: Optional[str]

Cursor for backward pagination

minLength1
maxLength255
expand: Optional[Union[Literal["total_count", "session_count", "grant_count", 3 more], List[Literal["total_count", "session_count", "grant_count", 3 more]]]]
Accepts one of the following:
Literal["total_count", "session_count", "grant_count", 3 more]
Accepts one of the following:
"total_count"
"session_count"
"grant_count"
"role-assignments"
"credentials"
"credentials.provider"
List[Literal["total_count", "session_count", "grant_count", 3 more]]
Accepts one of the following:
"total_count"
"session_count"
"grant_count"
"role-assignments"
"credentials"
"credentials.provider"
filter_email: Optional[Union[str, SequenceNotStr[str]]]

Filter by exact email address

Accepts one of the following:
str

Filter by exact email address

SequenceNotStr[str]
filter_id: Optional[Union[str, SequenceNotStr[str]]]

Restrict results to users with this publicId. Repeatable, max 100. Mutually exclusive with after/before.

Accepts one of the following:
str

Restrict results to users with this publicId. Repeatable, max 100. Mutually exclusive with after/before.

SequenceNotStr[str]
filter_identifier: Optional[Union[str, SequenceNotStr[str]]]

Filter by exact user identifier

Accepts one of the following:
str

Filter by exact user identifier

SequenceNotStr[str]
limit: Optional[int]

Maximum number of items to return

minimum1
maximum100
query: Optional[Union[str, SequenceNotStr[str]]]

Search across email and credential subject (substring match)

Accepts one of the following:
str

Search across email and credential subject (substring match)

SequenceNotStr[str]
query_email: Optional[Union[str, SequenceNotStr[str]]]

Search by email (substring match)

Accepts one of the following:
str

Search by email (substring match)

SequenceNotStr[str]
query_subject: Optional[Union[str, SequenceNotStr[str]]]

Search by federated credential subject (substring match)

Accepts one of the following:
str

Search by federated credential subject (substring match)

SequenceNotStr[str]
sort: Optional[str]

Comma-separated sort fields. Prefix with - for descending. Allowed: created_at, email, authenticated_at

ReturnsExpand Collapse
class UserListResponse:
items: List[User]
id: str

Unique identifier of the user

created_at: datetime

Entity creation timestamp

formatdate-time
email: str

Email address of the user

formatemail
email_verified: bool

Whether the email address has been verified

identifier: str

Zone-scoped user identifier. Defaults to the user's Keycard ID. When the provider has user_identifier_claim configured, the value is set from that claim at user creation time.

organization_id: str

Organization that owns this user

status: Literal["active", "disabled"]

Status of the user. Disabled users cannot authenticate.

Accepts one of the following:
"active"
"disabled"
updated_at: datetime

Entity update timestamp

formatdate-time
zone_id: str

Zone this user belongs to

authenticated_at: Optional[str]

Date when the user was last authenticated

credentials: Optional[List[Credential]]

Authentication credentials for this user, each carrying its identity provider for federation credentials. Populated only when expand[]=credentials is set on the listing endpoint.

Accepts one of the following:
class CredentialIamUserCredentialFederation:

Federation credential: the user authenticates through an identity provider.

created_at: datetime

Entity creation timestamp

formatdate-time
provider_id: Optional[str]

ID of the identity provider backing this credential. null when the source provider has been deleted.

type: Literal["federation"]
updated_at: datetime

Entity update timestamp

formatdate-time
issuer: Optional[str]

Issuer identifier of the identity provider.

provider: Optional[Provider]

A Provider is a system that supplies access to Resources and allows actors (Users or Applications) to authenticate.

id: str

Unique identifier of the provider

created_at: datetime

Entity creation timestamp

formatdate-time
identifier: str

User specified identifier, unique within the zone

minLength1
maxLength2048
name: str

Human-readable name

minLength1
maxLength255
organization_id: str

Organization that owns this provider

owner_type: Literal["platform", "customer"]

Who owns this provider. Platform-owned providers cannot be modified via API.

Accepts one of the following:
"platform"
"customer"
slug: str

URL-safe identifier, unique within the zone

minLength1
maxLength63
updated_at: datetime

Entity update timestamp

formatdate-time
zone_id: str

Zone this provider belongs to

client_id: Optional[str]

OAuth 2.0 client identifier

client_secret_set: Optional[bool]

Indicates whether a client secret is configured

description: Optional[str]

Human-readable description

maxLength2048
metadata: Optional[Metadata]

Provider metadata

icon_url: Optional[str]

Icon URL

formaturi
maxLength2048
protocols: Optional[Protocols]

Protocol-specific configuration

oauth2: Optional[ProtocolsOauth2]

OAuth 2.0 protocol configuration

issuer: str

OIDC issuer URL used for discovery and token validation.

formaturi
authorization_endpoint: Optional[str]
formaturi
authorization_parameters: Optional[Dict[str, str]]

Custom query parameters appended to authorization redirect URLs. Use for non-standard providers (e.g. Google prompt=consent, access_type=offline).

authorization_resource_enabled: Optional[bool]

Whether to include the resource parameter in authorization requests.

authorization_resource_parameter: Optional[str]

The resource parameter value to include in authorization requests. Defaults to "resource" when authorization_resource_enabled is true.

code_challenge_methods_supported: Optional[List[str]]
jwks_uri: Optional[str]
formaturi
registration_endpoint: Optional[str]
formaturi
scope_parameter: Optional[str]

The query parameter name for scopes in authorization requests. Defaults to "scope". Slack v2 uses "user_scope".

scope_separator: Optional[str]

The separator character for scope values. Defaults to " " (space). Slack v2 uses ",".

scopes_supported: Optional[List[str]]
token_endpoint: Optional[str]
formaturi
token_response_access_token_pointer: Optional[str]

Dot-separated path to the access token in the token response body. Defaults to "access_token". Slack v2 uses "authed_user.access_token".

openid: Optional[ProtocolsOpenid]

OpenID Connect protocol configuration

scopes: Optional[List[str]]

Additional OIDC scopes to request from this provider during authentication (e.g. "groups"). Merged with the default scopes (openid, profile, email).

single_logout_enabled: Optional[bool]

When true, logging out of the zone propagates the logout to this provider's end_session_endpoint (RP-initiated logout). Defaults to false.

user_identifier_claim: Optional[str]

Name of a top-level string claim in this provider's ID Token to use as the user identifier on user creation. When not set, the user's Keycard ID is used.

userinfo_endpoint: Optional[str]
formaturi
type: Optional[Literal["external", "keycard-vault", "keycard-sts"]]
Accepts one of the following:
"external"
"keycard-vault"
"keycard-sts"
subject: Optional[str]

Subject identifier from the identity provider.

class CredentialIamUserCredentialPassword:

Password credential: the user authenticates with email and password. The email lives on the user.

created_at: datetime

Entity creation timestamp

formatdate-time
type: Literal["password"]
updated_at: datetime

Entity update timestamp

formatdate-time
grant_count: Optional[int]

Delegated-grant count for this user. Populated only when expand[]=grant_count is set on the listing endpoint.

minimum0
issuer: Optional[str]

Issuer identifier of the identity provider

provider_id: Optional[str]

Reference to the identity provider. This field is undefined when the source identity provider is deleted but the user is not deleted.

role_assignments: Optional[List[RoleAssignment]]

Role grants for this user within the zone. Populated only when expand[]=role-assignments is set on the listing endpoint.

role_id: str

ID of the assigned role

role_identifier: str

Role identifier: a lowercase slug (letters and digits separated by single hyphens or underscores), unique per owner type within a zone. Role identifiers surface in policy evaluation, so the slug restriction keeps them unambiguous in policy text.

minLength1
maxLength255
role_owner_type: Literal["platform", "customer"]

Owner type of the granted role. Disambiguates roles that share an identifier across owner types.

Accepts one of the following:
"platform"
"customer"
scope: Optional[RoleAssignmentScope]

The resource this grant is scoped to, or null when the grant is unscoped (applies to the owning zone itself).

id: str

The ID of the scoped resource.

type: str

The kind of resource this grant is scoped to (e.g. zone).

session_count: Optional[int]

Session count for this user. Populated only when expand[]=session_count is set on the listing endpoint.

minimum0
subject: Optional[str]

Subject identifier from the identity provider

List users

import os
from keycardai_api import KeycardAPI

client = KeycardAPI(
    api_key=os.environ.get("KEYCARD_API_API_KEY"),  # This is the default and can be omitted
)
users = client.zones.users.list(
    zone_id="zoneId",
)
print(users.items)
{
  "items": [
    {
      "id": "id",
      "created_at": "2019-12-27T18:11:19.117Z",
      "email": "dev@stainless.com",
      "email_verified": true,
      "identifier": "identifier",
      "organization_id": "organization_id",
      "status": "active",
      "updated_at": "2019-12-27T18:11:19.117Z",
      "zone_id": "zone_id",
      "authenticated_at": "authenticated_at",
      "credentials": [
        {
          "created_at": "2019-12-27T18:11:19.117Z",
          "provider_id": "provider_id",
          "type": "federation",
          "updated_at": "2019-12-27T18:11:19.117Z",
          "issuer": "issuer",
          "provider": {
            "id": "id",
            "created_at": "2019-12-27T18:11:19.117Z",
            "identifier": "x",
            "name": "x",
            "organization_id": "organization_id",
            "owner_type": "platform",
            "slug": "slug",
            "updated_at": "2019-12-27T18:11:19.117Z",
            "zone_id": "zone_id",
            "client_id": "client_id",
            "client_secret_set": true,
            "description": "description",
            "metadata": {
              "icon_url": "https://example.com"
            },
            "protocols": {
              "oauth2": {
                "issuer": "https://example.com",
                "authorization_endpoint": "https://example.com",
                "authorization_parameters": {
                  "foo": "string"
                },
                "authorization_resource_enabled": true,
                "authorization_resource_parameter": "authorization_resource_parameter",
                "code_challenge_methods_supported": [
                  "string"
                ],
                "jwks_uri": "https://example.com",
                "registration_endpoint": "https://example.com",
                "scope_parameter": "scope_parameter",
                "scope_separator": "scope_separator",
                "scopes_supported": [
                  "string"
                ],
                "token_endpoint": "https://example.com",
                "token_response_access_token_pointer": "token_response_access_token_pointer"
              },
              "openid": {
                "scopes": [
                  "string"
                ],
                "single_logout_enabled": true,
                "user_identifier_claim": "user_identifier_claim",
                "userinfo_endpoint": "https://example.com"
              }
            },
            "type": "external"
          },
          "subject": "subject"
        }
      ],
      "grant_count": 0,
      "issuer": "issuer",
      "provider_id": "provider_id",
      "role_assignments": [
        {
          "role_id": "role_id",
          "role_identifier": "role_identifier",
          "role_owner_type": "platform",
          "scope": {
            "id": "id",
            "type": "type"
          }
        }
      ],
      "session_count": 0,
      "subject": "subject"
    }
  ],
  "pagination": {
    "after_cursor": "x",
    "before_cursor": "x",
    "total_count": 0
  }
}
Returns Examples
{
  "items": [
    {
      "id": "id",
      "created_at": "2019-12-27T18:11:19.117Z",
      "email": "dev@stainless.com",
      "email_verified": true,
      "identifier": "identifier",
      "organization_id": "organization_id",
      "status": "active",
      "updated_at": "2019-12-27T18:11:19.117Z",
      "zone_id": "zone_id",
      "authenticated_at": "authenticated_at",
      "credentials": [
        {
          "created_at": "2019-12-27T18:11:19.117Z",
          "provider_id": "provider_id",
          "type": "federation",
          "updated_at": "2019-12-27T18:11:19.117Z",
          "issuer": "issuer",
          "provider": {
            "id": "id",
            "created_at": "2019-12-27T18:11:19.117Z",
            "identifier": "x",
            "name": "x",
            "organization_id": "organization_id",
            "owner_type": "platform",
            "slug": "slug",
            "updated_at": "2019-12-27T18:11:19.117Z",
            "zone_id": "zone_id",
            "client_id": "client_id",
            "client_secret_set": true,
            "description": "description",
            "metadata": {
              "icon_url": "https://example.com"
            },
            "protocols": {
              "oauth2": {
                "issuer": "https://example.com",
                "authorization_endpoint": "https://example.com",
                "authorization_parameters": {
                  "foo": "string"
                },
                "authorization_resource_enabled": true,
                "authorization_resource_parameter": "authorization_resource_parameter",
                "code_challenge_methods_supported": [
                  "string"
                ],
                "jwks_uri": "https://example.com",
                "registration_endpoint": "https://example.com",
                "scope_parameter": "scope_parameter",
                "scope_separator": "scope_separator",
                "scopes_supported": [
                  "string"
                ],
                "token_endpoint": "https://example.com",
                "token_response_access_token_pointer": "token_response_access_token_pointer"
              },
              "openid": {
                "scopes": [
                  "string"
                ],
                "single_logout_enabled": true,
                "user_identifier_claim": "user_identifier_claim",
                "userinfo_endpoint": "https://example.com"
              }
            },
            "type": "external"
          },
          "subject": "subject"
        }
      ],
      "grant_count": 0,
      "issuer": "issuer",
      "provider_id": "provider_id",
      "role_assignments": [
        {
          "role_id": "role_id",
          "role_identifier": "role_identifier",
          "role_owner_type": "platform",
          "scope": {
            "id": "id",
            "type": "type"
          }
        }
      ],
      "session_count": 0,
      "subject": "subject"
    }
  ],
  "pagination": {
    "after_cursor": "x",
    "before_cursor": "x",
    "total_count": 0
  }
}