알림톡·문자 예약 발송하기 — scheduleType 과 at
지정한 시각에 카카오 알림톡이나 문자를 발송하는 방법. 예약 시각 형식, 시간대, 야간 광고 제한과의 관계를 정리했습니다.
POST /api/v2/notices/send발송 시각을 지정하려면 scheduleType 을 SCHEDULED 로 두고 at 에 시각을 넣습니다. 기본값은 DIRECTLY(즉시)입니다.
형식
| 파라미터 | 값 |
|---|---|
scheduleType |
"SCHEDULED" |
at |
"2026-09-01 09:00:00" — Y-m-d H:i:s, 한국 표준시(KST) |
ISO 8601(2026-09-01T09:00:00Z)이나 유닉스 타임스탬프는 받지 않습니다.
예제
Node.js / TypeScript
await sendgo.alimtalk.send({
templateCode: 'PROMO_SUMMER_2026',
scheduleType: 'SCHEDULED',
at: '2026-09-01 09:00:00',
contacts: [{ contact: '01012345678', var1: '가을 한정 30% 할인' }],
});
Python
client.alimtalk.send(
template_code="PROMO_SUMMER_2026",
schedule_type="SCHEDULED",
at="2026-09-01 09:00:00",
contacts=[{"contact": "01012345678", "var1": "가을 한정 30% 할인"}],
)
PHP · Laravel
<?php
$sendgo->alimtalk->send([
'templateCode' => 'PROMO_SUMMER_2026',
'scheduleType' => 'SCHEDULED',
'at' => '2026-09-01 09:00:00',
'contacts' => [['contact' => '01012345678', 'var1' => '가을 한정 30% 할인']],
]);
문자 예약
같은 파라미터가 문자에도 적용됩니다.
curl -X POST https://sendgo.io/api/v2/messages/send \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"campaignType": "MESSAGE",
"messageType": "LMS",
"scheduleType": "SCHEDULED",
"at": "2026-09-01 09:00:00",
"subject": "[공지] 서비스 점검 안내",
"content": "9월 1일 02:00~06:00 점검이 예정되어 있습니다.",
"contacts": [{ "contact": "01012345678" }],
"senderKey": "your_sms_sender_key"
}'
시간대 함정
서버가 UTC 로 동작하는 경우(도커 컨테이너, AWS 기본 설정 등)가 흔합니다. 날짜를 만드는 코드가 KST 를 쓰는지 확인하세요. UTC 시각을 그대로 넘기면 9시간 이른 시각에 발송됩니다.
<?php
// 잘못된 예 — 서버가 UTC 면 실제 발송은 KST 18:00 이 된다.
'at' => now()->addDay()->setTime(9, 0)->format('Y-m-d H:i:s'),
// 올바른 예
'at' => now('Asia/Seoul')->addDay()->setTime(9, 0)->format('Y-m-d H:i:s'),
from datetime import datetime, time
from zoneinfo import ZoneInfo
at = datetime.now(ZoneInfo("Asia/Seoul")).replace(hour=9, minute=0, second=0)
client.alimtalk.send(
template_code="PROMO_001",
schedule_type="SCHEDULED",
at=at.strftime("%Y-%m-%d %H:%M:%S"),
contacts=[...],
)
// Node.js — 서버 시간대에 의존하지 말고 명시적으로 KST 로 포맷한다.
const at = new Intl.DateTimeFormat('sv-SE', {
timeZone: 'Asia/Seoul',
year: 'numeric', month: '2-digit', day: '2-digit',
hour: '2-digit', minute: '2-digit', second: '2-digit',
hour12: false,
}).format(target).replace('T', ' ');
야간 광고 제한과의 관계
광고성 메시지는 실제 발송 시각 기준으로 21시~익일 08시에 나갈 수 없습니다. 예약을 그 구간으로 잡으면 안 됩니다.
주의할 조합: 저녁에 배치를 돌리면서 예약 시각을 "지금부터 3시간 뒤"로 계산하면, 실행 시각에 따라 제한 구간에 들어갈 수 있습니다. 절대 시각으로 잡거나, 제한 구간이면 다음 날 08시로 밀어내세요.
<?php
$at = now('Asia/Seoul')->addHours(3);
// 21시~08시 구간이면 다음 날 아침으로 미룬다.
if ($at->hour >= 21 || $at->hour < 8) {
$at = $at->copy()->addDay()->setTime(8, 0);
}
자세한 규칙은 광고성 메시지 규칙에 있습니다.
다음 단계
자주 묻는 질문
- 예약 시각은 어떤 형식으로 넘기나요?
- Y-m-d H:i:s 형식의 문자열입니다. 예: 2026-09-01 09:00:00. ISO 8601 이나 유닉스 타임스탬프가 아닙니다.
- 예약 발송을 취소할 수 있나요?
- 샌드고 콘솔의 발송 내역에서 아직 실행되지 않은 예약 건을 확인하고 취소할 수 있습니다.
- 예약 시각의 시간대는 무엇인가요?
- 한국 표준시(KST, UTC+9)입니다. 서버가 UTC 로 동작한다면 예약 시각을 만들 때 KST 로 변환해서 넘기세요. UTC 시각을 그대로 보내면 9시간 어긋납니다.
- 예약 발송에도 야간 광고 제한이 적용되나요?
- 네. 광고성 메시지는 실제 발송이 일어나는 시각 기준으로 21시~익일 08시에 나갈 수 없습니다. 예약 시각을 그 구간으로 잡으면 안 됩니다.