Summary and recommendation
Sprinklr's REST API (base: `https://api.sprinklr.com/api/v2`) supports full user lifecycle management via OAuth 2.0 Bearer tokens obtained through the client_credentials or authorization code flow.
Core user operations - list, get, create, update, deactivate, delete - are available under `/users`, with role lookups at `/roles`.
SCIM 2.0 is available at `https://api.sprinklr.com/scim/v2` for Enterprise plans with active SSO.
The API is suitable for building identity graph integrations that keep Sprinklr user state synchronized with a canonical directory source, but several sharp edges require explicit handling before any automation is production-ready.
Key scopes required: `user.read` for GET operations, `user.write` for mutations, and `role.read` to resolve roleIds before provisioning.
Tokens expire in 24 hours by default - implement refresh or re-issuance logic before expiry.
Rate limits are not publicly enumerated;
HTTP 429 is returned on breach, but documented Retry-After header behavior is unconfirmed by official docs.
API quick reference
| Has user API | Yes |
| Auth method | OAuth 2.0 (client credentials and authorization code flows) |
| Base URL | Official docs |
| SCIM available | Yes |
| SCIM plan required | Enterprise |
Authentication
Auth method: OAuth 2.0 (client credentials and authorization code flows)
Setup steps
- Log in to the Sprinklr platform as an Admin and navigate to Settings > API Management.
- Create an API App to obtain a Client ID and Client Secret.
- Request an access token via POST to https://api.sprinklr.com/oauth/token using client_credentials grant type.
- Include the returned Bearer token in the Authorization header for all subsequent API requests.
- Tokens expire; implement refresh logic using the refresh_token if using authorization code flow.
Required scopes
| Scope | Description | Required for |
|---|---|---|
| user.read | Read user profiles and list users within the environment. | GET /users, GET /users/{id} |
| user.write | Create, update, and deactivate user accounts. | POST /users, PUT /users/{id}, DELETE /users/{id} |
| role.read | Read available roles and role assignments. | GET /roles, GET /users/{id}/roles |
User object / data model
| Field | Type | Description | On create | On update | Notes |
|---|---|---|---|---|---|
| id | string | Unique Sprinklr user identifier. | system-generated | immutable | Used as path parameter in user-specific endpoints. |
| username | string | Unique login username for the user. | required | optional | Typically matches corporate email. |
| string | Primary email address of the user. | required | optional | ||
| firstName | string | User's first name. | required | optional | |
| lastName | string | User's last name. | required | optional | |
| status | enum | Account status: ENABLED or DISABLED. | optional (defaults to ENABLED) | optional | Set to DISABLED to deactivate without deleting. |
| roleIds | array |
List of role IDs assigned to the user. | required | optional | At least one role must be assigned. |
| partnerUserId | string | External identifier for the user from an IdP or partner system. | optional | optional | Used for SCIM and SSO correlation. |
| timeZone | string | User's preferred time zone (IANA format). | optional | optional | |
| locale | string | User's locale/language preference (e.g., en_US). | optional | optional | |
| profileImage | string (URL) | URL of the user's profile image. | optional | optional | |
| createdTime | long (epoch ms) | Timestamp when the user was created. | system-generated | immutable | |
| modifiedTime | long (epoch ms) | Timestamp of last modification. | system-generated | system-generated |
Core endpoints
List Users
- Method: GET
- URL:
https://api.sprinklr.com/api/v2/users - Watch out for: page is zero-indexed. Omitting pageSize defaults to 50.
Request example
GET /api/v2/users?page=0&pageSize=50
Authorization: Bearer {access_token}
Response example
{
"data": [
{"id":"u_123","username":"jdoe@acme.com","status":"ENABLED"}
],
"totalCount": 1
}
Get User by ID
- Method: GET
- URL:
https://api.sprinklr.com/api/v2/users/{userId} - Watch out for: Returns 404 if user does not exist in the authenticated environment.
Request example
GET /api/v2/users/u_123
Authorization: Bearer {access_token}
Response example
{
"id": "u_123",
"username": "jdoe@acme.com",
"email": "jdoe@acme.com",
"status": "ENABLED",
"roleIds": ["role_456"]
}
Create User
- Method: POST
- URL:
https://api.sprinklr.com/api/v2/users - Watch out for: username must be unique across the environment. Duplicate usernames return a 409 conflict.
Request example
POST /api/v2/users
Authorization: Bearer {access_token}
Content-Type: application/json
{"username":"jdoe@acme.com","email":"jdoe@acme.com","firstName":"Jane","lastName":"Doe","roleIds":["role_456"]}
Response example
{
"id": "u_789",
"username": "jdoe@acme.com",
"status": "ENABLED"
}
Update User
- Method: PUT
- URL:
https://api.sprinklr.com/api/v2/users/{userId} - Watch out for: PUT replaces the full user object; omitting optional fields may reset them. Use carefully.
Request example
PUT /api/v2/users/u_789
Authorization: Bearer {access_token}
Content-Type: application/json
{"firstName":"Jane","lastName":"Smith","roleIds":["role_456","role_789"]}
Response example
{
"id": "u_789",
"firstName": "Jane",
"lastName": "Smith",
"status": "ENABLED"
}
Deactivate User
- Method: PUT
- URL:
https://api.sprinklr.com/api/v2/users/{userId} - Watch out for: Sprinklr does not expose a dedicated PATCH or deactivate endpoint; status change is done via PUT.
Request example
PUT /api/v2/users/u_789
Authorization: Bearer {access_token}
Content-Type: application/json
{"status":"DISABLED"}
Response example
{
"id": "u_789",
"status": "DISABLED"
}
Delete User
- Method: DELETE
- URL:
https://api.sprinklr.com/api/v2/users/{userId} - Watch out for: Deletion is permanent. Prefer setting status=DISABLED for reversible deactivation.
Request example
DELETE /api/v2/users/u_789
Authorization: Bearer {access_token}
Response example
HTTP 204 No Content
List Roles
- Method: GET
- URL:
https://api.sprinklr.com/api/v2/roles - Watch out for: Role IDs are environment-specific; do not reuse IDs across different Sprinklr environments.
Request example
GET /api/v2/roles
Authorization: Bearer {access_token}
Response example
{
"data": [
{"id":"role_456","name":"Community Manager"},
{"id":"role_789","name":"Admin"}
]
}
Get Token (OAuth 2.0)
- Method: POST
- URL:
https://api.sprinklr.com/oauth/token - Watch out for: Tokens expire in 24 hours by default. Implement token refresh or re-issuance before expiry.
Request example
POST /oauth/token
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials&client_id=CLIENT_ID&client_secret=CLIENT_SECRET
Response example
{
"access_token": "eyJ...",
"token_type": "Bearer",
"expires_in": 86400
}
Rate limits, pagination, and events
- Rate limits: Sprinklr enforces per-app rate limits on API calls. Specific numeric limits are not publicly documented in detail; limits vary by plan and API app configuration.
- Rate-limit headers: Unknown
- Retry-After header: Unknown
- Rate-limit notes: Official docs do not explicitly document rate-limit response headers or Retry-After behavior. Contact Sprinklr support for app-specific limits.
- Pagination method: offset
- Default page size: 50
- Max page size: 100
- Pagination pointer: page / pageSize
| Plan | Limit | Concurrent |
|---|---|---|
| Enterprise | Not publicly specified; configured per API app by Sprinklr support | 0 |
- Webhooks available: No
- Webhook notes: Sprinklr's public developer documentation does not describe user-management-specific webhook events. Webhooks are available for social listening and engagement events, not user lifecycle events.
- Alternative event strategy: Poll GET /users with a timestamp filter or use SCIM provisioning events via your IdP (Okta, Entra ID) for user lifecycle notifications.
SCIM API status
SCIM available: Yes
SCIM version: 2.0
Plan required: Enterprise
Endpoint: https://api.sprinklr.com/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}
Limitations:
- SSO must be configured and active before SCIM provisioning can be enabled.
- SCIM is only available on the Enterprise plan.
- SCIM endpoint URL and Bearer token are generated within Sprinklr's SSO/SCIM settings and must be copied into the IdP (Okta or Entra ID).
- Group push maps to Sprinklr user groups, not roles; role assignment still requires manual configuration or API.
- Google Workspace and OneLogin are not listed as supported IdPs for SCIM in official docs.
Common scenarios
Three primary automation scenarios are well-supported by the API:
Provisioning via REST: Fetch roleIds from GET /api/v2/roles first - they are environment-scoped and not portable.
Then POST /api/v2/users with username, email, firstName, lastName, and roleIds.
The username field must be unique;
a duplicate returns HTTP 409.
Check existence with GET /users?username= before creating to avoid collision errors in idempotent pipelines.
Deprovisioning via REST: Retrieve the user's id via GET /api/v2/users filtered by email or username, then issue PUT /api/v2/users/{userId} with {"status":"DISABLED"}.
This preserves audit history and is reversible.
DELETE /api/v2/users/{userId} is permanent - prefer DISABLED for any environment with compliance or audit requirements.
SCIM auto-provisioning with Okta or Entra ID: SSO (SAML) must be fully active before SCIM can be enabled.
Generate the SCIM Base URL and Bearer token from Settings → Security → SCIM Provisioning, then configure the IdP connector.
Note that group push maps to Sprinklr user groups, not permission roles - role assignment remains a separate step outside the SCIM sync loop.
Google Workspace and OneLogin are not listed as supported IdPs in official documentation.
Provision a new employee via REST API
- Obtain OAuth 2.0 access token via POST /oauth/token with client_credentials.
- Retrieve available role IDs via GET /api/v2/roles to identify the correct roleId for the new user.
- POST /api/v2/users with required fields: username, email, firstName, lastName, roleIds.
- Store the returned id for future updates or deactivation.
Watch out for: username must be unique; if the user already exists (e.g., from a previous import), the API returns 409. Check existence with GET /users?username= before creating.
Deprovision a departing employee
- Obtain a fresh access token if the current one is near expiry.
- Look up the user's Sprinklr id via GET /api/v2/users filtering by username or email.
- Set status to DISABLED via PUT /api/v2/users/{userId} with {"status":"DISABLED"} to revoke access while preserving audit history.
- Optionally call DELETE /api/v2/users/{userId} for full removal if data retention is not required.
Watch out for: Deletion is irreversible. Prefer DISABLED status for compliance and audit trail preservation.
Set up SCIM auto-provisioning with Okta
- Confirm Enterprise plan is active and SSO (SAML) is fully configured in Sprinklr Settings > Security.
- In Sprinklr, navigate to Settings > Security > SCIM Provisioning and enable SCIM to generate the SCIM Base URL and Bearer token.
- In Okta, add the Sprinklr app from the Okta Integration Network and navigate to the Provisioning tab.
- Enter the Sprinklr SCIM Base URL and Bearer token into Okta's SCIM connector settings.
- Enable the desired provisioning features: Create Users, Update User Attributes, Deactivate Users.
- Assign users or groups in Okta to trigger initial provisioning sync.
Watch out for: SCIM will not activate if SSO is not already live. Group push maps to Sprinklr user groups, not permission roles - role assignment must be handled separately.
Why building this yourself is a trap
The most consequential API caveat is that PUT /users/{userId} replaces the full user object - omitting any optional field may silently reset it. Always fetch the current object before issuing a PUT to avoid unintended data loss.
A second structural trap: user IDs are environment-scoped, so the same individual will have different id values across Sprinklr environments; any identity graph integration must store and resolve IDs per environment, not globally.
Role IDs share the same constraint - they cannot be reused across environments and must be retrieved fresh from each target before provisioning. Finally, the developer portal and help center are separate properties with overlapping but non-identical documentation;
some endpoint details and schema fields appear in only one of the two, making complete API coverage dependent on consulting both sources.
Automate Sprinklr 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.