알림톡·문자 예약 발송하기 — scheduleType 과 at

알림톡·문자 예약 발송하기 — scheduleType 과 at

지정한 시각에 카카오 알림톡이나 문자를 발송하는 방법. 예약 시각 형식, 시간대, 야간 광고 제한과의 관계를 정리했습니다.

POST /api/v2/notices/send

발송 시각을 지정하려면 scheduleTypeSCHEDULED 로 두고 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시에 나갈 수 없습니다. 예약 시각을 그 구간으로 잡으면 안 됩니다.

이 문서에서 쓰는 패키지

관련 문서