요약
Brevo API를 사용하면 마케팅 이메일, 트랜잭션 이메일, SMS 메시지를 프로그래밍으로 전송할 수 있습니다. API 키 인증을 사용하여 api.brevo.com으로 요청을 보내고, 웹훅을 통해 전송 및 참여 이벤트를 추적합니다. 테스트 시 Apidog를 활용해 페이로드 검증, 웹훅 핸들러 검증, 통합 시 오류 및 구독 취소 처리를 점검하세요.
소개
Brevo(구 Sendinblue)는 50만 개 이상의 기업이 매일 수백만 건의 이메일을 처리할 수 있도록 지원합니다. 마케팅 캠페인, 트랜잭션 이메일, SMS 마케팅, 자동화 워크플로우까지 모두 제공합니다.
이메일 API는 단순한 전송을 넘어서 실제 운영 환경에서 반송, 스팸 신고, 구독 취소, 전송 지연 등 여러 상황을 다뤄야 합니다. Brevo는 이 복잡성을 추상화하여 사용자 개발 부담을 줄입니다.
API 주요 사용 사례:
- 마케팅 캠페인: 대량 이메일 발송
- 트랜잭션 이메일: 비밀번호 재설정, 주문 확인, 알림 등
- SMS 메시지: 인증 코드, 알림, 마케팅 문자
💡 앱에 이메일 통합 시 Apidog를 활용해 템플릿 테스트, 웹훅 페이로드 검증, 이메일 클라이언트 전반에서 통합 정상 동작 확인이 가능합니다. 실제 이메일 전송 없이 Brevo 응답을 모의(Mock)해 오류 처리까지 테스트할 수 있습니다.
인증 및 설정
API 키 받기
- Brevo 개발자 센터에 로그인
- SMTP & API → API 키로 이동
- 필요한 권한으로 새 키 생성
- 안전하게 저장
API 키는 api-key 헤더에 추가합니다:
curl -X GET "https://api.brevo.com/v3/account" \
-H "accept: application/json" \
-H "api-key: your-api-key-here"
API 기본 URL
https://api.brevo.com/v3/
전송량 제한
Brevo는 요금제에 따라 요청을 제한합니다:
- 무료: 분당 300 요청
- 스타터: 분당 600 요청
- 비즈니스: 분당 1200 요청
X-RateLimit-Remaining 헤더로 사용량 추적이 가능합니다.
트랜잭션 이메일 전송
트랜잭션 이메일은 비밀번호 재설정, 주문 확인, 환영 이메일 등 사용자 행동에 의해 트리거됩니다.
간단한 이메일 보내기
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."
}'
응답 예시:
{
"messageId": "<20260324123456.123456@relay.brevo.com>"
}
템플릿 사용
시각 편집기에서 템플릿 생성 후 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"
}
}'
템플릿 내 변수 사용 예시:
<p>Hi {{params.name}},</p>
<p>Your order {{params.order_number}} has shipped.</p>
<p><a href="{{params.tracking_url}}">Track your package</a></p>
첨부 파일 포함 전송
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>Please find your invoice attached.</p>',
attachment: [
{
name: 'invoice.pdf',
content: base64EncodedPdfContent
}
]
})
})
마케팅 캠페인
마케팅 이메일은 목록 전체로 발송하며, 구독 취소, 예약, 분석 기능이 포함됩니다.
캠페인 생성
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>Newsletter content here...</body></html>",
"recipients": {
"listIds": [12, 15]
},
"scheduledAt": "2026-03-25T09:00:00+00:00"
}'
즉시 보내기
curl -X POST "https://api.brevo.com/v3/emailCampaigns/{campaignId}/sendNow" \
-H "api-key: your-api-key"
캠페인 통계 가져오기
curl -X GET "https://api.brevo.com/v3/emailCampaigns/{campaignId}" \
-H "api-key: your-api-key"
응답 예:
{
"statistics": {
"delivered": 4850,
"opened": 1455,
"clicked": 291,
"unsubscribed": 12,
"bounces": 150
}
}
연락처 관리
연락처는 이메일 전송의 대상입니다. 목록 구성과 속성(커스텀 필드) 관리도 지원합니다.
연락처 생성
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를 사용하면 기존 연락처도 업데이트됩니다.
연락처 세부 정보 가져오기
curl -X GET "https://api.brevo.com/v3/contacts/user@example.com" \
-H "api-key: your-api-key"
목록에 추가
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"]
}'
목록에서 제거
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"]
}'
연락처 구독 취소
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
}'
SMS 마케팅
Brevo SMS API로 글로벌 SMS 전송이 가능합니다.
SMS 보내기
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": "Your verification code is: 123456",
"type": "transactional"
}'
마케팅 SMS 보내기
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": "Flash sale! 50% off today only. Reply STOP to unsubscribe.",
"type": "marketing"
}'
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"
추적을 위한 웹훅
웹훅은 이메일 이벤트(전송, 열림, 클릭, 반송, 구독 취소 등)를 실시간으로 알려줍니다.
웹훅 구성
Brevo 대시보드: 설정 → 웹훅 → 웹훅 추가
추적 이벤트:
-
delivered: 이메일 도달 -
opened: 열람됨 -
clicked: 링크 클릭 -
bounced: 반송(하드/소프트) -
spam: 스팸 신고 -
unsubscribed: 구독 취소
웹훅 페이로드 처리 예제
app.post('/webhooks/brevo', (req, res) => {
const event = req.body
switch (event.event) {
case 'delivered':
console.log(`Email ${event.messageId} delivered to ${event.email}`)
break
case 'opened':
console.log(`Email opened by ${event.email} at ${event.date}`)
break
case 'bounced':
console.log(`Bounce: ${event.email} - ${event.reason}`)
markContactBounced(event.email)
break
case 'spam':
console.log(`Spam complaint from ${event.email}`)
removeFromAllLists(event.email)
break
case 'unsubscribed':
console.log(`Unsubscribed: ${event.email}`)
break
}
res.status(200).send('OK')
})
Apidog로 테스트하기
이메일 API는 반송/실패 등 다양한 복잡한 시나리오가 있으므로, 템플릿·웹훅·반송 등 다양한 상황을 Apidog에서 쉽게 검증할 수 있습니다.
1. 이메일 전송 모의(Mock)
실제 이메일 전송 없이 응답을 모의:
pm.test('Email API accepts valid payload', () => {
const response = pm.response.json()
pm.expect(response).to.have.property('messageId')
pm.expect(response.messageId).to.match(/<.*@relay\.brevo\.com>/)
})
2. 웹훅 처리 테스트
Apidog에서 모의 페이로드 생성 후 엔드포인트 검증:
{
"event": "bounced",
"email": "invalid@example.com",
"messageId": "<12345@relay.brevo.com>",
"reason": "hard_bounce",
"date": "2026-03-24T12:00:00Z",
"subject": "Welcome to Our Platform"
}
3. 템플릿 유효성 검사
템플릿 변수 검증:
pm.test('Template variables are 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. 환경 분리
# Development
BREVO_API_KEY: xkeysib-dev-xxx
BREVO_SENDER: dev@yourapp.com
# Production
BREVO_API_KEY: xkeysib-prod-xxx
BREVO_SENDER: noreply@yourapp.com
Apidog로 Brevo 이메일 API를 무료로 테스트할 수 있습니다.
일반적인 오류 및 해결 방법
400 Bad Request - 필수 필드 누락
원인: 필수 필드 누락
해결: 오류 메시지 확인
{
"code": "invalid_parameter",
"message": "sender.email is required"
}
401 Unauthorized
원인: 잘못된 또는 누락된 API 키
해결: api-key 헤더 및 키 상태 확인
402 Payment Required
원인: 한도 초과, 크레딧 부족
해결:
- 이메일: 요금제 한도 확인
- SMS: 크레딧 구매
429 Too Many Requests
원인: 전송량 제한 초과
해결: 지수 백오프(exponential backoff) 적용
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('Rate limit exceeded')
}
404 연락처를 찾을 수 없음
원인: 없는 연락처 업데이트 시도
해결: updateEnabled: true 사용
{
"email": "new@example.com",
"updateEnabled": true
}
대안 및 비교
| 기능 | Brevo | SendGrid | Mailchimp | Postmark |
|---|---|---|---|---|
| 가격 정책 | 일일 300 이메일 무료 | 일일 100 이메일 무료 | 월 500 이메일 무료 | 월 100 이메일 무료 |
| 마케팅 이메일 | 예 | 예 | 예 | 아니요 |
| 트랜잭션 이메일 | 예 | 예 | 제한적 | 예 (전문) |
| SMS | 예 | 아니요 | 아니요 | 아니요 |
| 자동화 | 예 | 예 | 예 | 제한적 |
| 템플릿 편집기 | 시각 + 코드 | 코드 | 시각 | 코드 |
Brevo는 이메일과 SMS를 결합한 경쟁력 있는 가격 정책이 장점입니다.
실제 사용 사례
전자상거래 주문 플로우:
온라인 스토어는 Brevo로 주문 확인(트랜잭션), 배송 알림(트랜잭션), 장바구니 포기 복구(마케팅 자동화), 주간 프로모션(마케팅 캠페인)을 통합 관리합니다.
SaaS 온보딩:
프로젝트 관리 SaaS는 트랜잭션 API로 환영 이메일, 비밀번호 재설정, 팀 초대 발송. 마케팅 이메일로 신규 기능 공지.
SMS 인증:
핀테크 앱은 SMS API로 2단계 인증 코드 발송. 트랜잭션 SMS 엔드포인트로 빠르게 코드 전송, 웹훅으로 전송 실패 추적 및 재시도 처리.
결론
정리:
- Brevo API로 마케팅, 트랜잭션 이메일, SMS 모두 처리
-
api-key헤더로 인증 - 템플릿 활용으로 일관된 이메일 유지
- 연락처/목록 관리로 타겟 캠페인 가능
- 웹훅으로 전송/열람/클릭/반송 추적
- Apidog로 실제 발송 전 통합 테스트
다음 단계:
- Brevo 계정 생성 및 API 키 발급
- 첫 트랜잭션 이메일 전송
- 시각 편집기에서 템플릿 생성
- 반송/구독취소용 웹훅 핸들러 구축
- 개발 단계에서 Apidog로 테스트
Apidog로 Brevo 이메일 API 무료 테스트
자주 묻는 질문
Brevo와 Sendinblue의 차이는?
동일 제품의 리브랜딩(2023년 Sendinblue → Brevo). API 엔드포인트는 계속 api.brevo.com 사용.
무료로 이메일 몇 통 보낼 수 있나요?
무료 요금제: 하루 300건(월 9,000건). 더 많은 발송은 유료 플랜 필요.
콜드 이메일도 가능합니까?
기술적으로 가능하지만, 반송/스팸률이 높으면 계정 정지 위험. 도메인 워밍업·이메일 모범 사례 준수 필요.
이메일 반송 처리 방법은?
bounced 웹훅 수신 → 하드 반송은 영구 삭제, 소프트 반송은 재시도. 반송률 5% 이상이면 발신자 평판 저하.
마케팅 이메일 vs 트랜잭션 이메일?
트랜잭션: 개별 행동 트리거된 단일 이메일.
마케팅: 다수 수신자 대상 캠페인.
Brevo는 이 둘을 분리 처리.
구독 취소 링크 추가법?
마케팅 이메일은 자동, 트랜잭션 이메일엔 직접 추가:
<a href="{{ unsubscribe_url }}">Unsubscribe</a>
내 도메인에서 전송 가능?
네. SPF, DKIM, DMARC 레코드 설정 필요. Brevo 대시보드 → 발신자 & IP에서 값 확인.
특정 시간대 예약 발송은?
scheduleAt에 ISO 8601 타임스탬프 사용:
{
"scheduledAt": "2026-03-25T09:00:00-05:00"
}
전송량 제한 초과 시?
429 에러 발생. 응답의 X-RateLimit-Reset으로 재시도 타이밍 확인, 백오프 로직 및 대기열 적용 권장.


Top comments (0)