# checkContactEmails

Check every never-checked email address on the selected contacts, the contacts table’s bulk Check emails. Addresses checked before are skipped and cost nothing; when the credits run out the rest stay unchecked. Async: poll getBulkTask(bulkTaskId); its `emailChecks` gives checkedCount, undeliverableCount and notCheckedCount once it finishes, and each result is on the address (getContact). getContactEmailCheckSummary first says how many addresses it would check. One email-verification credit per address checked, the same credits as the app (plan allowance first, then bought; checkBillingAction with action EMAIL_VERIFICATION says how many are left), so name the count and have the person agree before a large one. ADMIN: the key owner must currently be an org admin. SELECTION, one of two forms: `contactIds`, or a contact filter (`filterId` from listContactFilters, or an inline `filterTree` in saveFilter’s CONTACT DSL, parsed strictly) with `selectCount: N`, the first N matches: count the filter with countContacts and pass that count. A filter without selectCount, or beside contactIds, is refused. At most 20,000 contacts per call.

- Call: `POST https://server.goliathdata.com/api/v1/call` with `{ "operationId": "checkContactEmails", "variables": {...} }`
- Scope: `ADMIN`
- Type: mutation
- Idempotency: honors `Idempotency-Key` (24 h)
- Rate-limited: no

## Variables

- `contactIds`: `[String!]`
- `filterId`: `ID`
- `filterTree`: `JSON`
- `selectCount`: `Int`

## Response (data, an example)

```json
{
  "emailCheckMutation": {
    "checkContactEmails": {
      "mode": "SYNC",
      "bulkTaskId": "…"
    }
  }
}
```

## Example

```bash
curl https://server.goliathdata.com/api/v1/call \
  -H "Authorization: Bearer $GOLIATH_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $(uuidgen)" \
  -d '{
    "operationId": "checkContactEmails",
    "variables": {}
  }'
```
