SkillhabitDocs

Users

List, search, create, update, archive, and inspect user accounts.

POST
/users/{userId}/access/{action}

Adds or removes access to one Skillhabit application for the user. action controls whether the selected application is added or removed. Supported applicationId values are achievements, analyse, create, learn, and follow-up.

AuthorizationBearer <token>

A JSON Web Token

In: header

Path Parameters

userId*string

User id whose application access should be updated.

action*string

Access update action.

Value in

  • "ADD"
  • "REMOVE"

Request Body

application/json

Application access request.

TypeScript Definitions

Use the request body type in TypeScript.

Request to grant or revoke access to one Skillhabit application.

Response Body

application/json

curl -X POST "https://example.com/users/7f9c2a1e-4b8d-4f6a-9c2e-1d3b5a7e9c01/access/ADD" \  -H "Content-Type: application/json" \  -d '{}'
Empty
POST
/users/{userId}/archive

Archives a user account. Admin users cannot be archived and return a bad request.

AuthorizationBearer <token>

A JSON Web Token

In: header

Path Parameters

userId*string

User id to archive.

Response Body

application/json

curl -X POST "https://example.com/users/7f9c2a1e-4b8d-4f6a-9c2e-1d3b5a7e9c01/archive"
Empty
GET
/users

Returns users for the customer. Use filter to search by user fields supported by the user service; an empty filter returns all users. The response includes resolved custom field names and pagination metadata.

AuthorizationBearer <token>

A JSON Web Token

In: header

Query Parameters

filter?string

Search filter. Empty string returns all users.

Default""
skip?integer

Number of matching users to skip.

Formatint32
Default0
limit?integer

Maximum number of users to return.

Formatint32
Default100

Response Body

application/json

curl -X GET "https://example.com/users?filter=alice&skip=0&limit=100"
{  "users": [    {      "userId": "7f9c2a1e-4b8d-4f6a-9c2e-1d3b5a7e9c01",      "email": "employee@example.com",      "firstName": "string",      "lastName": "string",      "avatarUrl": "string",      "customFields": {        "property1": {},        "property2": {}      },      "emailStatus": "string",      "metadata": {        "property1": "string",        "property2": "string"      },      "archivedAt": 1700000000000,      "customArchiveDate": 1750000000000    }  ],  "skip": 0,  "limit": 100,  "filter": "string",  "matchCount": 250}
POST
/users

Creates a user account for the customer. The request may include name, language, and whether a welcome email should be sent.

AuthorizationBearer <token>

A JSON Web Token

In: header

Request Body

application/json

User creation request.

TypeScript Definitions

Use the request body type in TypeScript.

Create user request.

Response Body

application/json

curl -X POST "https://example.com/users" \  -H "Content-Type: application/json" \  -d '{}'
{  "userId": "7f9c2a1e-4b8d-4f6a-9c2e-1d3b5a7e9c01",  "newUser": true}
GET
/users/{userId}

Returns one user account with profile fields, metadata, custom fields, integrations, and current group membership information.

AuthorizationBearer <token>

A JSON Web Token

In: header

Path Parameters

userId*string

User id to retrieve.

Response Body

application/json

curl -X GET "https://example.com/users/7f9c2a1e-4b8d-4f6a-9c2e-1d3b5a7e9c01"
{  "userId": "7f9c2a1e-4b8d-4f6a-9c2e-1d3b5a7e9c01",  "email": "employee@example.com",  "firstName": "string",  "lastName": "string",  "avatarUrl": "string",  "customFields": {    "property1": {},    "property2": {}  },  "emailStatus": "string",  "language": "en",  "lastLoginAt": 0,  "admin": true,  "manager": true,  "applicationIds": [    "string"  ],  "metadata": {    "property1": "string",    "property2": "string"  },  "createdAt": 1700000000000,  "timeZone": {    "displayName": "string",    "id": "string",    "dstsavings": 0,    "rawOffset": 0  },  "integrationIds": {    "property1": "string",    "property2": "string"  },  "archivedAt": 0,  "scheduledDeleteDate": 0,  "customArchiveDate": 0,  "memberOfGroups": [    {      "groupId": "7d6b7a10-2b2a-4a30-8a2e-39ad8e4f2b11",      "groupType": "string",      "name": "string"    }  ],  "managerOfGroups": [    {      "groupId": "7d6b7a10-2b2a-4a30-8a2e-39ad8e4f2b11",      "groupType": "string",      "name": "string"    }  ]}
DELETE
/users/{userId}

