Add addresses
POST /v1/bulk-verifications/{jobId}/itemsSend the list in chunks of 1–500 rows per call. Each row carries the
address and a row_index — its position in your source list, starting at
0. The index is what makes uploads safe to retry: re-sending a
(row_index, email) pair you already sent is ignored, so a chunk that timed
out can simply be sent again.
curl -X POST https://api.tryverifyemail.com/v1/bulk-verifications/$JOB_ID/items \ -H "Authorization: Bearer sk_your_api_key" \ -H "Content-Type: application/json" \ -d '{"items":[ {"row_index":0,"email":"a@example.com"}, {"row_index":1,"email":"b@example.com"} ]}'const emails = ["a@example.com", "b@example.com" /* … */];
for (let start = 0; start < emails.length; start += 500) { const items = emails .slice(start, start + 500) .map((email, i) => ({ row_index: start + i, email })); await fetch(`${BASE}/${jobId}/items`, { method: "POST", headers, body: JSON.stringify({ items }), });}emails = ["a@example.com", "b@example.com"] # …
for start in range(0, len(emails), 500): items = [ {"row_index": start + i, "email": email} for i, email in enumerate(emails[start : start + 500]) ] requests.post(f"{BASE}/{job_id}/items", headers=HEADERS, json={"items": items})Response
Section titled “Response”Returns 200 with what happened to the chunk:
{ "received": 2, "inserted": 2, "duplicates_ignored": 0 }duplicates_ignored counts rows that matched a pair already stored. Two
things make the call fail instead, both with a 409:
-
A
row_indexreused with a different address. Nothing from the chunk is written; the body lists the offending rows. Fix them and resend.{"error": "row_conflict","conflicts": [{ "row_index": 0, "email": "other@example.com" }]} -
The job is already committed.
{ "error": "input_sealed" }— create a new job for the extra rows.
See also
Section titled “See also”- Create a job — the previous step
- Commit the job — the next step
- Bulk jobs — overview