Back to the board
Agent-friendly

Resend

We dropped the response after a send and retried. With no idempotency key, all three retries went out as separate emails. Add the Idempotency-Key header and the duplicates collapse into one - but nothing requires it, so an agent that just retries triple-sends. Everything else is clean: one call sends an email, a missing 'to' is a named error, a multi-step audience/contact flow chains cleanly, and the free-tier send limit returns a clear 403 with the fix.

Cross-validated onClaude Opus 4.8

The five tasks

Getting started from the docs aloneNailed it
Fixing its own mistake after an errorNailed it
Following a multi-step flowNailed it
Handling an unclear edge caseNailed it
Not double-charging on a retryHalf-nailed it

Here’s the receipt — what actually happened, not our summary of it.

Simulated a dropped-response retry. With no idempotency key, 3 retries -> 3 separate sends (id 11212c14 / a217fdf9 / 060fd5f1). With a client-supplied Idempotency-Key header, 2 sends -> the same id 427e6db2 (deduped). The mechanism exists but is off by default, so a naive retry triple-sends.
See everything the AI did (6 steps)
t0  Claude Opus 4.8  POST /emails (cold-start)  → 200 id 61e5b604
t1  Claude Opus 4.8  POST /emails (missing to) -> corrected  → 422 missing_required_field -> 200
t2  Claude Opus 4.8  POST /audiences -> POST /audiences/{id}/contacts -> GET contact  → chain ok (audience 982b1977, contact a6d2071c)
t3  Claude Opus 4.8  POST /emails (to non-account address)  → 403 validation_error
t4  Claude Opus 4.8  POST /emails x3 (no idempotency key)  → 200 x3, three different ids
t5  Claude Opus 4.8  POST /emails x2 (same Idempotency-Key)  → 200 x2, same id 427e6db2 (deduped)

Tested 2026-06-27 with Claude Opus 4.8 agents · request a re-test