Deletes a user account by id.

AuthorizationBearer <token>

A JSON Web Token

In: header

Path Parameters

userId*string

User id to delete.

Response Body

application/json

curl -X DELETE "https://example.com/users/7f9c2a1e-4b8d-4f6a-9c2e-1d3b5a7e9c01"
Empty
GET
/users/certificates

Returns certificates for the selected users. Use flatView=true to request the downstream flat response shape; omit it for the grouped-by-user response.

AuthorizationBearer <token>

A JSON Web Token

In: header

Query Parameters

userIds[]?array<string>

User ids whose certificates should be returned.

flatView?boolean

When true, returns the downstream flat certificate view instead of the grouped user view.

Response Body

application/json

curl -X GET "https://example.com/users/certificates?userIds%5B%5D=7f9c2a1e-4b8d-4f6a-9c2e-1d3b5a7e9c01&flatView=false"
{  "usersWithCertificates": {    "property1": {      "contentId": "d69c7cd1-9943-4f7f-b95f-0572b3458e9c",      "contentType": "COURSE",      "contentName": "string",      "certificateId": "e2d2a9c7-5349-4ca7-a1dc-7c1b2a3e4f50",      "issued": 1700000000000,      "pdfUri": "string",      "status": "ACTIVE",      "recertificationContentId": "string",      "expiresAt": 1731536000000,      "certificateAttachment": "string",      "certificateAttachments": [        {          "url": "string",          "name": "string",          "createdAt": 1700000000000        }      ],      "recertificationCertificate": {        "contentId": "d69c7cd1-9943-4f7f-b95f-0572b3458e9c",        "contentType": "COURSE",        "contentName": "string",        "certificateId": "e2d2a9c7-5349-4ca7-a1dc-7c1b2a3e4f50",        "issued": 0,        "pdfUri": "string",        "status": "ACTIVE",        "recertificationContentId": "string",        "expiresAt": 0,        "certificateAttachment": "string",        "certificateAttachments": [          {            "url": "string",            "name": "string",            "createdAt": 1700000000000          }        ],        "expiredNotificationEnabled": true      },      "expiredNotificationEnabled": true    },    "property2": {      "contentId": "d69c7cd1-9943-4f7f-b95f-0572b3458e9c",      "contentType": "COURSE",      "contentName": "string",      "certificateId": "e2d2a9c7-5349-4ca7-a1dc-7c1b2a3e4f50",      "issued": 1700000000000,      "pdfUri": "string",      "status": "ACTIVE",      "recertificationContentId": "string",      "expiresAt": 1731536000000,      "certificateAttachment": "string",      "certificateAttachments": [        {          "url": "string",          "name": "string",          "createdAt": 1700000000000        }      ],      "recertificationCertificate": {        "contentId": "d69c7cd1-9943-4f7f-b95f-0572b3458e9c",        "contentType": "COURSE",        "contentName": "string",        "certificateId": "e2d2a9c7-5349-4ca7-a1dc-7c1b2a3e4f50",        "issued": 0,        "pdfUri": "string",        "status": "ACTIVE",        "recertificationContentId": "string",        "expiresAt": 0,        "certificateAttachment": "string",        "certificateAttachments": [          {            "url": "string",            "name": "string",            "createdAt": 1700000000000          }        ],        "expiredNotificationEnabled": true      },      "expiredNotificationEnabled": true    }  }}
GET
/users/custom-field-choice

Deprecated compatibility endpoint that returns the customer's available custom fields for older user custom-field update clients. Prefer GET /custom-fields.

AuthorizationBearer <token>

A JSON Web Token

In: header

Response Body

application/json

curl -X GET "https://example.com/users/custom-field-choice"
{  "customFields": [    {      "customFieldId": "22576317-111e-4373-9d27-b04469f360d3",      "id": "22576317-111e-4373-9d27-b04469f360d3",      "type": "CHOICE",      "name": "Department",      "choices": [        {          "choiceId": "8a9064d1-2226-41e1-b203-33a42063c251",          "name": "Sales"        }      ]    }  ]}
GET
/users/{userId}/certificates

Returns certificates issued to one user.

AuthorizationBearer <token>

A JSON Web Token

In: header

Path Parameters

