Usage reports
This endpoint is live. Everything on this page is callable except the Instagram breakdown by entry point, which is still pre-release and marked where it begins.
One endpoint reports activity for every robot on your account.
by_role separates AI answers from human ones, which is what you need to show your own customers
how much of their support the automation is carrying.
messages.total and messages.units are not the same number. A robot using the
enhanced-accuracy model consumes two units per message, so a customer who sent 1,000 messages
on that model shows total: 1000 and units: 2000.
Reconcile billing against units. Show total to your customer as a message count.
external_id is your identifier for the robot. It is null until robot creation over the API
ships, so today every robot returns null here — match on robot_id in the meantime.
The window defaults to the last 30 days and may not span more than a year. Requesting a wider
window, a from after your to, or a limit above 100 returns 400.
This reports robot activity, not your remaining balance. It answers “how much did this customer use?” rather than “how much is left on the account?”. Plan balance is out of scope for this API.
metadata.processed_at is the moment the figures are accurate as of. Usage is computed
periodically, so a conversation from seconds ago may not be counted yet.
One robot
Pass robot_id to narrow the report to a single robot.
Paging
Page with limit and offset. pagination.total_count is the number of robots matching your
query across every page, so you know how many calls to make before you start.
Instagram breakdown by entry point
Pre-release — not callable yet. This section commits to the shape, not to a date. Passing
breakdown=source today returns the standard payload above without the extra fields. Everything
else on this page is live.
A customer whose volume comes mostly from story replies has a different product than one driven by
comments, and a single total hides that.
breakdown=source adds fields rather than replacing them. messages, conversations and
channels_connected are still there, so one parser handles both shapes.
The same source vocabulary appears on every message event, so you can attribute an event to its
entry point without a second call.
Reconciling a gap
If a webhook delivery exhausted its retries, this API is how you find out. Compare the counts here against what you stored for the same window.