Skip to main content

Create Template

Save a reusable email template. The returned id can be passed as template_id to POST /email/send — recipients receive the template's HTML with {{variables}} substituted from the request's variables map.

Endpoint

POST /templates

Returns: 201 Created

Headers

HeaderValueRequired
AuthorizationBearer <your-api-key>Yes
Content-Typeapplication/jsonYes

Body Parameters

ParameterTypeRequiredDescription
namestringYesDisplay name. Max 255 characters.
htmlstringYesEmail body HTML. Supports {{variables}} for personalization.
HTML is sanitized

The HTML you submit is run through a sanitizer (scripts, event handlers, and external resources are stripped) and Arsel's unsubscribe placeholders are auto-injected. The stored HTML returned in the response may differ from what you sent.

Response

{
"id": "01957e3a-4b5c-7d8e-9f0a-1b2c3d4e5f6a",
"name": "Welcome Email v2",
"html": "<h1>Welcome!</h1><p>Thanks for signing up.</p>",
"created_at": "2026-03-08T12:00:00.000Z",
"updated_at": "2026-03-08T12:00:00.000Z"
}
FieldTypeDescription
idstringTemplate ID. Use this as template_id in send/campaign requests.
namestringTemplate name
htmlstringSanitized HTML body
created_atstringISO 8601 timestamp
updated_atstringISO 8601 timestamp

Examples

curl -X POST "https://api.arsel.sa/v1/templates" \
-H "Authorization: Bearer be_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "Welcome Email v2",
"html": "<h1>Welcome, {{first_name}}!</h1><p>Thanks for joining.</p>"
}'

Error Responses

{
"status_code": 422,
"name": "validation_error",
"message": "name should not be empty, html should not be empty"
}