캠페인
캠페인은 초안(draft)으로 만들고, estimate 로 수신자 수·비용·잔액을 확인한 뒤 send 로 보내거나 예약해요. 발송 시작 때 수신자 수 × 단가가 잔액에서 예약되고 끝나면 안 보낸 만큼 돌아와요.
curl
# 초안\ncurl -X POST https://send.ad/api/v1/campaigns -H "Authorization: Bearer $SEND_API_KEY" -H "content-type: application/json" -d '{\n "name":"추석 프로모션","subject":"{{first_name|고객}}님, 추석 선물 20% 할인","preheader":"9월 25일까지 무료배송",\n "from_name":"한빛 마케팅팀","reply_to":"hello@hanbit.kr",\n "audience":{"list_ids":["<list-uuid>"],"exclude_list_ids":[]},\n "ad_prefix":true,"track_opens":true,"track_clicks":true,\n "design":{"version":1,"blocks":[{"id":"h","type":"heading","text":"추석 선물 20% 할인"},{"id":"t","type":"text","html":"<p>9월 25일까지 무료배송이에요.</p>"},{"id":"b","type":"button","text":"쿠폰 받기","href":"https://hanbit.kr/gift"}]}\n}'\n# 예상 → 발송\ncurl https://send.ad/api/v1/campaigns/<id>/estimate -H "Authorization: Bearer $SEND_API_KEY"\ncurl -X POST https://send.ad/api/v1/campaigns/<id>/send -H "Authorization: Bearer $SEND_API_KEY" -H "content-type: application/json" -d '{"scheduled_at":"2026-09-20T10:00:00+09:00"}'상태
draft → scheduled → queued → sending → sent, 그 밖에 paused · canceled · failed. pause/resume/cancel 은 POST. 테스트 발송은 POST /{id}/test { to: […] }(통당 과금).
보고서
GET /api/v1/campaigns/{id}/report → counts · rates · links[] · timeline[]\nGET /api/v1/campaigns/{id}/recipients → 수신자별 상태(queued/sent/delivered/bounced/…)\nGET /api/v1/events?campaign_id=&type=open|click|bounce|unsubscribe규정 자동 처리
ad_prefix:true 면 제목 앞에 (광고) 를 붙이고, 푸터에 회사명·주소·연락처·수신거부 링크가 자동으로 들어가요. List-Unsubscribe·List-Unsubscribe-Post 헤더도 자동. 21:00~08:00 KST 예약은 워크스페이스 night_consent 가 true 여야 해요.