Summary and recommendation
The CrowdStrike Falcon User Management API uses OAuth 2.0 client credentials flow. All tokens are issued via POST to https://api.crowdstrike.com/oauth2/token and expire after 30 minutes - token refresh logic is mandatory. Two scopes gate all user operations: user-management:read for listing and inspecting users and roles, and user-management:write for create, update, delete, and role assignment.
The base URL is region-specific: US-1 is api.crowdstrike.com, US-2 is api.us-2.crowdstrike.com, EU-1 is api.eu-1.crowdstrike.com. Using the wrong regional URL returns authentication errors, not a redirect. Integrating Falcon into an identity graph requires handling this regional split explicitly, since a single hardcoded base URL will silently fail for tenants in non-default regions.
API quick reference
| Has user API | Yes |
| Auth method | OAuth 2.0 (client credentials flow) |
| Base URL | Official docs |
| SCIM available | Yes |
| SCIM plan required | Enterprise ($184.99/device/year) |
Authentication
Auth method: OAuth 2.0 (client credentials flow)
Setup steps
- Log in to the Falcon console and navigate to Support & Resources > API Clients and Keys.
- Click 'Add new API client', provide a name and description, and select the required scopes (e.g., User Management: Read and/or Write).
- Copy the generated Client ID and Client Secret - the secret is shown only once.
- POST to https://api.crowdstrike.com/oauth2/token with grant_type=client_credentials, client_id, and client_secret to obtain a Bearer token.
- Include the token in all subsequent requests as Authorization: Bearer
. Tokens expire after 30 minutes; re-authenticate as needed.
Required scopes
| Scope | Description | Required for |
|---|---|---|
| user-management:read | Read access to user accounts, roles, and role assignments | List users, get user details, list roles |
| user-management:write | Write access to create, update, and delete user accounts and role assignments | Create user, update user, delete user, assign/revoke roles |
User object / data model
| Field | Type | Description | On create | On update | Notes |
|---|---|---|---|---|---|
| uid | string | Unique identifier (UUID) for the user within Falcon | system-generated | immutable | Used as path parameter in user-specific endpoints |
| username | string | User's email address used as login identifier | required | supported | Must be a valid email address; used as unique login |
| first_name | string | User's first name | required | supported | |
| last_name | string | User's last name | required | supported | |
| customer_id | string | CID (Customer ID) the user belongs to | system-assigned | immutable | Reflects the tenant CID |
| created_at | string (ISO 8601) | Timestamp when the user account was created | system-generated | immutable | |
| updated_at | string (ISO 8601) | Timestamp of last update to the user record | system-generated | system-updated | |
| roles | array of strings | List of role IDs assigned to the user | assigned via separate endpoint | managed via grant/revoke role endpoints | Roles are not set inline during user creation; use /user-roles/entities/user-roles/v1 |
Core endpoints
List user UIDs
- Method: GET
- URL:
https://api.crowdstrike.com/users/queries/user-uids/v1 - Watch out for: Returns only UIDs; must follow up with the entities endpoint to retrieve full user objects.
Request example
GET /users/queries/user-uids/v1?offset=0&limit=100
Authorization: Bearer <token>
Response example
{
"resources": ["uid-1234", "uid-5678"],
"meta": {"pagination": {"offset": 0, "limit": 100, "total": 2}}
}
Get user details by UID
- Method: GET
- URL:
https://api.crowdstrike.com/users/entities/users/v1 - Watch out for: Accepts multiple ids query params. Max batch size not explicitly documented; keep batches small (≤100).
Request example
GET /users/entities/users/v1?ids=uid-1234&ids=uid-5678
Authorization: Bearer <token>
Response example
{
"resources": [
{"uid": "uid-1234", "username": "user@example.com",
"first_name": "Jane", "last_name": "Doe"}
]
}
Create user
- Method: POST
- URL:
https://api.crowdstrike.com/users/entities/users/v1 - Watch out for: Roles must be assigned separately after creation. No password is set via API; user receives an email invitation.
Request example
POST /users/entities/users/v1
Authorization: Bearer <token>
Content-Type: application/json
{
"username": "newuser@example.com",
"first_name": "John",
"last_name": "Smith"
}
Response example
{
"resources": [
{"uid": "uid-9999", "username": "newuser@example.com",
"first_name": "John", "last_name": "Smith"}
]
}
Update user
- Method: PATCH
- URL:
https://api.crowdstrike.com/users/entities/users/v1 - Watch out for: user_uuid is passed as a query parameter, not in the request body.
Request example
PATCH /users/entities/users/v1?user_uuid=uid-9999
Authorization: Bearer <token>
Content-Type: application/json
{
"first_name": "Jonathan"
}
Response example
{
"resources": [
{"uid": "uid-9999", "first_name": "Jonathan", "last_name": "Smith"}
]
}
Delete user
- Method: DELETE
- URL:
https://api.crowdstrike.com/users/entities/users/v1 - Watch out for: Deletion is immediate and irreversible. Revoke roles before deletion if auditing role history is required.
Request example
DELETE /users/entities/users/v1?user_uuid=uid-9999
Authorization: Bearer <token>
Response example
{
"resources": ["uid-9999"],
"errors": []
}
Get user roles
- Method: GET
- URL:
https://api.crowdstrike.com/user-roles/queries/user-role-ids-by-user-uuid/v1 - Watch out for: Returns role ID strings only; use /user-roles/entities/user-roles/v1 to get full role metadata.
Request example
GET /user-roles/queries/user-role-ids-by-user-uuid/v1?user_uuid=uid-1234
Authorization: Bearer <token>
Response example
{
"resources": ["falcon_admin", "detection_monitor"]
}
Grant roles to user
- Method: POST
- URL:
https://api.crowdstrike.com/user-roles/entities/user-roles/v1 - Watch out for: Role IDs are case-sensitive strings. Use the /user-roles/queries/roles/v1 endpoint to enumerate valid role IDs first.
Request example
POST /user-roles/entities/user-roles/v1
Authorization: Bearer <token>
Content-Type: application/json
{
"roleIds": ["falcon_admin"],
"user_uuid": "uid-9999"
}
Response example
{
"resources": [{"cid": "cid-abc", "role_id": "falcon_admin", "user_uuid": "uid-9999"}]
}
Revoke roles from user
- Method: DELETE
- URL:
https://api.crowdstrike.com/user-roles/entities/user-roles/v1 - Watch out for: Both user_uuid and roleId are required query parameters. Revoking a non-assigned role returns an error.
Request example
DELETE /user-roles/entities/user-roles/v1?user_uuid=uid-9999&roleId=falcon_admin
Authorization: Bearer <token>
Response example
{
"resources": ["falcon_admin"],
"errors": []
}
Rate limits, pagination, and events
- Rate limits: CrowdStrike enforces per-API-client rate limits. Specific numeric limits are not publicly documented; limits vary by endpoint and tenant tier. Rate limit responses return HTTP 429.
- Rate-limit headers: Yes
- Retry-After header: Yes
- Rate-limit notes: On HTTP 429, inspect X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-RetryAfter headers. Implement exponential backoff. Limits are per API client credential pair.
- Pagination method: offset
- Default page size: 100
- Max page size: 500
- Pagination pointer: offset
| Plan | Limit | Concurrent |
|---|---|---|
| All tiers | Not publicly specified; enforced per API client | 0 |
- Webhooks available: No
- Webhook notes: CrowdStrike Falcon does not expose a general-purpose outbound webhook system for user management events via the public API.
- Alternative event strategy: Use the Falcon Event Streams API (streaming API) to consume audit and activity events in near-real-time, or poll the Audit Logs API for user lifecycle changes.
SCIM API status
SCIM available: Yes
SCIM version: 2.0
Plan required: Enterprise ($184.99/device/year)
Endpoint: Tenant-specific SCIM base URL provided within the Falcon console SSO/SCIM configuration page
Supported operations: Create user (POST /Users), Read user (GET /Users/{id}), Update user (PUT /Users/{id}), Deactivate user (PATCH /Users/{id} with active:false), List users (GET /Users), Push groups (POST /Groups)
Limitations:
- Requires SAML SSO to be configured and active before SCIM provisioning can be enabled.
- SCIM is configured through an IdP (Okta, Entra ID, OneLogin) - CrowdStrike acts as the SCIM service provider.
- Google Workspace is not listed as a supported IdP for SCIM integration.
- SCIM token is generated in the Falcon console and must be stored securely; rotation requires reconfiguring the IdP.
- Available only on Enterprise tier and above.
Common scenarios
User provisioning is a two-step operation: POST /users/entities/users/v1 creates the account (triggering an email invitation - no password is set via API), then a separate POST /user-roles/entities/user-roles/v1 assigns roles using the uid returned from creation.
Role IDs are case-sensitive strings; enumerate valid IDs via GET /user-roles/queries/roles/v1 before attempting assignment.
Bulk user listing requires pagination via offset (default 100, max 500) against /users/queries/user-uids/v1, followed by batched GET requests to /users/entities/users/v1 with ids params - keep batches at or below 100 UIDs.
Role data is not embedded in the user object; a separate GET /user-roles/queries/user-role-ids-by-user-uuid/v1 call per user is required to build a complete user-role inventory.
For offboarding, deletion via DELETE /users/entities/users/v1 is immediate and irreversible with no soft-delete mechanism; if SCIM is active, prefer deactivating the user in the IdP with active:false over direct API deletion.
Provision a new user with a specific role
- POST /oauth2/token to obtain a Bearer token with user-management:write scope.
- POST /users/entities/users/v1 with username (email), first_name, last_name in the body to create the user account.
- Note the returned uid from the response.
- GET /user-roles/queries/roles/v1 to enumerate available role IDs and identify the target role.
- POST /user-roles/entities/user-roles/v1 with the uid and desired roleIds array to assign the role.
Watch out for: The user receives an email invitation to set their password. Roles cannot be assigned in the same request as user creation.
Deprovision a user (offboarding)
- POST /oauth2/token to obtain a Bearer token with user-management:write scope.
- GET /users/queries/user-uids/v1 or search by username to retrieve the user's uid.
- GET /user-roles/queries/user-role-ids-by-user-uuid/v1?user_uuid=
to list assigned roles. - DELETE /user-roles/entities/user-roles/v1?user_uuid=
&roleId= for each assigned role (optional but recommended for audit trail). - DELETE /users/entities/users/v1?user_uuid=
to permanently remove the user.
Watch out for: Deletion is irreversible. If using SCIM, deactivating the user in the IdP (active:false) is the preferred offboarding path and avoids direct API deletion.
Bulk list all users and their roles
- POST /oauth2/token to obtain a Bearer token with user-management:read scope.
- GET /users/queries/user-uids/v1?offset=0&limit=500 and paginate using offset until all UIDs are collected.
- Batch the UIDs and GET /users/entities/users/v1?ids=
&ids= ... (keep batches ≤100) to retrieve user details. - For each uid, GET /user-roles/queries/user-role-ids-by-user-uuid/v1?user_uuid=
to retrieve role assignments. - Correlate user objects with their role lists for a complete user-role inventory.
Watch out for: This requires multiple API calls per user for role data. For large tenants, respect rate limits and implement backoff on HTTP 429 responses. Consider regional base URL differences if operating a multi-region deployment.
Why building this yourself is a trap
The most common integration failure pattern with the Falcon API is assuming a single-call provisioning model.
Role assignment is entirely decoupled from user creation - there is no inline roles field on the create request body - so any pipeline that does not explicitly handle the two-step flow will produce users with no roles assigned and no error surfaced.
API client credential scope is fixed at client creation time; adding a new scope requires editing or recreating the client in the Falcon console with no runtime scope elevation available.
Rate limits are enforced per API client but specific numeric thresholds are not publicly documented; always inspect X-RateLimit-Limit, X-RateLimit-Remaining, and X-RateLimit-RetryAfter headers and implement exponential backoff on HTTP 429.
SCIM provisioning requires both an active SAML SSO configuration and Enterprise tier access - it cannot be enabled independently, and Google Workspace is not a supported IdP for SCIM. Teams building automated identity graph pipelines against Falcon must account for all of these constraints before assuming parity with simpler SCIM-native integrations.
Automate CrowdStrike 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.