Tóm tắt
Các API của Brevo cho phép bạn gửi email tiếp thị, email giao dịch và tin nhắn SMS theo chương trình. Bạn xác thực bằng khóa API, gửi yêu cầu đến api.brevo.com và sử dụng webhook để theo dõi việc gửi và tương tác. Để kiểm thử, hãy sử dụng Apidog để xác thực payload, kiểm tra trình xử lý webhook và đảm bảo tích hợp của bạn xử lý các email bị trả lại và hủy đăng ký chính xác.
Giới thiệu
Brevo (trước đây là Sendinblue) xử lý hàng triệu email mỗi ngày cho hơn 500.000 doanh nghiệp. Nó hỗ trợ các chiến dịch tiếp thị, email giao dịch, SMS marketing và quy trình tự động hóa.
API email không chỉ đơn giản là gửi tin nhắn – hệ thống sản xuất cần quản lý email bị trả lại, khiếu nại spam, hủy đăng ký và thời gian gửi. Brevo giúp bạn đơn giản hóa những vấn đề này.
Các trường hợp sử dụng chính:
- Chiến dịch tiếp thị: Gửi email hàng loạt tới danh sách liên hệ.
- Email giao dịch: Đặt lại mật khẩu, xác nhận đơn hàng, thông báo hệ thống.
- Tin nhắn SMS: Gửi mã xác minh, cảnh báo, SMS marketing.
💡 Nếu bạn tích hợp email vào ứng dụng, Apidog giúp kiểm thử mẫu, xác thực payload webhook, mô phỏng phản hồi Brevo và kiểm tra xử lý lỗi mà không cần gửi email thực.
Xác thực và thiết lập
Lấy khóa API
- Đăng nhập vào Brevo
- Chọn SMTP & API → API Keys
- Tạo khóa mới với quyền phù hợp
- Lưu trữ khóa an toàn
Khóa API dùng trong header api-key:
curl -X GET "https://api.brevo.com/v3/account" \
-H "accept: application/json" \
-H "api-key: your-api-key-here"
API Base URL
Tất cả request gửi về:
https://api.brevo.com/v3/
Giới hạn tỷ lệ
- Miễn phí: 300 requests/phút
- Khởi đầu: 600 requests/phút
- Doanh nghiệp: 1200 requests/phút
Kiểm tra header X-RateLimit-Remaining để theo dõi usage.
Gửi email giao dịch
Email giao dịch là những email được kích hoạt bởi hành động người dùng (đặt lại mật khẩu, xác nhận đơn hàng…).
Gửi một email đơn giản
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": "Your App",
"email": "noreply@yourapp.com"
},
"to": [
{
"email": "user@example.com",
"name": "John Doe"
}
],
"subject": "Welcome to Our Platform",
"htmlContent": "<html><body><h1>Welcome!</h1><p>Thanks for signing up.</p></body></html>",
"textContent": "Welcome! Thanks for signing up."
}'
Phản hồi:
{
"messageId": "<20260324123456.123456@relay.brevo.com>"
}
Gửi email sử dụng mẫu
Tạo mẫu trong Brevo, sau đó gửi theo 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"
}
}'
Biến mẫu trong nội dung:
<p>Chào {{params.name}},</p>
<p>Đơn hàng của bạn {{params.order_number}} đã được vận chuyển.</p>
<p><a href="{{params.tracking_url}}">Theo dõi gói hàng của bạn</a></p>
Gửi email với tệp đính kèm
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: 'Your App', email: 'noreply@yourapp.com' },
to: [{ email: 'user@example.com' }],
subject: 'Your Invoice',
htmlContent: '<p>Vui lòng tìm hóa đơn của bạn đính kèm.</p>',
attachment: [
{
name: 'invoice.pdf',
content: base64EncodedPdfContent
}
]
})
})
Chiến dịch tiếp thị
Email tiếp thị gửi đến danh sách liên hệ. Brevo xử lý hủy đăng ký, lên lịch, phân tích.
Tạo chiến dịch
curl -X POST "https://api.brevo.com/v3/emailCampaigns" \
-H "api-key: your-api-key" \
-H "content-type: application/json" \
-d '{
"name": "March Newsletter",
"subject": "What'\''s New in March",
"sender": {
"name": "Your Brand",
"email": "newsletter@yourbrand.com"
},
"type": "classic",
"htmlContent": "<html><body>Nội dung bản tin tại đây...</body></html>",
"recipients": {
"listIds": [12, 15]
},
"scheduledAt": "2026-03-25T09:00:00+00:00"
}'
Gửi ngay lập tức
curl -X POST "https://api.brevo.com/v3/emailCampaigns/{campaignId}/sendNow" \
-H "api-key: your-api-key"
Lấy số liệu chiến dịch
curl -X GET "https://api.brevo.com/v3/emailCampaigns/{campaignId}" \
-H "api-key: your-api-key"
Phản hồi mẫu:
{
"statistics": {
"delivered": 4850,
"opened": 1455,
"clicked": 291,
"unsubscribed": 12,
"bounces": 150
}
}
Quản lý liên hệ
Liên hệ là những người bạn gửi email. Tổ chức họ vào danh sách, thêm thuộc tính tuỳ chỉnh.
Tạo liên hệ
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
}'
Cờ updateEnabled: true sẽ update liên hệ nếu đã tồn tại.
Lấy chi tiết liên hệ
curl -X GET "https://api.brevo.com/v3/contacts/user@example.com" \
-H "api-key: your-api-key"
Thêm vào danh sách
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"]
}'
Xóa khỏi danh sách
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"]
}'
Hủy đăng ký liên hệ
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
}'
Tiếp thị SMS
Brevo gửi SMS toàn cầu qua API SMS.
Gửi tin nhắn SMS giao dịch
curl -X POST "https://api.brevo.com/v3/transactionalSMS/sms" \
-H "api-key: your-api-key" \
-H "content-type: application/json" \
-d '{
"sender": "YourApp",
"recipient": "+15551234567",
"content": "Mã xác minh của bạn là: 123456",
"type": "transactional"
}'
Gửi SMS tiếp thị
curl -X POST "https://api.brevo.com/v3/transactionalSMS/sms" \
-H "api-key: your-api-key" \
-H "content-type: application/json" \
-d '{
"sender": "YourBrand",
"recipient": "+15551234567",
"content": "Giảm giá chớp nhoáng! Giảm 50% chỉ hôm nay. Trả lời STOP để hủy đăng ký.",
"type": "marketing"
}'
Lấy thống kê 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"
Webhooks để theo dõi
Webhooks gửi realtime event về ứng dụng của bạn: đã gửi, mở, nhấp, trả lại, hủy đăng ký.
Cấu hình webhooks
Vào Brevo dashboard: Cài đặt → Webhooks → Thêm webhook. Chọn các sự kiện:
-
delivered: Đã gửi thành công -
opened: Đã mở -
clicked: Đã nhấp link -
bounced: Trả lại (hard/soft) -
spam: Báo cáo spam -
unsubscribed: Hủy đăng ký
Xử lý payload webhook
app.post('/webhooks/brevo', (req, res) => {
const event = req.body
switch (event.event) {
case 'delivered':
console.log(`Email ${event.messageId} đã được gửi đến ${event.email}`)
break
case 'opened':
console.log(`Email đã được mở bởi ${event.email} vào lúc ${event.date}`)
break
case 'bounced':
console.log(`Bị trả lại: ${event.email} - ${event.reason}`)
markContactBounced(event.email)
break
case 'spam':
console.log(`Khiếu nại spam từ ${event.email}`)
removeFromAllLists(event.email)
break
case 'unsubscribed':
console.log(`Đã hủy đăng ký: ${event.email}`)
break
}
res.status(200).send('OK')
})
Kiểm thử với Apidog
API email có nhiều trạng thái lỗi phức tạp. Bạn nên kiểm thử mẫu, email bị trả lại, webhook. Apidog hỗ trợ các bước này.
1. Mô phỏng gửi email
Không gửi email thật trong dev, dùng payload mô phỏng:
pm.test('API Email chấp nhận payload hợp lệ', () => {
const response = pm.response.json()
pm.expect(response).to.have.property('messageId')
pm.expect(response.messageId).to.match(/<.*@relay\.brevo\.com>/)
})
2. Kiểm thử xử lý webhook
Tạo payload webhook giả lập trong Apidog:
{
"event": "bounced",
"email": "invalid@example.com",
"messageId": "<12345@relay.brevo.com>",
"reason": "hard_bounce",
"date": "2026-03-24T12:00:00Z",
"subject": "Chào mừng đến với nền tảng của chúng tôi"
}
Gửi vào endpoint webhook và xác minh logic xử lý.
3. Xác thực mẫu
Lưu payload mẫu và kiểm thử biến:
pm.test('Các biến mẫu hợp lệ', () => {
const payload = pm.request.body.toJSON()
pm.expect(payload.params).to.have.property('name')
pm.expect(payload.params).to.have.property('order_number')
})
4. Tách biệt môi trường
# Môi trường phát triển
BREVO_API_KEY: xkeysib-dev-xxx
BREVO_SENDER: dev@yourapp.com
# Môi trường sản xuất
BREVO_API_KEY: xkeysib-prod-xxx
BREVO_SENDER: noreply@yourapp.com
Kiểm thử API email Brevo với Apidog - miễn phí.
Các lỗi và cách khắc phục thường gặp
400 Bad Request - Thiếu trường bắt buộc
Nguyên nhân: Payload thiếu trường quan trọng.
Khắc phục: Đọc chi tiết trong message trả về:
{
"code": "invalid_parameter",
"message": "sender.email là bắt buộc"
}
401 Unauthorized
Nguyên nhân: Sai hoặc thiếu API key.
Khắc phục: Kiểm tra header api-key và xác minh khóa chưa bị thu hồi.
402 Payment Required
Nguyên nhân: Hết quota hoặc thiếu credit.
Khắc phục:
- Email: Kiểm tra plan quota
- SMS: Mua thêm SMS credit
429 Too Many Requests
Nguyên nhân: Vượt giới hạn tỷ lệ.
Khắc phục: Áp dụng backoff lũy thừa:
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('Đã vượt quá giới hạn tỷ lệ')
}
404 Contact not found
Nguyên nhân: Cập nhật liên hệ không tồn tại.
Khắc phục: Dùng updateEnabled: true khi tạo:
{
"email": "new@example.com",
"updateEnabled": true
}
Thao tác này sẽ tạo mới nếu chưa có.
Các lựa chọn thay thế và so sánh
| Tính năng | Brevo | SendGrid | Mailchimp | Postmark |
|---|---|---|---|---|
| Giá | 300 email/ngày miễn phí | 100 email/ngày miễn phí | 500 email/tháng miễn phí | 100 email/tháng miễn phí |
| Email tiếp thị | Có | Có | Có | Không |
| Email giao dịch | Có | Có | Hạn chế | Có (chuyên biệt) |
| SMS | Có | Không | Không | Không |
| Tự động hóa | Có | Có | Có | Hạn chế |
| Trình chỉnh sửa mẫu | Trực quan + mã | Mã | Trực quan | Mã |
Brevo nổi bật nhờ hỗ trợ cả email và SMS với giá cạnh tranh.
Các trường hợp sử dụng thực tế
Quy trình đặt hàng thương mại điện tử: Dùng Brevo cho xác nhận đơn hàng, thông báo vận chuyển, phục hồi giỏ hàng bị bỏ quên (tự động hóa), khuyến mãi hàng tuần – tất cả qua một tích hợp duy nhất.
Onboarding SaaS: Gửi email chào mừng, đặt lại mật khẩu, mời nhóm qua API giao dịch; các chiến dịch tiếp thị thông báo tính năng mới.
Xác minh SMS: Ứng dụng fintech sử dụng API SMS Brevo cho mã 2FA, webhook để kiểm soát lỗi gửi.
Kết luận
Bạn đã nắm được:
- API Brevo cho email tiếp thị, giao dịch và SMS
- Xác thực bằng header
api-key - Sử dụng mẫu để đảm bảo email đồng nhất, dễ bảo trì
- Quản lý liên hệ/danh sách cho các chiến dịch mục tiêu
- Webhooks để theo dõi gửi/mở/nhấp/trả lại
- Kiểm thử toàn diện với Apidog trước khi gửi thực tế
Các bước tiếp theo:
- Tạo tài khoản Brevo và lấy API key
- Gửi email giao dịch đầu tiên
- Tạo mẫu với trình chỉnh sửa Brevo
- Thiết lập xử lý webhook cho trả lại/hủy đăng ký
- Kiểm thử với Apidog trong quá trình phát triển
Kiểm thử API email Brevo với Apidog - miễn phí
Câu hỏi thường gặp
Brevo và Sendinblue khác nhau như thế nào?
Cùng sản phẩm, chỉ đổi tên. Sendinblue thành Brevo từ 2023. API vẫn là api.brevo.com.
Có thể gửi bao nhiêu email miễn phí?
300 email/ngày (9.000/tháng) cho gói Free. Gửi nhiều hơn cần nâng cấp gói trả phí.
Có thể dùng Brevo cho email lạnh (cold email) không?
Có nhưng rủi ro cao. Cold email dễ bị trả lại, spam. Tỷ lệ khiếu nại cao có thể tạm ngưng tài khoản.
Làm thế nào xử lý email bị trả lại?
Lắng nghe webhook bounced. Hard bounce (email không hợp lệ) cần xóa liên hệ, soft bounce có thể thử lại. Nếu bounce >5%, danh tiếng gửi giảm.
Khác biệt giữa email tiếp thị và giao dịch?
Giao dịch: Kích hoạt theo hành động user, gửi 1 người.
Tiếp thị: Chiến dịch gửi nhiều người. Brevo tách biệt vì lý do khả năng gửi và compliance.
Thêm link hủy đăng ký như thế nào?
Brevo tự động chèn cho email tiếp thị. Email giao dịch tự thêm:
<a href="{{ unsubscribe_url }}">Hủy đăng ký</a>
Có thể gửi email từ domain riêng không?
Có. Thiết lập SPF, DKIM, DMARC trong phần Người gửi & IP. Nếu thiếu xác thực, email dễ vào spam.
Lên lịch gửi email múi giờ cụ thể?
Dùng scheduledAt dạng ISO 8601:
{
"scheduledAt": "2026-03-25T09:00:00-05:00"
}
Nếu bị giới hạn tỷ lệ?
Nhận lỗi 429, header X-RateLimit-Reset trả về số giây đến khi reset. Nên dùng backoff hoặc queue email.


Top comments (0)