Skip to main content

SCIM 2.0 API Configuration

Overview​

The SCIM API Connector enables Endpoint Protector to integrate with enterprise Identity Providers (IdPs) such as Microsoft Entra ID (Azure AD), Okta, or similar platforms to automate user and group provisioning.

With SCIM (System for Cross-domain Identity Management), Endpoint Protector automatically creates, updates, and deactivates user accounts and group memberships based on changes in the organization's Identity Provider.

This integration:

  • Reduces manual user management
  • Enforces the Identity Provider as the source of truth
  • Improves security through automated deprovisioning
  • Supports enterprise compliance and access governance

Understanding SCIM​

SCIM (System for Cross-domain Identity Management) is an industry-standard protocol designed to simplify identity lifecycle management between systems.

SCIM allows an Identity Provider to:

  • Create users automatically when an administrator assigns them to an application
  • Update user attributes and group memberships
  • Deactivate users when an administrator revokes their access in the Identity Provider

Important:
SCIM manages user and group provisioning only.
SSO technologies such as SAML or OpenID Connect (OIDC) handle authentication and login separately.

How SCIM Works in Endpoint Protector​

In a typical deployment:

  1. An administrator configures SCIM in Endpoint Protector and generates a bearer token.
  2. The same administrator configures SCIM provisioning in the Identity Provider using:
    • The SCIM Base URL
    • The generated bearer token
  3. The Identity Provider sends SCIM requests to Endpoint Protector whenever:
    • An administrator assigns or removes a user
    • User attributes change
    • Group memberships change

Endpoint Protector processes these requests and updates its internal user and group records accordingly.

Configuring the SCIM API Connector​

Configure the SCIM API Connector from:

Directory Services → SCIM API Configuration

Scim configuration screen

API Status

  • SCIM API Enabled
    Enables or disables the SCIM API endpoints.
    • When enabled, Endpoint Protector accepts SCIM provisioning requests.
    • When disabled, Endpoint Protector rejects all SCIM requests.

Bearer Token

  • API Token
    A tenant-specific bearer token used to authenticate SCIM requests coming from the Identity Provider.
  • Generate Token
    Generates a new bearer token.
    After generation, copy the token and configure it in the Identity Provider.

Note:
Rotating the token requires updating the token value in the Identity Provider.
The old token becomes invalid immediately.

API Endpoints

Endpoint Protector provides the following endpoints for SCIM provisioning:

  • SCIM Base URL
    Base endpoint for all SCIM operations.
  • Users Endpoint
    The Identity Provider uses this endpoint to create, update, and deactivate users.
  • Groups Endpoint
    Provisions groups and manages group memberships.

You need these URLs when you configure SCIM provisioning in the Identity Provider.

Authentication Header Format

SCIM requests must include the bearer token in the HTTP request header using one of the supported formats:

  • Recommended:
    X-AUTH-TOKEN: <token>
  • Alternative:
    Authorization: Bearer <token>

The UI displays an example request for reference.

Supported SCIM Operations​

Endpoint Protector supports standard SCIM 2.0 operations, including:

  • User provisioning and updates
  • Group provisioning and membership updates
  • Bulk operations
  • Filtering and pagination

For detailed endpoint definitions, schemas, and examples, refer to the Endpoints section of the SCIM API Technical Reference.

Important Notes and Limitations​

  • SCIM provisioning applies to users and groups only
  • You must assign administrative roles manually
  • Deprovisioning deactivates users rather than deleting them
  • Provisioning timing depends on the Identity Provider
  • The Identity Provider controls attribute mapping and group behavior

Summary​

The SCIM API Connector automates user and group management in Endpoint Protector.


SCIM API Technical Reference

This section provides the complete technical specification of the SCIM API, including:

  • Supported endpoints
  • Request and response formats
  • Schemas
  • Filtering and pagination
  • Bulk operation support

Base URL: https://[server]/scim/v2

Authentication​

All endpoints except Discovery require Bearer token authentication.

HeaderFormatNote
X-AUTH-TOKENscim_xxxx...Recommended
AuthorizationBearer scim_xxxx...Standard OAuth2

Provisioning Entities​

EntityDevice Control (DC)Admin Console
UsersSupportedNot Supported
GroupsSupportedNot Supported
ComputersSupported (Custom)Not Supported

Endpoints​

