For the complete documentation index, see llms.txt. This page is also available as Markdown.

Tabnine SCIM API

List/search users

get
Authorizations
AuthorizationstringRequired

SCIM API key issued via the admin-only auth-service endpoint POST /organization/idp/scim-key. Token also encodes syncMode (e.g. UsersAndTeams), which gates Groups behavior as noted above.

Query parameters
filterstringOptional

Only userName eq "<value>" is supported. Any other property or operator returns 400. (scim.router.ts parseScimFilter)

countstringOptional

Page size. Optional, passed through to auth-service (default 10 there).

startIndexstringOptional

1-based per SCIM spec. Converted to 0-based before calling the internal auth-service API.

Responses
200

OK. Deviation - no real pagination handling (AuthClient.getUsers has // TODO: handle pagination); totalResults may not reflect true dataset size across pages.

application/json
schemasstring[]OptionalExample: ["urn:ietf:params:scim:api:messages:2.0:ListResponse"]
totalResultsintegerOptional
get/Users
GET /scim/v2/Users HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "schemas": [
    "urn:ietf:params:scim:api:messages:2.0:ListResponse"
  ],
  "totalResults": 1,
  "Resources": [
    {
      "schemas": [
        "urn:ietf:params:scim:schemas:core:2.0:User"
      ],
      "id": "text",
      "externalId": "text",
      "userName": "name@gmail.com",
      "active": true,
      "meta": {
        "resourceType": "User",
        "created": "2026-01-01T00:00:00.000Z",
        "lastModified": "2026-01-01T00:00:00.000Z"
      }
    }
  ]
}

Create a user

post
Authorizations
AuthorizationstringRequired

SCIM API key issued via the admin-only auth-service endpoint POST /organization/idp/scim-key. Token also encodes syncMode (e.g. UsersAndTeams), which gates Groups behavior as noted above.

Body
schemasstring[]Optional
userNamestring · emailRequired

Required. Not validated as email format at this layer (only presence-checked).

externalIdstringRequired

Required.

activebooleanOptional

Optional. Defaults to true downstream if omitted.

Responses
201

Created.

application/json
schemasstring[]RequiredExample: ["urn:ietf:params:scim:schemas:core:2.0:User"]
idstringRequired
externalIdstringRequired
userNamestring · emailRequired
activebooleanRequired
post/Users
POST /scim/v2/Users HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 113

{
  "schemas": [
    "text"
  ],
  "userName": "name@gmail.com",
  "externalId": "text",
  "active": true,
  "meta": {
    "resourceType": "User"
  }
}
{
  "schemas": [
    "urn:ietf:params:scim:schemas:core:2.0:User"
  ],
  "id": "text",
  "externalId": "text",
  "userName": "name@gmail.com",
  "active": true,
  "meta": {
    "resourceType": "User",
    "created": "2026-01-01T00:00:00.000Z",
    "lastModified": "2026-01-01T00:00:00.000Z"
  }
}

Get a user by ID

get
Authorizations
AuthorizationstringRequired

SCIM API key issued via the admin-only auth-service endpoint POST /organization/idp/scim-key. Token also encodes syncMode (e.g. UsersAndTeams), which gates Groups behavior as noted above.

Path parameters
idstringRequired
Responses
200

OK.

application/json
schemasstring[]RequiredExample: ["urn:ietf:params:scim:schemas:core:2.0:User"]
idstringRequired
externalIdstringRequired
userNamestring · emailRequired
activebooleanRequired
get/Users/{id}
GET /scim/v2/Users/{id} HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "schemas": [
    "urn:ietf:params:scim:schemas:core:2.0:User"
  ],
  "id": "text",
  "externalId": "text",
  "userName": "name@gmail.com",
  "active": true,
  "meta": {
    "resourceType": "User",
    "created": "2026-01-01T00:00:00.000Z",
    "lastModified": "2026-01-01T00:00:00.000Z"
  }
}

Replace a user

put

Deviation - not a true full replace. Omitted fields are left unchanged rather than cleared (internal auth-service call is a PATCH, not a PUT).

Authorizations
AuthorizationstringRequired

