← Back to all posts
2026-09-05 · MailAnvil Team

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?

Prasyarat

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

Semua service backend (Express, Laravel, Go, Python, Lambda, Workers) kirim ke template yang sama — yang beda cuma template_data-nya.

Kenapa MailAnvil

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.