userId*string

User id whose certificates should be returned.

Response Body

application/json

curl -X GET "https://example.com/users/7f9c2a1e-4b8d-4f6a-9c2e-1d3b5a7e9c01/certificates"
{  "userId": "7f9c2a1e-4b8d-4f6a-9c2e-1d3b5a7e9c01",  "certificates": [    {      "contentId": "d69c7cd1-9943-4f7f-b95f-0572b3458e9c",      "contentType": "COURSE",      "contentName": "string",      "certificateId": "e2d2a9c7-5349-4ca7-a1dc-7c1b2a3e4f50",      "issued": 1700000000000,      "pdfUri": "string",      "status": "ACTIVE",      "recertificationContentId": "string",      "expiresAt": 1731536000000,      "certificateAttachment": "string",      "certificateAttachments": [        {          "url": "string",          "name": "string",          "createdAt": 1700000000000        }      ],      "recertificationCertificate": {        "contentId": "d69c7cd1-9943-4f7f-b95f-0572b3458e9c",        "contentType": "COURSE",        "contentName": "string",        "certificateId": "e2d2a9c7-5349-4ca7-a1dc-7c1b2a3e4f50",        "issued": 0,        "pdfUri": "string",        "status": "ACTIVE",        "recertificationContentId": "string",        "expiresAt": 0,        "certificateAttachment": "string",        "certificateAttachments": [          {            "url": "string",            "name": "string",            "createdAt": 1700000000000          }        ],        "expiredNotificationEnabled": true      },      "expiredNotificationEnabled": true    }  ]}
GET
/users/{userId}/order-details

Returns Academy order/contact details stored for a user. These values are used when creating content purchase orders.

AuthorizationBearer <token>

A JSON Web Token

In: header

Path Parameters

userId*string

User id whose order details should be returned.

Response Body

application/json

application/json

curl -X GET "https://example.com/users/7f9c2a1e-4b8d-4f6a-9c2e-1d3b5a7e9c01/order-details"
{  "disablePayment": false,  "email": "string",  "firstName": "string",  "lastName": "string",  "companyName": "string",  "companyNumber": "string",  "companyEmail": "string",  "phone": "string",  "phoneCode": "string",  "address": {    "street": "string",    "city": "string",    "country": "string",    "phone": "string",    "zip": "string"  },  "companyPayment": false,  "note": "string",  "createdAt": "2019-08-24T14:15:22Z",  "updatedAt": "2019-08-24T14:15:22Z"}
PUT
/users/{userId}/order-details

Updates Academy order/contact details for a user.

AuthorizationBearer <token>

A JSON Web Token

In: header

Path Parameters

userId*string

User id whose order details should be updated.

Request Body

application/json

Order/contact fields to store for the user.

TypeScript Definitions

Use the request body type in TypeScript.

Request body for updating user order/contact details.

Response Body

application/json

application/json

curl -X PUT "https://example.com/users/7f9c2a1e-4b8d-4f6a-9c2e-1d3b5a7e9c01/order-details" \  -H "Content-Type: application/json" \  -d '{}'
{  "disablePayment": false,  "email": "string",  "firstName": "string",  "lastName": "string",  "companyName": "string",  "companyNumber": "string",  "companyEmail": "string",  "phone": "string",  "phoneCode": "string",  "address": {    "street": "string",    "city": "string",    "country": "string",    "phone": "string",    "zip": "string"  },  "companyPayment": false,  "note": "string",  "createdAt": "2019-08-24T14:15:22Z",  "updatedAt": "2019-08-24T14:15:22Z"}
GET
/users/extended-info

Returns users with manual/smart group memberships, manager groups, and available application permissions. Use filter to search; an empty filter returns all users.

AuthorizationBearer <token>

A JSON Web Token

In: header

Query Parameters

filter?string

Search filter. Empty string returns all users.

Default""
skip?integer

Number of matching users to skip.

Formatint32
Default0
limit?integer

Maximum number of users to return.

Formatint32
Default100

Response Body

application/json

