# Read or starred state changed

Source: https://docs.emelia.io/docs/inbox-api/email-updated

Guide: [Inbox API](https://docs.emelia.io/docs/inbox-api.md)

Webhook event `email.updated`: Emelia sends an HTTP POST request to your URL.

Fired when the read state or the star changes through the API or the inbox app. Changes made directly at the provider (for example in Gmail) and synchronised later do not fire it.

Registration: webhook subscriptions cannot be created with an API key, and Emelia has no screen for them yet: contact support.

## Headers

| Header | Description |
|---|---|
| `X-Maylee-Event` | Event name, same as `event` in the body. |
| `X-Maylee-Signature` | `t=<unix seconds>,v1=<hex HMAC-SHA256 of "<t>.<raw body>" keyed with the webhook secret>`. Reject deliveries older than 300 seconds and compare in constant time. |
| `User-Agent` | Fixed User-Agent of the delivery client. Do not use it to authenticate a delivery: verify the signature. |

## Payload

| Field | Type | Required | Description |
|---|---|---|---|
| `event` | any | yes |  |
| `createdAt` | string (date-time) | yes | Time of THIS delivery attempt (changes on retries). |
| `data` | object | yes |  |
| `data.emailId` | string | yes |  |
| `data.changes` | object | yes | Either `isRead` or `isStarred`. |
| `data.changes.isRead` | boolean | no |  |
| `data.changes.isStarred` | boolean | no |  |

```json
{
  "event": "email.updated",
  "createdAt": "2026-10-08T09:12:51.000Z",
  "data": {
    "emailId": "cmemacme0000000000000001",
    "changes": {
      "isRead": true
    }
  }
}
```
