> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://api.docs.modulards.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://api.docs.modulards.com/_mcp/server.

# List clients

GET https://api.modulards.com/api/public/v1/clients

Lists the clients you can reach. Use it to find a client by name or company, to see which clients have a given website, or to build a directory of your customers.

By default clients come sorted by name. You can also get each client's number of websites, which counts only the websites your token can reach, and add the client's contact methods or websites to the answer with `include`.

Reference: https://api.docs.modulards.com/modular-ds-public-api/clients/manage-clients/list-clients

## Authentication

- `Authorization` header (bearer token, required) — Personal access token created in the Modular DS dashboard; read-only tokens can only call GET endpoints.

## Request

### Query parameters

- `page[number]` (string, optional) — Page number, starting at 1.
- `page[size]` (string, optional) — Rows per page, up to 50 (default 15).
- `sort` (string, optional) — Sort order. Accepted: `name`, `last_name`, `company`, `created_at`, `sites_count`; a leading `-` reverses the order. Default `name`, ascending.
- `include` (string, optional) — Related data to return with each client. Accepted: `contact_methods` and `sites`. Separate several with commas.
- `fields[clients]` (string, optional) — Limits the attributes returned. `sites_count`, the number of websites your token can reach, is only returned when you name it here or sort by it.
- `filter[id][]` (string, optional) — Only these clients, by client id. Several ids match any of them.
- `filter[s]` (string, optional) — Free-text search over the name, the last name and the company.
- `filter[sites][]` (string, optional) — Only the clients assigned to these websites, by website id. Several ids match any of them.
- `filter[channel]` (string, optional) — Only the clients that have a contact method on this channel: `email` or `phone`.

## Response

### 200

200 - Clients

- `data` (list of ApiPublicV1ClientsGetResponsesContentApplicationJsonSchemaDataItems, optional)
- `jsonapi` (ApiPublicV1ClientsGetResponsesContentApplicationJsonSchemaJsonapi, optional)
- `links` (ApiPublicV1ClientsGetResponsesContentApplicationJsonSchemaLinks, optional)
- `meta` (ApiPublicV1ClientsGetResponsesContentApplicationJsonSchemaMeta, optional)

## Types

### ApiPublicV1ClientsGetResponsesContentApplicationJsonSchemaDataItems

- `attributes` (ApiPublicV1ClientsGetResponsesContentApplicationJsonSchemaDataItemsAttributes, optional)
- `id` (string, optional)
- `links` (ApiPublicV1ClientsGetResponsesContentApplicationJsonSchemaDataItemsLinks, optional)
- `type` (string, optional)

### ApiPublicV1ClientsGetResponsesContentApplicationJsonSchemaJsonapi

- `version` (string, optional)

### ApiPublicV1ClientsGetResponsesContentApplicationJsonSchemaLinks

- `first` (string, optional)
- `last` (string, optional)
- `next` (any, optional, nullable)
- `prev` (any, optional, nullable)

### ApiPublicV1ClientsGetResponsesContentApplicationJsonSchemaMeta

- `current_page` (double, optional)
- `from` (double, optional)
- `last_page` (double, optional)
- `links` (list of ApiPublicV1ClientsGetResponsesContentApplicationJsonSchemaMetaLinksItems, optional)
- `path` (string, optional)
- `per_page` (double, optional)
- `to` (double, optional)
- `total` (double, optional)

### ApiPublicV1ClientsGetResponsesContentApplicationJsonSchemaDataItemsAttributes

- `company` (string, optional)
- `created_at` (string, optional)
- `last_name` (string, optional)
- `name` (string, optional)
- `updated_at` (string, optional)

### ApiPublicV1ClientsGetResponsesContentApplicationJsonSchemaDataItemsLinks

- `self` (string, optional)

### ApiPublicV1ClientsGetResponsesContentApplicationJsonSchemaMetaLinksItems

- `active` (boolean, optional)
- `label` (string, optional)
- `url` (string, optional, nullable)

## Examples

**Response**

```json
{
  "data": [
    {
      "attributes": {
        "company": "Acme",
        "created_at": "2026-08-10T09:00:00.000000Z",
        "last_name": "Walker",
        "name": "Alice",
        "updated_at": "2026-08-10T09:00:00.000000Z"
      },
      "id": "101",
      "links": {
        "self": "https://api.modulards.com/api/public/v1/clients/101"
      },
      "type": "clients"
    }
  ],
  "jsonapi": {
    "version": "1.1"
  },
  "links": {
    "first": "https://api.modulards.com/api/public/v1/clients?page%5Bnumber%5D=1",
    "last": "https://api.modulards.com/api/public/v1/clients?page%5Bnumber%5D=1",
    "next": null,
    "prev": null
  },
  "meta": {
    "current_page": 1,
    "from": 1,
    "last_page": 1,
    "links": [
      {
        "active": false,
        "label": "&laquo; Previous",
        "url": null
      },
      {
        "active": true,
        "label": "1",
        "url": "https://api.modulards.com/api/public/v1/clients?page%5Bnumber%5D=1"
      },
      {
        "active": false,
        "label": "Next &raquo;",
        "url": null
      }
    ],
    "path": "https://api.modulards.com/api/public/v1/clients",
    "per_page": 15,
    "to": 1,
    "total": 1
  }
}
```

**SDK Code**

```python 200 - Clients
import requests

url = "https://api.modulards.com/api/public/v1/clients"

headers = {"Authorization": "Bearer <token>"}

response = requests.get(url, headers=headers)

print(response.json())
```

```javascript 200 - Clients
const url = 'https://api.modulards.com/api/public/v1/clients';
const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go 200 - Clients
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://api.modulards.com/api/public/v1/clients"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Authorization", "Bearer <token>")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby 200 - Clients
require 'uri'
require 'net/http'

url = URI("https://api.modulards.com/api/public/v1/clients")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'

response = http.request(request)
puts response.read_body
```

```java 200 - Clients
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://api.modulards.com/api/public/v1/clients")
  .header("Authorization", "Bearer <token>")
  .asString();
```

```php 200 - Clients
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://api.modulards.com/api/public/v1/clients', [
  'headers' => [
    'Authorization' => 'Bearer <token>',
  ],
]);

echo $response->getBody();
```

```csharp 200 - Clients
using RestSharp;

var client = new RestClient("https://api.modulards.com/api/public/v1/clients");
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer <token>");
IRestResponse response = client.Execute(request);
```

```swift 200 - Clients
import Foundation

let headers = ["Authorization": "Bearer <token>"]

let request = NSMutableURLRequest(url: NSURL(string: "https://api.modulards.com/api/public/v1/clients")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```