Skip to main content

Overview

The SCIM (System for Cross-domain Identity Management) 2.0 API provides standardized endpoints for automated user and group provisioning. SCIM enables identity providers and HR systems to synchronize user accounts, manage lifecycle events, and maintain group memberships automatically.
v2.8.0 implements SCIM 2.0 protocol (RFC 7643, RFC 7644) with Keycloak backend integration.

Use Cases

  • Identity Provider (IdP) Provisioning: Okta, Azure AD, OneLogin
  • HR System Integration: Workday, BambooHR, SAP SuccessFactors
  • User Lifecycle Automation: Onboarding, offboarding, role changes
  • Group Management: Automatic team/department synchronization
  • Directory Synchronization: Keep user data in sync across systems

SCIM 2.0 Standards Compliance

  • Core User Schema (RFC 7643 §4.1)
    • userName, name, emails, active, password
  • Core Group Schema (RFC 7643 §4.2)
    • displayName, members
  • CRUD Operations (RFC 7644)
    • Create (POST), Read (GET), Update (PUT/PATCH), Delete
  • Filtering & Pagination
    • Basic filters (userName eq, email eq)
    • Pagination (startIndex, count)
  • PATCH Operations (RFC 7644 §3.5.2)
    • replace, add (partial support)

Base URL

Authentication

All SCIM endpoints require authentication:
  • Authorization: Bearer {token} (service account or admin user)
  • Requires SCIM provisioning permissions
SCIM endpoints should be called by identity providers or automation systems, not end users. Configure appropriate access controls.

User Endpoints

POST /Users

Create a new user (SCIM 2.0). Provisions user in Keycloak and syncs roles to OpenFGA. Request Body:
array
required
SCIM schema URIs (always ["urn:ietf:params:scim:schemas:core:2.0:User"])
string
required
Unique username or email address
object
User’s name:
  • givenName: First name
  • familyName: Last name
  • formatted: Full name
array
Email addresses (array of {value, primary} objects)
boolean
default:true
Whether user account is active
string
User’s initial password (optional, can be set later)
Request Example:
Response:
Status Codes:
Created
User created successfully
Bad Request
Invalid SCIM schema or missing required fields
Conflict
User already exists

GET /Users/

Get user by ID (SCIM 2.0). Returns user in SCIM format. Path Parameters:
string
required
Keycloak user ID (UUID)
Request Example:
Response: Same as POST /Users response Status Codes:
Success
User retrieved successfully
Not Found
User not found

PUT /Users/

Replace user (SCIM 2.0 PUT). Replaces entire user resource. All fields must be provided. Path Parameters:
string
required
Keycloak user ID (UUID)
Request Body: Same as POST /Users Request Example:
Response: Same as POST /Users response Status Codes:
Success
User updated successfully
Bad Request
Invalid SCIM schema
Not Found
User not found

PATCH /Users/

Update user with PATCH operations (SCIM 2.0). Supports partial updates using SCIM PATCH operations. Path Parameters:
string
required
Keycloak user ID (UUID)
Request Body:
array
required
["urn:ietf:params:scim:api:messages:2.0:PatchOp"]
array
required
Array of PATCH operations:
  • op: Operation type (replace, add, remove)
  • path: Attribute path (e.g., active, emails)
  • value: New value
Request Example:
Response: Same as POST /Users response Status Codes:
Success
User patched successfully
Bad Request
Invalid PATCH operation
Not Found
User not found

DELETE /Users/

Delete (deactivate) user (SCIM 2.0). Deactivates user in Keycloak (sets enabled=false) and removes OpenFGA authorization tuples. User data is preserved for compliance. Path Parameters:
string
required
Keycloak user ID (UUID)
Request Example:
Response: No content (HTTP 204)
Soft Delete: Users are deactivated (not permanently deleted) to comply with audit and compliance requirements. Hard deletion requires direct Keycloak admin access.
Status Codes:
No Content
User deleted successfully
Not Found
User not found

GET /Users

List/search users (SCIM 2.0). Supports basic filtering and pagination. Query Parameters:
string
SCIM filter expression (e.g., userName eq "alice@example.com")Supported filters:
  • userName eq "value"
  • email eq "value"
integer
default:1
1-based start index for pagination (minimum: 1)
integer
default:100
Number of results to return (1-1000)
Request Example:
Response:
Status Codes:
Success
Users retrieved successfully
Bad Request
Invalid filter or pagination parameters

Group Endpoints

POST /Groups

Create a new group (SCIM 2.0). Request Body:
array
required
["urn:ietf:params:scim:schemas:core:2.0:Group"]
string
required
Group name (e.g., “Engineering”, “Marketing”)
array
Array of group members:
  • value: User ID (UUID)
  • display: Display name (optional)
Request Example:
Response:
Status Codes:
Created
Group created successfully
Bad Request
Invalid SCIM schema
Conflict
Group already exists

GET /Groups/

Get group by ID (SCIM 2.0). Path Parameters:
string
required
Keycloak group ID (UUID)
Request Example:
Response: Same as POST /Groups response Status Codes:
Success
Group retrieved successfully
Not Found
Group not found

Identity Provider Integration Examples

Okta SCIM Integration

Azure AD SCIM Integration

OneLogin SCIM Integration


SCIM Testing & Validation

Test User Provisioning Flow


SCIM Provisioning Guide

Complete SCIM setup and integration guide

Keycloak Integration

Keycloak deployment and configuration

OpenFGA Authorization

Authorization model and permissions

SCIM Implementation ADR

SCIM design decisions

Standards Compliant: Full SCIM 2.0 protocol implementation with Keycloak and OpenFGA integration!