Skip to content

User Directory & SCIM

VeraID v2.0 includes a built-in user directory for managing human identities alongside your non-human identities. The directory supports user lifecycle management, group-based access control, and SCIM 2.0 provisioning for automated sync with external identity providers like Okta and Microsoft Entra ID.

User lifecycle management

User states

Every user in the VeraID directory moves through a defined lifecycle:

StateDescriptionCan Sign In
INVITEDInvitation sent, user has not yet acceptedNo
ACTIVEUser has accepted invitation and is fully operationalYes
SUSPENDEDTemporarily disabled by an admin or automated policyNo
DEPROVISIONEDPermanently disabled, scheduled for deletionNo

Creating users

Create users through the admin UI or API:

Terminal window
curl -X POST https://app.veraid.io/api/v1/directory/users \
-H "Authorization: Bearer kd_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"email": "jane@example.com",
"firstName": "Jane",
"lastName": "Smith",
"department": "Engineering",
"title": "Staff Engineer",
"groups": ["engineering", "platform-team"],
"roles": ["user"],
"metadata": {
"employeeId": "EMP-1234",
"costCenter": "CC-5678",
"startDate": "2026-04-01"
},
"sendInvitation": true
}'

Response:

{
"id": "usr_abc123",
"email": "jane@example.com",
"firstName": "Jane",
"lastName": "Smith",
"status": "INVITED",
"groups": ["engineering", "platform-team"],
"roles": ["user"],
"createdAt": "2026-03-26T10:00:00Z"
}

Updating users

Terminal window
curl -X PATCH https://app.veraid.io/api/v1/directory/users/{userId} \
-H "Authorization: Bearer kd_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"department": "Platform Engineering",
"title": "Principal Engineer",
"groups": ["engineering", "platform-team", "architecture"],
"metadata": {
"costCenter": "CC-9999"
}
}'

Suspending and deprovisioning users

Terminal window
# Suspend a user (reversible)
curl -X POST https://app.veraid.io/api/v1/directory/users/{userId}/suspend \
-H "Authorization: Bearer kd_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{ "reason": "Leave of absence" }'
# Deprovision a user (permanent)
curl -X POST https://app.veraid.io/api/v1/directory/users/{userId}/deprovision \
-H "Authorization: Bearer kd_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"reason": "Employee departure",
"transferOwnedNhisTo": "usr_backup_owner",
"revokeAllSessions": true,
"revokeOwnedNhis": true
}'

When a user is deprovisioned:

  • All active sessions are immediately revoked.
  • All NHIs owned by the user are suspended or transferred (configurable).
  • All OIDC/SAML sessions at connected SPs are terminated via back-channel logout.
  • An audit log entry is created with the deprovisioning reason and actor.

Group-based access

Groups organize users and control access to applications, NHIs, and policies.

Managing groups

Terminal window
# Create a group
curl -X POST https://app.veraid.io/api/v1/directory/groups \
-H "Authorization: Bearer kd_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "platform-team",
"displayName": "Platform Team",
"description": "Platform engineering team members",
"metadata": {
"costCenter": "CC-5678",
"manager": "usr_manager123"
}
}'
# Add members to a group
curl -X POST https://app.veraid.io/api/v1/directory/groups/{groupId}/members \
-H "Authorization: Bearer kd_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"userIds": ["usr_abc123", "usr_def456", "usr_ghi789"]
}'

Group-based policies

Groups can be referenced in conditional access policies and OIDC/SAML attribute mapping:

{
"name": "Allow platform team to access production APIs",
"conditions": {
"groups": ["platform-team"],
"applications": ["production-api"]
},
"effect": "ALLOW"
}

Groups are automatically included in OIDC groups claim and SAML group assertions when the corresponding scope or attribute mapping is configured.


Inbound SCIM 2.0 provisioning

Inbound SCIM allows external identity providers (Okta, Microsoft Entra ID, OneLogin) to automatically provision, update, and deprovision users in VeraID.

Setting up inbound SCIM

  1. Navigate to Settings > Directory > SCIM Provisioning > Inbound.
  2. Click Enable Inbound SCIM.
  3. VeraID generates a SCIM base URL and bearer token:
SCIM Base URL: https://app.veraid.io/api/scim/v2/{orgId}
SCIM Token: scim_tok_abc123...
  1. Configure your external IdP with these values.

Configuring Okta

In your Okta admin console:

  1. Go to Applications > Add Application > SCIM 2.0 Test App.
  2. Under Provisioning > Integration, enter:
    • SCIM connector base URL: https://app.veraid.io/api/scim/v2/{orgId}
    • Unique identifier field: userName
    • Authentication mode: HTTP Header
    • Authorization: Bearer scim_tok_abc123...
  3. Enable the desired provisioning features:
    • Create Users — Provision new users from Okta to VeraID.
    • Update User Attributes — Sync profile changes.
    • Deactivate Users — Deprovision users when removed from the Okta app.
  4. Test the connection and save.

