support.canned_reply.created
A saved reply is added to a project's support inbox.
The dashboard calls these Saved Replies; the event keeps the
canned_reply name. The snapshot carries the snippet's title, shortcut and
position but never its body — fetch that with GET /v1/projects/{project} /support/canned-replies/{reply} if you mirror the picker somewhere else.
When this fires
A creator saves a new reusable reply on a project:
- Dashboard — Saved Replies → Add Reply from the support inbox.
- REST —
POST /v1/projects/{project}/support/canned-replies. - MCP — the
create_canned_replytool.
It does not fire when:
- A saved reply is inserted into a conversation. Using a snippet is just composing a message; the reply that goes out raises
support.message.sentlike any other. - The save is rejected. A duplicate
shortcuton the same project, or a body outside its limits, fails validation and writes nothing.
Required ability
support-conversation:view — token must carry this at mint time to subscribe an endpoint to this event.
Payload
{
"id": "evt_01HX...",
"type": "support.canned_reply.created",
"created_at": "2026-09-06T09:40:00Z",
"api_version": "2026-05-01",
"project_id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13",
"data": {
"canned_reply": {
"id": "c2f8e6a1-7d34-4b9e-a05c-3e1f9b7d2a68",
"title": "Opening hours",
"shortcut": "hours",
"sort_order": 1
},
"project_id": "7f3d1c92-8b45-4e6a-9d21-5c8e0a4b6f13"
}
}Field reference
| Field | Type | Notes |
|---|---|---|
id | string ULID | Unique event id, prefixed evt_. Use for idempotent processing. |
type | string | Always support.canned_reply.created for this event. |
created_at | ISO 8601 timestamp | Server-side emission time. |
api_version | string | Webhook API contract version. |
project_id | string UUID | Project this event belongs to. |
data.canned_reply | object | The new snippet — id, title, shortcut, sort_order only. No body. |
data.canned_reply.id | string UUID | Saved reply identifier. |
data.canned_reply.title | string | The label shown in the picker, 2–80 characters. |
data.canned_reply.shortcut | string, nullable | The token typed in the composer to expand the snippet — letters, digits, dashes and underscores, up to 30 characters, stored without a leading slash. null when none was set. |
data.canned_reply.sort_order | integer | Position in the picker, 0–999. Defaults to 0 when the request omits it. |
data.project_id | string UUID | Mirrors the envelope project_id. |
Caveats
- The
bodyis the one thing a consumer usually wants and the one thing not sent. This matches the family rule that nosupport.*payload carries message text; read it over the API. shortcutis unique per project, so it doubles as a stable handle for the snippet in a mirror — but it is optional and editable, so key onid.sort_orderis not a dense sequence. Several snippets can share a value; the dashboard orders ties by creation.
Related events
support.canned_reply.updated— the snippet is reworded, given a new shortcut or moved.support.canned_reply.deleted— the snippet is removed from the picker.- Support events overview — back to family overview.
How is this guide?