Merge tags & variables

wemail uses Mustache-style merge tags.

wemail uses Mustache-style merge tags. Pass values via vars on a send, or per-recipient vars in a batch.

Syntax

ParameterTypeRequiredDescription
{{var}}basic substitutionOptionalReplaces with the string value.
{{#if var}} … {{/if}}conditionalOptionalRenders only if var is truthy.
{{#each items}} … {{/each}}loopOptionalIterate over an array.
{{var | upper}}filterOptionalBuilt-in filters: upper, lower, currency, date.

Code examples

cURL
curl -X POST https://api.wemail.io/v3/messages \
  -H "Authorization: Bearer afn_live_pK7…b9aF" \
  -H "Content-Type: application/json" \
  -d '{
    "from": "noreply@updates.acme.io",
    "to":   ["alex@example.com"],
    "subject": "Hi {{first_name}}, your balance is {{balance}}",
    "html": "<p>Hi {{first_name}},</p><p>Your balance is {{balance}}.</p>",
    "vars": { "first_name": "Alex", "balance": "$42.10" }
  }'
Node.js
import { WemailClient } from "@wemail/sdk";
const wemail = new WemailClient(process.env.WEMAIL_API_KEY);

await wemail.sendMessage({
  from:    "noreply@updates.acme.io",
  to:      ["alex@example.com"],
  subject: "Hi {{first_name}}, your balance is {{balance}}",
  html:    "<p>Hi {{first_name}},</p><p>Your balance is {{balance}}.</p>",
  vars:    { first_name: "Alex", balance: "$42.10" },
});
Python
from wemail.client import WemailClient

wemail = WemailClient(api_key=os.environ["WEMAIL_API_KEY"])

wemail.send_message({
    "from": "noreply@updates.acme.io",
    "to": ["alex@example.com"],
    "subject": "Hi {{first_name}}, your balance is {{balance}}",
    "html": "<p>Hi {{first_name}},</p><p>Your balance is {{balance}}.</p>",
    "vars": {"first_name": "Alex", "balance": "$42.10"},
})
PHP
<?php
$wemail = new \Wemail\WemailClient(getenv('WEMAIL_API_KEY'));
$wemail->sendMessage([
    'from'    => 'noreply@updates.acme.io',
    'to'      => ['alex@example.com'],
    'subject' => 'Hi {{first_name}}, your balance is {{balance}}',
    'html'    => '<p>Hi {{first_name}}, your balance is {{balance}}.</p>',
    'vars'    => ['first_name' => 'Alex', 'balance' => '$42.10'],
]);
Ruby
wemail = Wemail::Client.new(api_key: ENV["WEMAIL_API_KEY"])
wemail.send_message(
  from: "noreply@updates.acme.io",
  to:   ["alex@example.com"],
  subject: "Hi {{first_name}}, your balance is {{balance}}",
  html: "<p>Hi {{first_name}}, your balance is {{balance}}.</p>",
  vars: { first_name: "Alex", balance: "$42.10" }
)
Go
client, err := wemail.NewClient(os.Getenv("WEMAIL_API_KEY"))
client.SendMessage(wemail.SendMessageRequest{
    From:    "noreply@updates.acme.io",
    To:      []string{"alex@example.com"},
    Subject: "Hi {{first_name}}, your balance is {{balance}}",
    Html:    wemail.PtrString("<p>Hi {{first_name}}, your balance is {{balance}}.</p>"),
    Vars:    map[string]interface{}{"first_name": "Alex", "balance": "$42.10"},
})
Java
WemailClient wemail = new WemailClient(System.getenv("WEMAIL_API_KEY"));
wemail.sendMessage(new SendMessageRequest()
    .from("noreply@updates.acme.io")
    .to(List.of("alex@example.com"))
    .subject("Hi {{first_name}}, your balance is {{balance}}")
    .html("<p>Hi {{first_name}}, your balance is {{balance}}.</p>")
    .vars(Map.of("first_name", "Alex", "balance", "$42.10")));
.NET
var wemail = new WemailClient(Environment.GetEnvironmentVariable("WEMAIL_API_KEY"));
await wemail.SendMessageAsync(new SendMessageRequest {
  From = "noreply@updates.acme.io",
  To = new List<string> { "alex@example.com" },
  Subject = "Hi {{first_name}}, your balance is {{balance}}",
  Html = "<p>Hi {{first_name}}, your balance is {{balance}}.</p>",
  Vars = new Dictionary<string, object> { ["first_name"] = "Alex", ["balance"] = "$42.10" },
});
ResponseExample response
{
  "id": "msg_01HBYE7K9Z4PMQDR3W",
  "status": "queued",
  "created_at": "2026-05-10T09:42:18Z",
  "to": ["alex@example.com"]
}