GET /v1/email/batches/{batch_id} returns a batch’s drafting status, row counts, what it is waiting for and what drafting has cost. Each send has its own status, which you read with GET /v1/email/batches/{batch_id}/sends/{send_id}. A batch and its sends fail and stop independently: stopping a batch never stops a send, and a send failing never stops the batch.

Batch statuses

The status filter on GET /v1/email/batches accepts these values. Other transitions return 409. None of these verbs affects a send. A send scheduled for Monday still goes out after the batch is cancelled.

Why nothing is happening

next_draft_at and next_draft_reason on the batch, and next_send_at and next_send_reason on a send, say what each is waiting for. They are null while it is working, and while it is paused or finished. Policy edits such as raising the cap, removing the window or shortening the gap take effect within five minutes, with no restart.

When a batch stops itself

invalid_input failures and runs that produced nothing sendable do not count toward the ten.

Why a row failed

During drafting, last_error reads {error_type}: {message}, for example invalid_input: this run supplied no value for required input(s): company. A row whose run succeeded but produced nothing sendable has a plain last_error such as to is empty (work_email). The message the worker drafting this row stopped before it finished means the row went back to pending without using an attempt. Exhausted rows are draft_failed until you edit or redraft them. See task errors for each error_type.

Send failures

For a failed send, last_error holds Resend’s own message. 10 consecutive transient failures pause the send (paused, with failure_reason set, and email_batch.send.paused fires). Its rows stay covered, and resume continues from where it stopped. A send also becomes failed if the integration is disabled or deleted, or if its creator has left the workspace or lost the ADMIN/EDITOR role.

Webhooks

The email_batch.* events carry the batch. The email_batch.send.* events carry the send. See webhooks for the envelope and signatures.

Cost

provider_cost is the sum of every row’s task-run model spend on your provider keys. Talqing charges no platform fee on email batches. Per-call charges from the task’s tools and MCP servers appear only on those vendors’ bills.
Task spend is not shown in the Observability charts, and nothing caps it. Every drafted row is billed whether or not it is ever sent.

Deleting a batch

DELETE /v1/email/batches/{batch_id} permanently removes the batch, its rows and its sends. That includes the record of what was sent to whom, so export the CSV first if you might need it. Only a drafted, canceled or failed batch with no live send can be deleted. Otherwise the request returns 409.

Next

Create, review and send

Editing rows, redrafting, and creating a send.

Webhooks

Signatures, retries and delivery records.