Configuring Microsoft Entra ID

In the Azure portal:

  1. Go to Enterprise Applications > New Application > Non-gallery application.
  2. Under Provisioning > Provisioning Mode, select Automatic.
  3. Enter:
    • Tenant URL: https://app.veraid.io/api/scim/v2/{orgId}
    • Secret Token: scim_tok_abc123...
  4. Map attributes (Entra ID fields to VeraID SCIM fields).
  5. Test the connection, then enable provisioning.

Supported SCIM operations

OperationEndpointDescription
List UsersGET /UsersRetrieve users with filtering
Get UserGET /Users/{id}Retrieve a specific user
Create UserPOST /UsersProvision a new user
Update UserPATCH /Users/{id}Update user attributes
Replace UserPUT /Users/{id}Replace all user attributes
Delete UserDELETE /Users/{id}Deprovision a user
List GroupsGET /GroupsRetrieve groups with filtering
Get GroupGET /Groups/{id}Retrieve a specific group
Create GroupPOST /GroupsCreate a new group
Update GroupPATCH /Groups/{id}Add/remove group members
Delete GroupDELETE /Groups/{id}Delete a group

SCIM attribute mapping

SCIM AttributeVeraID FieldRequired
userNameemailYes
name.givenNamefirstNameYes
name.familyNamelastNameYes
displayNamedisplayNameNo
activestatus (ACTIVE/SUSPENDED)Yes
emails[primary].valueemailYes
titletitleNo
urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:departmentdepartmentNo
urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:managermanagerIdNo

Outbound SCIM provisioning

Outbound SCIM allows VeraID to push user and group changes to downstream applications (e.g., provisioning users into SaaS tools).

Setting up outbound SCIM

Terminal window
curl -X POST https://app.veraid.io/api/v1/directory/scim/outbound \
-H "Authorization: Bearer kd_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "Provision to Jira",
"baseUrl": "https://jira.example.com/scim/v2",
"authType": "bearer",
"authToken": "jira_scim_token_abc123",
"syncUsers": true,
"syncGroups": true,
"attributeMapping": {
"userName": "user.email",
"displayName": "user.fullName",
"active": "user.isActive"
},
"filters": {
"includeGroups": ["engineering", "product"]
}
}'

Outbound provisioning events

VeraID triggers outbound SCIM operations when:

EventSCIM Operation
User created in VeraIDPOST /Users
User profile updatedPATCH /Users/{id}
User added to groupPATCH /Groups/{id}
User removed from groupPATCH /Groups/{id}
User suspendedPATCH /Users/{id} (set active: false)
User deprovisionedDELETE /Users/{id}

SCIM token management

Creating tokens

Terminal window
curl -X POST https://app.veraid.io/api/v1/directory/scim/tokens \
-H "Authorization: Bearer kd_live_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "Okta SCIM Token",
"expiresInDays": 365,
"scopes": ["users:read", "users:write", "groups:read", "groups:write"]
}'

Response:

{
"id": "scim_tok_abc123",
"name": "Okta SCIM Token",
"token": "scim_tok_full_token_shown_once",
"expiresAt": "2027-03-26T10:00:00Z",
"scopes": ["users:read", "users:write", "groups:read", "groups:write"],
"createdAt": "2026-03-26T10:00:00Z"
}

Listing tokens

Terminal window
curl -X GET https://app.veraid.io/api/v1/directory/scim/tokens \
-H "Authorization: Bearer kd_live_your_api_key"

Revoking tokens

Terminal window
curl -X DELETE https://app.veraid.io/api/v1/directory/scim/tokens/{tokenId} \
-H "Authorization: Bearer kd_live_your_api_key"

Token rotation

To rotate a SCIM token without downtime:

  1. Create a new token with the same scopes.
  2. Update the external IdP configuration with the new token.
  3. Verify provisioning works with the new token.
  4. Revoke the old token.

Audit logging

All directory operations are recorded in the audit log:

EventDescription
user.createdNew user provisioned (manual or SCIM)
user.updatedUser attributes modified
user.suspendedUser suspended
user.deprovisionedUser permanently disabled
user.reactivatedSuspended user reactivated
group.createdNew group created
group.member_addedUser added to group
group.member_removedUser removed from group
scim.token_createdNew SCIM token generated
scim.token_revokedSCIM token revoked
scim.sync_completedSCIM sync operation completed

Next steps

Federation

Connect external IdPs for enterprise SSO with JIT provisioning. Federation Guide

Conditional Access

Create policies based on user groups and directory attributes. Conditional Access