How do I fetch message reports?
Use GET /api/v2/reports with pagination and filters such as sender, status, date range, and mobile number.
List message reports with pagination, date filters, status filters, and sender scoping.
Use Reports APIs to fetch message reports, statuses, mobile-number history, campaign reporting, and delivery analytics.
Public message reporting APIs are read-only JSON endpoints under the canonical reports base URL. Do not use /v2/reports; that twin path is intentionally not exposed for report management.
https://graph.whats91.com/api/v2/reportsUse a public API token in the Authorization header. GET endpoints also accept authToken, auth_token, or token as query parameters for compatibility.
Authorization: Bearer w91_live_xxxxxxxxxxxxxxxxxEndpoint: GET /api/v2/reports/messages.
/api/v2/reports/messages| Parameter | Type | Required | Description |
|---|---|---|---|
senderId | string | Optional | WhatsApp sender phone number. Optional when token scope/default sender resolves it. |
page | number | Optional | Positive integer. Default 1. |
limit | number | Optional | Positive integer. Default 50, max 200. |
dateFrom | string | Optional | YYYY-MM-DD. Defaults to the last 30 days for live message reports. |
dateTo | string | Optional | YYYY-MM-DD. Defaults to today for live message reports. |
storage | string | Optional | live or archive. Default live. |
status | string | Optional | accepted, sent, delivered, read, failed, pending, or another supported report status. |
receiver | string | Optional | Recipient phone number. |
campaignUid | string | Optional | Filter reports by campaign UID. |
templateName | string | Optional | Filter reports by template name. |
messageType | string | Optional | template, text, image, document, or another message type. |
sourceType | string | Optional | PUBLIC_API, CAMPAIGN, CHATBOT, FLOW, or another source type. |
curl "https://graph.whats91.com/api/v2/reports/messages?senderId=919999999999&status=delivered&limit=50" \
-H "Authorization: Bearer w91_live_xxx"{
"success": true,
"message": "Message reports retrieved",
"data": {
"senderId": "919999999999",
"phoneNumberId": "1234567890",
"reports": [
{
"reportUid": "msg_uid",
"messageId": "wamid.xxxxx",
"receiver": "918888888888",
"sourceType": "CAMPAIGN",
"campaignUid": "campaign_uid",
"templateName": "payment_reminder",
"messageType": "template",
"status": "delivered",
"latestStatus": "delivered",
"occurredAt": "2026-06-05T08:00:00.000Z"
}
],
"pagination": {
"page": 1,
"limit": 50,
"total": 1,
"totalPages": 1,
"count": 1,
"hasMore": false
}
},
"metadata": {
"apiVersion": "v2",
"requestId": "request-uuid"
}
}| HTTP | Error code | Meaning |
|---|---|---|
| 401 | MISSING_AUTH_TOKEN | No bearer/query token was supplied. |
| 401 | INVALID_AUTH_TOKEN | Token is invalid, expired, revoked, or user inactive. |
| 403 | SENDER_NOT_ALLOWED | Number-scoped token attempted another sender. |
| 403 | FEATURE_NOT_AVAILABLE | Subscription does not include the requested report feature. |
| 400 | VALIDATION_FAILED | Invalid date range, pagination, storage, or missing required query field. |
Use these examples as starting points for server-side implementations.
curl -X GET "https://graph.whats91.com/api/v2/reports/messages" \
-H "Authorization: Bearer w91_live_xxx"const response = await fetch("https://graph.whats91.com/api/v2/reports/messages", {
method: "GET",
headers: {
"Authorization": "Bearer w91_live_xxx",
"Content-Type": "application/json"
}
});
const data = await response.json();
console.log(data);$ch = curl_init("https://graph.whats91.com/api/v2/reports/messages");
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer w91_live_xxx",
"Content-Type: application/json"
]
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;import requests
response = requests.request(
"GET",
"https://graph.whats91.com/api/v2/reports/messages",
headers={
"Authorization": "Bearer w91_live_xxx",
"Content-Type": "application/json",
}
)
print(response.json())using var client = new HttpClient();
client.DefaultRequestHeaders.Add("Authorization", "Bearer w91_live_xxx");
var request = new HttpRequestMessage(HttpMethod.Get, "https://graph.whats91.com/api/v2/reports/messages");
var response = await client.SendAsync(request);
Console.WriteLine(await response.Content.ReadAsStringAsync());Use GET /api/v2/reports with pagination and filters such as sender, status, date range, and mobile number.
Yes. Use the message status endpoint with the required message identifier to retrieve the current report status.
Reports reflect Whats91 processing and webhook updates. Use Webhooks for real-time event delivery and Reports for querying stored state.
Retrieve the latest status and lifecycle events for one message.
List message history for one recipient mobile number.
Webhook management requests, responses, and event payload samples for common Whats91 webhook flows.
Read user-wide message billing records across WhatsApp sender numbers.