SCIM API key issued via the admin-only auth-service endpoint POST /organization/idp/scim-key. Token also encodes syncMode (e.g. UsersAndTeams), which gates Groups behavior as noted above.

Path parameters
idstringRequired
Body

All fields optional (Partial - see auth.types.ts). No firstName/lastName at this layer.

userNamestring · emailOptional
externalIdstringOptional
activebooleanOptional
Responses
200

OK.

application/json
schemasstring[]RequiredExample: ["urn:ietf:params:scim:schemas:core:2.0:User"]
idstringRequired
externalIdstringRequired
userNamestring · emailRequired
activebooleanRequired
put/Users/{id}
PUT /scim/v2/Users/{id} HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 63

{
  "userName": "name@gmail.com",
  "externalId": "text",
  "active": true
}
{
  "schemas": [
    "urn:ietf:params:scim:schemas:core:2.0:User"
  ],
  "id": "text",
  "externalId": "text",
  "userName": "name@gmail.com",
  "active": true,
  "meta": {
    "resourceType": "User",
    "created": "2026-01-01T00:00:00.000Z",
    "lastModified": "2026-01-01T00:00:00.000Z"
  }
}

Delete (deactivate) a user

delete

Deviation - this is a soft delete. The user is deactivated (toggleUserActive(..., false) in auth-service); the record is not removed. Re-provisioning: POSTing /Users again with the same userName reactivates/adopts the existing (deactivated) user rather than creating a new one or erroring, as long as it currently has no externalId set - if it still has one, POST returns 409 instead.

Authorizations
AuthorizationstringRequired

SCIM API key issued via the admin-only auth-service endpoint POST /organization/idp/scim-key. Token also encodes syncMode (e.g. UsersAndTeams), which gates Groups behavior as noted above.

Path parameters
idstringRequired
Responses
204

No Content. Correctly empty-bodied (unlike the internal auth-service delete endpoint, which incorrectly sends a body on 204).

No content

delete/Users/{id}
DELETE /scim/v2/Users/{id} HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*

No content

Partially update a user

patch

Deviation - only active, externalId, userName (case-insensitive path match) are patchable. Operations targeting any other path are silently ignored (logged, not rejected). If no operation targets a supported property, this is a silent no-op that returns the current user unchanged with a 200 - the caller cannot distinguish "applied" from "ignored" from the response alone.

Authorizations
AuthorizationstringRequired

SCIM API key issued via the admin-only auth-service endpoint POST /organization/idp/scim-key. Token also encodes syncMode (e.g. UsersAndTeams), which gates Groups behavior as noted above.

Path parameters
idstringRequired
Body
Responses
200

OK (see no-op deviation note above).

application/json
schemasstring[]RequiredExample: ["urn:ietf:params:scim:schemas:core:2.0:User"]
idstringRequired
externalIdstringRequired
userNamestring · emailRequired
activebooleanRequired
patch/Users/{id}
PATCH /scim/v2/Users/{id} HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 56

{
  "Operations": [
    {
      "op": "add",
      "path": "text",
      "value": null
    }
  ]
}
{
  "schemas": [
    "urn:ietf:params:scim:schemas:core:2.0:User"
  ],
  "id": "text",
  "externalId": "text",
  "userName": "name@gmail.com",
  "active": true,
  "meta": {
    "resourceType": "User",
    "created": "2026-01-01T00:00:00.000Z",
    "lastModified": "2026-01-01T00:00:00.000Z"
  }
}

List/search groups

get
Authorizations
AuthorizationstringRequired

SCIM API key issued via the admin-only auth-service endpoint POST /organization/idp/scim-key. Token also encodes syncMode (e.g. UsersAndTeams), which gates Groups behavior as noted above.

Query parameters
filterstringOptional

Only displayName eq "<value>" is supported.

countstringOptional
startIndexstringOptional

1-based, converted to 0-based internally.

excludedAttributesstringOptional

Comma-separated attribute names to omit from each result (e.g. members).

Responses
200

Deviation - if the organization's IDP sync mode is not UsersAndTeams (i.e. group provisioning isn't enabled for that org/token), this returns 200 with an empty list rather than an error, masking the feature-flag state.

