TL;DR
API Brevo memungkinkan Anda mengirim email pemasaran, email transaksional, dan pesan SMS secara terprogram. Anda melakukan otentikasi dengan kunci API, mengirim permintaan ke `api.brevo.com`, dan menggunakan webhook untuk melacak pengiriman dan interaksi. Untuk pengujian, gunakan Apidog untuk memvalidasi payload, menguji handler webhook, dan memastikan integrasi Anda menangani pantulan (bounces) dan berhenti berlangganan (unsubscribes) dengan benar.
Pendahuluan
Brevo (sebelumnya Sendinblue) memproses jutaan email setiap hari untuk lebih dari 500.000 bisnis. Ini menangani kampanye pemasaran, email transaksional, pemasaran SMS, dan alur kerja otomatisasi.
API Email terlihat sederhana - kirim pesan, selesai. Namun sistem email produksi perlu menangani pantulan, keluhan spam, berhenti berlangganan, dan waktu pengiriman. Brevo mengelola kerumitan ini agar Anda tidak perlu melakukannya.
API mencakup tiga kasus penggunaan utama:
- Kampanye pemasaran - Email massal ke daftar kontak
- Email transaksional - Reset kata sandi, konfirmasi pesanan, notifikasi
- Pesan SMS - Kode verifikasi, peringatan, teks pemasaran
Otentikasi dan pengaturan
Dapatkan kunci API
- Masuk ke Brevo
- Buka SMTP & API → Kunci API
- Buat kunci baru dengan izin yang sesuai
- Simpan dengan aman
Kunci API ditempatkan di header api-key:
curl -X GET "https://api.brevo.com/v3/account" \
-H "accept: application/json" \
-H "api-key: your-api-key-here"
URL dasar API
Semua permintaan masuk ke:
https://api.brevo.com/v3/
Batas tingkat permintaan
Brevo membatasi permintaan berdasarkan paket:
- Gratis: 300 permintaan/menit
- Pemula: 600 permintaan/menit
- Bisnis: 1200 permintaan/menit
Periksa header X-RateLimit-Remaining untuk melacak penggunaan.
Mengirim email transaksional
Email transaksional adalah pesan individual yang dipicu oleh tindakan pengguna. Contohnya adalah reset kata sandi, konfirmasi pesanan, email selamat datang.
Kirim email sederhana
curl -X POST "https://api.brevo.com/v3/smtp/email" \
-H "accept: application/json" \
-H "api-key: your-api-key" \
-H "content-type: application/json" \
-d '{
"sender": {
"name": "Aplikasi Anda",
"email": "noreply@yourapp.com"
},
"to": [
{
"email": "user@example.com",
"name": "John Doe"
}
],
"subject": "Selamat Datang di Platform Kami",
"htmlContent": "<html><body><h1>Selamat Datang!</h1><p>Terima kasih telah mendaftar.</p></body></html>",
"textContent": "Selamat Datang! Terima kasih telah mendaftar."
}'
Respons:
{
"messageId": "<20260324123456.123456@relay.brevo.com>"
}
Menggunakan template
Buat template di editor visual Brevo, lalu kirim berdasarkan ID:
curl -X POST "https://api.brevo.com/v3/smtp/email" \
-H "api-key: your-api-key" \
-H "content-type: application/json" \
-d '{
"templateId": 15,
"to": [
{
"email": "user@example.com",
"name": "John Doe"
}
],
"params": {
"name": "John",
"order_number": "ORD-12345",
"tracking_url": "https://tracking.example.com/ORD-12345"
}
}'
Variabel template menggunakan kurung kurawal ganda:
<p>Halo {{params.name}},</p>
<p>Pesanan Anda {{params.order_number}} telah dikirim.</p>
<p><a href="{{params.tracking_url}}">Lacak paket Anda</a></p>
Kirim dengan lampiran
const response = await fetch('https://api.brevo.com/v3/smtp/email', {
method: 'POST',
headers: {
'api-key': process.env.BREVO_API_KEY,
'content-type': 'application/json'
},
body: JSON.stringify({
sender: { name: 'Aplikasi Anda', email: 'noreply@yourapp.com' },
to: [{ email: 'user@example.com' }],
subject: 'Faktur Anda',
htmlContent: '<p>Silakan temukan faktur Anda terlampir.</p>',
attachment: [
{
name: 'invoice.pdf',
content: base64EncodedPdfContent
}
]
})
})
Kampanye pemasaran
Email pemasaran ditujukan ke daftar kontak. Brevo menangani tautan berhenti berlangganan, penjadwalan, dan analitik.
Buat kampanye
curl -X POST "https://api.brevo.com/v3/emailCampaigns" \
-H "api-key: your-api-key" \
-H "content-type: application/json" \
-d '{
"name": "Buletin Maret",
"subject": "Apa yang Baru di Bulan Maret",
"sender": {
"name": "Merek Anda",
"email": "newsletter@yourbrand.com"
},
"type": "classic",
"htmlContent": "<html><body>Konten Buletin di sini...</body></html>",
"recipients": {
"listIds": [12, 15]
},
"scheduledAt": "2026-03-25T09:00:00+00:00"
}'
Kirim segera
curl -X POST "https://api.brevo.com/v3/emailCampaigns/{campaignId}/sendNow" \
-H "api-key: your-api-key"
Dapatkan statistik kampanye
curl -X GET "https://api.brevo.com/v3/emailCampaigns/{campaignId}" \
-H "api-key: your-api-key"
Respons mencakup:
{
"statistics": {
"delivered": 4850,
"opened": 1455,
"clicked": 291,
"unsubscribed": 12,
"bounces": 150
}
}
Manajemen kontak
Kontak adalah orang-orang yang Anda kirimi email. Atur mereka ke dalam daftar dan tambahkan atribut khusus.
Buat kontak
curl -X POST "https://api.brevo.com/v3/contacts" \
-H "api-key: your-api-key" \
-H "content-type: application/json" \
-d '{
"email": "new.user@example.com",
"attributes": {
"FIRSTNAME": "Jane",
"LASTNAME": "Smith",
"PLAN": "premium"
},
"listIds": [12, 15],
"updateEnabled": true
}'
Flag updateEnabled: true memperbarui kontak yang sudah ada daripada gagal.
Dapatkan detail kontak
curl -X GET "https://api.brevo.com/v3/contacts/user@example.com" \
-H "api-key: your-api-key"
Tambahkan ke daftar
curl -X POST "https://api.brevo.com/v3/contacts/lists/12/contacts/add" \
-H "api-key: your-api-key" \
-H "content-type: application/json" \
-d '{
"emails": ["user1@example.com", "user2@example.com"]
}'
Hapus dari daftar
curl -X DELETE "https://api.brevo.com/v3/contacts/lists/12/contacts/remove" \
-H "api-key: your-api-key" \
-H "content-type: application/json" \
-d '{
"emails": ["user@example.com"]
}'
Berhenti berlangganan kontak
curl -X PUT "https://api.brevo.com/v3/contacts/user@example.com" \
-H "api-key: your-api-key" \
-H "content-type: application/json" \
-d '{
"emailBlacklisted": true
}'
Pemasaran SMS
Brevo mengirim pesan SMS secara global melalui API SMS mereka.
Kirim SMS
curl -X POST "https://api.brevo.com/v3/transactionalSMS/sms" \
-H "api-key: your-api-key" \
-H "content-type: application/json" \
-d '{
"sender": "AplikasiAnda",
"recipient": "+15551234567",
"content": "Kode verifikasi Anda adalah: 123456",
"type": "transactional"
}'
Kirim SMS pemasaran
curl -X POST "https://api.brevo.com/v3/transactionalSMS/sms" \
-H "api-key: your-api-key" \
-H "content-type: application/json" \
-d '{
"sender": "MerekAnda",
"recipient": "+15551234567",
"content": "Flash sale! Diskon 50% hanya hari ini. Balas STOP untuk berhenti berlangganan.",
"type": "marketing"
}'
Dapatkan statistik SMS
curl -X GET "https://api.brevo.com/v3/transactionalSMS/statistics?startDate=2026-03-01&endDate=2026-03-31" \
-H "api-key: your-api-key"
Webhook untuk pelacakan
Webhook memberi tahu aplikasi Anda tentang peristiwa email: terkirim, dibuka, diklik, terpental, berhenti berlangganan.
Konfigurasi webhook
Di dasbor Brevo: Pengaturan → Webhook → Tambah webhook
Peristiwa yang akan dilacak:
delivered- Email sampai di kotak masukopened- Penerima membuka emailclicked- Penerima mengklik tautanbounced- Email terpental (keras atau lunak)spam- Ditandai sebagai spamunsubscribed- Penerima berhenti berlangganan
Tangani payload webhook
app.post('/webhooks/brevo', (req, res) => {
const event = req.body
switch (event.event) {
case 'delivered':
console.log(`Email ${event.messageId} terkirim ke ${event.email}`)
break
case 'opened':
console.log(`Email dibuka oleh ${event.email} pada ${event.date}`)
break
case 'bounced':
console.log(`Pantulan: ${event.email} - ${event.reason}`)
// Tandai kontak sebagai tidak valid
markContactBounced(event.email)
break
case 'spam':
console.log(`Keluhan spam dari ${event.email}`)
// Hapus dari semua daftar
removeFromAllLists(event.email)
break
case 'unsubscribed':
console.log(`Berhenti berlangganan: ${event.email}`)
break
}
res.status(200).send('OK')
})
Pengujian dengan Apidog
API email memiliki mode kegagalan yang kompleks. Anda perlu menguji template, pantulan, dan webhook. Apidog membantu.

