SCIM API Reference
SCIM API Reference
This page documents the SCIM 2.0 endpoints axe Account exposes for user and group provisioning. In most cases your identity provider's SCIM connector calls these endpoints for you; this reference is for teams building a custom integration or validating behavior directly.
axe implements the SCIM 2.0 standard (RFC 7643 / RFC 7644). This page focuses on axe-specific behavior. For the generic protocol, refer to the SCIM specifications.
Base URL and authentication
All endpoints are served under /api/scim/v2 on your regional or private base URL:
https://axe.deque.com/api/scim/v2Authenticate every request with your SCIM API key:
-H "X-API-Key: <API_KEY>"
# or
-H "Authorization: <API_KEY>"See Prerequisites & Setup to obtain a key and base URL.
Conventions
- Content type:
application/json - Error responses use the SCIM error schema:
{ "schemas": ["urn:ietf:params:scim:api:messages:2.0:Error"], "detail": "<message>", "status": <code> } - Pagination (Users):
startIndex(1-based) andcount(1–100). - Filtering (Users, Groups):
filterusing theeqoperator, e.g.userName eq "user@example.com".
Users
List users
GET /api/scim/v2/UsersReturns members of your enterprise. Supports pagination and filtering.
When a filter is supplied, the lookup is not restricted to your enterprise: a matching user who is not a member is returned with active: false. Check active rather than treating any result as a member. Filtered requests always return at most one resource and ignore count and startIndex.
Query parameters
| Parameter | Type | Description |
|---|---|---|
filter |
string | Optional. e.g. userName eq "user@example.com" or externalId eq "<id>". |
startIndex |
integer | Optional. 1-based index of the first result. Default 1. |
count |
integer | Optional. Results per page, 1–100. |
Example
curl -H "X-API-Key: $KEY" \
"https://axe.deque.com/api/scim/v2/Users?count=10&startIndex=1"Response 200 OK
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:ListResponse"],
"totalResults": 42,
"itemsPerPage": 10,
"startIndex": 1,
"Resources": [
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
"id": "5f3e...c2",
"userName": "user@example.com",
"active": true,
"name": { "givenName": "Alex", "familyName": "Doe" },
"emails": [
{ "primary": true, "value": "user@example.com", "type": "work", "display": "user@example.com" }
],
"groups": [
{ "value": "grp-1", "display": "Axe Monitor", "$ref": "/Groups/grp-1" }
],
"meta": { "resourceType": "User", "location": "/Users/5f3e...c2" }
}
]
}Errors
| Status | detail |
|---|---|
| 400 | Count must be between 1-100 |
Get a user
GET /api/scim/v2/Users/{id}Returns a single user by their axe user ID. active reflects enterprise membership.
Response 200 OK — a User resource (see above).
Errors
| Status | detail |
|---|---|
| 404 | User not found |
Create a user
POST /api/scim/v2/UsersProvisions a user: creates the axe account, adds them to your enterprise, and sends an invitation email. A groups value in the body is ignored — assign product access separately via PATCH /Groups.
Request body
| Field | Required | Description |
|---|---|---|
schemas |
✅ | Must include urn:ietf:params:scim:schemas:core:2.0:User. |
userName |
✅ | The user's email. |
name.givenName |
✅ | First name. |
name.familyName |
✅ | Last name. |
emails |
✅ | Array with exactly one primary: true entry. |
active |
✅ | true adds the user to the enterprise. |
externalId |
— | Your directory's unique identifier (recommended). |
Example
curl -X POST -H "X-API-Key: $KEY" -H "Content-Type: application/json" \
-d '{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
"userName": "user@example.com",
"name": { "givenName": "Alex", "familyName": "Doe" },
"emails": [{ "type": "work", "value": "user@example.com", "primary": true }],
"active": true
}' \
"https://axe.deque.com/api/scim/v2/Users"Response 201 Created — the created User resource.
Errors
| Status | detail |
|---|---|
| 400 | Validation errors: Exactly one primary e-mail is required at 'emails'. (generic error envelope, not the SCIM error schema) |
| 400 | A primary email is required but was not found in the emails array |
| 400 | User email domain does not match enterprise root group |
| 400 | Enterprise does not have an identity provider configured |
| 409 | User is already a member of an enterprise |
Replace a user
PUT /api/scim/v2/Users/{id}Updates a user's name and email.
Request body
| Field | Required | Description |
|---|---|---|
schemas |
✅ | Must include urn:ietf:params:scim:schemas:core:2.0:User. |
id |
✅ | The user's axe user ID (UUID). Must match {id} in the path. |
name.givenName |
✅ | First name. |
name.familyName |
✅ | Last name. |
emails |
✅ | Array containing the user's emails. Exactly one entry must have primary: true. |
name.middleName |
— | Middle name. |
meta |
— | Accepted and ignored; the server assigns meta. |
Response 200 OK — the updated User resource.
Errors
| Status | detail |
|---|---|
| 404 | User not found |
| 403 | User is a member of multiple enterprises |
| 403 | User is not a member of this enterprise |
| 400 | No primary email found in the provided emails array |
| 409 | A user with this email already exists |
Activate or deactivate a user
PATCH /api/scim/v2/Users/{id}Sets enterprise membership. active: true adds the user to the enterprise; active: false deprovisions them (removes membership; the account is retained).
Request body
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{ "op": "replace", "value": { "active": false } }
]
}Response 204 No Content
Errors
| Status | detail |
|---|---|
| 404 | User not found |
| 400 | Cannot remove the last admin from the enterprise |
Deprovision a user
DELETE /api/scim/v2/Users/{id}Removes the user from your enterprise (soft removal — the account is retained).
Response 204 No Content
Errors
| Status | detail |
|---|---|
| 404 | User not found |
| 400 | Cannot remove the last admin from the enterprise |
Groups
Groups are either product subscriptions (grant a product seat) or teams (organize users). See How SCIM Works with axe Account.
List groups
GET /api/scim/v2/GroupsReturns all product subscriptions and teams for your enterprise. This endpoint is not paginated.
Query parameters
| Parameter | Type | Description |
|---|---|---|
filter |
string | Optional. displayName eq "<name>". Matched exactly and case-sensitively against team names and product names — unlike the userName filter on /Users, which is case-insensitive. |
Response 200 OK
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:ListResponse"],
"totalResults": 5,
"startIndex": 1,
"itemsPerPage": 5,
"Resources": [
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:Group"],
"id": "grp-1",
"displayName": "Axe Monitor",
"members": [
{ "value": "5f3e...c2", "display": "user@example.com", "$ref": "/Users/5f3e...c2" }
]
}
]
}Get a group
GET /api/scim/v2/Groups/{id}Response 200 OK — a Group resource.
Errors
| Status | detail |
|---|---|
| 404 | Group not found |
Create a group
POST /api/scim/v2/GroupsCreates a team. If displayName exactly matches the name of a product your enterprise holds an active subscription for, no team is created — the existing product subscription group is returned instead (201, with its id and Location), and any members in the request body are ignored. Manage that group's membership through PATCH /Groups/{id}.
Matching is case-sensitive and exact. If the name matches a product whose subscription is not active, a regular team is created with that name instead — it will not grant product seats.
Request body
| Field | Required | Description |
|---|---|---|
schemas |
✅ | Must include urn:ietf:params:scim:schemas:core:2.0:Group. |
displayName |
✅ | Team name (non-blank, ≤128 characters). |
members |
— | Optional array (≤1000). |
Response 201 Created — the created Group resource, with a Location header.
Errors
| Status | detail |
|---|---|
| 400 | The group was not created because some users are not members of the enterprise. User IDs: ... |
| 409 | A group with this displayName already exists |
Update group membership
PATCH /api/scim/v2/Groups/{id}Adds or removes members. For a subscription group, this grants or revokes a product seat. For a team group, this changes team membership.
Request body
{
"schemas": ["urn:ietf:params:scim:api:messages:2.0:PatchOp"],
"Operations": [
{ "op": "add", "path": "members", "value": [ { "value": "5f3e...c2" } ] }
]
}Use op: "remove" with a path to remove members. A replace with an empty array removes all members.
Response 204 No Content
Errors
| Status | detail |
|---|---|
| 404 | Group not found |
| 404 | Product not found |
| 402 | Enterprise subscription out of seats |
| 400 | Some users were not added to the group because they are not members of the enterprise. User IDs: ... |
| 400 | Path is required for remove operations |
Delete a group
DELETE /api/scim/v2/Groups/{id}Deletes a team. Delete requests against a product subscription group are ignored (returns 204).
Response 204 No Content
Errors
| Status | detail |
|---|---|
| 404 | Group not found |
Update a group (not supported)
PUT /api/scim/v2/Groups/{id}Not supported. Returns 405 Method not allowed. Use PATCH to modify membership.
Discovery endpoints
These support automatic connector configuration. All return 200 OK.
| Endpoint | Returns |
|---|---|
GET /api/scim/v2/ServiceProviderConfig |
Supported capabilities (patch, filtering with max 100 results; bulk and sort not supported). |
GET /api/scim/v2/Schemas |
User and Group schema definitions. |
GET /api/scim/v2/Schemas/{id} |
A single schema by URN. 404 "Schema not found" if unknown. |
GET /api/scim/v2/ResourceTypes |
User and Group resource types. |
GET /api/scim/v2/ResourceTypes/{id} |
A single resource type. 404 "Resource type not found" if unknown. |
