# Get Account Health

> Deliverability and warmup health for one email account.

Requires an API key with the `read` scope.

## Path Parameters

<ParamField path="account_id" type="string" required>
  The unique identifier of the email account.
</ParamField>

## Response

<ResponseField name="data" type="object">
  Health and warmup status for the account.

  <Expandable title="data">
    <ResponseField name="healthScore" type="integer">The Health Score shown in the app: the share of this account's warmup email that landed in the inbox over the last 7 days, 0 to 100. `null` until enough warmup emails have been measured.</ResponseField>
    <ResponseField name="healthBasis" type="object">The counts behind the score: `window`, `inbox`, `spam`, `verified`, `minVerified`, `state` (`measured`, `building` or `off`), `score` and `weighted`.</ResponseField>
    <ResponseField name="bounce7d" type="object">Campaign emails sent and bounced over the last 7 days: `{"sent": 120, "bounced": 2}`.</ResponseField>
    <ResponseField name="warmupHealth" type="integer">The same number as `healthScore`, kept for older integrations.</ResponseField>
    <ResponseField name="bounceRate" type="number">Bounce rate.</ResponseField>
    <ResponseField name="replyRate" type="number">Reply rate.</ResponseField>
    <ResponseField name="sentToday" type="integer">Campaign emails sent today. Warmup sends are not counted.</ResponseField>
    <ResponseField name="dailyLimit" type="integer">Campaign emails per day.</ResponseField>
    <ResponseField name="connectionStatus" type="string">Connection state, for example `connected`.</ResponseField>
    <ResponseField name="lastError" type="string">Last connection error, or `null`.</ResponseField>
    <ResponseField name="lastHealthCheck" type="string">Timestamp of the last health check, or `null`.</ResponseField>
    <ResponseField name="warmupEnabled" type="boolean">Whether warmup is on.</ResponseField>
    <ResponseField name="warmupIdentifier" type="string">Warmup identifier, or `null`.</ResponseField>
    <ResponseField name="warmupIdentifierInSubject" type="boolean">Whether the identifier is added to warmup subjects.</ResponseField>
    <ResponseField name="warmupAccountCode" type="string">The account's warmup code, or `null`.</ResponseField>
    <ResponseField name="warmupSubjectCodeEnabled" type="boolean">Whether the code is added to warmup subjects.</ResponseField>
    <ResponseField name="warmupDynamicTagEnabled" type="boolean">Whether warmup mail carries a per-message tag.</ResponseField>
    <ResponseField name="warmupProgress" type="object">Ramp progress: `enabled`, `progress` (percent), `currentLimit`, `targetLimit`, and once warmup has started `daysCompleted` and `totalDays`. The last two keys are absent when warmup is off or not started.</ResponseField>
    <ResponseField name="domainAuth" type="object">SPF, DKIM and DMARC check result, or `null`.</ResponseField>
    <ResponseField name="domainAuthCheckedAt" type="string">Timestamp of the last domain check, or `null`.</ResponseField>
    <ResponseField name="warnings" type="array">Human-readable warnings, for example a failing domain record. Empty when there are none.</ResponseField>
  </Expandable>
</ResponseField>

<RequestExample>
```bash cURL
curl -X GET "https://api.foxreach.io/api/v1/email-accounts/cea_abc123/health" \
  -H "X-API-Key: otr_your_key"
```

```python Python SDK
from foxreach import FoxReach

client = FoxReach(api_key="otr_your_key")
health = client.email_accounts.health("cea_abc123")
print(health.health_score)
```

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

const client = new FoxReach({ apiKey: "otr_your_key" });
const health = await client.emailAccounts.health("cea_abc123");
```
</RequestExample>

<ResponseExample>
```json
{
  "data": {
    "healthScore": 92,
    "healthBasis": {
      "window": "7d",
      "inbox": 46,
      "spam": 4,
      "verified": 50,
      "minVerified": 20,
      "state": "measured",
      "score": 92,
      "weighted": true
    },
    "bounce7d": { "sent": 120, "bounced": 2 },
    "warmupHealth": 92,
    "bounceRate": 0.02,
    "replyRate": 0.08,
    "sentToday": 12,
    "dailyLimit": 50,
    "connectionStatus": "connected",
    "lastError": null,
    "lastHealthCheck": null,
    "warmupEnabled": true,
    "warmupIdentifier": null,
    "warmupIdentifierInSubject": false,
    "warmupAccountCode": null,
    "warmupSubjectCodeEnabled": false,
    "warmupDynamicTagEnabled": false,
    "warmupProgress": {
      "enabled": true,
      "progress": 50,
      "daysCompleted": 7,
      "totalDays": 14,
      "currentLimit": 2,
      "targetLimit": 5
    },
    "domainAuth": null,
    "domainAuthCheckedAt": null,
    "warnings": []
  }
}
```
</ResponseExample>

## Errors

| Status | Description |
|--------|-------------|
| `401` | Missing, invalid, revoked or expired API key |
| `403` | API key does not have the required scope: `read` |
| `404` | Email account not found, or it belongs to another workspace |

## Rate Limit

- **100 requests per minute, per API key.** Fixed 60-second window.
- Every response includes `X-RateLimit-Limit`, `X-RateLimit-Remaining`, and `X-RateLimit-Reset` (unix epoch seconds).
- A `429` response includes a `Retry-After` header (seconds until the bucket resets).

For client-side patterns (`Retry-After`, exponential backoff, monitoring `X-RateLimit-Remaining`), see [Rate Limiting](/rate-limiting).
