List Message Logs
GET /v1/messages/{messageId}.
The dashboard Logs & Analytics page is the visual counterpart of this endpoint — the same rows, filters, and statuses you see there are what this endpoint returns as JSON.
Headers
x-api-key: ps_...(orx-api-key-id: <api_key_id>) — a number-scoped key. Tenant-scoped keys receive403.
Query parameters
24h service window: WhatsApp opens a 24-hour customer-service window every time a contact messages you.
serviceWindowOpenAtSend records the state of that window at the moment each outbound message was accepted: true means it was a reply inside an open window and was sent immediately; false means it was a “cold” send outside the window — paced by the anti-block engine on Pilot Status web numbers, and requiring an approved template on Meta Cloud API numbers; null means the window was not computed (inbound rows, group/channel destinations). Filter with window=open / window=closed.Examples
Response (200)
Response fields
Retention: rows respect the number’s PII retention mode. On
RELAY_ONLY numbers the rows are returned redacted (content: null).origin — which rail the message left by
The set grows. Treat a value you do not recognise as “unclassified outbound”, not as an error.
Outbound rows with no send request
Three kinds ofOUT row were not sent by Pilot Status, so there is no send request behind them: APP, LAYER, and CHATWOOT from a native WhatsApp Cloud inbox. On these rows:
correlationId,template,serviceWindowOpenAtSend,errorCodeanderrorMessagearenull;GET /v1/messages/{messageId}answers404— the list row is all there is;statusfollows the statuses Meta reports:SENT,DELIVERED,READorFAILED;- the message does not count toward your plan’s message usage;
- on a number whose PII retention mode redacts the row,
toandcontentarenullandredacted: trueis added, as on any other row.
CHATWOOT row from an API mirror inbox is a regular send: it has a correlationId and full detail.
On LAYER rows and native-inbox CHATWOOT rows, content is what the Graph API request carried: the text body, a media caption, or the body text of an interactive message. Three types get a short generated text instead:
- a template reads
Template: <name>— the rendered body is not stored, andtemplatestaysnull; - a location reads
Location: <latitude>, <longitude>, followed by its name and address when the request had them; - contacts read
Contacts: <names>.
content: null.
A native-inbox CHATWOOT row:
LAYER rows, and CHATWOOT rows from a native inbox, are recorded only from the moment Pilot Status started recording layer sends for the number. Earlier sends are not backfilled. What is and is not recorded: Meta layer → Sends are recorded in Logs.