# List Agency Clients

> List the workspaces owned by the agency owner, with health and usage.

Requires an API key with the `read` scope.

Only API keys of an Agency workspace can call this endpoint (`403 agency_required` otherwise). The call always runs in the key's own workspace; `X-Workspace-Id` is ignored.

The list is not paginated: an Agency plan allows at most 30 workspaces. It includes the agency workspace itself.

## Response

<ResponseField name="data" type="array">
  <Expandable title="Client workspace">
    <ResponseField name="id" type="string">Workspace id. Pass it as `X-Workspace-Id` to act as the client.</ResponseField>
    <ResponseField name="name" type="string">Workspace name.</ResponseField>
    <ResponseField name="slug" type="string">URL slug.</ResponseField>
    <ResponseField name="isPersonal" type="boolean">`true` for the owner's personal workspace.</ResponseField>
    <ResponseField name="contacts" type="integer">Contacts stored.</ResponseField>
    <ResponseField name="maxContacts" type="integer">Contact limit on the Agency plan.</ResponseField>
    <ResponseField name="sentThisMonth" type="integer">Emails sent this month.</ResponseField>
    <ResponseField name="monthlyLimit" type="integer">Monthly send limit.</ResponseField>
    <ResponseField name="totalCampaigns" type="integer">Campaigns in the workspace.</ResponseField>
    <ResponseField name="activeCampaigns" type="integer">Campaigns currently sending.</ResponseField>
    <ResponseField name="totalAccounts" type="integer">Email accounts connected.</ResponseField>
    <ResponseField name="connectedAccounts" type="integer">Accounts connected and active.</ResponseField>
    <ResponseField name="errorAccounts" type="integer">Accounts in an error state.</ResponseField>
    <ResponseField name="totalReplies" type="integer">Real replies (bounces, warmup and unrelated mail excluded).</ResponseField>
    <ResponseField name="replyRate" type="number">Replies as a percentage of emails sent this month.</ResponseField>
    <ResponseField name="verificationCredits" type="integer">Unexpired email verification credits.</ResponseField>
    <ResponseField name="status" type="string">`error`, `active`, `idle` or `setup`.</ResponseField>
    <ResponseField name="createdAt" type="string">ISO 8601 timestamp.</ResponseField>
  </Expandable>
</ResponseField>

<RequestExample>
```bash cURL
curl "https://api.foxreach.io/api/v1/agency/clients" \
  -H "X-API-Key: otr_your_key"
```

```python Python SDK
from foxreach import FoxReach

client = FoxReach(api_key="otr_your_key")
clients = client.agency.list_clients()
```

```typescript TypeScript SDK
import { FoxReach } from "foxreach";

const client = new FoxReach({ apiKey: "otr_your_key" });
const clients = await client.agency.listClients();
```
</RequestExample>

<ResponseExample>
```json
{
  "data": [
    {
      "id": "ws_abc123",
      "name": "Acme Co",
      "slug": "acme-co",
      "isPersonal": false,
      "contacts": 1200,
      "maxContacts": 100000,
      "sentThisMonth": 3400,
      "monthlyLimit": 500000,
      "totalCampaigns": 2,
      "activeCampaigns": 1,
      "totalAccounts": 3,
      "connectedAccounts": 3,
      "errorAccounts": 0,
      "totalReplies": 41,
      "replyRate": 1.2,
      "verificationCredits": 500,
      "status": "active",
      "createdAt": "2026-10-01T09:00:00+00:00"
    }
  ]
}
```
</ResponseExample>

## Errors

| Status | Description |
|--------|-------------|
| `401` | Missing, invalid, revoked or expired API key |
| `403` | API key does not have the required scope: `read` |
| `403` | `agency_required`: the key's workspace does not hold an Agency plan |

## Rate Limit

- **300 requests per minute, shared by every `read` call in your workspace.** Fixed 60-second window.
- Every response includes `X-RateLimit-Limit`, `X-RateLimit-Remaining`, `X-RateLimit-Reset` (unix epoch seconds) and `X-RateLimit-Bucket` (`read`).
- A `429` response includes a `Retry-After` header (seconds until the bucket resets).

For client-side patterns, see [Rate Limiting](/rate-limiting).
