Count the messages of a period
Build a request to copy
This page never sends a request. Fill in the fields, then copy the request and run it from your server.
curl -X GET 'https://api.whatsable.app/v1/analytics/messages?from=string&to=string&time_zone=string'
Counts the messages sent, delivered, read, failed and received from from to to, by day or by week. The numbers are the ones the Analytics page of the dashboard shows.
A key on every number may leave out number_id and counts the whole organization. A key limited to some numbers must name one of them in number_id, otherwise 403 number_not_allowed_for_key.
bearerAuthAuthorizationBearer <nfy_live_<32 characters>>An API key from Settings > API keys, sent as Authorization: Bearer <key>.
from*stringThe first day, YYYY-MM-DD, in time_zone.
^\d{4}-\d{2}-\d{2}$to*stringThe last day, YYYY-MM-DD, in time_zone. At most 90 days after from, counting both.
^\d{4}-\d{2}-\d{2}$time_zone*stringThe IANA time zone the days are read in, such as America/Argentina/Buenos_Aires.
1 <= length <= 64number_id?stringOnly this number. A key limited to some numbers must name one of them; a key on every number may leave it out for the whole organization.
1 <= length <= 64The counts of the period.
application/json- response
Message counts for a period: what was sent, delivered, read, failed and received. The same numbers as the Analytics page of the dashboard.
object*stringfrom*stringThe first day, as requested.
to*stringThe last day, as requested.
time_zone*stringnumber_id*|The number counted, or null for every number of the organization.
granularity*|day up to 31 days, else week: buckets start on Monday, and the first one on from.
counts*read_rate*|read divided by sent, from 0 to 1. Null when nothing was sent.
delivery_rate*|delivered divided by sent, from 0 to 1. Null when nothing was sent.
series*array<>One entry per day or week, oldest first.
by_sender*array<>Outbound messages by sender, most first. The counts add up to counts.total_sent.
top_failures*array<>The five most frequent failure codes, most first.
curl -X GET 'https://api.whatsable.app/v1/analytics/messages?from=string&to=string&time_zone=string'{ "object": "message_analytics", "from": "2026-10-01", "to": "2026-10-02", "time_zone": "America/Argentina/Buenos_Aires", "number_id": null, "granularity": "day", "counts": { "total_sent": 120, "sent": 116, "delivered": 110, "read": 84, "failed": 4, "received": 95 }, "read_rate": 0.7241, "delivery_rate": 0.9483, "series": [ { "date": "2026-10-01", "sent": 60, "delivered": 57, "read": 44, "failed": 1, "received": 50 }, { "date": "2026-10-02", "sent": 56, "delivered": 53, "read": 40, "failed": 3, "received": 45 } ], "by_sender": [ { "sent_by": "bot", "count": 70 }, { "sent_by": "operator", "count": 50 } ], "top_failures": [ { "meta_code": 131026, "count": 3 }, { "meta_code": null, "count": 1 } ]}Switch the AI's follow-ups to a contact off or on PATCH
`off` stops the AI's follow-ups to this person on every number, and the bot keeps answering when they write. Sending `off` again is safe. `on` lets follow-ups start again from the next outbound message. It needs a key that may use every number the contact has a conversation on, or it answers `403 number_not_allowed_for_key`.
Count the template sends of a period GET
Counts the messages sent with each template from `from` to `to`: sent, delivered, read and failed, with the read rate. The numbers are the ones the Analytics page of the dashboard shows.