Send via API Email API

Troubleshoot Email API

Go from symptom to cause in order, for calls that are rejected, calls that succeed but never arrive, and rejections for exceeding limits.

Every table starts from the symptom you see. Upper rows are more common than lower ones, so read down and stop at the first row that matches.

First: which of the two problems is it

This question splits everything else in two.

The call returnedMeansRead
anything other than 202the message never entered the systemThe call is rejected
202the message is in the system, the problem is downstream202 but nothing arrives

What each code means, and which are worth retrying: Email API error code reference.

The call is rejected

SymptomCauseFix
Authentication rejectedThe header is missing the Bearer prefix — the most common causeSend the full Authorization: Bearer <key> form
Authentication rejectedThe key has been deletedCompare the leading characters against the key preview column on the API keys page
Authentication rejectedThe key was truncated when stored in an environment variableCheck the length of the string your application actually sends
Permission rejectedThe domain in from is not active yetPublish the sending domain records
Permission rejectedThe key is a Sending Key bound to a different domain; it can only send from its ownUse the key bound to the domain in from
Permission rejectedA typo in the domain in fromCorrect from
Rejected for bad dataA required field is missing, or there is a to but neither text nor htmlAdd the missing field
Rejected for bad dataThe message exceeds the size ceilingThe ceiling is under Limits in Email API → Guide
Rejected for too many requestsYou exceeded the allowed send rateSlow down and spread bulk sends over time. Retrying immediately only makes it worse

Your plan's limits are shown in the console.

202 but nothing arrives

202 means accepted for sending, not delivered.

Check, in orderIf this is the cause
The recipient's junk folder — the most skipped step and the most often correctRead on to Messages land in junk
Stats & logs → Logs tab; only the status of that exact message is the truthBounced means the receiver refused it — the problem is the recipient address or your domain reputation
The suppression listThe message is dropped before leaving the system
The sending domain's DNS recordsMissing signing records let mail go out but get it filed as junk

The Email API Stats & logs screen on its Statistics tab: a Statistics / Logs switch at the top right, a date range selector, four cards for Total sent, Delivered, Bounced and Complained, a daily activity chart, and the Bounces by type and Recipient engagement blocks

The screen opens on the Statistics tab — figures for the whole domain, not the message you are chasing:

  • Click Logs at the top right for the per-message table
  • Narrow it with the search box (recipient, subject or message ID) and the Status filter
  • Click a row for its status, the bounce reason, and the open and click counts

How to read the Statistics blocks: Read the overview page.

Messages land in junk

Not a technical fault, so no single button fixes it. The table is ordered by impact.

CauseFix
Missing signing records — one missing row of the three means no signaturePublish all three rows
No _dmarc record, or one that contradicts your sending sourceAdd a _dmarc record that does not contradict your sending source
Still mailing people who reported you as spam — this damages the whole domain's reputationHandle the email.complained event, see Receive mail events by webhook
Still mailing hard-bounced addresses — a high bounce rate is a scored signalDrop those addresses from your send list

The webhook receives nothing

CheckMeans
Is the endpoint pausedThe webhook page has a button to switch it back on. Events that happen while it is paused are neither saved nor delivered later
Is the event you need among those selected at creationIf it is missing, that event is never delivered to you
The delivery history has rows showing Delivery errorYour endpoint returned an error, took longer than 10 seconds or could not be reached. Nothing is retried automatically — fix the endpoint, then click Replay
The delivery history has no rows at allNo such event has happened — send a message to an address that certainly does not exist to generate a bounce

When to contact support

Send these four; they are enough to pull up the exact record:

  1. The sending domain
  2. The approximate time, with the time zone
  3. The recipient address
  4. The response code of the call, or the status shown in Stats & logs

Do not include the API key

Nobody needs it to look something up, and sending it means you have to revoke it.