Skip to content

Voice note played status + played_at on messages

Released: June 17, 2026

Public API — played_at on messages Added

Section titled “Public API — played_at on messages ”

Meta emits a played status webhook when a recipient first plays an outbound voice note (audio with voice: true). Kirimdev now stores that moment on the message row as played_at (ISO-8601) and returns it from GET /v1/{phone_number_id}/messages/{id} and list endpoints when present.

The timestamp is taken from Meta’s statuses[].timestamp on the webhook (converted to UTC), not the worker’s processing time — so played_at aligns with the forwarded message.status payload your subscriber already receives.

The delivery status field is unchanged — it still cycles sentdeliveredread (or failed). played_at is an independent engagement signal, not a replacement for read.

Webhooks — message.status passthrough Changed

Section titled “Webhooks — message.status passthrough ”

message.status events forwarded from Meta may now include statuses[].status: "played" for voice notes. Subscribers already receive the raw Meta JSON — no envelope change. Handle played in your status state machine alongside sent, delivered, read, and failed.

Dashboard — voice played analytics Changed

Section titled “Dashboard — voice played analytics ”

The Analytics Voice played KPI now counts only outbound audio rows with a played_at stamp, and the percentage denominator on the Messages subject is delivered voice notes (metadata.voice = true), capped at 100%. The inbox mic indicator appears only on voice notes (not generic audio attachments).