Skip to content

Concept map· 6 connected terms

Mark as Read

Also called: Mark-as-read call · Mark message as read · status: read request · Blue ticks API

In one line
An API call that marks a customer's message as read, turning its ticks blue on their phone and optionally showing a typing indicator.

Reviewed

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}/messages with status: read and the inbound message_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

2 / 2
POSThttps://graph.facebook.com/v26.0/106540352242922/messages

POST 200 in 450 ms

Request

3 headers · body
POST /v26.0/106540352242922/messages HTTP/1.1
Host: graph.facebook.com
Authorization: Bearer {ACCESS_TOKEN}
Content-Type: application/json
{
"messaging_product": "whatsapp",
"status": "read",
"message_id": "wamid.HBgMOTE5ODEyMzQ1Njc4FQIAEhgUM0E3MEI1RjlDODRCQTIxQkE4NjYA",
"typing_indicator": {
"type": "text"
}
}

Response

200 OK
HTTP/1.1 200 OK
Content-Type: application/json
{
"success": true
}
Try another response
The real request a business sends to mark a customer's message as read and show typing. Send it, then switch to the errors an unknown message ID or an expired access token returns.

Response: 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?

  1. Take the ID from the webhook

    Each inbound message in a messages webhook has an id, its WAMID. That value, and only that, goes into message_id.

  2. 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.

  3. POST the read status

    Send messaging_product, status: read and message_id to /{PHONE_NUMBER_ID}/messages, using the same business number that received the message. Add typing_indicator only if a reply is on its way.

  4. 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.

  5. 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_id must 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.

Mark as Read FAQs

How do I show blue ticks to a customer on the WhatsApp Business API?+
Mark their message as read. POST `status: read` with the inbound message's WAMID as `message_id` to `/{PHONE_NUMBER_ID}/messages`; their ticks turn blue, and earlier messages in that one-to-one chat are marked too.
How long does the WhatsApp typing indicator last?+
Until you send a reply or 25 seconds pass, whichever comes first. Send it together with the read status, and only when a reply really is coming.
Does marking a message as read cost anything?+
No. It is not a message, so it is neither delivered nor billed as one, and it does not open or extend the 24-hour customer service window. Only the replies you send are charged.
Why does mark as read return error 131009?+
The `message_id` is not valid for that call: a typo, the ID of a message you sent, a message received by a different business number, or one older than 30 days.
What is the difference between mark as read and a read receipt?+
Direction. Mark as read is your call telling the customer you have seen their message; a read receipt is the `read` status webhook telling you the customer has opened yours.

See InfiQ pricing

Try it on the official WhatsApp Business API

InfiQ is an official Meta Business Partner. Start a 7-day free trial — no card needed — and see this running on your own number.