SCIM docs
SCIM provisioning for ShareOTP
ShareOTP exposes a workspace-scoped SCIM 2.0 surface for identity-provider-driven user provisioning and deprovisioning.
Authentication
Generate a SCIM bearer token in Admin - Settings - Security. Tokens are workspace-scoped, shown once when created, and independent from normal ShareOTP REST API keys.
Authorization header
curl https://your-domain.com/api/scim/v2/ServiceProviderConfig \ -H "Authorization: Bearer scim_shareotp_..."
Supported endpoints
Method
Path
Description
GET
/api/scim/v2/ServiceProviderConfig
Discover supported SCIM features
GET
/api/scim/v2/Users
List users with pagination and supported filters
POST
/api/scim/v2/Users
Create or upsert a user by externalId or userName
GET
/api/scim/v2/Users/{id}
Fetch one user resource
PATCH
/api/scim/v2/Users/{id}
Update fields or set active=false
Supported user fields
The SCIM implementation is intentionally focused on workforce sync for ShareOTP users.
externalId
userName
displayName
name.formatted
emails
roles
active
Supported filters
Use filters for directory reconcile jobs and identity-provider lookups.
externalId eq "00u123"
externalId pr
userName eq "[email protected]"
id eq "user_123"
active eq true
active eq false
Examples
Create or upsert a user
curl https://your-domain.com/api/scim/v2/Users \
-H "Authorization: Bearer scim_shareotp_..." \
-H "Content-Type: application/scim+json" \
-d '{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
"externalId": "00u123",
"userName": "[email protected]",
"displayName": "Alice Example",
"active": true,
"roles": [{ "value": "MEMBER" }],
"emails": [{ "value": "[email protected]", "primary": true }]
}'List SCIM-managed users
curl "https://your-domain.com/api/scim/v2/Users?filter=externalId%20pr&startIndex=1&count=100" \ -H "Authorization: Bearer scim_shareotp_..."
Deprovisioning behavior
When SCIM sets active=false, ShareOTP soft-disables the user, revokes their API keys and org-level artifacts, deletes account permissions and login/session artifacts, and removes them from active seat usage.
Disable a user
curl https://your-domain.com/api/scim/v2/Users/user_123 \
-X PATCH \
-H "Authorization: Bearer scim_shareotp_..." \
-H "Content-Type: application/scim+json" \
-d '{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{ "op": "replace", "path": "active", "value": false }
]
}'Recommended full reconcile
- Upsert every active user with POST /Users.
- List managed users with GET /Users?filter=externalId pr.
- PATCH active=false for previously managed users that no longer exist in the source directory.