Kirim email lewat API (POST /v1/messages)
Semua yang perlu kamu tahu tentang POST /v1/messages — field, lampiran, Idempotency-Key anti kirim dobel, merge tag, pelacakan, dan unsubscribe.
Di halaman ini
Endpoint POST /v1/messages adalah inti API kirim.id: satu request mengirim satu email ke satu penerima. Endpoint ini cocok untuk email transaksional seperti kode verifikasi, reset password, invoice, dan notifikasi pesanan. Di artikel ini kamu akan menemukan semua field yang didukung, aturan lampiran, cara mencegah email terkirim dobel, dan apa saja yang otomatis ditambahkan kirim.id ke setiap email.
/v1/messagesMengirim satu email ke satu penerima. Butuh scope send_email. Berhasil: 201 dengan message_id dan status queued.
Field request#
| Field | Tipe | Wajib | Aturan |
|---|---|---|---|
to | string | ya | Satu alamat email, maks. 255 karakter. Bukan array. |
subject | string | ya | Maks. 255 karakter. Boleh berisi merge tag. |
html | string | ya | Isi HTML, maks. 500.000 karakter. Boleh berisi merge tag. |
sending_domain_id | integer | ya | ID domain milikmu yang berstatus active (dari GET /v1/domains). |
from_email | string | tidak | Alamat pengirim. Harus memakai domain dari sending_domain_id (subdomain lain ditolak). Bawaan: no-reply@ domainmu. |
from_name | string | tidak | Nama tampilan pengirim, maks. 100. Bawaan: nama bisnismu. |
reply_to | string | tidak | Alamat penerima balasan — boleh domain lain, misalnya Gmail tim CS. |
text | string | tidak | Versi teks biasa, maks. 500.000 karakter. Kalau kosong, dibuat otomatis dari HTML. |
metadata | object | tidak | Data milikmu yang dikembalikan di status pesan & setiap webhook, mis. {"order_id":"1001"}. Maks. 10 kunci (1–40 karakter A-Z a-z 0-9 _ . -); nilai teks (maks. 500)/angka/boolean/null, tidak boleh bersarang. |
attachments | array | tidak | Lampiran, lihat bagian di bawah. |
CC/BCC dan header kustom belum didukung; field yang tidak dikenal diabaikan.
Contoh lengkap#
curl -X POST https://api.kirim.id/v1/messages \
-H "Authorization: Bearer $KIRIM_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: order-1001-invoice" \
-d '{
"to": "[email protected]",
"subject": "Invoice pesanan #1001",
"html": "<p>Halo {{nama_depan|Kak}}, invoice terlampir.</p>",
"text": "Halo {{nama_depan|Kak}}, invoice terlampir.",
"sending_domain_id": 1,
"from_email": "[email protected]",
"from_name": "Toko Rina",
"reply_to": "[email protected]",
"metadata": {"order_id": "1001", "source": "woocommerce"},
"attachments": [
{"filename": "invoice-1001.pdf", "content": "JVBERi0xLjQK...", "content_type": "application/pdf"}
]
}'Urutan pemeriksaan#
Sebelum email masuk antrean, kirim.id memeriksa request secara berurutan:
Alamat
torusak (bukan format email / lebih dari 255 karakter) → penalti 4 koin, lalu422.Validasi field, metadata, dan lampiran →
422.Domain harus milikmu dan aktif;
from_emailharus di domain itu →422.Saldo koin minimal 1 → kalau tidak,
422 Saldo koin habis.Penerima di suppression list → penalti +
422.Penerima dijadikan kontak (dibuat otomatis bila belum ada). Kalau kontak sudah unsubscribe/bounce/melapor spam → penalti +
422.Email masuk antrean →
201.
Lampiran#
| Field | Wajib | Aturan |
|---|---|---|
filename | ya | Nama file yang dilihat penerima, maks. 255. Folder, karakter kontrol, dan " \ / : * ? < > | dibuang. |
content | ya | Isi file dalam base64 standar (bukan data URL). Tidak boleh kosong. |
content_type | tidak | Mis. application/pdf. Kalau kosong, ditebak dari ekstensi. |
Maksimal 10 lampiran dan total 10 MB (ukuran asli, sebelum base64) per email. Batas body request 20 MB.
Ekstensi berisiko malware ditolak, mis.
.exe,.bat,.js,.vbs,.msi,.iso,.apk,.scr,.ps1. Kirim lewat link unduhan.File hanya disimpan sampai email diserahkan ke server pengiriman. Kalau email tertahan antrean lebih dari 4 hari, pesan berstatus
failedkarena lampiran kedaluwarsa.Biaya tetap 1 koin per email berapa pun lampirannya — tapi email besar lebih lambat dan lebih sering masuk spam.
Anti kirim dobel (Idempotency-Key)#
Jaringan bisa putus setelah kirim.id menerima email tapi sebelum jawabannya sampai ke server-mu. Kalau request diulang tanpa pengaman, penerima bisa mendapat dua email. Tambahkan header Idempotency-Key:
8–100 karakter, unik per email yang ingin dikirim (mis. ID pesanan + jenis email:
order-1001-invoice). Berlaku per akun, tanpa batas waktu.Request pertama →
201. Request berikutnya dengan key yang sama →200berisimessage_id& status pesan pertama, tanpa email baru dan tanpa potong koin. Isi body request ulang tidak diperiksa.Kalau request pertama ditolak (4xx), tidak ada yang tersimpan — key yang sama boleh dipakai lagi setelah diperbaiki.
Personalisasi (merge tag)#
Tulis {{nama_tag}} di subject, html, atau text. Tambahkan cadangan dengan {{nama_tag|Cadangan}} untuk dipakai kalau datanya kosong. Nama tag tidak peka huruf besar/kecil, tag tak dikenal dibiarkan apa adanya, dan nilai otomatis di-escape untuk HTML.
| Tag (dan alias) | Isi |
|---|---|
{{email}} | Email penerima |
{{nama}} · {{name}} | Nama kontak. Kontak yang dibuat otomatis oleh POST /messages belum punya nama — isi dulu lewat POST /contacts atau pakai cadangan. |
{{nama_depan}} · {{first_name}} | Kata pertama dari nama |
{{bisnis}} · {{nama_bisnis}} · {{perusahaan}} · {{company}} | Nama bisnismu |
{{alamat_bisnis}} · {{alamat_perusahaan}} | Alamat bisnismu (Pengaturan Akun) |
{{unsubscribe_url}} · {{link_berhenti_langganan}} · {{link_unsubscribe}} | Link berhenti langganan khusus penerima ini |
{{tahun}} | Tahun sekarang (WIB) |
{{judul_email}} · {{subjek}} | Subjek email |
Tag {{link_browser}}, {{versi_web}}, dan {{preheader}} hanya untuk campaign — di email API isinya kosong.
Pelacakan, unsubscribe & header#
Pelacakan klik — setiap link
href="http(s)://…"(tanda kutip ganda) diganti link pelacak yang langsung meneruskan ke tujuan asli. Linkmailto:,tel:, atau tanpa tanda kutip ganda tidak dilacak.Pelacakan buka — gambar 1×1 piksel ditambahkan di akhir email. Sebagian aplikasi (mis. Apple Mail) memuat gambar otomatis, jadi angka "dibuka" bisa sedikit lebih tinggi.
Unsubscribe — kalau isi email belum memuat link unsubscribe, kirim.id menambahkan footer berisi nama & alamat bisnis plus link "Berhenti berlangganan". Email juga membawa header
List-UnsubscribedanList-Unsubscribe-Post: List-Unsubscribe=One-Click(syarat Gmail & Yahoo).Header lain —
Message-ID,X-Campaign-id: api,X-Subscriber-id,X-Message-id. Return-Path memakai subdomain bounce domainmu dan email ditandatangani DKIM domainmu.
Pelacakan buka/klik dan footer unsubscribe tidak bisa dimatikan.
Langkah berikutnya#
Apakah artikel ini membantu?
Artikel terkait
Masih butuh bantuan?
Tim support kirim.id siap membantu · Senin–Jumat, 09.00–17.00 WIB

