Skip to content

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:

Terminal window
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.

@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.
}

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.”
Webhook event reference →