curl -X GET "https://example.com/users/extended-info?filter=alice&skip=0&limit=100"
{  "users": [    {      "userId": "7f9c2a1e-4b8d-4f6a-9c2e-1d3b5a7e9c01",      "email": "employee@example.com",      "firstName": "string",      "lastName": "string",      "avatarUrl": "string",      "emailStatus": "string",      "admin": true,      "manager": true,      "memberOfGroups": [        {          "groupId": "7d6b7a10-2b2a-4a30-8a2e-39ad8e4f2b11",          "groupType": "string",          "name": "string"        }      ],      "managerOfGroups": [        {          "groupId": "7d6b7a10-2b2a-4a30-8a2e-39ad8e4f2b11",          "groupType": "string",          "name": "string"        }      ],      "availableApplications": [        "string"      ]    }  ],  "skip": 0,  "limit": 100,  "filter": "string",  "matchCount": 250}
POST
/users/{userId}/make-admin/{endow}

Grants or revokes administrator rights for a user. Use endow=true to grant admin access and endow=false to revoke it.

AuthorizationBearer <token>

A JSON Web Token

In: header

Path Parameters

userId*string

User id whose admin access should be updated.

endow*boolean

true grants admin access; false revokes admin access.

Response Body

application/json

curl -X POST "https://example.com/users/7f9c2a1e-4b8d-4f6a-9c2e-1d3b5a7e9c01/make-admin/true"
Empty
POST
/users/{userId}/make-manager/{endow}

Grants or revokes manager rights for a user. Use endow=true to grant manager access and endow=false to revoke it.

AuthorizationBearer <token>

A JSON Web Token

In: header

Path Parameters

userId*string

User id whose manager access should be updated.

endow*boolean

true grants manager access; false revokes manager access.

Response Body

curl -X POST "https://example.com/users/7f9c2a1e-4b8d-4f6a-9c2e-1d3b5a7e9c01/make-manager/true"
Empty
POST
/users/search

Search for users in the system with advanced filtering capabilities. This endpoint supports filtering by text search (searches in user name or email), metadata key-value pairs, pagination (skip/limit), and optionally includes group information and application permissions. The metadata parameter allows filtering users based on custom metadata stored as key-value pairs. When includeGroups is set to true, the response will include group memberships for each user.

AuthorizationBearer <token>

A JSON Web Token

In: header

Request Body

application/json

Advanced search request. Use includeGroups=true to include group memberships and application access.

TypeScript Definitions

Use the request body type in TypeScript.

Advanced user search request.

Response Body

application/json

application/json

curl -X POST "https://example.com/users/search" \  -H "Content-Type: application/json" \  -d '{}'
{  "users": [    {      "userId": "7f9c2a1e-4b8d-4f6a-9c2e-1d3b5a7e9c01",      "email": "employee@example.com",      "firstName": "string",      "lastName": "string",      "avatarUrl": "string",      "customFields": {        "property1": {},        "property2": {}      },      "emailStatus": "string",      "metadata": {        "property1": "string",        "property2": "string"      },      "admin": true,      "manager": true,      "memberOfGroups": [        {          "groupId": "7d6b7a10-2b2a-4a30-8a2e-39ad8e4f2b11",          "groupType": "string",          "name": "string"        }      ],      "managerOfGroups": [        {          "groupId": "7d6b7a10-2b2a-4a30-8a2e-39ad8e4f2b11",          "groupType": "string",          "name": "string"        }      ],      "availableApplications": [        "string"      ]    }  ],  "matchCount": 250}
POST
/users/{userId}/set-custom-archived-date

Set a custom date when the user account will be archived. Pass null date to reset the custom archived date. Admin or manager users can not have a custom archived date.

AuthorizationBearer <token>

A JSON Web Token

In: header

Path Parameters

userId*string

User id whose custom archive date should be updated.

Request Body

application/json

Custom archive date in epoch milliseconds, or null to clear it.

TypeScript Definitions

Use the request body type in TypeScript.

Custom archive date update request.

Response Body

application/json

curl -X POST "https://example.com/users/7f9c2a1e-4b8d-4f6a-9c2e-1d3b5a7e9c01/set-custom-archived-date" \  -H "Content-Type: application/json" \  -d '{}'
Empty
POST
/users/{userId}/unarchive

Unarchive a previously archived user account.

AuthorizationBearer <token>

A JSON Web Token

In: header

Path Parameters

userId*string

User id to unarchive.

Response Body

application/json

curl -X POST "https://example.com/users/7f9c2a1e-4b8d-4f6a-9c2e-1d3b5a7e9c01/unarchive"
Empty
POST
/users/{userId}/update-custom-field-choice

