Typical questions it answers: which numbers never received this week’s send,
who has blocked us, and whether a specific customer got their message.
Statuses are a lifecycle, not a verdict
SENT, DELIVERED and READ all mean the message went out. They differ only
in how far it got:
To count what you sent, ask for
SENT, DELIVERED and READ together.
Asking for SENT alone returns only the ones still unconfirmed, which on a
healthy account is a small fraction of what actually went out.READ.
Email never does — there is no read receipt, so an email resting at
DELIVERED is fully settled. And PENDING on an inbound message is normal and
permanent: nobody sends a receipt for a message a customer wrote to you.
Why a message failed
On email,errorMessage carries the reason in words. On WhatsApp you usually
get a numeric errorCode instead:
Any other code is passed through unchanged. Rows sent before codes were
recorded have neither field; that is expected, not a data error.
Filtering
direction defaults to OUTBOUND — a delivery status only means something for
a message you sent. Pass direction=INBOUND for what customers sent you.
The window, and how to widen it
With no dates, the read covers the last seven days — a rolling window from the moment you ask, so the edge is a timestamp rather than a midnight. Every response says which window it used:createdAfter, createdBefore, or both, and
that window is honoured however wide it is. Naming either one turns the default
off entirely, so createdBefore=2026-08-01 really does mean everything before
August.
A bare date means the whole day, in UTC. createdBefore=2026-09-30 includes
everything that happened on the 30th, not just the instant it began — so
createdAfter=2026-09-01&createdBefore=2026-09-30 is the whole of that range,
with no missing final day. Pass a full timestamp
(2026-09-30T06:00:00Z) when you want an exact instant; it is used as given.
Once you start paging, the window is fixed. A next_cursor carries the range
its first page resolved, so range is identical on every page of one result
set even though the default floor is relative to “now”.
There is no total. Results page through
next_cursor, and a page comes back
without counting the rows behind it — counting an unbounded log is far more
expensive than reading a page of it. To total something up, page to the end.What this log does not cover
It lists messages, so it is not a delivery-rate report. A few send failures never create a row at all — an absent message is not proof that nothing was attempted. Message text is never returned; the log answers what happened to a message, not what it said.Related
- One uniform surface — the same capabilities over REST and MCP
- Use MCP — connect an AI tool to your Boom organization