Help

Integration

Searching Users with the REST API

Updated 11 Nov 2026 14 min read

This document explains how to search users through the Monosign REST API. You can search by user name, by e-mail address, by first name and last name and by profile values, and you can combine these criteria in one request.

The search options on this page are available from Monosign v2026.11. In earlier versions SearchCondition is not available, and ProfileFilter applies only the Eq and Neq conditions: the other conditions are ignored and do not filter the list. The search by name (section 2) is not available either.

Request

Property

Values

Type

POST

URL

https://api.monofor.com/v1.4/users/list

Header

MonoSign-AppId: the App Id of your application access key
MonoSign-AppKey: the App Key of your application access key
Content-Type: application/json

Permission

System.API.Users.List

Body (Raw: JSON)

The search criteria. Every field is optional.

The URL shown above is an example. Use the API address of your own Monosign installation.

Before you start

  • Create an access key for your application. The steps are described in Custom Application REST API Integration.

  • Open the application and check Source Using Type. If it is System Default or Disabled, the request is refused. With Only defined to Application, the list contains only the users of the user sources defined on the application.

Search options at a glance

Field

Searches in

How it matches

SearchText

User name or e-mail. With Starts, also first name, last name and the searchable profile properties

Chosen with SearchCondition: Contains (default), Starts, Ends or Eq

UserName

User name only

Contains

Email

E-mail only

Contains

IsExact

Changes SearchText, UserName and Email

The whole value must be equal

ProfileFilter

Profile values

