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

# List customers

GET https://anthropod.in/api/v2/conversation-analytics/customers

Return matching records as data[], with pagination.has_more and pagination.next_cursor. Each item uses the same native payload as single-record retrieval. Required start_time/end_time are epoch seconds with an inclusive start and exclusive end, spanning at most 31 days. limit is 1–50 (default 20); sort_order is asc or desc (default desc). Optional filter applies the same standard field matching as the dashboard. The record contains the current customer_analytics, meta_analytics and native timeline object. It preserves the customer portion of the analytics webhook; it does not reconstruct a historical profile. For larger datasets, use [Create export](/v0/api-reference/exports/create-export) to obtain a CSV download link. Each export supports at most 31 days, 100,000 records and 200 MiB (209,715,200 bytes); split longer periods into adjacent windows.

Reference: https://docs.anthropod.in/api-reference/conversation-analytics/list-customers

## Authentication

- `Authorization` header (bearer token, required) — Existing private account API key from Developer Hub. Keep it on your backend.

## Request

### Query parameters

- `service_id` (string, required) — Required authorized service. Client identity is derived from the API key. Nonempty, at most 255 characters; whitespace-only values and control characters are rejected.
- `time_field` (enum, optional, default: last_interaction_at) — Timestamp used for filtering and ordering. Only last_interaction_at is currently supported for this resource.
  - Allowed values: `last_interaction_at`
- `start_time` (long, required) — Inclusive start in Unix epoch seconds. Must precede end_time; maximum window is 31 days. Milliseconds are invalid.
- `end_time` (long, required) — Exclusive end in Unix epoch seconds. Maximum window is 31 days. Milliseconds are invalid.
- `sort_order` (enum, optional, default: desc) — Order by last_interaction_at, then ID in the same direction. asc returns oldest first; desc returns newest first. Keep the same sort_order when continuing with a cursor.
  - Allowed values: `asc`, `desc`
- `limit` (integer, optional, default: 20) — Maximum records per page. Accepts integers from 1 to 50; defaults to 20.
- `cursor` (string, optional) — Opaque continuation token, 1–4,096 characters; expires after 15 minutes. Repeat the same filters and sort_order. Omit for the first page. Copy pagination.next_cursor from the previous response; see the [pagination walkthrough](/v0/pagination) for first and next-page requests.
- `filter` (string, optional) — Dashboard filters as one URL-encoded JSON object (maximum 16 KB). All conditions must match. See the schema for fields, operators, and value constraints.

## Response

### 200

Successful response.

- `data` (list of object, required) — Current customer profiles and their native analytics and timeline for this page.
  - `client_id` (string, optional) — Owning client.
  - `service_id` (string, optional) — Owning service.
  - `customer_id` (string, optional) — Customer identifier in this service.
  - `customer_analytics` (object, optional) — Current accumulated customer analytics. Native customer modules are preserved; no conversation-module wrapper or new catalog version is added.
    - `business_insights` (map from string to object, optional) — Native customer business-insight module results.
      - `ans` (any, optional) — Stored answer: string, number, boolean, object, array, or null, according to the configured parameter.
      - `explanation` (any, optional) — Stored explanation, when present; preserved in its original form.
      - `explanation_with_source` (list of map from string to any or map from string to any, optional, nullable) — Stored supporting evidence as an array of evidence objects. When no evidence is available, the stored value may be an empty array, an empty object, or null; the field may also be absent.
      - `subparameters` (map from string to object, optional, nullable) — Nested results keyed by subparameter name. These retain the same ans, explanation, and evidence structure. When there are no nested results, the stored value may be null or an empty object; the field may also be absent.
    - `custom_module` (map from string to object, optional) — Native customer custom-module results.
      - `ans` (any, optional) — Stored answer: string, number, boolean, object, array, or null, according to the configured parameter.
      - `explanation` (any, optional) — Stored explanation, when present; preserved in its original form.
      - `explanation_with_source` (list of map from string to any or map from string to any, optional, nullable) — Stored supporting evidence as an array of evidence objects. When no evidence is available, the stored value may be an empty array, an empty object, or null; the field may also be absent.
      - `subparameters` (map from string to object, optional, nullable) — Nested results keyed by subparameter name. These retain the same ans, explanation, and evidence structure. When there are no nested results, the stored value may be null or an empty object; the field may also be absent.
    - `customer_summary` (map from string to any, optional) — Native customer summary and evidence.
    - `conversation_dispositions` (map from string to any, optional) — Native current dispositions.
    - `lead_quality` (map from string to any, optional) — Native customer lead-quality results.
    - `concerns_and_queries` (map from string to any, optional) — Native accumulated concerns and queries.
    - `templates` (map from string to any, optional) — Native customer template results.
  - `meta_analytics` (map from string to any, optional) — Stored customer metadata from the current accumulated profile.
  - `timeline` (map from string to map from string to any, optional) — The same timeline object returned with customer analytics in the analytics webhook, keyed by its stored entry IDs.
- `pagination` (object, required)
  - `has_more` (boolean, required) — Whether another page is available.
  - `next_cursor` (string, required, nullable) — Opaque continuation token; null when has_more is false. Reuse the same filters, time range and sort order with this token.

## Errors

### 400 Bad Request Error

Bad Request

- `type` (string, required) — Problem type URI.
- `title` (string, required) — Standard HTTP status title.
- `status` (integer, required) — HTTP status code.
- `detail` (string, required) — Description of this occurrence.
- `code` (string, required) — Machine-readable error code.
- `request_id` (string, required) — Reference to use when contacting support.

