Campaigns

Create a campaign as a draft, check recipients, cost, and balance with estimate , then send or schedule it with send . When the send starts, recipients × unit price is reserved from your balance, and anything not sent is returned when it finishes.

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"}'

Status

draft → scheduled → queued → sending → sent, and everything else paused · canceled · failed. pause/resume/cancel is POST. Test sends use POST /{id}/test { to: […] }(charged per email).

Reports

GET /api/v1/campaigns/{id}/report      → counts · rates · links[] · timeline[]\nGET /api/v1/campaigns/{id}/recipients  → per-recipient status (queued/sent/delivered/bounced/…)\nGET /api/v1/events?campaign_id=&type=open|click|bounce|unsubscribe

Automatic compliance

ad_prefix:true , "(Ad)" is added to the front of the subject line, and your company name, address, contact, and unsubscribe link are added to the footer automatically. List-Unsubscribe·List-Unsubscribe-Post headers are automatic too. Scheduling between 21:00 and 08:00 KST requires the workspace's night_consent to be true.