Eq, Neq, Starts, Ends, Contains, Null, NotNull

  • All criteria in one request are combined with AND: a user is returned only when every criterion matches. To return the users who match at least one criterion, send Match (section 8).

  • Spaces at the start and at the end of a search text are removed. An empty text is not applied as a criterion.

  • The characters %, _ and [ are searched as ordinary characters. They are not wildcards.

1. Search by user name or e-mail

SearchText looks for the text in the user name and in the e-mail address. A user is returned when one of the two matches. The search is not case-sensitive.

{
  "SearchText": "john",
  "SearchCondition": "Starts"
}

SearchCondition

Alias

Returns users whose user name or e-mail

Contains (default)

contains the text

Starts

BeginsWith, StartsWith, Begins

starts with the text. Starts also searches the first name and the last name, word by word: see section 2

Ends

EndsWith

ends with the text

Eq

Equals

is equal to the text

On a large directory, prefer Starts or Eq. These two use an index and answer quickly. Contains and Ends have to read every user and can take several seconds.

2. Search by name

With "SearchCondition": "Starts", SearchText searches word by word in the user name, the e-mail address, the first name, the last name and every profile property that is marked as searchable. A user is returned when every word you send is the start of a word in one of these fields.

{
  "SearchText": "john smith",
  "SearchCondition": "Starts"
}

SearchText

Returns

joh

Users who have a word that starts with joh: first name John, user name john.smith, e-mail [email protected]

jan

Also the user whose first name is Mary Jane: a second name is found like the first one

john smith or smith john

Users who have both words. The order of the words and the field of each word do not matter

smith, john or "john smith"

The same users. Commas, semicolons, quotes and other punctuation around a word are removed

isik, IŞIK or ışık

The same users, for example last name Işık. Upper and lower case and accents are ignored, so jose also finds José

john.smith@ex

The user whose e-mail address starts with this text

mith

Not Smith: the middle and the end of a word are not searched. Use Contains for the user name and the e-mail address, or a ProfileFilter with Contains for a profile value

  • The result is the same on SQL Server and on PostgreSQL.

  • At most five words are used. When you send more, the five longest words are used.

  • The domain of an e-mail address is not searched as a word: example does not find [email protected].

  • First Name and Last Name are searchable by default. To search in another profile property, open the property in Management (Directory, Profiles, Properties), turn on Searchable on the Advanced tab and save. The values that already exist become searchable a short time later. A masked property is never searched.

  • With IsExact set to true, the search by name is not used (section 4).

After the upgrade to v2026.11, Monosign prepares the search by name in the background. This takes a few minutes for every 100,000 users. Until it is finished, Starts searches only the start of the user name and of the e-mail address.

Is the search by name ready?

The background work is done by Search Token Service. In Management, open System, then Services, and find the row Search Token Service. The Status column shows where it stands. There is one row for each service node.

Status

Meaning

READY with Done: every searchable field is filled for all {n} tenant(s).

Finished. The search by name is active.

RUNNING with Filling {tenant}: {done} / {total} users, {tokens} tokens written

In progress on this node. The line shows how many users are done.

WAITING

Another service node is doing the work, or a change of the Searchable switch of a profile property is about to be handled.

ERROR with the tenant and Last error: …

The work failed. It is tried again automatically every 30 seconds and continues from where it stopped. Until it finishes, a field that is not filled yet is not searched.

Below the status, the row shows the counts Tenants, Tenants up to date, Searchable fields and Searchable fields filled. The work is finished when the two tenant counts are equal and the two field counts are equal.

The service runs on a service node in Batch mode. When no node runs it, the search by name does not become active.

3. Search only in the user name or only in the e-mail

Use UserName to search only in the user name, and Email to search only in the e-mail address. Both always work as "contains" and are not case-sensitive. SearchCondition does not change them. When you send both, both must match.

{
  "UserName": "john",
  "Email": "@example.com"
}

4. Exact match

With IsExact set to true, SearchText, UserName and Email must be equal to the whole value, and SearchCondition is ignored.

{
  "SearchText": "[email protected]",
  "IsExact": true
}

With IsExact, upper and lower case follow the database: not case-sensitive on SQL Server with its default collation, case-sensitive on PostgreSQL. For an exact search that is not case-sensitive on both databases, send "SearchCondition": "Eq" without IsExact.

5. Search by profile values

ProfileFilter is a list of filters. Each filter has a Property (the name of a profile property, for example FirstName), a Condition and, for most conditions, a Value. When you send several filters, all of them must match.

{
  "ProfileFilter": [
    {
      "Property": "FirstName",
      "Condition": "Contains",
      "Value": "joh"
    },
    {
      "Property": "Department",
      "Condition": "Eq",
      "Value": "IT"
    },
    {
      "Property": "Manager",
      "Condition": "NotNull"
    }
  ]
}

Condition

Alias

Value

Returns users whose profile value

Eq

Equals

Required

is equal to the value

Neq

NotEquals

Required

is filled and is different from the value. Users with an empty value are not returned.

Starts

BeginsWith

Required

starts with the value

Ends

EndsWith

Required

ends with the value

Contains

Required

contains the value

Null

Not used

is empty or does not exist

NotNull

Not used

is filled

  • Starts, Ends and Contains are not case-sensitive.

  • Eq and Neq compare the whole stored value. Upper and lower case follow the database: not case-sensitive on SQL Server with its default collation, case-sensitive on PostgreSQL.

  • For Eq and Neq, send the value in the type the property stores: "Value": "5" is a text and "Value": 5 is a number, and they do not match each other.

  • Property is the name of the profile property. When no property has exactly this name, a name that differs only in upper and lower case is accepted.

  • The comparison conditions Gt, Gtq, Lt and Ltq are not supported for profile values and return an error.

6. Combining criteria

You can send text criteria, profile filters and the other fields together. This example returns the users of the user source corp who have a word that starts with john in their user name, e-mail, first name or last name, and whose department is IT:

{
  "SearchText": "john",
  "SearchCondition": "Starts",
  "SourceName": "corp",
  "ProfileFilter": [
    {
      "Property": "Department",
      "Condition": "Eq",
      "Value": "IT"
    }
  ],
  "IncludeProfile": true,
  "Page": 1,
  "PageSize": 100
}

7. Other fields that change the result

By default the list contains only active users in the Enabled state. If a user you expect is missing, check IsActive and State first.

Field

Default

Description

IsActive

true

Only users with this IsActive value are returned.

IgnoreIsActiveParameter

false

Send true to return users regardless of IsActive.

State and StateParameter

Enabled

State is applied only when StateParameter is true. Values: All, Enabled, Disabled, Removed, Pending.

SourceName

Name, title or NetBIOS name of a user source. Use internal for the internal source. An unknown source returns an error.

SourceId

Id of a user source. When it is sent, SourceName is not used.

Groups

List of group names. Returns the users who are currently a direct member of at least one of them.

UpdatedDate

Returns the users created or updated on or after this date.

UserId

Returns the user with this id.

IncludeProfile, IncludeGroups, IncludeProfilePhoto

false

Add the profile values, the groups or the profile photo to each user in the result.

To search in all users, whatever their state:

{
  "SearchText": "john",
  "IgnoreIsActiveParameter": true,
  "StateParameter": true,
  "State": "All"
}

8. Match any criterion

By default every criterion must match. With "Match": "Any", a user is returned when at least one of UserName, Email, SearchText and the ProfileFilter items matches. This example returns the users whose department is IT or Finance:

{
  "Match": "Any",
  "ProfileFilter": [
    {
      "Property": "Department",
      "Condition": "Eq",
      "Value": "IT"
    },
    {
      "Property": "Department",
      "Condition": "Eq",
      "Value": "Finance"
    }
  ]
}
  • Match accepts All (default, alias And) and Any (alias Or).

  • The fields of section 7 are never part of it. User source, state, IsActive, groups, updated date and user id always apply.

  • To find users by first name or last name, you do not need Match: the search by name (section 2) looks in both and is much faster.

9. Fast search

How fast the list answers depends on how the text is matched. On a large directory, choose a match that can use an index.

You want

Send

Speed

Users by the start of a user name, an e-mail address, a first name or a last name

SearchText with "SearchCondition": "Starts"

Fast

The user with a known user name or e-mail address

SearchText with "SearchCondition": "Eq", or UserName / Email with "IsExact": true

Fast

A text in the middle or at the end of a user name or an e-mail address

SearchText with Contains or Ends, or UserName / Email without IsExact

Slow: every user is read

Users who match one of several texts

"Match": "Any" with text criteria

Slow when a criterion is a "contains"

On a test directory with 310,000 users, the same search answered in about 6 seconds with Contains and in less than 1 second with Starts.

  • SearchCondition is Contains when you do not send it. For a fast search, always send Starts or Eq.

  • UserName and Email work as "contains". To search by the start of a user name or an e-mail address, use SearchText with Starts.

  • Keep PageSize small when you show the result to a person, for example 20 or 50.

  • Send IncludeProfile, IncludeGroups and IncludeProfilePhoto only when you need them.

  • Starts does not find a text in the middle of a word. When you need that, use Contains and expect a longer answer time.

In Postman

  1. Create a request with the method POST and the URL https://api.monofor.com/v1.4/users/list (use the API address of your own installation).

  2. On the Headers tab, add MonoSign-AppId and MonoSign-AppKey with the values of your application access key.

  3. On the Body tab, select raw and JSON, and paste the body below.

  4. Click Send. Postman shows the answer time next to the status.

{
  "SearchText": "john.sm",
  "SearchCondition": "Starts",
  "Page": 1,
  "PageSize": 50
}

Paging and response

  • Page is the page number and starts at 1.

  • PageSize is 100 when you do not send it. The maximum is 1000; a larger value is reduced to the maximum.

  • Users are ordered by user name.

  • ItemCount is the total number of matching users and PageCount is the number of pages. Read the next pages by increasing Page until it reaches PageCount.

Example response (shortened; each user has more fields than shown here):

{
  "Code": 1,
  "Data": {
    "PageCount": 1,
    "PageSize": 100,
    "CurrentPage": 1,
    "ItemCount": 1,
    "List": [
      {
        "UserId": "bbce41c7-f363-4724-999e-16c3d2293f78",
        "UserName": "john.smith",
        "Email": "[email protected]",
        "SourceName": "corp",
        "State": 1,
        "IsActive": true
      }
    ]
  },
  "Success": true
}

When no user matches, the request is still successful: Success is true, ItemCount is 0, the list is empty and the message is There is no user with these parameters.

Errors

When a criterion cannot be applied or a value of the body cannot be read, the response has Success set to false and one of these messages. No user is returned.

Message

Reason

Unknown profile property '{Property}'.

No profile property has the name sent in Property.

Condition {Condition} is not supported for profile filters; use Eq (Equals), Neq (NotEquals), Starts (BeginsWith), Ends (EndsWith), Contains, Null or NotNull.

A comparison condition (Gt, Gtq, Lt, Ltq) was sent in a profile filter.

Condition {Condition} requires a value.

Starts, Ends or Contains was sent without a Value.

Unknown SearchCondition {n}. Use Contains, Starts, Ends or Eq.

SearchCondition has a value that is not in the list.

Unknown {Field} "{value}". Use {names}.

Match, State or the Condition of a profile filter has a name that is not in the list. Example: Unknown Match "Either". Use All or Any.

The value "{value}" of {Field} cannot be read: it must be a number.

A value has the wrong type, for example "PageSize": "abc". The end of the message says what is expected: a number, a date, an id (GUID), true or false, or a list.

The request body cannot be read: it is not valid JSON.

The body is not valid JSON, for example a missing comma or bracket.

There is no source named {SourceName}. Please check your request model.

No user source matches SourceName.

You are not allowed to perform this action. Please contact with your system administrator if you need to access users.

Source Using Type of the application is System Default or Disabled.

Examples

You can call the API with your programming language. The cURL command below sends the first example. For the other examples, replace the body.

curl --location --request POST 'https://api.monofor.com/v1.4/users/list' \
--header 'MonoSign-AppId: <your-app-id>' \
--header 'MonoSign-AppKey: <your-app-key>' \
--header 'Content-Type: application/json' \
--data-raw '{
  "Page": 1,
  "PageSize": 1000
}'