### 401 Unauthorized Error

Unauthorized

- `type` (string, required) — Problem type URI.
- `title` (string, required) — Standard HTTP status title.
- `status` (integer, required) — HTTP status code.
- `detail` (string, required) — Description of this occurrence.
- `code` (string, required) — Machine-readable error code.
- `request_id` (string, required) — Reference to use when contacting support.

### 403 Forbidden Error

Forbidden

- `type` (string, required) — Problem type URI.
- `title` (string, required) — Standard HTTP status title.
- `status` (integer, required) — HTTP status code.
- `detail` (string, required) — Description of this occurrence.
- `code` (string, required) — Machine-readable error code.
- `request_id` (string, required) — Reference to use when contacting support.

### 429 Too Many Requests Error

Request allowance exceeded. Retry after the returned Retry-After interval.

- `type` (string, required) — Problem type URI.
- `title` (string, required) — Standard HTTP status title.
- `status` (integer, required) — HTTP status code.
- `detail` (string, required) — Description of this occurrence.
- `code` (string, required) — Machine-readable error code.
- `request_id` (string, required) — Reference to use when contacting support.

### 500 Internal Server Error

Internal Server Error

- `type` (string, required) — Problem type URI.
- `title` (string, required) — Standard HTTP status title.
- `status` (integer, required) — HTTP status code.
- `detail` (string, required) — Description of this occurrence.
- `code` (string, required) — Machine-readable error code.
- `request_id` (string, required) — Reference to use when contacting support.

### 503 Service Unavailable Error

The feature is disabled or a required dependency is temporarily unavailable.

- `type` (string, required) — Problem type URI.
- `title` (string, required) — Standard HTTP status title.
- `status` (integer, required) — HTTP status code.
- `detail` (string, required) — Description of this occurrence.
- `code` (string, required) — Machine-readable error code.
- `request_id` (string, required) — Reference to use when contacting support.

## Examples

**Response**

```json
{
  "data": [
    {
      "client_id": "client_123",
      "service_id": "service_123",
      "customer_id": "customer_123",
      "customer_analytics": {
        "business_insights": {
          "callback_priority": {
            "ans": "High",
            "explanation": "The customer requested a callback tomorrow.",
            "explanation_with_source": [
              {
                "sources": [
                  {
                    "end_timestamp": "00:00:04.500",
                    "segment_id": "S1",
                    "start_timestamp": "00:00:02.000"
                  }
                ],
                "text": "Please call me tomorrow."
              }
            ],
            "subparameters": {
              "callback_requested": {
                "ans": true,
                "explanation": "Customer requested a callback."
              }
            }
          }
        },
        "custom_module": {
          "callback_required": {
            "ans": true
          }
        },
        "customer_summary": {
          "customer_summary_with_source": [
            {
              "sources": [
                {
                  "id": "conversation_123"
                }
              ],
              "text": "Customer requested a callback."
            }
          ]
        }
      },
      "meta_analytics": {
        "crm_lead_stage": "Follow-up",
        "lead_source": "Website",
        "primary_language": "English"
      },
      "timeline": {
        "conversation_123": {
          "call_time": 1788220800,
          "id": "conversation_123",
          "record_type": "call"
        }
      }
    }
  ],
  "pagination": {
    "has_more": false,
    "next_cursor": null
  }
}
```

**SDK Code**

```python
import requests

url = "https://anthropod.in/api/v2/conversation-analytics/customers"

querystring = {"end_time":"1788307200","service_id":"service_123","sort_order":"desc","start_time":"1788220800","time_field":"last_interaction_at"}

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

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

print(response.json())
```

```javascript
const url = 'https://anthropod.in/api/v2/conversation-analytics/customers?end_time=1788307200&service_id=service_123&sort_order=desc&start_time=1788220800&time_field=last_interaction_at';
const options = {method: 'GET', headers: {Authorization: 'Bearer <accountApiKey>'}};

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

```go
package main

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

func main() {

	url := "https://anthropod.in/api/v2/conversation-analytics/customers?end_time=1788307200&service_id=service_123&sort_order=desc&start_time=1788220800&time_field=last_interaction_at"

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

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

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

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

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

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://anthropod.in/api/v2/conversation-analytics/customers?end_time=1788307200&service_id=service_123&sort_order=desc&start_time=1788220800&time_field=last_interaction_at")

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

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

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

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://anthropod.in/api/v2/conversation-analytics/customers?end_time=1788307200&service_id=service_123&sort_order=desc&start_time=1788220800&time_field=last_interaction_at")
  .header("Authorization", "Bearer <accountApiKey>")
  .asString();
```

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

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://anthropod.in/api/v2/conversation-analytics/customers?end_time=1788307200&service_id=service_123&sort_order=desc&start_time=1788220800&time_field=last_interaction_at', [
  'headers' => [
    'Authorization' => 'Bearer <accountApiKey>',
  ],
]);

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

```csharp
using RestSharp;

var client = new RestClient("https://anthropod.in/api/v2/conversation-analytics/customers?end_time=1788307200&service_id=service_123&sort_order=desc&start_time=1788220800&time_field=last_interaction_at");
var request = new RestRequest(Method.GET);
request.AddHeader("Authorization", "Bearer <accountApiKey>");
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

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

let request = NSMutableURLRequest(url: NSURL(string: "https://anthropod.in/api/v2/conversation-analytics/customers?end_time=1788307200&service_id=service_123&sort_order=desc&start_time=1788220800&time_field=last_interaction_at")! 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()
```