# Connect several accounts at once

> Requires X-Project-Id and a plan that includes the email channel (403 channelnotincluded otherwise). Takes { "accounts": [...] }, where each item has email,…

Source: https://warmerly.com/docs/accounts/connect-several-accounts-at-once

```text
POST /accounts/bulk
```

Requires `X-Project-Id` and a plan that includes the email channel (`403 channel_not_included` otherwise). Takes `{ "accounts": [...] }`, where each item has `email`, `provider` (`gmail` | `outlook` | `zoho` | `namecheap` | `custom`), `smtp` and `imap` objects, and optional `displayName` and `timezone` (default `UTC`), the same fields as `POST /accounts`. SMTP or IMAP hosts that point at private or internal addresses refuse the whole batch with `400 bad_request`.

Capacity is **all-or-nothing**: if the batch would breach the plan's mailbox limit the whole request is refused with `402 plan_capacity` rather than importing the first few. A billing-locked workspace is refused with `402 billing_locked`. Past that gate each account is inserted independently, so one bad row does not lose the others:

```json
{
  "results": [
    { "index": 0, "email": "a@yourdomain.com", "ok": true, "id": "3a6f9e2e-4b7a-4e9a-9b1d-6e3a2f8c1a10" },
    { "index": 1, "email": "b@yourdomain.com", "ok": false, "error": "duplicate key value violates unique constraint" }
  ]
}
```

A failed row carries the database's error text in `error`, so treat it as debugging context, not something to parse. Each connected mailbox starts with `status: "aging"` and warmup enabled (`warmupStartedAt` is set). Unlike `POST /accounts`, the bulk route does not start the DNS pre-flight check itself.

## More from Accounts

- [Disconnect an account](https://warmerly.com/docs/accounts/disconnect-an-account): Permanently disconnects and removes the account, including its warmup history. For a Warmerly-hosted mailbox…
- [Check settings before you connect](https://warmerly.com/docs/accounts/check-settings-before-you-connect): detect takes { "email": "you@yourdomain.com" } (3 to 320 characters) and returns { "detection": { … } }:…
- [Domain health (records + blocklists in one call)](https://warmerly.com/docs/accounts/domain-health-records-blocklists-in-one-call): The single call behind the domain-health card in the dashboard, and the one to reach for first: it returns…
