Mengelola Template Email Transaksional via API — Reusable Template untuk OTP, Invoice, dan Reset Password
Kalau setiap kirim email kamu tempel HTML inline di kode, HTML itu jadi duplikat di 10 tempat: service OTP, service invoice, service reset password, job notifikasi, dan seterusnya. Ganti logo? Edit 10 file. Salah variabel? Push 10 commit.
Template API menyelesaikan ini. Simpan HTML sekali di server MailAnvil, dapat template_id, lalu kirim email cukup dengan template_id + data. Satu sumber kebenaran, tanpa redeploy.
Kenapa template, bukan HTML inline?
- Satu sumber kebenaran — HTML OTP cuma ada satu. Edit di satu tempat, semua service ikut berubah.
- Non-developer bisa edit — tim operasional bisa ubah copy di dashboard tanpa nunggu engineer.
- Payload kirim jadi kecil —
POST /v1/sendcukup kirimtemplate_id+template_data, bukan HTML 3KB tiap request. - Konsisten antar-kanal — MCP agent, cron job, dan API pakai template yang sama.
Prasyarat
- API key MailAnvil (diawali
re_) — ambil di mailanvil.com - Node.js 18+ atau
curluntuk mencoba contoh
Konsep: variabel {{nama}}
Template pakai sintaks {{variabel}} sederhana (bukan handlebars). Misal template OTP:
<h1>Kode verifikasi Anda</h1>
<p>Gunakan kode <strong>{{otp_code}}</strong> untuk masuk.</p>
<p>Kode berlaku 5 menit.</p>
Saat kirim, isi template_data dengan nilai variabelnya:
{ "otp_code": "482913" }
Step 1 — Buat template
POST /v1/templates dengan name, subject, dan html (atau text untuk email teks polos).
curl -X POST https://api.mailanvil.com/v1/templates \
-H "Authorization: Bearer re_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"name": "otp-login",
"subject": "Kode verifikasi Anda",
"html": "<h1>Kode verifikasi Anda</h1><p>Gunakan kode <strong>{{otp_code}}</strong> untuk masuk.</p>"
}'
Respons 201:
{
"template": {
"id": "tpl_01j2x...",
"name": "otp-login",
"subject": "Kode verifikasi Anda"
}
}
Simpan tpl_... itu. Itu template_id yang dipakai di semua request berikutnya. Nama template wajib unik — buat name yang sama dua kali balas 400.
Step 2 — Lihat daftar & detail template
# daftar semua template
curl -s https://api.mailanvil.com/v1/templates \
-H "Authorization: Bearer re_your_api_key"
# detail satu template
curl -s https://api.mailanvil.com/v1/templates/tpl_01j2x... \
-H "Authorization: Bearer re_your_api_key"
Respons GET /v1/templates berbentuk { "templates": [ ... ] }.
Step 3 — Kirim pakai template
POST /v1/send terima template_id + template_data sebagai pengganti html. Keduanya mutually exclusive — kirim html bareng template_id ditolak.
await fetch("https://api.mailanvil.com/v1/send", {
method: "POST",
headers: {
"Authorization": "Bearer re_your_api_key",
"Content-Type": "application/json",
"Idempotency-Key": "otp:[email protected]" // deterministik, anti duplikat saat retry
},
body: JSON.stringify({
from: "MailAnvil <[email protected]>",
to: ["[email protected]"],
template_id: "tpl_01j2x...",
template_data: { otp_code: "482913" }
})
});
Respons 202 Accepted — email masuk antrian, dikirim asinkron.
Step 4 — Update template tanpa redeploy
Ganti subject, ganti HTML, tambah variabel — cukup PATCH:
curl -X PATCH https://api.mailanvil.com/v1/templates/tpl_01j2x... \
-H "Authorization: Bearer re_your_api_key" \
-H "Content-Type: application/json" \
-d '{
"subject": "Kode verifikasi baru Anda",
"html": "<h1>Kode verifikasi Anda</h1><p><strong>{{otp_code}}</strong> — berlaku 10 menit.</p>"
}'
Semua service yang pakai template_id itu langsung kirim email versi baru. Nol deploy, nol downtime.
Step 5 — Hapus template
curl -X DELETE https://api.mailanvil.com/v1/templates/tpl_01j2x... \
-H "Authorization: Bearer re_your_api_key"
200 = terhapus. GET template yang sudah dihapus balas 404.
Pola pakai di dunia nyata
- OTP (GoPay/OVO/DANA style) — satu template
otp-login, dipanggil service auth dengantemplate_data: { otp_code }. - Invoice QRIS — template
invoice-qrisdengan{ order_id, total, qris_url }, dipanggil setelah payment webhook sukses. - Reset password — template
reset-passworddengan{ reset_link },{{reset_link}}dirender jadi tombol. - Welcome email — template
welcomedengan{ name }.
Semua service backend (Express, Laravel, Go, Python, Lambda, Workers) kirim ke template yang sama — yang beda cuma template_data-nya.
Kenapa MailAnvil
- IDR pricing + QRIS/GoPay — bayar Rupiah, tanpa markup USD
- Bahasa docs + support — tanpa lapisan terjemahan untuk tim kamu
- Cloudflare Workers native — API yang sama jalan di edge
- MCP-native —
list_templateslangsung bisa dipanggil AI agent (Claude, Cursor, Codex) untuk lihat template tersimpan
Next steps
Buat template untuk 3 pesan paling sering kamu kirim (OTP, invoice, reset), ganti semua html inline di kode jadi template_id, dan pindahkan copy-edit ke dashboard. Referensi API lengkap di docs.mailanvil.com.
Satu HTML, satu template_id, semua service — tanpa redeploy.