application/json
schemasstring[]OptionalExample: ["urn:ietf:params:scim:api:messages:2.0:ListResponse"]
totalResultsintegerOptional
get/Groups
GET /scim/v2/Groups HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "schemas": [
    "urn:ietf:params:scim:api:messages:2.0:ListResponse"
  ],
  "totalResults": 1,
  "Resources": [
    {
      "schemas": [
        "urn:ietf:params:scim:schemas:core:2.0:Group"
      ],
      "id": "text",
      "externalId": "text",
      "displayName": "text",
      "members": [
        {
          "value": "text",
          "display": "text",
          "type": "User",
          "ref": "text"
        }
      ],
      "meta": {
        "resourceType": "Group",
        "created": "2026-01-01T00:00:00.000Z",
        "lastModified": "2026-01-01T00:00:00.000Z"
      }
    }
  ]
}

Create a group

post

Deviation - members is accepted in the request body's type but is never sent to auth-service on create; a created group always starts with no members (add members afterward via PATCH/PUT).

Authorizations
AuthorizationstringRequired

SCIM API key issued via the admin-only auth-service endpoint POST /organization/idp/scim-key. Token also encodes syncMode (e.g. UsersAndTeams), which gates Groups behavior as noted above.

Body
schemasstring[]Optional
displayNamestringRequired
externalIdstringRequired
Responses
201

Deviation (significant) - if the org's sync mode is not UsersAndTeams, this endpoint does NOT call auth-service at all. It fabricates a 201 response with a random UUID and echoes the input back. The caller is told the group was created; nothing was persisted.

application/json
schemasstring[]RequiredExample: ["urn:ietf:params:scim:schemas:core:2.0:Group"]
idstringRequired
externalIdstringOptional
displayNamestringRequired
post/Groups
POST /scim/v2/Groups HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 134

{
  "schemas": [
    "text"
  ],
  "displayName": "text",
  "externalId": "text",
  "members": [
    {
      "value": "text",
      "display": "text",
      "type": "User",
      "ref": "text"
    }
  ]
}
{
  "schemas": [
    "urn:ietf:params:scim:schemas:core:2.0:Group"
  ],
  "id": "text",
  "externalId": "text",
  "displayName": "text",
  "members": [
    {
      "value": "text",
      "display": "text",
      "type": "User",
      "ref": "text"
    }
  ],
  "meta": {
    "resourceType": "Group",
    "created": "2026-01-01T00:00:00.000Z",
    "lastModified": "2026-01-01T00:00:00.000Z"
  }
}

Get a group by ID

get
Authorizations
AuthorizationstringRequired

SCIM API key issued via the admin-only auth-service endpoint POST /organization/idp/scim-key. Token also encodes syncMode (e.g. UsersAndTeams), which gates Groups behavior as noted above.

Path parameters
idstringRequired
Query parameters
excludedAttributesstringOptional
Responses
200

OK.

application/json
schemasstring[]RequiredExample: ["urn:ietf:params:scim:schemas:core:2.0:Group"]
idstringRequired
externalIdstringOptional
displayNamestringRequired
get/Groups/{id}
GET /scim/v2/Groups/{id} HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{
  "schemas": [
    "urn:ietf:params:scim:schemas:core:2.0:Group"
  ],
  "id": "text",
  "externalId": "text",
  "displayName": "text",
  "members": [
    {
      "value": "text",
      "display": "text",
      "type": "User",
      "ref": "text"
    }
  ],
  "meta": {
    "resourceType": "Group",
    "created": "2026-01-01T00:00:00.000Z",
    "lastModified": "2026-01-01T00:00:00.000Z"
  }
}

Replace a group

put
Authorizations
AuthorizationstringRequired

SCIM API key issued via the admin-only auth-service endpoint POST /organization/idp/scim-key. Token also encodes syncMode (e.g. UsersAndTeams), which gates Groups behavior as noted above.

Path parameters
idstringRequired
Body
displayNamestringRequired
externalIdstringOptional
Responses
200

Deviation - if sync mode is not UsersAndTeams, fabricates a 200 echo of the input without persisting anything (same no-op pattern as POST /Groups).

