What is the mark-as-read call?
Mark as read is the WhatsApp Cloud API request a business makes to tell a customer their message has been seen. You POST to /{PHONE_NUMBER_ID}/messages with a body that is not a message at all: just messaging_product, status set to read, and message_id, the WhatsApp Message ID (WAMID) of the customer's inbound message from your webhook. The API answers {"success": true}, and the two grey ticks under the customer's message turn blue on their phone.
The same call can show a Typing Indicator. Add "typing_indicator": {"type": "text"} and the customer sees that you are typing until you send a reply or 25 seconds pass, whichever comes first. Marking a one-to-one message as read also marks the earlier messages in that conversation, so marking the latest one is enough; in groups every message must be marked individually. Meta accepts the call for messages received within the last 30 days, and an unknown or invalid ID fails with error code 131009 ("Parameter value is not valid").
It is easy to confuse with a Read Receipt. A read receipt is the read Message Status you receive in a webhook when a customer opens a message you sent, just as a Delivery Receipt is the delivered one. Mark as read runs the other way: it is your acknowledgement of their message, and you decide when to send it. Neither is a billable message, and neither opens nor extends the 24-hour customer service window.
Key takeaways
- Mark as read is a POST to
/{PHONE_NUMBER_ID}/messageswithstatus: readand the inboundmessage_id; the customer then sees blue ticks. - Add
typing_indicator: {type: text}to the same call to show typing until you reply or 25 seconds pass. - In one-to-one chats it also marks every earlier message read; in groups each message must be marked.
- It works for messages received in the last 30 days; an invalid ID returns error 131009.
- It is your acknowledgement to the customer, the reverse of the read receipt you receive for your own messages.
Press Send: turn the ticks blue
https://graph.facebook.com/v26.0/106540352242922/messagesPOST 200 in 450 ms(simulated)
Request
3 headers · bodyResponse
200 OKResponse: 200 OK after 450 ms.
Why does the mark-as-read call matter?
Blue ticks are a promise that someone has seen the message. Customers writing to a clinic, a courier or a bank watch them, and an unread question invites "hello??" follow-ups and duplicate tickets. Marking a message read when a bot or an agent actually starts on it, and showing a typing indicator while the answer is prepared, makes an automated reply feel attended. Marking everything read the moment it arrives does the opposite: it tells customers they have been seen and then ignored.
The mark-as-read call in code
curl -X POST "https://graph.facebook.com/v26.0/{PHONE_NUMBER_ID}/messages" \-H "Authorization: Bearer {ACCESS_TOKEN}" \-H "Content-Type: application/json" \-d '{"messaging_product": "whatsapp","status": "read","message_id": "wamid.HBgMOTE5ODEyMzQ1Njc4FQIAEhgUM0E3MEI1RjlDODRCQTIxQkE4NjYA","typing_indicator": { "type": "text" }}'# → { "success": true }
Drop `typing_indicator` to mark the message read without showing typing.
How does the mark-as-read call work?
Take the ID from the webhook
Each inbound message in a messages webhook has an
id, its WAMID. That value, and only that, goes intomessage_id.Decide when read is true
Mark the message when your bot starts processing it or when an agent opens the conversation, not when the webhook lands in a queue nobody is watching.
POST the read status
Send
messaging_product,status: readandmessage_idto/{PHONE_NUMBER_ID}/messages, using the same business number that received the message. Addtyping_indicatoronly if a reply is on its way.Reply within 25 seconds
The typing indicator disappears when you reply or after 25 seconds. If the work takes longer, send a short holding reply rather than leaving a dead indicator.
Handle the response
Expect
{"success": true}. Log 131009 (wrong, foreign or too-old ID) and move on, retry transient 5xx errors with backoff, and never let a failed read call block the actual reply.
Key facts at a glance
The mark-as-read call: key facts and limits
- Endpoint
- POST /{PHONE_NUMBER_ID}/messages
- Body
- messaging_product, status: read, message_id
- Success
- {"success": true}
- Typing indicator
- typing_indicator.type = text; up to 25 seconds
- Time limit
- Messages received in the last 30 days
- One-to-one chats
- Earlier messages are marked read too
- Groups
- Each message marked individually
- Invalid ID
- Error 131009, Parameter value is not valid
Common wrong turns
Common mistakes with the mark-as-read call
Marking read on arrival
Blue ticks the second a webhook lands, followed by an hour of silence, look worse than grey ticks. Mark messages when a bot or agent actually picks them up.
Showing typing without replying
Meta's guidance is to show a typing indicator only if you are going to respond. An indicator that vanishes after 25 seconds with no answer feels broken.
Blocking the reply on the read call
If the read request is slow or fails, the customer should still get the answer. Fire it without awaiting, or in parallel, and log failures.
Using the wrong message ID
message_idmust be a WAMID you received. The ID of a message you sent, an ID from another business number or one older than 30 days returns 131009.Expecting one call to clear a group
The cascade to earlier messages applies to one-to-one chats only. In groups, mark each message you have handled.
Good practice
Best practices for the mark-as-read call
- In one-to-one chats, mark only the newest inbound message; earlier ones follow automatically.
- Pair the typing indicator with slow work such as a language-model call, a CRM lookup or a payment check.
- Have the inbox mark messages read when an agent opens the chat, not when it is assigned.
- Track time from inbound to read as a responsiveness metric alongside first-reply time.
Example: A pharmacy bot in Ahmedabad
An Ahmedabad pharmacy chain's WhatsApp bot receives "Is paracetamol 650 in stock at the Navrangpura store?" Checking the store's inventory system takes about four seconds, so the moment the worker picks up the message it sends mark as read with a typing indicator. The customer sees blue ticks and "typing…", then the answer with the store's location pin. Questions that need a pharmacist are left unread until the pharmacist opens the chat in the team inbox, so blue ticks always mean that a person, or the bot, is really on it.