Discovery (Public - No Auth Required)​

MethodEndpointDescription
GET/ServiceProviderConfigService capabilities
GET/SchemasAll supported schemas
GET/Schemas/\{schemaId\}Specific schema by URN
GET/ResourceTypesResource type definitions

Users​

MethodEndpointDescription
GET/UsersList users (with filtering/pagination)
GET/Users/\{id\}Get user by ID
POST/UsersCreate user
PUT/Users/\{id\}Full update (replace)
PATCH/Users/\{id\}Partial update
DELETE/Users/\{id\}Delete user

Groups​

MethodEndpointDescription
GET/GroupsList groups (with filtering/pagination)
GET/Groups/\{id\}Get group by ID
POST/GroupsCreate group
PUT/Groups/\{id\}Full update (replace)
PATCH/Groups/\{id\}Partial update / member operations
DELETE/Groups/\{id\}Delete group

Computers (Custom Resource)​

MethodEndpointDescription
GET/ComputersList computers (with filtering/pagination)
GET/Computers/\{id\}Get computer by ID
POST/ComputersCreate computer
PUT/Computers/\{id\}Full update (replace)
PATCH/Computers/\{id\}Partial update
DELETE/Computers/\{id\}Delete computer

Bulk Operations​

MethodEndpointDescription
POST/BulkProcess multiple operations in single request

Bulk Constraints:

  • Maximum 250 operations per request
  • Maximum 2MB payload size

Filtering & Pagination​

Query Parameters:

ParameterTypeDefaultDescription
startIndexinteger11-based pagination start
countinteger20Results per page
filterstring-SCIM filter expression

Filter Examples:

?filter=userName eq "john"
?filter=displayName co "Admin"
?startIndex=1&count=20

Supported Filter Operators: eq, ne, co, sw, ew, gt, lt, ge, le

Logical Operators: and, or


Schemas​

Schema URNs​

ResourceCore SchemaExtension Schema
Userurn:ietf:params:scim:schemas:core:2.0:Userurn:ietf:params:scim:schemas:extension:enterprise:2.0:User
Groupurn:ietf:params:scim:schemas:core:2.0:Groupurn:ietf:params:scim:schemas:extension:custom:2.0:Group
Computerurn:ietf:params:scim:schemas:core:2.0:Computer-

Message Schemas​

TypeSchema URN
List Responseurn:ietf:params:scim:api:messages:2.0:ListResponse
Errorurn:ietf:params:scim:api:messages:2.0:Error
Patch Operationurn:ietf:params:scim:api:messages:2.0:PatchOp
Bulk Requesturn:ietf:params:scim:api:messages:2.0:BulkRequest
Bulk Responseurn:ietf:params:scim:api:messages:2.0:BulkResponse

Resource Attributes​

User Resource​

Database Table: clientuser

Core Schema (urn:ietf:params:scim:schemas:core:2.0:User)

AttributeTypeRequiredMutabilityUniquenessDB Column
idstring-readOnlyserverID
externalIdstringNoreadWritenoneEXTERNAL_ID
userNamestringYesimmutableserverUSERNAME
displayNamestringNoreadWritenonecomputed (FIRSTNAME + LASTNAME)
name.givenNamestringNoreadWritenoneFIRSTNAME
name.familyNamestringNoreadWritenoneLASTNAME
groupscomplex[]NoreadOnly-via clientgroup join table

Enterprise Extension (urn:ietf:params:scim:schemas:extension:enterprise:2.0:User)

AttributeTypeRequiredMutabilityDB Column
departmentintegerYesreadWriteDEPARTMENT_ID
domainstringNoreadWriteDOMAIN
emailstringNoreadWriteEMAIL
phonestringNoreadWritePHONE
employeeNumberstringNoreadWriteEMPLOYEE_ID

Group Resource​

Database Table: eppgroup

Core Schema (urn:ietf:params:scim:schemas:core:2.0:Group)

AttributeTypeRequiredMutabilityDB Column
idstring-readOnlyID
externalIdstringNoreadWriteEXTERNAL_ID
displayNamestringYesreadWriteNAME
namestringYesreadWriteNAME
memberscomplex[]NoreadWritevia clientgroup join table

Custom Extension (urn:ietf:params:scim:schemas:extension:custom:2.0:Group)