application/json
schemasstring[]RequiredExample: ["urn:ietf:params:scim:schemas:core:2.0:Group"]
idstringRequired
externalIdstringOptional
displayNamestringRequired
put/Groups/{id}
PUT /scim/v2/Groups/{id} HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 115

{
  "displayName": "text",
  "externalId": "text",
  "members": [
    {
      "value": "text",
      "display": "text",
      "type": "User",
      "ref": "text"
    }
  ]
}
{
  "schemas": [
    "urn:ietf:params:scim:schemas:core:2.0:Group"
  ],
  "id": "text",
  "externalId": "text",
  "displayName": "text",
  "members": [
    {
      "value": "text",
      "display": "text",
      "type": "User",
      "ref": "text"
    }
  ],
  "meta": {
    "resourceType": "Group",
    "created": "2026-01-01T00:00:00.000Z",
    "lastModified": "2026-01-01T00:00:00.000Z"
  }
}

Delete a group

delete

Deviation - if sync mode is not UsersAndTeams, silently no-ops and returns 204 without calling auth-service.

Authorizations
AuthorizationstringRequired

SCIM API key issued via the admin-only auth-service endpoint POST /organization/idp/scim-key. Token also encodes syncMode (e.g. UsersAndTeams), which gates Groups behavior as noted above.

Path parameters
idstringRequired
Responses
204

No Content.

No content

delete/Groups/{id}
DELETE /scim/v2/Groups/{id} HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*

No content

Partially update a group (including membership)

patch

Supports standard Operations array. members path supports add/remove/replace, including value-filtered paths like members[value eq "<id>"]. Flat displayName/externalId replace also supported.

Authorizations
AuthorizationstringRequired

SCIM API key issued via the admin-only auth-service endpoint POST /organization/idp/scim-key. Token also encodes syncMode (e.g. UsersAndTeams), which gates Groups behavior as noted above.

Path parameters
idstringRequired
Body
Responses
200

OK (only reached when sync mode is UsersAndTeams).

application/json
schemasstring[]RequiredExample: ["urn:ietf:params:scim:schemas:core:2.0:Group"]
idstringRequired
externalIdstringOptional
displayNamestringRequired
patch/Groups/{id}
PATCH /scim/v2/Groups/{id} HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Content-Type: application/json
Accept: */*
Content-Length: 56

{
  "Operations": [
    {
      "op": "add",
      "path": "text",
      "value": null
    }
  ]
}
{
  "schemas": [
    "urn:ietf:params:scim:schemas:core:2.0:Group"
  ],
  "id": "text",
  "externalId": "text",
  "displayName": "text",
  "members": [
    {
      "value": "text",
      "display": "text",
      "type": "User",
      "ref": "text"
    }
  ],
  "meta": {
    "resourceType": "Group",
    "created": "2026-01-01T00:00:00.000Z",
    "lastModified": "2026-01-01T00:00:00.000Z"
  }
}

List supported SCIM schemas

get

Known gap (referenced by DEV3-6023) - only User and Group core schemas are returned. An EnterpriseUser extension schema (employeeNumber attribute) exists fully drafted in source (consts.ts) but is commented out and not served. No custom-attribute extension schemas exist at all.

Authorizations
AuthorizationstringRequired

SCIM API key issued via the admin-only auth-service endpoint POST /organization/idp/scim-key. Token also encodes syncMode (e.g. UsersAndTeams), which gates Groups behavior as noted above.

Responses
200

OK.

application/json
objectOptional
get/Schemas
GET /scim/v2/Schemas HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
200

OK.

{}

Get a single schema by its URN ID

get
Authorizations
AuthorizationstringRequired

SCIM API key issued via the admin-only auth-service endpoint POST /organization/idp/scim-key. Token also encodes syncMode (e.g. UsersAndTeams), which gates Groups behavior as noted above.

Path parameters
idstringRequired
Responses
200

OK.

application/json
objectOptional
get/Schemas/{id}
GET /scim/v2/Schemas/{id} HTTP/1.1
Authorization: Bearer YOUR_SECRET_TOKEN
Accept: */*
{}

Last updated

Was this helpful?