Summary and recommendation
SentinelOne exposes a REST API at `https://<your-management-console-url>/web/api/v2.1` for full user lifecycle management.
Authentication uses a Bearer token (`Authorization: ApiToken <token>`) generated per user from Settings > Users > API Token - the token is shown only once and must be stored immediately.
Tokens inherit the generating user's role and scope, so a token from a Site-level Admin cannot reach Account-level user management endpoints.
The stable version for user management is v2.1.
Older v2.0 endpoints exist but some are deprecated;
use v2.1 exclusively.
The base URL is tenant-specific - there is no global endpoint.
Retrieve your `accountId` first via `GET /web/api/v2.1/users/login/by-token` before issuing any scoped user management calls.
For teams building an identity graph across SaaS tools, the user object's `source` field (`local`, `sso`, `scim`), `scopeRoles` array, `lastLogin` timestamp, and `isActive` flag provide the signals needed to model access state accurately.
Integrating SentinelOne into an MCP server with 60+ deep IT/identity integrations is a viable pattern for centralizing this identity graph across your security and IT stack.
API quick reference
| Has user API | Yes |
| Auth method | API Token (Bearer token in Authorization header) |
| Base URL | Official docs |
| SCIM available | Yes |
| SCIM plan required | Singularity Enterprise (custom pricing); SSO must be configured as a prerequisite |
Authentication
Auth method: API Token (Bearer token in Authorization header)
Setup steps
- Log in to the SentinelOne Management Console as an admin user.
- Navigate to Settings > Users > select your user profile.
- Click 'Generate API Token' under the API Token section.
- Copy the generated token - it is shown only once.
- Include the token in all API requests as: Authorization: ApiToken
- Tokens can be revoked and regenerated from the same user settings page.
- Service user accounts can be created specifically for API access to avoid tying tokens to human accounts.
Required scopes
| Scope | Description | Required for |
|---|---|---|
| Admin role | Full access to all API endpoints including user management, site/account configuration. | Creating, updating, and deleting users; managing roles and permissions. |
| User role (read-only) | Limited API access; can read data but cannot modify users or configuration. | Read-only GET operations on permitted resources. |
| Viewer role | Minimal access; primarily for dashboards and reports. | Read-only access to threat and activity data. |
User object / data model
| Field | Type | Description | On create | On update | Notes |
|---|---|---|---|---|---|
| id | string | Unique user identifier (UUID) | auto-generated | immutable | Used as path parameter for user-specific operations. |
| string | User's email address; used as login identifier | required | supported | Must be unique across the account. | |
| fullName | string | User's full display name | required | supported | |
| role | string | User role: Admin, IR Team, SOC, IT, Viewer, or custom roles | required | supported | Role names are case-sensitive. |
| scope | string | Access scope: account, site, or group level | required | supported | Determines which resources the user can access. |
| scopeRoles | array | Array of scope-role assignments for multi-scope users | optional | supported | Allows assigning different roles at different scopes. |
| twoFaEnabled | boolean | Whether two-factor authentication is enabled for the user | optional | supported | |
| canGenerateApiToken | boolean | Whether the user is permitted to generate API tokens | optional | supported | |
| createdAt | datetime (ISO 8601) | Timestamp when the user was created | auto-generated | immutable | |
| updatedAt | datetime (ISO 8601) | Timestamp of last user record update | auto-generated | auto-updated | |
| lastLogin | datetime (ISO 8601) | Timestamp of the user's last login | null | auto-updated | |
| source | string | How the user was provisioned: local, sso, or scim | auto-set | immutable | |
| isActive | boolean | Whether the user account is active | defaults to true | supported | Set to false to disable without deleting. |
| accountId | string | ID of the account the user belongs to | required (via query param) | immutable | |
| siteIds | array | List of site IDs the user has access to | optional | supported | Applicable when scope is 'site'. |
Core endpoints
List Users
- Method: GET
- URL:
/web/api/v2.1/users - Watch out for: Must supply accountIds or siteIds query parameter to scope results; omitting may return unexpected cross-scope data.
Request example
GET /web/api/v2.1/users?limit=50&accountIds=<accountId>
Authorization: ApiToken <token>
Response example
{
"data": [{"id":"123","email":"user@example.com","fullName":"Jane Doe","role":"Admin"}],
"pagination": {"nextCursor":"abc123","totalItems":200}
}
Get User by ID
- Method: GET
- URL:
/web/api/v2.1/users/{userId} - Watch out for: Returns 404 if the token's scope does not include the target user's account/site.
Request example
GET /web/api/v2.1/users/123
Authorization: ApiToken <token>
Response example
{
"data": {"id":"123","email":"user@example.com","fullName":"Jane Doe","role":"Admin","isActive":true}
}
Create User
- Method: POST
- URL:
/web/api/v2.1/users - Watch out for: An invitation email is sent automatically upon creation. The user must accept the invite before they can log in.
Request example
POST /web/api/v2.1/users
Authorization: ApiToken <token>
Content-Type: application/json
{
"data": {"email":"newuser@example.com","fullName":"John Smith","role":"Viewer","accountId":"<accountId>"}
}
Response example
{
"data": {"id":"456","email":"newuser@example.com","fullName":"John Smith","role":"Viewer","isActive":true}
}
Update User
- Method: PUT
- URL:
/web/api/v2.1/users/{userId} - Watch out for: Email address cannot be changed via API after account creation. Role changes take effect immediately.
Request example
PUT /web/api/v2.1/users/456
Authorization: ApiToken <token>
Content-Type: application/json
{
"data": {"fullName":"John A. Smith","role":"Admin"}
}
Response example
{
"data": {"id":"456","email":"newuser@example.com","fullName":"John A. Smith","role":"Admin"}
}
Delete User
- Method: DELETE
- URL:
/web/api/v2.1/users/{userId} - Watch out for: Deletion is permanent and cannot be undone. Consider setting isActive=false to disable without deleting.
Request example
DELETE /web/api/v2.1/users/456
Authorization: ApiToken <token>
Response example
{
"data": {"success": true}
}
Get Current User (token owner)
- Method: GET
- URL:
/web/api/v2.1/users/login/by-token - Watch out for: Useful for validating token validity and retrieving the token owner's accountId for subsequent scoped queries.
Request example
GET /web/api/v2.1/users/login/by-token
Authorization: ApiToken <token>
Response example
{
"data": {"id":"789","email":"admin@example.com","fullName":"API Admin","role":"Admin"}
}
List Roles
- Method: GET
- URL:
/web/api/v2.1/user-roles - Watch out for: Custom roles created in the console are returned alongside built-in roles. Role IDs differ per account.
Request example
GET /web/api/v2.1/user-roles?accountIds=<accountId>
Authorization: ApiToken <token>
Response example
{
"data": [{"id":"r1","name":"Admin","description":"Full access"},{"id":"r2","name":"Viewer","description":"Read-only"}]
}
Revoke User API Token
- Method: POST
- URL:
/web/api/v2.1/users/{userId}/revoke-api-token - Watch out for: Immediately invalidates the target user's API token. The user must regenerate a new token from the console.
Request example
POST /web/api/v2.1/users/456/revoke-api-token
Authorization: ApiToken <token>
Response example
{
"data": {"success": true}
}
Rate limits, pagination, and events
Rate limits: SentinelOne enforces API rate limits but does not publicly document specific numeric thresholds in official docs. Rate limiting is applied per API token.
Rate-limit headers: Unknown
Retry-After header: Unknown
Rate-limit notes: Official documentation does not specify exact request-per-minute limits or rate-limit response headers. HTTP 429 is returned when limits are exceeded. Contact SentinelOne support for tenant-specific limits.
Pagination method: cursor
Default page size: 10
Max page size: 1000
Pagination pointer: cursor (returned in pagination.nextCursor in response); limit controls page size
Webhooks available: Yes
Webhook notes: SentinelOne supports webhook notifications (called 'Notifications' in the console) for threat and activity events. They are configured via Settings > Notifications and are not user-management-specific.
Alternative event strategy: For user lifecycle events, poll GET /web/api/v2.1/users with updatedAt__gt filter or use SCIM provisioning with an IdP that supports event-driven sync (e.g., Okta).
Webhook events: Threat detected, Threat resolved, Agent disconnected, Policy violation, System health alerts
SCIM API status
SCIM available: Yes
SCIM version: 2.0
Plan required: Singularity Enterprise (custom pricing); SSO must be configured as a prerequisite
Endpoint: https://
/api/v1/scim (tenant-specific; generated within the SentinelOne SSO/SCIM configuration UI) Supported operations: Create user (POST /Users), Read user (GET /Users/{id}), List users (GET /Users), Update user (PUT /Users/{id}), Deactivate user (PATCH /Users/{id} with active=false), Push groups (POST /Groups, PATCH /Groups/{id})
Limitations:
- SCIM provisioning is officially documented only for Okta; Entra ID (Azure AD) and OneLogin may work but are not officially documented with step-by-step guides.
- SSO (SAML) must be fully configured before SCIM can be enabled.
- SCIM endpoint URL and bearer token are generated inside the SentinelOne console under Settings > SSO; the endpoint is tenant-specific and not a static public URL.
- User deprovisioning via SCIM deactivates the account (sets active=false) rather than deleting it.
- Group push maps to SentinelOne roles/sites; mapping must be configured manually in the IdP application.
- Available only on Singularity Enterprise tier per context data; not available on Core, Control, or Complete tiers.
Common scenarios
Three scenarios cover the primary automation use cases:
Provision a new analyst: Fetch accountId via GET /users/login/by-token, list available roles via GET /user-roles?accountIds=<accountId>, then POST /users with email, fullName, role, and accountId.
An invitation email fires immediately on POST - if the user's email domain is not allowlisted in your mail relay, the invite will be silently blocked.
Confirm creation with GET /users/{newUserId}.
Deprovision a departing employee: Locate the user via GET /users?email=<email>&accountIds=<accountId>.
Set isActive=false via PUT /users/{userId} to block login without destroying the record, then revoke any active API token via POST /users/{userId}/revoke-api-token.
Use DELETE /users/{userId} only if permanent removal is required - deletion is irreversible.
If the user was provisioned via SCIM (source=scim), deprovision from the IdP instead;
direct API deletion can cause SCIM sync conflicts.
SCIM lifecycle automation via Okta: Requires Singularity Enterprise and a working SAML SSO configuration.
Generate the SCIM endpoint URL and bearer token from Settings > SSO in the SentinelOne console - this token is separate from user API tokens.
Configure SCIM 2.0 in the Okta SentinelOne app with Push New Users, Push Profile Updates, and Deactivate Users enabled.
Map userName to email and displayName to fullName.
If SSO is ever reconfigured, the SCIM bearer token may be regenerated;
Okta must be updated immediately to prevent provisioning failures.
Provision a new analyst user via REST API
- Authenticate: obtain API token from console Settings > Users > API Token.
- Retrieve accountId: GET /web/api/v2.1/users/login/by-token to get the token owner's accountId.
- List available roles: GET /web/api/v2.1/user-roles?accountIds=
to find the correct role name/ID. - Create user: POST /web/api/v2.1/users with email, fullName, role, and accountId in request body.
- Verify creation: GET /web/api/v2.1/users/{newUserId} to confirm user record and isActive=true.
- Inform user: SentinelOne automatically sends an invitation email; user must accept before first login.
Watch out for: The invitation email is sent immediately on POST. If the email domain is not allowlisted in your mail system, the invite may be blocked.
Deprovision a departing employee
- Find user: GET /web/api/v2.1/users?email=
&accountIds= to retrieve userId. - Disable account: PUT /web/api/v2.1/users/{userId} with isActive=false to immediately block login without data loss.
- Revoke API token: POST /web/api/v2.1/users/{userId}/revoke-api-token to invalidate any active API tokens.
- Optionally delete: DELETE /web/api/v2.1/users/{userId} if permanent removal is required (irreversible).
Watch out for: If the user was provisioned via SCIM (source=scim), deprovisioning should be performed from the IdP to keep SCIM state consistent; direct API deletion may cause sync conflicts.
Configure SCIM provisioning with Okta for automated lifecycle management
- Confirm Singularity Enterprise license and that SAML SSO is already configured and working.
- In SentinelOne console: navigate to Settings > SSO > enable SCIM provisioning; copy the generated SCIM endpoint URL and bearer token.
- In Okta Admin: open the SentinelOne application > Provisioning tab > configure SCIM 2.0 with the copied endpoint URL and bearer token.
- Enable provisioning features in Okta: Push New Users, Push Profile Updates, Deactivate Users.
- Map Okta profile attributes to SentinelOne SCIM attributes (userName=email, displayName=fullName).
- Configure group push in Okta to map Okta groups to SentinelOne roles/sites.
- Test with a single user assignment before enabling for all users.
Watch out for: The SCIM bearer token generated in SentinelOne is separate from user API tokens. If SSO is reconfigured, the SCIM token may be regenerated and Okta must be updated to avoid provisioning failures.
Why building this yourself is a trap
Several non-obvious behaviors create integration risk. Pagination is cursor-based - pass pagination.nextCursor from each response as the cursor query parameter in the next request; the default page size is 10 with a maximum of 1000.
Omitting accountIds or siteIds on GET /users may return unexpected cross-scope data.
Rate limits are enforced per API token but exact numeric thresholds are not publicly documented. HTTP 429 is returned when limits are exceeded; no Retry-After header behavior is documented.
Contact SentinelOne support for tenant-specific limits before building high-frequency polling.
Bulk user operations are not supported - every create or update is a single API call. SSO-provisioned users (source=sso or source=scim) cannot have passwords managed via API; authentication is fully delegated to the IdP.
Email addresses cannot be changed via API after account creation. Custom role IDs differ per account - always fetch current role IDs from GET /user-roles rather than hardcoding them.
Automate SentinelOne 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.