---
title: "Verify a list of email addresses (spends money)"
method: POST
path: "/email-verification/jobs"
tags: ["Email Verification"]
---

# Verify a list of email addresses (spends money)

`POST /email-verification/jobs`

## Request

- Base URL: `https://api.emailchaser.com/r`
- URL: `https://api.emailchaser.com/r/email-verification/jobs`
- Auth: HTTP bearer

SPENDS MONEY: every address checked adds metered usage to the workspace's next invoice. No campaign is created and nothing is sent. Each check runs up to two providers in a waterfall and every provider that returns a verdict is one billable verification credit, so an address costs ONE credit when the first provider rejects it outright and TWO otherwise. Call GET /email-verification/rates for the current per-credit price and use per_address_ceiling_usd to budget. An address that gets no verdict (a provider failure, a cancelled job, or the workspace's monthly verification allowance running out mid-job) is NOT billed and comes back with result unknown, still in the download. Duplicates are removed and unparseable entries are returned in invalid_emails before anything is charged. Requires an active or trialing subscription: a past_due workspace is refused with subscription_not_active, and a trialing workspace may submit up to 100 addresses in total across all its jobs, after which it is refused with trial_allowance_exceeded. Errors carry a machine-readable code: insufficient_allowance (402, with needed_usd and available_usd), trial_allowance_exceeded (402, with allowance and remaining), subscription_not_active (402), no_active_subscription (402) and invalid_request (400).

## Request body

- ModelsCreateEmailVerificationJobRequest
  - `emails` string[], required: Emails are the addresses to verify. Duplicates are removed before anything is charged, and syntactically invalid entries are returned in invalid_emails rather than billed.
  - `name` string, required: Name is what the job is called in the app. Required.

## Response `200`

The created job and its cost estimate

- ModelsCreateEmailVerificationJobResponse
  - `duplicate_rows` integer: DuplicateRows is how many repeats were removed. Each one would have been a second paid check for an answer already bought.
  - `estimate_high_usd` number: EstimateHighUsd assumes every address runs both providers. This is the common case and the number to plan against.
  - `estimate_low_usd` number: EstimateLowUsd assumes every address settles on the first provider.
  - `id` string: ID of the created job.
  - `invalid_emails` string[]: InvalidEmails are the submitted entries that are not addresses at all. They were not charged for and are not in the job.
  - `total` integer: Total is how many addresses were accepted, after removing duplicates and unparseable entries.

## Other responses

- `400`: Malformed body, empty name, or no usable addresses
- `401`: Unauthorized - invalid or missing API key
- `402`: Not enough monthly verification allowance, the free trial allowance is used up, or the subscription is not active
- `500`: Failed to create the job

---

[API](https://skmtc.dev/emailchaser/apis/emailchaser-api.md) · [All operations](https://skmtc.dev/emailchaser/apis/emailchaser-api/llms.txt) · [OpenAPI document](https://skmtc.dev/emailchaser/apis/emailchaser-api/revisions/8b114990abb7?raw)