AttributeTypeRequiredMutabilityDB Column
departmentintegerYesreadWriteDEPARTMENT_ID
domainstringNoreadWriteDOMAIN

Computer Resource (Custom)​

Database Table: clientmachine

Core Schema (urn:ietf:params:scim:schemas:core:2.0:Computer)

AttributeTypeRequiredMutabilityUniquenessDB Column
idstring-readOnlyserverID
namestringYesreadOnlyserverNAME
departmentintegerNoreadOnlynoneDEPARTMENT_ID
domainstringNoreadOnlynoneDOMAIN
groupscomplex[]NoreadOnly-via join table

Note: Computer resource is READ-ONLY. EPP clients manage computers; the SCIM API can't modify them.

Junction Table: User-Group Membership​

Database Table: clientgroup

ColumnTypeReferences
CLIENT_IDintclientuser.ID
GROUP_IDinteppgroup.ID

Complex Attribute: members (Group)​

Sub-attributeTypeDescription
valuestringResource ID (clientuser.ID)
$refreferenceResource URI
displaystringDisplay name (clientuser.USERNAME)
typestring"User" or "Group"

Complex Attribute: groups (User/Computer)​

Sub-attributeTypeDescription
valuestringGroup ID (eppgroup.ID)
$refreferenceGroup URI
displaystringGroup name (eppgroup.NAME)

Attribute Characteristics​

CharacteristicValuesDescription
typestring, integer, boolean, dateTime, complex, referenceData type
requiredtrue, falseWhether attribute is mandatory
mutabilityreadOnly, readWrite, immutable, writeOnlyModification rules
returnedalways, never, default, requestWhen included in response
uniquenessnone, server, globalUniqueness constraint
caseExacttrue, falseCase sensitivity

HTTP Status Codes​

CodeStatusUsed For
200OKSuccessful GET, PUT, PATCH
201CreatedSuccessful POST
204No ContentSuccessful DELETE
400Bad RequestInvalid request syntax, missing required fields
401UnauthorizedMissing or invalid authentication
404Not FoundResource not found
413Payload Too LargeBulk request exceeds limits
500Internal Server ErrorServer-side error

Request & Response Examples​

Create User (POST /Users)​

Request:

POST /scim/v2/Users HTTP/1.1
Host: server.example.com
Content-Type: application/scim+json
X-AUTH-TOKEN: scim_xxxx...

{
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:User",
"urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"
],
"userName": "jsmith",
"displayName": "John Smith",
"urn:ietf:params:scim:schemas:extension:enterprise:2.0:User": {
"department": 1,
"domain": "example.com",
"email": "jsmith@example.com",
"phone": "555-1234"
}
}

Response (201 Created):

{
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:User",
"urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"
],
"id": "42",
"userName": "jsmith",
"displayName": "John Smith",
"groups": [],
"urn:ietf:params:scim:schemas:extension:enterprise:2.0:User": {
"department": 1,
"domain": "example.com",
"email": "jsmith@example.com",
"phone": "555-1234"
},
"meta": {
"resourceType": "User",
"created": "2025-01-20T10:00:00Z",
"lastModified": "2025-01-20T10:00:00Z",
"location": "https://server.example.com/scim/v2/Users/42"
}
}

Get User (GET /Users/{id})​

Request:

GET /scim/v2/Users/42 HTTP/1.1
Host: server.example.com
X-AUTH-TOKEN: scim_xxxx...

Response (200 OK):

{
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:User",
"urn:ietf:params:scim:schemas:extension:enterprise:2.0:User"
],
"id": "42",
"userName": "jsmith",
"displayName": "John Smith",
"groups": [
{
"value": "5",
"$ref": "https://server.example.com/scim/v2/Groups/5",
"display": "Engineering"
}
],
"urn:ietf:params:scim:schemas:extension:enterprise:2.0:User": {
"department": 1,
"domain": "example.com",
"email": "jsmith@example.com",
"phone": "555-1234"
},
"meta": {
"resourceType": "User",
"created": "2025-01-20T10:00:00Z",
"lastModified": "2025-01-20T10:00:00Z",
"location": "https://server.example.com/scim/v2/Users/42"
}
}

List Users (GET /Users)​

Request:

GET /scim/v2/Users?startIndex=1&count=10&filter=userName co "smith" HTTP/1.1
Host: server.example.com
X-AUTH-TOKEN: scim_xxxx...