1. Mock pengiriman email
Selama pengembangan, jangan mengirim email sungguhan. Mock responsnya:
pm.test('API Email menerima payload yang valid', () => {
const response = pm.response.json()
pm.expect(response).to.have.property('messageId')
pm.expect(response.messageId).to.match(/<.*@relay\.brevo\.com>/)
})

2. Uji penanganan webhook
Buat mock payload webhook di Apidog:
{
"event": "bounced",
"email": "invalid@example.com",
"messageId": "<12345@relay.brevo.com>",
"reason": "hard_bounce",
"date": "2026-03-24T12:00:00Z",
"subject": "Selamat Datang di Platform Kami"
}
Kirim ke endpoint webhook Anda dan verifikasi bahwa kode Anda menanganinya.
3. Validasi template
Simpan payload template dan uji bahwa variabel diganti dengan benar:
pm.test('Variabel template valid', () => {
const payload = pm.request.body.toJSON()
pm.expect(payload.params).to.have.property('name')
pm.expect(payload.params).to.have.property('order_number')
})
4. Pemisahan lingkungan
# Pengembangan
BREVO_API_KEY: xkeysib-dev-xxx
BREVO_SENDER: dev@yourapp.com
# Produksi
BREVO_API_KEY: xkeysib-prod-xxx
BREVO_SENDER: noreply@yourapp.com
Uji API email Brevo dengan Apidog - gratis
Kesalahan umum dan perbaikannya
400 Bad Request - Bidang yang wajib diisi hilang
Penyebab: Payload kehilangan bidang yang wajib diisi.
Perbaikan: Periksa pesan kesalahan untuk detailnya:
{
"code": "invalid_parameter",
"message": "sender.email diperlukan"
}
401 Unauthorized
Penyebab: Kunci API tidak valid atau hilang.
Perbaikan: Verifikasi header api-key diatur dengan benar. Periksa apakah kunci belum dicabut.
402 Payment Required
Penyebab: Akun telah melebihi batas atau kehilangan kredit.
Perbaikan:
- Untuk email: Periksa batas email paket Anda
- Untuk SMS: Beli kredit SMS
429 Too Many Requests
Penyebab: Batas tingkat permintaan terlampaui.
Perbaikan: Terapkan backoff eksponensial:
async function sendWithRetry(email, retries = 3) {
for (let i = 0; i < retries; i++) {
const response = await sendEmail(email)
if (response.status === 429) {
await sleep(Math.pow(2, i) * 1000)
} else {
return response
}
}
throw new Error('Batas tingkat permintaan terlampaui')
}
404 Kontak tidak ditemukan
Penyebab: Mencoba memperbarui kontak yang tidak ada.
Perbaikan: Gunakan updateEnabled: true saat membuat kontak:
{
"email": "new@example.com",
"updateEnabled": true
}
Ini membuat atau memperbarui kontak.
Alternatif dan perbandingan
| Fitur | Brevo | SendGrid | Mailchimp | Postmark |
|---|---|---|---|---|
| Harga | 300 email/hari gratis | 100 email/hari gratis | 500 email/bulan gratis | 100 email/bulan gratis |
| Email pemasaran | Ya | Ya | Ya | Tidak |
| Email transaksional | Ya | Ya | Terbatas | Ya (spesialisasi) |
| SMS | Ya | Tidak | Tidak | Tidak |
| Otomatisasi | Ya | Ya | Ya | Terbatas |
| Editor template | Visual + kode | Kode | Visual | Kode |
Brevo menonjol karena dukungan email dan SMS gabungan dengan harga yang kompetitif.
Kasus penggunaan dunia nyata
Alur pesanan e-commerce. Toko online menggunakan Brevo untuk: konfirmasi pesanan (transaksional), notifikasi pengiriman (transaksional), pemulihan keranjang yang ditinggalkan (otomatisasi pemasaran), dan promosi mingguan (kampanye pemasaran). Semuanya dari satu integrasi.
Orientasi SaaS. Alat manajemen proyek mengirim email selamat datang, reset kata sandi, dan undangan tim melalui API transaksional. Email pemasaran mengumumkan fitur baru kepada pengguna yang memilih ikut serta.
Verifikasi SMS. Aplikasi fintech menggunakan API SMS Brevo untuk kode otentikasi dua faktor. Endpoint SMS transaksional mengirimkan kode dalam hitungan detik, dan webhook melacak kegagalan pengiriman untuk logika coba lagi.
Kesimpulan
Berikut adalah apa yang telah Anda pelajari:
- API Brevo menangani pemasaran, email transaksional, dan SMS
- Otentikasi dengan header
api-key - Gunakan template untuk email yang konsisten dan mudah dipelihara
- Kelola kontak dan daftar untuk kampanye yang ditargetkan
- Webhook melacak pengiriman, pembukaan, klik, dan pantulan
- Uji dengan Apidog dalam pengembangan
Langkah selanjutnya:
- Buat akun Brevo dan dapatkan kunci API
- Kirim email transaksional pertama Anda
- Buat template di editor visual
- Siapkan handler webhook untuk pantulan dan berhenti berlangganan
- Uji dengan Apidog dalam pengembangan
Uji API email Brevo dengan Apidog - gratis
FAQ
Apa perbedaan antara Brevo dan Sendinblue?Produk yang sama, nama baru. Sendinblue berganti nama menjadi Brevo pada tahun 2023. API masih menggunakan `api.brevo.com` tetapi Anda akan melihat referensi Sendinblue di dokumentasi lama.
Berapa banyak email yang bisa saya kirim secara gratis?300 email per hari di paket gratis. Itu berarti 9.000 email per bulan. Untuk lebih banyak, tingkatkan ke paket berbayar mulai dari $25/bulan untuk 20.000 email.
Bisakah saya menggunakan Brevo untuk email dingin (cold emails)?Secara teknis ya, tapi itu berisiko. Email dingin memiliki tingkat pantulan dan spam yang tinggi. Brevo memantau reputasi pengirim. Tingkat keluhan yang tinggi menyebabkan akun ditangguhkan. Hangatkan domain Anda terlebih dahulu dan ikuti praktik terbaik email.
Bagaimana cara menangani pantulan email?Dengarkan webhook bounced. Pantulan keras (email tidak valid) harus menghapus kontak secara permanen. Pantulan lunak (kotak surat penuh, masalah sementara) dapat dicoba lagi. Lacak tingkat pantulan - jika melebihi 5%, reputasi pengirim Anda akan menurun.
Apa perbedaan antara email pemasaran dan email transaksional?Email transaksional dipicu oleh tindakan pengguna (pembelian, pendaftaran) dan dikirim ke satu penerima. Email pemasaran adalah kampanye yang dikirim ke banyak penerima secara bersamaan. Brevo memisahkannya demi alasan pengiriman dan kepatuhan.
Bagaimana cara menambahkan tautan berhenti berlangganan?Brevo secara otomatis menambahkan tautan berhenti berlangganan ke email pemasaran. Untuk email transaksional, tambahkan tautan Anda sendiri:
<a href="{{ unsubscribe_url }}">Berhenti Berlangganan</a>
Bisakah saya mengirim email dari domain saya sendiri?Ya. Atur catatan SPF, DKIM, dan DMARC. Brevo menyediakan nilainya di Pengaturan → Pengirim & IP. Tanpa otentikasi yang tepat, email mungkin masuk ke spam.
Bagaimana cara menjadwalkan email di zona waktu tertentu?Gunakan parameter scheduledAt dengan stempel waktu ISO 8601:
{
"scheduledAt": "2026-03-25T09:00:00-05:00"
}
Apa yang terjadi jika saya mencapai batas tingkat permintaan?Anda akan mendapatkan kesalahan 429. Respons mencakup header X-RateLimit-Reset dengan detik hingga reset. Terapkan backoff eksponensial atau antrekan email untuk nanti.
