Revoke/edit webhook events and unsupported sub-kind hint
Released: July 11, 2026
Two new webhook events cover message deletions and edits from
Coexistence WhatsApp numbers, and every message.received
delivery for a Meta-downgraded message now carries a sub-kind hint so
you can tell “the contact edited a message” from “Meta doesn’t know
what this is”.
message.revoked webhook event Added
Section titled “message.revoked webhook event ”When a WhatsApp contact deletes (“delete for everyone”) a message
they previously sent to your number, Meta delivers a revoke webhook
carrying the original message’s wamid. Kirimdev now forwards that as a
first-class message.revoked event:
{ "id": "evt_01HXYZABCDEFGHJKMNPQRSTVWX", "type": "message.revoked", "created_at": "2026-07-11T15:34:10.000Z", "data": { "message_id": "msg_01HXYZABCDEFGHJKMNPQRSTVXY", "provider_id": "wamid.HBgLMTY1MDM4Nzk0MzkV...", "conversation_id": "cnv_01HXYZABCDEFGHJKMNPQRSTVWZ", "contact_id": "ctc_01HXYZABCDEFGHJKMNPQRSTVW0", "contact_phone_number": "+6285887130408", "phone_number_id": "890836697444150", "display_phone_number": "6281295648580", "revoked_at": "2026-07-11T15:34:10.000Z" }}Subscribe on create or update:
curl -X POST https://api.kirimdev.com/v1/webhook_subscriptions \ -H "Authorization: Bearer $KIRIM_KEY" \ -H "Content-Type: application/json" \ -d '{ "url": "https://your-app.example.com/webhooks/kirim", "events": ["message.received", "message.revoked"] }'message.edited webhook event Added
Section titled “message.edited webhook event ”When a contact edits a previously sent message AND Meta forwards the
new body, we fan out a message.edited event with both the new and
original content:
{ "id": "evt_...", "type": "message.edited", "created_at": "2026-07-11T15:33:22.000Z", "data": { "message_id": "msg_01HXYZABCDEFGHJKMNPQRSTVXY", "provider_id": "wamid.HBgLMTY1MDM4Nzk0MzkV...", "conversation_id": "cnv_...", "contact_id": "ctc_...", "contact_phone_number": "+6285887130408", "phone_number_id": "890836697444150", "display_phone_number": "6281295648580", "new_content": "Halooee", "original_content": "Halo", "edited_at": "2026-07-11T15:33:22.000Z", "edit_history": [ { "content": "Halo", "edited_at": "2026-07-11T15:33:15.000Z" } ] }}original_content is the FIRST version of the message, never
overwritten by subsequent edits. edit_history is the chronological
revision log (Meta allows edits within 15 minutes of the original
send).
Also Coexistence-only.
unsupported.type hint on message.received Added
Section titled “unsupported.type hint on message.received ”For every inbound message where type === "unsupported", the API
response and outbound webhook payloads now include an unsupported
block distinguishing the sub-kind Meta reported:
"edit"— the contact edited a previous message; Meta refused to forward the new body (see the advisory above)."unknown"— a message type Meta itself cannot classify (typically a new WhatsApp product not yet in the Cloud API contract).
Example inbound webhook body (unchanged Meta-passthrough envelope with the new field inside the messages array):
{ "object": "whatsapp_business_account", "entry": [{ "id": "1880077689245224", "changes": [{ "field": "messages", "value": { "messaging_product": "whatsapp", "metadata": { "display_phone_number": "6281295648580", "phone_number_id": "890836697444150" }, "contacts": [{ "profile": { "name": "Ori" }, "wa_id": "6285887130408" }], "messages": [{ "from": "6285887130408", "id": "wamid.HBgN...", "timestamp": "1783760270", "type": "unsupported", "unsupported": { "type": "edit" } }] } }] }]}Same hint on GET /v1/{phone_number_id}/messages and GET /v1/{phone_number_id}/messages/{id}:
{ "id": "msg_...", "object": "message", "type": "unsupported", "content": null, "unsupported": { "type": "edit" }, "status": "delivered", ...}The unsupported field is only present when populated; older rows
ingested before this feature omit it. Kept open-string because Meta
may introduce further sub-kinds (view_once, poll, …) without
prior notice.
SDK Changed
Section titled “SDK ”@kirimdev/sdk 3.13.0 picks up the new events and hint via the
fresh openapi.json snapshot. Type-safe subscription:
await kirim.webhookSubscriptions.create({ url: 'https://your-app.example.com/webhooks/kirim', events: ['message.received', 'message.revoked', 'message.edited'],})New payload types exported from @kirimdev/sdk/webhooks:
MessageRevokedEvent, MessageEditedEvent (with their
MessageRevokedPayload / MessageEditedPayload data shapes).
import { verifyWebhookSignature, type KirimNativeWebhookEvent } from '@kirimdev/sdk/webhooks'
const event = (await verifyWebhookSignature({ rawBody, signatureHeader, secrets,})) as KirimNativeWebhookEvent
if (event.type === 'message.revoked') { // event.data.message_id, event.data.revoked_at, ...}For the inbound sub-kind hint, retrieve response types now include
the optional unsupported field:
const msg = await kirim.messages.retrieve(id, phoneNumberId)if (msg.type === 'unsupported' && msg.unsupported?.type === 'edit') { // Contact edited an earlier message; Meta didn't share the new body.}Dashboard Added
Section titled “Dashboard ”Message bubbles for Meta-downgraded messages now distinguish the sub-kind instead of showing a single generic placeholder:
edit→ “Kontak mengedit pesan sebelumnya. Buka WhatsApp di HP untuk melihat isi terbaru.”unknown→ “Tipe pesan belum didukung — cek langsung di HP.”- fallback → “Pesan tidak didukung — cek langsung di HP.”