다중 푸시 발송
API Endpoint
POST /api/push/multiple
여러 구독자에게 동일한 푸시 알림을 한 번의 요청으로 발송합니다.
엔드포인트: POST https://api.pushmanager.kr/api/push/multiple
POST /api/push/multiple
Content-Type: application/json
X-API-Key: <서비스-API-키>
Origin: <등록된-도메인>
Content-Type: application/json
X-API-Key: <서비스-API-키>
Origin: <등록된-도메인>
Parameters
subscriptions
푸시 알림을 받을 구독자들의 배열입니다. 각 요소는 표준 웹 푸시 구독 객체이며, 최소 1개부터 최대 1,000개까지 포함할 수 있습니다. 모든 구독자에게 동일한
payload
내용이 전송됩니다.
payload
모든 구독자에게 전송될 공통 알림 내용입니다. 웹 푸시 Notification API 규격을 따르며, 단일 푸시와 동일한 속성들을 사용할 수 있습니다.
필수 속성:
- •
title
(String) - 알림 제목 (최대 100자) - •
body
(String) - 알림 본문 (최대 300자)
선택 속성:
- •
icon
(String) - 알림 아이콘 URL - •
image
(String) - 큰 이미지 URL - •
badge
(String) - 배지 아이콘 URL - •
url
(String) - 클릭 시 이동할 URL - •
tag
(String) - 그룹핑용 태그 (최대 50자) - •
requireInteraction
(Boolean) - 사용자 상호작용 필요 여부 - •
silent
(Boolean) - 무음 알림 여부 - •
data
(Object) - 사용자 정의 데이터 - •
actions
(Array) - 액션 버튼 배열 (최대 2개)
options
모든 푸시 알림에 공통으로 적용될 전송 옵션들입니다. 모든 항목은 선택사항이며, 기본값으로도 정상 동작합니다.
- •
TTL
(Number) - 메시지 생존 시간(초), 0~2,419,200 (최대 4주) - •
urgency
(String) - 우선순위: 'very-low', 'low', 'normal', 'high' - •
topic
(String) - 메시지 분류용 토픽 (최대 32자)
Discussion
이 엔드포인트는 다수의 구독자에게 효율적으로 푸시 알림을 발송하기 위해 병렬 처리를 사용합니다. 모든 구독 정보의 유효성을 먼저 검사한 후, 동시에 여러 푸시를 발송하여 성능을 최적화합니다. 각 구독자별 발송 결과가 개별적으로 기록되며, 전체 통계와 에러 분석 정보를 제공합니다.
요청 제한: API 키당 분당 100회
구독자 제한: 요청당 최대 1,000개 구독자
페이로드 제한: 최대 4KB
인증: 유효한 X-API-Key 헤더와 Origin 검증 필요
구독자 제한: 요청당 최대 1,000개 구독자
페이로드 제한: 최대 4KB
인증: 유효한 X-API-Key 헤더와 Origin 검증 필요
응답 형식
성공 응답 (200 OK)
{
"success": true,
"message": "Multiple push notifications processed",
"data": {
"total": 100,
"sent": 95,
"failed": 5,
"successRate": 95.0,
"errorStats": {
"expired": 3,
"client_error": 2
},
"payloadSize": 256,
"processingTime": 1250
}
}
"success": true,
"message": "Multiple push notifications processed",
"data": {
"total": 100,
"sent": 95,
"failed": 5,
"successRate": 95.0,
"errorStats": {
"expired": 3,
"client_error": 2
},
"payloadSize": 256,
"processingTime": 1250
}
}
유효성 검사 실패 (400 Bad Request)
{
"success": false,
"message": "Invalid subscriptions found",
"invalidSubscriptions": [
{
"index": 3,
"error": "Missing p256dh key"
},
{
"index": 7,
"error": "Invalid endpoint URL"
}
],
"code": "INVALID_SUBSCRIPTIONS"
}
"success": false,
"message": "Invalid subscriptions found",
"invalidSubscriptions": [
{
"index": 3,
"error": "Missing p256dh key"
},
{
"index": 7,
"error": "Invalid endpoint URL"
}
],
"code": "INVALID_SUBSCRIPTIONS"
}
에러 응답 (401/403/429/500)
{
"success": false,
"message": "Payload too large",
"code": "PAYLOAD_TOO_LARGE"
}
"success": false,
"message": "Payload too large",
"code": "PAYLOAD_TOO_LARGE"
}
요청 예시
{
"subscriptions": [
{
"endpoint": "https://fcm.googleapis.com/fcm/send/...",
"keys": {
"p256dh": "BGtFqB...",
"auth": "rF3dm..."
}
},
// ... 추가 구독자들
],
"payload": {
"title": "새로운 소식이 있습니다!",
"body": "지금 확인해보세요.",
"icon": "/icon-192x192.png",
"url": "https://your-domain.com/news"
},
"options": {
"TTL": 3600,
"urgency": "normal"
}
}
"subscriptions": [
{
"endpoint": "https://fcm.googleapis.com/fcm/send/...",
"keys": {
"p256dh": "BGtFqB...",
"auth": "rF3dm..."
}
},
// ... 추가 구독자들
],
"payload": {
"title": "새로운 소식이 있습니다!",
"body": "지금 확인해보세요.",
"icon": "/icon-192x192.png",
"url": "https://your-domain.com/news"
},
"options": {
"TTL": 3600,
"urgency": "normal"
}
}