Updates custom field answers on a user account. The request shape is forwarded to the user service and contains custom-field ids mapped to selected values.

AuthorizationBearer <token>

A JSON Web Token

In: header

Path Parameters

userId*string

User id whose custom fields should be updated.

Request Body

application/json

Custom field answers for the user. Keys and allowed values depend on the customer's custom field definitions.

TypeScript Definitions

Use the request body type in TypeScript.

User custom field answer update request.

Response Body

application/json

curl -X POST "https://example.com/users/7f9c2a1e-4b8d-4f6a-9c2e-1d3b5a7e9c01/update-custom-field-choice" \  -H "Content-Type: application/json" \  -d '{}'
Empty
POST
/users/{userId}/update-email

Changes the email address of a user account after validating the email format.

AuthorizationBearer <token>

A JSON Web Token

In: header

Path Parameters

userId*string

User id whose email should be updated.

Request Body

application/json

New email address.

TypeScript Definitions

Use the request body type in TypeScript.

Email update request.

Response Body

application/json

application/json

curl -X POST "https://example.com/users/7f9c2a1e-4b8d-4f6a-9c2e-1d3b5a7e9c01/update-email" \  -H "Content-Type: application/json" \  -d '{    "email": "new.email@example.com"  }'
Empty
POST
/users/{userId}/update-fullname

Updates the first and/or last name of a user account.

AuthorizationBearer <token>

A JSON Web Token

In: header

Path Parameters

userId*string

User id whose name should be updated.

Request Body

application/json

First and last name values to store on the user.

TypeScript Definitions

Use the request body type in TypeScript.

User name update request.

Response Body

application/json

curl -X POST "https://example.com/users/7f9c2a1e-4b8d-4f6a-9c2e-1d3b5a7e9c01/update-fullname" \  -H "Content-Type: application/json" \  -d '{    "firstName": "Alice",    "lastName": "Example"  }'
Empty
POST
/users/{userId}/update-language

Updates the user's preferred language. The language code must be one of the supported lowercase language codes, such as en, sv, de, no, nl, fi, uk, or es.

AuthorizationBearer <token>

A JSON Web Token

In: header

Path Parameters

userId*string

User id whose language should be updated.

Request Body

application/json

New preferred language code.

TypeScript Definitions

Use the request body type in TypeScript.

Language update request.

Response Body

application/json

curl -X POST "https://example.com/users/7f9c2a1e-4b8d-4f6a-9c2e-1d3b5a7e9c01/update-language" \  -H "Content-Type: application/json" \  -d '{    "language": "en"  }'
Empty
POST
/users/{userId}/update-metadata

Replaces or updates customer-defined metadata on a user account. Metadata keys and values are customer-specific strings.

AuthorizationBearer <token>

A JSON Web Token

In: header

Path Parameters

userId*string

User id whose metadata should be updated.

Request Body

application/json

Metadata key/value pairs to store on the user.

TypeScript Definitions

Use the request body type in TypeScript.

Metadata update request.

Response Body

application/json

curl -X POST "https://example.com/users/7f9c2a1e-4b8d-4f6a-9c2e-1d3b5a7e9c01/update-metadata" \  -H "Content-Type: application/json" \  -d '{    "metadata": {      "property1": "string",      "property2": "string"    }  }'
Empty
PUT
/users/{userId}/disable-payment

Enables or disables payment access for one user in Academy purchase flows.

AuthorizationBearer <token>

A JSON Web Token

In: header

Path Parameters

userId*string

User id whose payment access should be updated.

Request Body

application/json

Payment access flag.

TypeScript Definitions

Use the request body type in TypeScript.

Payment access update request.

Response Body

application/json

application/json

curl -X PUT "https://example.com/users/7f9c2a1e-4b8d-4f6a-9c2e-1d3b5a7e9c01/disable-payment" \  -H "Content-Type: application/json" \  -d '{}'
{  "disablePayment": false,  "email": "string",  "firstName": "string",  "lastName": "string",  "companyName": "string",  "companyNumber": "string",  "companyEmail": "string",  "phone": "string",  "phoneCode": "string",  "address": {    "street": "string",    "city": "string",    "country": "string",    "phone": "string",    "zip": "string"  },  "companyPayment": false,  "note": "string",  "createdAt": "2019-08-24T14:15:22Z",  "updatedAt": "2019-08-24T14:15:22Z"}