APIで実現するSMS配信時間の制御
NTT CPaaSのSMS APIが持つ「スケジューリング機能」を利用して、指定した日時にSMSが自動的に送信されるように設定する方法を解説します。夜間や休日の配信を抑制したり、ユーザーの生活リズムに合わせた最適なタイミングでメッセージを届けたりすることが可能になります。
2026/03/22
目的
多くのマーケティング担当者や開発者にとって、「キャンペーン開始のジャストタイミング」や「予約の前日19時」など、特定の時間に正確にメッセージを届けることは重要な課題です。手動での送信は手間がかかり、自社サーバーで送信時間を管理するプログラムを組むのも運用リスクが伴います。
本記事では、NTT CPaaSのSMS APIが持つ「スケジューリング機能」を利用して、指定した日時にSMSが自動的に送信されるように設定する方法を解説します。
この記事を読むことで、夜間や休日の配信を抑制したり、ユーザーの生活リズムに合わせた最適なタイミングでメッセージを届けたりすることが可能になります。
※このチュートリアルで使用するSMS APIの仕様は、SMS APIリファレンスにまとめています。あわせてご参照ください。
※本記事で紹介するこの機能は送信時間を指定するためのものであり、実際のSMS配信時間はトラフィック状況により遅延する可能性があることをご了承ください。
概要
SMSを送信する方法として、APIリクエストを行った瞬間に送信処理を行う「即時送信」が一般的ですが、今回は「予約送信(スケジューリング)」に焦点を当てます。
なぜ「自社サーバーでの管理」ではなく「APIの予約機能」なのか?
「指定時間にメッセージを送る」という要件に対し、自社のシステム側でCron(クーロン)などのジョブ管理ツールを使い、指定時間になったらAPIを叩くという実装も可能です。しかし、この方法では自社サーバーのダウンやネットワーク遅延により、送信が遅れたり失敗したりするリスクがあります。
NTT CPaaSの予約機能(sendAtパラメータ)を使用する場合、メッセージデータは事前にNTT CPaaSの堅牢なプラットフォームに預けられ、管理されます。
- 堅牢性: NTT CPaaS側でキューイングされるため、送信タイミングのズレが最小限に抑えられます。
- 確実性: 自社サーバーがダウンしていても、予約済みのメッセージは送信されます。
- 柔軟性: 送信前にキャンセルや時間の変更が可能です。
これにより、より確実かつ低負荷なコミュニケーションを実現できます。
サービス
▶ アカウントをお持ちでない方へ|60日間無料トライアルを開始
チュートリアルの内容は、トライアル環境ですぐにお試しいただけます。クレジットカード情報の登録は不要、自動で課金されることもありません。送信テストや動作確認に、ぜひ無料トライアルをご活用ください。
実践シナリオ
それでは、実際にNTT CPaaSのAPIを使ってSMSの送信予約を行ってみましょう。
また、予約後の変更(再スケジュール)、ステータス確認、キャンセルの方法についても解説します。
【事前準備】 (ステップ0)
作業を始める前に、以下の情報が手元にあるか確認してください。
- NTT CPaaS アカウント: まだお持ちでない場合は、トライアルアカウントを作成してください。
- APIキー: sms:message:send のスコープ権限を持つAPIキーが必要です。
- HTTPクライアント: 本記事では curl コマンドを使用しますが、Postmanや各プログラミング言語の公式SDKでも可能です。
- 送信元番号 (Sender): トライアル期間中はテスト用の送信元(例: ServiceSMS)を使用できます。独自の発信番号を使用したい場合は、NTT CPaaS管理画面から申請が必要です。
- 宛先電話番号 (Destination): メッセージを送信する携帯電話番号です。トライアル期間中は、登録時に認証したご自身の電話番号にのみ送信可能です。
ステップ1: SMSの送信予約を行う
「SMS送信 (Send SMS message)」エンドポイントを使用します。
通常の送信リクエストとの違いは、sendAt フィールドを含める点です。ここにSMSを届けたい日時を指定します。
スケジューリングのポイント:
- 日時形式: yyyy-MM-dd'T'HH:mm:ss.SSSZ の形式で指定します(例: 2026-01-06T12:45:00.000+0900)。※末尾は+0000でUTC、+0900でJST(日本時間)となります。
- 制限: 最大180日先まで予約可能です。
- bulkId (重要): bulkId フィールドに任意のID(識別子)を指定することをお勧めします。これを指定しておくと、後で「あの予約を変更したい」「キャンセルしたい」という時に、このIDを使って管理できます。
以下のコマンドを実行して予約を行います。
※ {BASE_URL} と {API_KEY} はご自身のアカウント情報に置き換えてください。
curl -L -g "${BASE_URL}/sms/3/messages" \
-H "Authorization: App ${API_KEY}" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d @- <<'EOF'
{
"messages": [
{
"sender": "ServiceSMS",
"destinations": [
{
"to": "81XXXXXXXXXX"
}
],
"content": {
"text": "ウィンターコレクションの準備が整いました。ぜひチェックしてください!"
}
}
],
"options": {
"schedule": {
"bulkId": "winter-campaign",
"sendAt": "2026-01-06T12:45:00.000+0900"
}
}
}
EOF
【応用】配信時間枠の設定(オプション)
法的な規制やユーザーへの配慮から、「夜間の送信は避けたい」「平日のみ送りたい」という場合があります。その際は deliveryTimeWindow を使用して、配信可能な曜日や時間帯を制限できます。※下記コードはmesssageパートのみ。
注意: 1つの bulkId 内に、異なる deliveryTimeWindow 設定を持つメッセージを混在させることは推奨されません。管理が複雑になり、検索や更新に影響が出る可能性があります。
下記の例では、10:00から20:00枠を配信時間枠と定めています。その範囲に該当しない時間設定を行っても、メッセージは制御され次の配信時間枠まで送信は待機されます(この場合では9:45ではなく当日の10:00以降SMSが送信されます)。
{
"messages": [
{
"sender": "InfoSMS",
"destinations": [
{
"to": "81XXXXXXXXXX"
}
],
"content": {
"text": "ウィンターコレクションの準備が整いました。ぜひチェックしてください!"
},
"options": {
"deliveryTimeWindow": {
"days": [
"MONDAY",
"TUESDAY",
"WEDNESDAY",
"THURSDAY",
"FRIDAY"
],
"from": {
"hour": 10,
"minute": 0
},
"to": {
"hour": 20,
"minute": 0
}
}
}
}
],
"options": {
"schedule": {
"bulkId": "winter-campaign",
"sendAt": "2026-01-07T09:45:00.000+0900"
}
}
}
ステップ2: レスポンスの確認
コードを実行し成功すると、200 OK が返ってきます。
このレスポンスには bulkId が含まれています。このIDは、後のステップ(変更・確認・キャンセル)で使用するため控えておいてください。
{"bulkId":"winter-campaign","messages":[{"messageId":"17677508738377950404983","status":{"groupId":1,"groupName":"PENDING","id":26,"name":"PENDING_ACCEPTED","description":"Message sent to next instance"},"destination":"81XXXXXXXXXX"}]}ステップ3: 予約日時を変更する(再スケジュール)
キャンペーンの日程が変わった場合などは、予約した日時を変更できます。
クエリパラメータに bulkId を指定し、リクエストボディに新しい sendAt (日時)を指定してPUTリクエストを送ります。
curl -L -g -X PUT 'https://{BASE_URL}/sms/1/bulks?bulkId=winter-campaign' \
-H 'Authorization: {authorization}' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
"sendAt": "2026-01-07T12:00:00.000+0900"
}'成功すると、新しい日時が反映されたレスポンスが返されます。UTC表記となります。
{"bulkId":"winter-campaign","sendAt":"2026-01-07T03:00:00.000+0000"}curl -L -g 'https://{baseUrl}/sms/1/bulks/status?bulkId=winter-campaign' \
-H 'Authorization: {authorization}' \
-H 'Accept: application/json'送信待ちの状態であれば、ステータスは PENDING と表示されます。
{"bulkId":"winter-campaign","status":"PENDING"}curl -L -g -X PUT 'https://{baseUrl}/sms/1/bulks/status?bulkId=winter-campaign' \
-H 'Authorization: {authorization}' \
-H 'Content-Type: application/json' \
-H 'Accept: application/json' \
-d '{
"status": "CANCELED"
}'レスポンスでステータスが CANCELED になっていれば、送信処理は中止されています。
{
"bulkId": "summer-campaign",
"status": "CANCELED"
}まとめ
これで、SMSの予約送信およびその管理方法を習得しました。
送信が完了した後の詳細な結果(実際にユーザー端末に届いたかなど)を確認したい場合は、messageId または bulkId を使用して「配信レポート (Delivery Report)」を取得することで、分析やトラブルシューティングに役立てることができます。
NTT CPaaSを、
60日間無料でお試しください
・SMS・Voice・メールを本番同様に無料で検証
・全API機能に即日アクセス / 有料プランと同一環境
・国内開発者向けに最適化された日本語ガイド
2026.03.22