All active users, with their user source

Without a search criterion, the list contains every active user in the Enabled state. Each user in the response has SourceName and SourceTitle, the user source the user comes from. Read every page as described in Paging and response.

{
  "Page": 1,
  "PageSize": 1000
}

To get the active users of one user source only, add SourceName:

{
  "SourceName": "corp",
  "Page": 1,
  "PageSize": 1000
}

Search users by user name

The users whose user name contains john:

{
  "UserName": "john"
}

The user whose user name is exactly john.smith:

{
  "UserName": "john.smith",
  "IsExact": true
}

Search a user by e-mail address

The user whose e-mail address is [email protected]. Eq compares the whole text with the user name and with the e-mail address, and it is not case-sensitive on both databases:

{
  "SearchText": "[email protected]",
  "SearchCondition": "Eq"
}

The users whose e-mail address contains @example.com:

{
  "Email": "@example.com"
}

Search users by name

The users who have a word that starts with john and a word that starts with smith in their first name, last name, user name or e-mail address (section 2). IncludeProfile adds the first name and the last name to each user in the response:

{
  "SearchText": "john smith",
  "SearchCondition": "Starts",
  "IncludeProfile": true
}

Search users by a profile value

The users whose department is IT:

{
  "ProfileFilter": [
    {
      "Property": "Department",
      "Condition": "Eq",
      "Value": "IT"
    }
  ],
  "IncludeProfile": true,
  "Page": 1,
  "PageSize": 100
}

