# Filters

See the [filters' concepts](../concepts/concepts.md#filters) for details.

> Note: by default, the filters can only be used from `find` endpoints generated by the Content Type Builder and the [CLI](../cli/CLI.md). If you need to implement a filters system somewhere else, read the [programmatic usage](#programmatic-usage) section.

## Available operators

The available operators are separated in four different categories:
 - [Filters](#filters)
 - [Sort](#sort)
 - [Limit](#limit)
 - [Start](#start)

### Filters

Easily filter results according to fields values.

 - `=`: Equals
 - `_ne`: Not equals
 - `_lt`: Lower than
 - `_gt`: Greater than
 - `_lte`: Lower than or equal to
 - `_gte`: Greater than or equal to
 - `_contains`: Contains
 - `_containss`: Contains case sensitive

#### Examples

Find users having `John` as first name.

`GET /user?firstName=John`

Find products having a price equal or greater than `3`.

`GET /product?price_gte=3`

### Sort

Sort according to a specific field.

#### Example

Sort users by email.

 - ASC: `GET /user?_sort=email:asc` or `GET /user?_sort=email`
 - DESC: `GET /user?_sort=email:desc` or `GET /user?_sort=-email`

### Limit

Limit the size of the returned results.

#### Example

Limit the result length to 30.

`GET /user?_limit=30`

### Start

Skip a specific number of entries (especially useful for pagination).

#### Example

Get the second page of results.

`GET /user?_start=10&_limit=10`

## Programmatic usage

Requests system can be implemented in custom code sections.

### Extracting requests filters

To extract the filters from an JavaScript object or a request, you need to call the [`strapi.utils.models.convertParams` helper](../api-reference/reference.md#strapiutils).

> Note: The returned objects is formatted according to the ORM used by the model.

#### Example

**Path —** `./api/user/controllers/User.js`.

```js
// Define a list of params.
const params = {
  '_limit': 20,
  '_sort': 'email'
};

// Convert params.
const formattedParams = strapi.utils.models.convertParams('user', params); // { limit: 20, sort: 'email' }
```

### Query usage

#### Example

**Path —** `./api/user/controllers/User.js`.

```js
module.exports = {

  find: async (ctx) => {
    // Convert params.
    const formattedParams = strapi.utils.models.convertParams('user', ctx.request.query);

    // Get the list of users according to the request query.
    const filteredUsers = await User
      .find()
      .where(formattedParams.where)
      .sort(formattedParams.sort)
      .skip(formattedParams.start)
      .limit(formattedParams.limit);

    // Finally, send the results to the client.
    ctx.body = filteredUsers;
  };
};
```
