Email templates
Reusable email bodies. Mustache-style placeholders are filled in by the sender service at send time.
Templates are scoped by owner unless marked isShared. Folders are free-form strings, used for grouping in the UI.
Create a template
Save a new template under the caller's account.
Required scopes:
contacts.writeRequest body
| Name | Type | Description |
|---|---|---|
namerequired | string | Display name. 1–200 chars. |
subjectrequired | string | Email subject. 1–200 chars. |
bodyrequired | string | HTML or plaintext body. 1–50,000 chars. |
folder | string | Free-form folder label. |
isShared | boolean | Visible to all users in the account. |
Request body
{ "name": "Reminder", "subject": "See you tomorrow", "body": "Hi {{firstName}}…" }Responses
201 CreatedCreated.example { "id": "et_8q4w…", "name": "Appointment reminder — 24h", "subject": "See you tomorrow at {{appointmentTime}}", "body": "Hi {{firstName}},\n\nA quick reminder…", "folder": "Reminders", "isShared": true, "ownerId": "usr_8h2c3p…", "createdAt": "2026-05-18T14:00:00Z" }
Code samples
curl -X POST https://app.contactfollowup.com/api/email-templates \
-H "Authorization: Bearer $HEARTHNOTE_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "name": "Reminder", "subject": "See you tomorrow", "body": "Hi {{firstName}}…" }'List templates
Templates the caller can see, optionally filtered to a folder.
Required scopes:
contacts.readQuery parameters
| Name | Type | Description |
|---|---|---|
folder | string | Restrict to a single folder. |
Responses
200 OKTemplates.example { "templates": [{ "id": "et_8q4w…", "name": "Appointment reminder — 24h", "subject": "See you tomorrow at {{appointmentTime}}", "body": "Hi {{firstName}},\n\nA quick reminder…", "folder": "Reminders", "isShared": true, "ownerId": "usr_8h2c3p…", "createdAt": "2026-05-18T14:00:00Z" }] }
Code samples
curl -X GET https://app.contactfollowup.com/api/email-templates \
-H "Authorization: Bearer $HEARTHNOTE_TOKEN" \
-H "Content-Type: application/json"