# Update Email Account

> Change an email account's settings, including warmup.

Requires an API key with the `write` scope.

Send only the fields you want to change. Omitted fields are left as they are.

## Path Parameters

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

## Body Parameters

<ParamField body="displayName" type="string">
  Friendly name shown on sent mail.
</ParamField>

<ParamField body="signature" type="string">
  Email signature.
</ParamField>

<ParamField body="dailyLimit" type="integer">
  Campaign emails per day, 1 to 200. Gmail and Microsoft hosts are capped at 50.
</ParamField>

<ParamField body="warmupEnabled" type="boolean">
  `true` starts warmup the same way as [Enable Warmup](/api-reference/email-accounts/enable-warmup): the ramp starts now. Sending `true` while the account is already warming keeps its ramp. `false` stops warmup. Turning it on counts against the free plan's warmed-inbox cap.
</ParamField>

<ParamField body="warmupDailyLimit" type="integer">
  Warmup mail per day, 1 to 50.
</ParamField>

<ParamField body="warmupIdentifier" type="string">
  A label for this account's warmup mail: letters, numbers, spaces, hyphens and underscores, up to 64 characters, unique in the workspace. Send `null` to clear it.
</ParamField>

<ParamField body="warmupIdentifierInSubject" type="boolean">
  Also put the identifier in the warmup subject line. Needs a warmup identifier to be set.
</ParamField>

<ParamField body="warmupInboxSegregationEnabled" type="boolean">
  Force post-scan inbox segregation of warmup mail on or off for this account. An explicit `null` defers to the platform default.
</ParamField>

<ParamField body="isActive" type="boolean">
  Whether the account is used for sending.
</ParamField>

<ParamField body="timezone" type="string">
  IANA timezone name.
</ParamField>

<ParamField body="dkimSelector" type="string">
  DKIM selector for custom SMTP servers: letters, numbers, dots, hyphens and underscores, up to 63 characters. An empty string or `null` clears it. Changing it re-runs the domain check.
</ParamField>

## Response

<ResponseField name="data" type="object">
  The email account object. Passwords and OAuth tokens are never returned.

  <Expandable title="data">
    <ResponseField name="id" type="string">Email account identifier.</ResponseField>
    <ResponseField name="email" type="string">Mailbox address.</ResponseField>
    <ResponseField name="displayName" type="string">Friendly name shown on sent mail, or `null`.</ResponseField>
    <ResponseField name="provider" type="string">Provider the account was connected as.</ResponseField>
    <ResponseField name="smtpHost" type="string">SMTP host.</ResponseField>
    <ResponseField name="smtpPort" type="integer">SMTP port.</ResponseField>
    <ResponseField name="imapHost" type="string">IMAP host.</ResponseField>
    <ResponseField name="imapPort" type="integer">IMAP port.</ResponseField>
    <ResponseField name="timezone" type="string">IANA timezone used for the account's daily limit window.</ResponseField>
    <ResponseField name="dailyLimit" type="integer">Maximum campaign emails per day.</ResponseField>
    <ResponseField name="sentToday" type="integer">Campaign emails sent today in the account's timezone. Warmup sends are not counted.</ResponseField>
    <ResponseField name="warmupEnabled" type="boolean">Whether warmup is on.</ResponseField>
    <ResponseField name="warmupDailyLimit" type="integer">Warmup mail per day once the ramp is complete.</ResponseField>
    <ResponseField name="warmupRampUpDays" type="integer">Days the warmup ramp takes.</ResponseField>
    <ResponseField name="warmupStartDate" type="string">ISO 8601 timestamp the ramp started, or `null`.</ResponseField>
    <ResponseField name="healthScore" type="integer">Stored health score, or `null`. For the live placement score use [Get Account Health](/api-reference/email-accounts/get-account-health).</ResponseField>
    <ResponseField name="domainAuth" type="object">SPF, DKIM and DMARC check result, or `null` until checked.</ResponseField>
    <ResponseField name="domainAuthCheckedAt" type="string">ISO 8601 timestamp of the last domain check, or `null`.</ResponseField>
    <ResponseField name="bounceRate" type="number">Bounce rate.</ResponseField>
    <ResponseField name="replyRate" type="number">Reply rate.</ResponseField>
    <ResponseField name="isActive" type="boolean">Whether the account is used for sending.</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="createdAt" type="string">ISO 8601 timestamp.</ResponseField>
    <ResponseField name="updatedAt" type="string">ISO 8601 timestamp.</ResponseField>
  </Expandable>
</ResponseField>

<RequestExample>
```bash cURL
curl -X PATCH "https://api.foxreach.io/api/v1/email-accounts/cea_abc123" \
  -H "X-API-Key: otr_your_key" \
  -H "Content-Type: application/json" \
  -d '{"dailyLimit": 40, "displayName": "John at Company"}'
```

```python Python SDK (beta)
from foxreach import FoxReach
from foxreach.types import EmailAccountUpdate

client = FoxReach(api_key="otr_your_key")
account = client.email_accounts.update(
    "cea_abc123",
    EmailAccountUpdate(daily_limit=40, display_name="John at Company"),
)
```

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

const client = new FoxReach({ apiKey: "otr_your_key" });
const account = await client.emailAccounts.update("cea_abc123", {
  dailyLimit: 40,
  displayName: "John at Company",
});
```
</RequestExample>

<ResponseExample>
```json
{
  "data": {
    "id": "cea_abc123",
    "email": "outreach@company.com",
    "displayName": "John at Company",
    "provider": "gmail",
    "smtpHost": "smtp.gmail.com",
    "smtpPort": 587,
    "imapHost": "imap.gmail.com",
    "imapPort": 993,
    "timezone": "UTC",
    "dailyLimit": 40,
    "sentToday": 0,
    "warmupEnabled": false,
    "warmupDailyLimit": 5,
    "warmupRampUpDays": 14,
    "warmupStartDate": null,
    "healthScore": null,
    "domainAuth": null,
    "domainAuthCheckedAt": null,
    "bounceRate": 0,
    "replyRate": 0,
    "isActive": true,
    "connectionStatus": "connected",
    "lastError": null,
    "createdAt": "2026-10-31T10:00:00",
    "updatedAt": "2026-10-31T10:00:00"
  }
}
```
</ResponseExample>

## Errors

| Status | Description |
|--------|-------------|
| `401` | Missing, invalid, revoked or expired API key |
| `403` | API key does not have the required scope: `write` |
| `404` | Email account not found, or it belongs to another workspace |
| `403` | `upgrade_required` when turning warmup on would exceed the free plan's warmed-inbox cap. The body is `{"detail": {"code": "upgrade_required", "limit_type": "warmup_accounts", "message": "...", "limit": 2, "current": 2}}`. A missing scope returns the same status with a plain `detail` string |
| `409` | Another account in the workspace already uses that `warmupIdentifier` |
| `422` | Daily limit above the provider cap: mailboxes on Gmail and Microsoft SMTP hosts are capped at 50 campaign emails per day; `Set a warmup identifier before adding it to the subject line.`; or the body failed validation |

## 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).
