Get a message's timeline
Retrieves the full story of one outbound send: when it was accepted,
its current delivery state, the terminal events it produced, and the
webhook deliveries that carried those events to your endpoints.
GET /v1/messages/{msg} answers “what happened”; this answers “why
does it say that”.
Requirements
msgis an outbound send id: the idsPOST /v1/chats/{chat}/messagesreturns. Inbound customer messages have no message id and return HTTP 404, as does another brand’s id or an unknown one.
Limits
- No per-attempt history: entries carry counters and a current state.
- No intermediate delivery states: you get the current state plus the immutable terminal events.
- Entries past the retention horizons are marked by
retentionandtruncatedrather than silently absent.
Returns
Each section whose retention horizon this message has outlived;
"delivery", "webhook", or both. Always present; an EMPTY array means an
empty section is a fact about the world rather than a sweep.
It exists because the horizons differ: a 45-day-old send that delivered and whose webhook fired shows a delivery entry and zero webhook entries, which would otherwise be byte-identical to “the webhook was never created” on the one endpoint built to answer that question.
“MAY have been swept”, never “was”: the 30-day webhook sweep takes
delivered rows ONLY, so a pending or failed outbox row survives past its
horizon and truncation can hide only a SUCCESS.
Get a message's timeline
curl https://messages.api.linqapp.com/v1/messages/$MSG/timeline \
-H "Authorization: Bearer $LINQ_AMB_API_KEY"{
"message_id": "msg_2c7d90",
"chat_id": "chat_4f81b2",
"entries": [
{
"kind": "accepted",
"at": "2026-08-06T14:02:12Z"
},
{
"kind": "delivery",
"at": "2026-08-06T14:02:13Z",
"state": "sent",
"attempt": 1
},
{
"kind": "message_sent",
"at": "2026-08-06T14:02:13Z",
"seq": 14
},
{
"kind": "webhook",
"at": "2026-08-06T14:02:13Z",
"state": "delivered",
"attempt": 1,
"endpoint_id": "wh_7c31a8",
"event_type": "message.sent",
"seq_from": 14,
"seq_to": 14,
"message_id": "msg_2c7d90"
}
],
"retention": {
"delivery_from": "2026-05-08T14:02:20Z",
"webhook_from": "2026-07-07T14:02:20Z"
},
"truncated": []
}Returns Examples
{
"message_id": "msg_2c7d90",
"chat_id": "chat_4f81b2",
"entries": [
{
"kind": "accepted",
"at": "2026-08-06T14:02:12Z"
},
{
"kind": "delivery",
"at": "2026-08-06T14:02:13Z",
"state": "sent",
"attempt": 1
},
{
"kind": "message_sent",
"at": "2026-08-06T14:02:13Z",
"seq": 14
},
{
"kind": "webhook",
"at": "2026-08-06T14:02:13Z",
"state": "delivered",
"attempt": 1,
"endpoint_id": "wh_7c31a8",
"event_type": "message.sent",
"seq_from": 14,
"seq_to": 14,
"message_id": "msg_2c7d90"
}
],
"retention": {
"delivery_from": "2026-05-08T14:02:20Z",
"webhook_from": "2026-07-07T14:02:20Z"
},
"truncated": []
}