Response (200 OK):

{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:ListResponse"],
"totalResults": 25,
"startIndex": 1,
"itemsPerPage": 10,
"Resources": [
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:User", "..."],
"id": "42",
"userName": "jsmith",
"..."
}
]
}

Create Group (POST /Groups)​

Request:

POST /scim/v2/Groups HTTP/1.1
Host: server.example.com
Content-Type: application/scim+json
X-AUTH-TOKEN: scim_xxxx...

{
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:Group",
"urn:ietf:params:scim:schemas:extension:custom:2.0:Group"
],
"displayName": "Engineering",
"urn:ietf:params:scim:schemas:extension:custom:2.0:Group": {
"department": 1,
"domain": "example.com"
},
"members": [
{
"value": "42",
"display": "jsmith"
}
]
}

Response (201 Created):

{
"schemas": [
"urn:ietf:params:scim:schemas:core:2.0:Group",
"urn:ietf:params:scim:schemas:extension:custom:2.0:Group"
],
"id": "5",
"displayName": "Engineering",
"urn:ietf:params:scim:schemas:extension:custom:2.0:Group": {
"department": 1,
"domain": "example.com"
},
"members": [
{
"value": "42",
"$ref": "https://server.example.com/scim/v2/Users/42",
"display": "jsmith"
}
],
"meta": {
"resourceType": "Group",
"created": "2025-01-20T10:00:00Z",
"lastModified": "2025-01-20T10:00:00Z",
"location": "https://server.example.com/scim/v2/Groups/5"
}
}

PATCH User (PATCH /Users/{id})​

Request:

PATCH /scim/v2/Users/42 HTTP/1.1
Host: server.example.com
Content-Type: application/scim+json
X-AUTH-TOKEN: scim_xxxx...

{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{
"op": "replace",
"path": "displayName",
"value": "Jonathan Smith"
},
{
"op": "replace",
"path": "urn:ietf:params:scim:schemas:extension:enterprise:2.0:User:phone",
"value": "555-5678"
}
]
}

Response (200 OK): Returns updated user resource.

PATCH Group Members (PATCH /Groups/{id})​

Add Members:

{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{
"op": "add",
"path": "members",
"value": [
{ "value": "43" },
{ "value": "44" }
]
}
]
}

Remove Members:

{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{
"op": "remove",
"path": "members[value eq \"43\"]"
}
]
}

Delete User (DELETE /Users/{id})​

Request:

DELETE /scim/v2/Users/42 HTTP/1.1
Host: server.example.com
X-AUTH-TOKEN: scim_xxxx...

Response: 204 No Content

Bulk Operation (POST /Bulk)​

Request:

POST /scim/v2/Bulk HTTP/1.1
Host: server.example.com
Content-Type: application/scim+json
X-AUTH-TOKEN: scim_xxxx...

{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:BulkRequest"],
"failOnErrors": 1,
"Operations": [
{
"method": "POST",
"path": "/Users",
"bulkId": "user1",
"data": {
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
"userName": "newuser"
}
},
{
"method": "DELETE",
"path": "/Users/99"
}
]
}

Response (200 OK):

{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:BulkResponse"],
"Operations": [
{
"method": "POST",
"bulkId": "user1",
"location": "https://server.example.com/scim/v2/Users/100",
"status": "201"
},
{
"method": "DELETE",
"location": "https://server.example.com/scim/v2/Users/99",
"status": "204"
}
]
}

Error Response​

Response (404 Not Found):

{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:Error"],
"status": "404",
"scimType": "noTarget",
"detail": "Resource not found"
}

Response (400 Bad Request):

{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:Error"],
"status": "400",
"scimType": "invalidValue",
"detail": "Missing required attribute: userName"
}

SCIM Error Types​

scimTypeDescription
invalidFilterInvalid filter syntax
tooManyToo many results
uniquenessUniqueness constraint violation
mutabilityCan't modify immutable attribute
invalidSyntaxMalformed request
invalidPathInvalid attribute path
noTargetResource not found
invalidValueInvalid attribute value

Response Headers​

All responses include:

Content-Type: application/scim+json
Cache-Control: no-cache, no-store, must-revalidate

Unauthorized responses include:

WWW-Authenticate: Bearer

References​