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. Layanan ini menangani kampanye pemasaran, email transaksional, pemasaran SMS, dan otomasi workflow.
API Email Brevo terlihat sederhana: kirim pesan, selesai. Tetapi untuk sistem produksi, Anda juga perlu menangani pantulan, keluhan spam, berhenti berlangganan, dan waktu pengiriman. Brevo mengelola semua kompleksitas ini.
Tiga use case utama API:
- Kampanye pemasaran: Kirim email massal ke daftar kontak.
- Email transaksional: Reset password, konfirmasi pesanan, notifikasi.
- Pesan SMS: Kode verifikasi, alert, pesan marketing.
💡 Tip: Jika Anda mengintegrasikan email ke aplikasi, Apidog membantu menguji template, validasi payload webhook, dan memastikan integrasi Anda berjalan di semua klien email. Anda bisa meniru respons Brevo dan menguji penanganan error tanpa mengirim email sungguhan.
Otentikasi dan Pengaturan
Dapatkan kunci API
- Login ke Brevo
- Buka SMTP & API → Kunci API
- Buat kunci baru dengan izin yang dibutuhkan
- Simpan dengan aman
Header untuk setiap request:
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 menggunakan base URL:
https://api.brevo.com/v3/
Batas Tingkat Permintaan
- Gratis: 300 permintaan/menit
- Pemula: 600 permintaan/menit
- Bisnis: 1200 permintaan/menit
Cek header X-RateLimit-Remaining untuk memantau limit.
Mengirim Email Transaksional
Email transaksional dikirim satu per satu, dipicu event user seperti reset password, konfirmasi pesanan.
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 dashboard 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:
<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
Untuk email massal ke daftar kontak.
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:
{
"statistics": {
"delivered": 4850,
"opened": 1455,
"clicked": 291,
"unsubscribed": 12,
"bounces": 150
}
}
Manajemen Kontak
Atur kontak ke dalam daftar, tambahkan atribut, kelola status.
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
}'
updateEnabled: true akan memperbarui kontak jika sudah ada.
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 mendukung pengiriman SMS global.
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 mengirimkan notifikasi ke endpoint Anda saat event terjadi pada email (terkirim, dibuka, dibounce, dll).
Konfigurasi Webhook
- Dasbor Brevo: Pengaturan → Webhook → Tambah webhook
- Pilih event:
delivered,opened,clicked,bounced,spam,unsubscribed
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}`)
markContactBounced(event.email)
break
case 'spam':
console.log(`Keluhan spam dari ${event.email}`)
removeFromAllLists(event.email)
break
case 'unsubscribed':
console.log(`Berhenti berlangganan: ${event.email}`)
break
}
res.status(200).send('OK')
})
Pengujian dengan Apidog
API email sering mengalami error edge-case. Untuk pengujian robust, gunakan Apidog.
1. Mock Pengiriman Email
Jangan kirim email sungguhan saat dev. Mock respons:
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 cek penanganannya.
3. Validasi Template
Pastikan variabel pada payload template 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
Pisahkan konfigurasi dev dan produksi:
# 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 Wajib Hilang
Penyebab: Payload kurang field wajib.
Solusi: Cek pesan error:
{
"code": "invalid_parameter",
"message": "sender.email diperlukan"
}
401 Unauthorized
Penyebab: Kunci API salah atau tidak dikirim.
Solusi: Pastikan header api-key benar dan kunci belum dicabut.
402 Payment Required
Penyebab: Batas paket terlampaui atau kredit habis.
Solusi:
- Email: cek kuota email
- SMS: beli kredit SMS
429 Too Many Requests
Penyebab: Limit request terlampaui.
Solusi: 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: Update kontak yang belum ada.
Solusi: Gunakan updateEnabled: true saat membuat kontak:
{
"email": "new@example.com",
"updateEnabled": true
}
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 kombinasi email dan SMS dengan harga kompetitif.
Kasus Penggunaan Dunia Nyata
E-commerce: Toko online mengirim konfirmasi order (transaksional), notifikasi pengiriman, pemulihan keranjang (otomasi), dan promosi mingguan (kampanye) – satu integrasi.
SaaS onboarding: Aplikasi project management mengirim email welcome, reset password, dan undangan tim via API transaksional. Email marketing untuk pengumuman fitur baru.
Verifikasi SMS: Aplikasi fintech mengirim kode 2FA via API SMS. Endpoint SMS transaksional memastikan pengiriman cepat; webhook untuk retry jika gagal.
Kesimpulan
Poin utama:
- API Brevo untuk email marketing, email transaksional, dan SMS
- Otentikasi via header
api-key - Gunakan template untuk email yang konsisten
- Kelola kontak & daftar untuk segmentasi
- Webhook untuk tracking event email
- Uji otomatis dengan Apidog di tahap pengembangan
Langkah selanjutnya:
- Daftar Brevo dan dapatkan API key
- Kirim email transaksional pertama Anda
- Buat template di editor visual
- Setup handler webhook untuk bounces dan unsubscribe
- Uji semuanya dengan Apidog
Uji API email Brevo dengan Apidog – gratis.
FAQ
Apa perbedaan antara Brevo dan Sendinblue?
Produk yang sama, nama baru. Sendinblue jadi Brevo (2023). API tetap api.brevo.com meski dokumentasi lama kadang sebut Sendinblue.
Berapa banyak email gratis?
300 email/hari di paket gratis (9.000/bulan). Upgrade untuk lebih banyak kapasitas.
Bisakah pakai untuk cold email?
Bisa, tapi berisiko. Tingkat bounce dan spam tinggi bisa suspend akun. Hangatkan domain dan ikuti best practice.
Bagaimana menangani bounce?
Dengarkan webhook bounced. Bounce keras: hapus kontak permanen. Bounce lunak: retry. Pantau tingkat bounce (<5%).
Marketing vs Transaksional?
Transaksional: dipicu aksi user, ke satu penerima. Marketing: kampanye massal. Brevo pisahkan untuk compliance.
Bagaimana menambahkan link unsubscribe?
Brevo otomatis pada email marketing. Untuk transaksional, tambahkan manual:
<a href="{{ unsubscribe_url }}">Berhenti Berlangganan</a>
Bisakah kirim dari domain sendiri?
Ya. Setup SPF, DKIM, DMARC di dashboard Brevo. Tanpa ini, email rawan masuk spam.
Jadwalkan email di zona waktu tertentu?
Gunakan parameter scheduledAt dengan timezone:
{
"scheduledAt": "2026-03-25T09:00:00-05:00"
}
Jika melewati batas rate limit?
Dapat error 429. Cek header X-RateLimit-Reset untuk retry. Terapkan backoff atau antre email.


Top comments (0)