Users created or changed since a date

Use this to keep another system up to date. UpdatedDate returns the users created or updated on or after the date. The example includes every state, so that disabled and removed users are returned too:

{
  "UpdatedDate": "2026-11-01T00:00:00Z",
  "IgnoreIsActiveParameter": true,
  "StateParameter": true,
  "State": "All",
  "Page": 1,
  "PageSize": 1000
}

Disabled users

{
  "StateParameter": true,
  "State": "Disabled",
  "IgnoreIsActiveParameter": true
}

One user by id, with profile and groups

{
  "UserId": "bbce41c7-f363-4724-999e-16c3d2293f78",
  "IncludeProfile": true,
  "IncludeGroups": true
}

Users with an empty profile value

The users who have no manager:

{
  "ProfileFilter": [
    {
      "Property": "Manager",
      "Condition": "Null"
    }
  ]
}

Users by name in one user source

The users of the user source corp who have a word that starts with john in their name, user name or e-mail address:

{
  "SearchText": "john",
  "SearchCondition": "Starts",
  "SourceName": "corp",
  "Page": 1,
  "PageSize": 50
}

Users who match one of several criteria

The users whose department is IT or Finance (section 8):

{
  "Match": "Any",
  "ProfileFilter": [
    {
      "Property": "Department",
      "Condition": "Eq",
      "Value": "IT"
    },
    {
      "Property": "Department",
      "Condition": "Eq",
      "Value": "Finance"
    }
  ]
}
Permanent link