Skip to content
Send messages

Mark messages as read

POST /v1/{phone_number_id}/messages doubles as both the outbound-send endpoint and the read-receipt endpoint — exactly like Meta’s WhatsApp Cloud API. To mark an inbound message as read, send a body with status: "read" and the inbound wamid you received from your webhook.

The double-tick on the sender’s phone turns blue.

Terminal window
curl -X POST \
https://api.kirim.chat/v1/$PHONE_ID/messages \
-H "Authorization: Bearer $KIRIM_KEY" \
-H "Content-Type: application/json" \
-d '{
"messaging_product": "whatsapp",
"status": "read",
"message_id": "wamid.HBgNNjI4MTIzNDU2Nzg5FQIAEhggMUE5MDM1QzVDMUYxQTAyRkVCNzZDQjVDMjFFRDQzNTUA"
}'

Add typing_indicator: { type: "text" } to also show a typing bubble to the sender alongside the receipt. Meta auto-dismisses it on your first outbound message or after ~25 seconds.

Terminal window
curl -X POST \
https://api.kirim.chat/v1/$PHONE_ID/messages \
-H "Authorization: Bearer $KIRIM_KEY" \
-H "Content-Type: application/json" \
-d '{
"messaging_product": "whatsapp",
"status": "read",
"message_id": "wamid.HBgN…",
"typing_indicator": { "type": "text" }
}'
{
"data": {
"id": "msg_01HXYZABCDEFGHJKMNPQRSTVWX",
"object": "message",
"status": "read",
"message_id": "wamid.HBgN…"
},
"request_id": "req_01HXYZABCDEFGHJKMNPQRSTVWX"
}

id is the Kirim external id of the inbound message row that was flipped to read locally. message_id echoes back the wamid you sent so retries can be correlated.

Safe to retry. A second call against a message that’s already in read state returns the same 200 payload without making another request to Meta — same shape regardless of whether the first call actually sent the receipt or not.

StatusCodeWhen
404resource_not_foundmessage_id (wamid) unknown to your org, or belongs to a different account
400invalid_field_valueThe wamid resolves to an outbound message — only inbound messages can be marked as read
502whatsapp_upstream_errorMeta accepted the request but the receipt is past the 7-day window or another upstream limit