# Mark a WhatsApp message as read

`POST /v1/whatsapp/messages/{message_id}/read`

Marks an inbound WhatsApp message as read, showing the contact the blue
ticks. WhatsApp also marks every earlier message in that conversation read.

Pass `typing_indicator: true` to show a typing indicator as well. WhatsApp
clears it when you send your next message, or after 25 seconds, whichever
comes first, and there is no call to clear it early, so ask for one only
when you are about to reply. WhatsApp cannot show a typing indicator without
a read receipt, so both arrive together.

The acknowledgement is sent asynchronously: a `202` means Bird accepted the
request, not that WhatsApp has shown it. Nothing reports back, because
WhatsApp publishes no delivery, status or failure callback for an
acknowledgement, so there is nothing to poll and no webhook event.
Repeating the call is safe, and each call restarts the 25-second typing
window. To refresh the indicator, send a fresh `Idempotency-Key` or none at
all: a replayed key answers from the stored response without acknowledging
anything again.

Only an inbound message can be marked read. WhatsApp allows this for 30
days after receipt, but Bird keeps the provider id a receipt needs for 15
days, so a message older than that answers `404`. A message Bird sent, or
one that never reached WhatsApp, answers `422`.

## Code samples

### TypeScript

```ts
const ack = await bird.whatsapp.markRead("wam_01krdgeqcxet5s7t44vh8rt9mg", {
  typing_indicator: true,
});
ack.typing_indicator; // true
```

### Python

```py
ack = client.whatsapp.mark_read("wam_01krdgeqcxet5s7t44vh8rt9mg", typing_indicator=True)
print(ack.typing_indicator)
```

### Go

```go
ack, err := client.Whatsapp.MarkRead(context.Background(), "wam_01krdgeqcxet5s7t44vh8rt9mg", bird.WhatsappMarkReadParams{
	TypingIndicator: bird.Ptr(true),
})
if err != nil {
	log.Fatal(err)
}
fmt.Println(ack.TypingIndicator)
```

### PHP

```php
$ack = $bird->whatsapp->markRead(
    'wam_01krdgeqcxet5s7t44vh8rt9mg',
    (new WhatsAppReadReceiptRequest())->setTypingIndicator(true),
);
var_dump($ack->getTypingIndicator());
```

### CLI

```sh
bird whatsapp mark-read <message-id> --typing-indicator=true
```

### cURL

```sh
curl -X POST "https://us1.platform.bird.com/v1/whatsapp/messages/{message_id}/read" \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "typing_indicator": true
  }'
```

## Example response `202`

```json
{
  "typing_indicator": true
}
```

## Path parameters

- `message_id` (string): ID of the inbound message to acknowledge.

## Request body

- `typing_indicator` (boolean): Show a typing indicator to the contact as well as marking the message read. WhatsApp clears it when you send your next message, or after 25 seconds, whichever comes first. Only ask for one if you are about to reply.

## Response body

- `typing_indicator` (boolean, required): Whether a typing indicator was requested alongside the read receipt.

## Related resources

- [Should I use a Bird SDK or call the API directly?](/explained/platform/should-i-use-an-sdk-or-call-the-api-directly) (answer)
- [Build your first integration](/learn/paths/integration) (course)
- [Send your first email](/docs/get-started/send-your-first-email) (docs)

[Get an implementation brief](/learn/workspace?topic=api-basics)
