Forem

Cover image for Cara Menggunakan Brevo API untuk SMS Marketing
Walse
Walse

Posted on • Originally published at apidog.com

Cara Menggunakan Brevo API untuk SMS Marketing

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.

Coba Apidog hari ini

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

  1. Login ke Brevo
  2. Buka SMTP & API → Kunci API
  3. Buat kunci baru dengan izin yang dibutuhkan
  4. 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"
Enter fullscreen mode Exit fullscreen mode

URL Dasar API

Semua permintaan menggunakan base URL:

https://api.brevo.com/v3/
Enter fullscreen mode Exit fullscreen mode

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."
  }'
Enter fullscreen mode Exit fullscreen mode

Respons:

{
  "messageId": "<20260324123456.123456@relay.brevo.com>"
}
Enter fullscreen mode Exit fullscreen mode

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"
    }
  }'
Enter fullscreen mode Exit fullscreen mode

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>
Enter fullscreen mode Exit fullscreen mode

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
      }
    ]
  })
})
Enter fullscreen mode Exit fullscreen mode

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"
  }'
Enter fullscreen mode Exit fullscreen mode

Kirim Segera

curl -X POST "https://api.brevo.com/v3/emailCampaigns/{campaignId}/sendNow" \
  -H "api-key: your-api-key"
Enter fullscreen mode Exit fullscreen mode

Dapatkan Statistik Kampanye

curl -X GET "https://api.brevo.com/v3/emailCampaigns/{campaignId}" \
  -H "api-key: your-api-key"
Enter fullscreen mode Exit fullscreen mode

Respons:

{
  "statistics": {
    "delivered": 4850,
    "opened": 1455,
    "clicked": 291,
    "unsubscribed": 12,
    "bounces": 150
  }
}
Enter fullscreen mode Exit fullscreen mode

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
  }'
Enter fullscreen mode Exit fullscreen mode

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"
Enter fullscreen mode Exit fullscreen mode

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"]
  }'
Enter fullscreen mode Exit fullscreen mode

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"]
  }'
Enter fullscreen mode Exit fullscreen mode

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
  }'
Enter fullscreen mode Exit fullscreen mode

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"
  }'
Enter fullscreen mode Exit fullscreen mode

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"
  }'
Enter fullscreen mode Exit fullscreen mode

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"
Enter fullscreen mode Exit fullscreen mode

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')
})
Enter fullscreen mode Exit fullscreen mode

Pengujian dengan Apidog

API email sering mengalami error edge-case. Untuk pengujian robust, gunakan Apidog.

Apidog Email Test

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>/)
})
Enter fullscreen mode Exit fullscreen mode

Apidog Webhook Test

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"
}
Enter fullscreen mode Exit fullscreen mode

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')
})
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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"
}
Enter fullscreen mode Exit fullscreen mode

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')
}
Enter fullscreen mode Exit fullscreen mode

404 Kontak Tidak Ditemukan

Penyebab: Update kontak yang belum ada.

Solusi: Gunakan updateEnabled: true saat membuat kontak:

{
  "email": "new@example.com",
  "updateEnabled": true
}
Enter fullscreen mode Exit fullscreen mode

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:

  1. Daftar Brevo dan dapatkan API key
  2. Kirim email transaksional pertama Anda
  3. Buat template di editor visual
  4. Setup handler webhook untuk bounces dan unsubscribe
  5. 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>
Enter fullscreen mode Exit fullscreen mode

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"
}
Enter fullscreen mode Exit fullscreen mode

Jika melewati batas rate limit?

Dapat error 429. Cek header X-RateLimit-Reset untuk retry. Terapkan backoff atau antre email.

Top comments (0)