All webhooks
Messages
Message read
message.readFires when a user marks a conversation as read. Carries the ID of the last message considered read and the timestamp of the read action.
HTTP request
AISAR sends a signed POST request to your webhook_url:
http
POST {webhook_url}
Content-Type: application/json
X-AISAR-Signature: sha256=...
{
"event": "message.read",
"event_id": "evt_01JXXXXXXXXXXXXXXXXXXXXX",
"timestamp": "2026-03-26T12:00:00.000000Z",
"company_id": 1,
"data": {
"subject_type": "conversation_read",
"subject_id": 88,
"conversation_id": 45,
"thread_id": 67,
"user_id": 3,
"last_read_message_id": 123,
"last_read_at": "2026-03-26T12:00:00.000000Z"
}
}The X-AISAR-Signature header carries an HMAC-SHA256 signature of the request body — use it to verify the request came from AISAR.
Example payload
json
{
"event": "message.read",
"event_id": "evt_01JXXXXXXXXXXXXXXXXXXXXX",
"timestamp": "2026-03-26T12:00:00.000000Z",
"company_id": 1,
"data": {
"subject_type": "conversation_read",
"subject_id": 88,
"conversation_id": 45,
"thread_id": 67,
"user_id": 3,
"last_read_message_id": 123,
"last_read_at": "2026-03-26T12:00:00.000000Z"
}
}Payload fields
| Field | Type | Description |
|---|---|---|
subject_type | string | Always conversation_read |
subject_id | integer | Conversation read record ID |
conversation_id | integer | Conversation that was read |
thread_id | integer|null | Thread that was read |
user_id | integer | User who marked the conversation as read |
last_read_message_id | integer|null | Last message ID considered read |
last_read_at | string|null | ISO 8601 timestamp of the read action |