알림톡 다건 발송 접수

post/public/v1/messages/alimtalk/batch200

items 1개 = 발송 그룹 1개 (최대 500개 · 전체 수신자 10만 명 이하). 항목마다 단건 발송과 같은 검증·접수를 독립으로 하므로 일부만 실패할 수 있고, 결과는 results 에 요청 순서대로 담긴다. 재시도 시 중복 접수는 항목별 idempotencyKey 로 막는다 (Idempotency-Key 헤더는 쓰지 않는다). 요청 형식 오류는 전체 400. 샌드박스 키면 항목별 모의발송.

알아 둘 것

  • items 한 개가 발송 그룹 한 개입니다. 한 번에 최대 500개, 모든 항목의 수신자 수 합계는 10만 명까지입니다.
  • 항목마다 따로 접수합니다. 일부 항목이 실패해도 나머지는 접수되고, 응답은 200 입니다 — 각 항목의 성공 여부는 results[].success 와 results[].error 로 확인하세요. 위 에러 코드 중 접수 단계 코드는 results[].error.code 로 옵니다.
  • results 는 요청한 items 와 같은 순서입니다.
  • 재시도로 중복 접수되지 않게 하려면 항목마다 idempotencyKey 를 넣으세요. 같은 키·같은 내용이면 새로 접수하지 않고 기존 groupId 를 돌려줍니다. 같은 키에 다른 내용이면 그 항목이 6929 로 실패합니다.
  • 요청 형식이 틀리면(필수 필드 누락, 항목 수·수신자 합계 초과, 항목 간 idempotencyKey 중복) 어느 항목도 접수하지 않고 요청 전체가 400 으로 거절됩니다.

요청 본문

  • itemsPublicSendAlimtalkBatchItem[]필수

    발송 항목 (최대 500개 · 항목 1개 = 발송 그룹 1개 · 전체 수신자 합 100,000명 이하)

    • recipientsPublicRecipientDto[]필수

      수신자 목록 (번호 + 수신자별 변수)

    • removeDuplicatesboolean선택null 가능

      번호 중복 제거 여부 · 기본 false (의도한 중복은 유지, 중복 시 앞의 수신자가 남는다)

      예: false

    • variablesobject선택null 가능

      전 수신자 공통 변수값 · 같은 키는 수신자별 값이 우선한다 · 키 규칙은 recipients[].variables 와 같다

      예: {"회사명":"타이탄즈"}

    • scheduledAtstring선택null 가능

      예약 시각 (ISO8601) · 생략하면 즉시 발송

      예: "2026-08-20T10:00:00+09:00"

    • tagsstring[]선택null 가능

      태그 (최대 3개)

      예: ["API"]

    • channelIdstring필수

      카카오 채널 검색용 ID (@ 유무 무관)

      예: "@우리브랜드"

    • templateCodestring필수

      카카오 템플릿 코드 (승인건만 · 콘솔 템플릿 상세에서 확인)

      예: "TPL_ORDER_01"

    • fallbackPublicFallbackDto선택null 가능

      대체발송

    • idempotencyKeystring선택null 가능

      항목별 멱등키 (최대 100자) · 같은 키·같은 본문으로 다시 보내면 새로 접수하지 않고 기존 groupId 를 돌려준다. 배치에서는 Idempotency-Key 헤더를 쓰지 않는다

      예: "course-123-student-456-v2"

응답

아래는 200 응답의 실제 모양입니다. 자동 생성된 스펙이 그리는 것은 data 안쪽뿐이라, 그것만 보고 짜면 값을 찾지 못합니다.

  • successboolean필수

    성공 응답에서는 항상 `true` 입니다.

    예: true

  • messagestring필수

    사람이 읽는 설명. 성공에는 기본 문구가 실리므로 분기 근거로 쓰지 마세요.

    예: "Request processed successfully"

  • dataPublicBatchAcceptResponse필수

    요청 결과 본문

    • acceptedCountnumber필수

      접수된 항목 수

      예: 499

    • failedCountnumber필수

      실패한 항목 수

      예: 1

    • totalHoldAmountnumber필수

      접수된 항목의 홀드 포인트 합

      예: 6487

    • resultsPublicBatchItemResult[]필수

      항목별 결과 (요청 items 순서)

  • timestampstring필수date-time

    응답을 만든 시각 (KST)

  • methodstring필수

    요청 메서드. 요청을 그대로 되비춰 줍니다.

    예: "POST"

  • pathstring필수

    요청 경로

    예: "/public/v1/messages/alimtalk"

  • correlationIdstring필수

    요청 추적 ID. **문의할 때 이 값을 함께 알려 주세요** — 서버 로그를 이 값으로 찾습니다.

에러

실패 응답도 봉투에 담겨 오고, 숫자 code 로 원인이 갈립니다. 이 호출에서 볼 수 있는 코드는 다음과 같습니다.

코드HTTP키설명
8620401PUBLIC_API_KEY_REQUIREDAPI 키가 필요합니다. Authorization: Bearer {key} 또는 X-Api-Key 헤더로 전달해 주세요.
8621401PUBLIC_API_KEY_INVALID유효하지 않은 API 키입니다.
8622401PUBLIC_API_KEY_SUSPENDED정지된 API 키입니다. 콘솔에서 상태를 확인해 주세요.
8623401PUBLIC_API_KEY_EXPIRED만료된 API 키입니다.
8624403PUBLIC_IP_BLOCKED허용되지 않은 IP 에서의 호출입니다. 국외 IP 는 예외 없이 차단됩니다.
8628429PUBLIC_RATE_LIMITED호출 한도를 초과했습니다. 잠시 후 다시 시도해 주세요.
8625403PUBLIC_SCOPE_FORBIDDEN이 키에 허용되지 않은 발송 채널입니다.
6904400SEND_RECIPIENTS_EMPTY보낼 수 있는 수신자가 없습니다.
6907400SEND_SCHEDULE_INVALID예약 시각이 올바르지 않습니다.
6909409SEND_BALANCE_INSUFFICIENT잔액이 부족합니다. 충전 후 다시 시도해 주세요.
6912502SEND_SUBMIT_FAILED발송 접수에 실패했습니다. 잠시 후 다시 시도해 주세요.
6914400SEND_MESSAGE_INVALID메시지 내용이 올바르지 않습니다.
6922403SEND_KEYWORD_BLOCKED본문에 차단 금칙어가 포함되어 발송할 수 없습니다.
6923403SEND_KEYWORD_HELD본문에 심사 대상 문구가 포함되어 접수가 보류되었습니다. 관리자 확인 후 다시 시도해 주세요.
6924403SEND_URL_BLOCKED본문에 차단된 URL 이 포함되어 발송할 수 없습니다.
6925422SEND_SUBMIT_REJECTED발송 접수가 거부되었습니다. 접수 내용을 확인해 주세요.
6900404SEND_TEMPLATE_NOT_FOUND템플릿을 찾을 수 없습니다.
6901409SEND_TEMPLATE_NOT_APPROVED승인된 템플릿만 발송할 수 있습니다.
6902409SEND_CHANNEL_NOT_ACTIVE정상 상태의 카카오 채널만 발송할 수 있습니다.
6905400SEND_VARIABLE_UNRESOLVED템플릿 변수에 연결되지 않은 항목이 있습니다.
6929409SEND_IDEMPOTENCY_MISMATCH같은 멱등키로 다른 내용의 발송이 이미 접수돼 있습니다. 새 발송이면 새 키를 쓰세요.
9000500INTERNAL_SERVER_ERROR서버 내부 오류가 발생했습니다.

여기서 바로 실행

post

문서에 적힌 그 주소로 나갑니다. dk_test_ 키라서 검증만 하고 발송도 과금도 일어나지 않습니다.

요청 (전체)

# 성공 응답은 200 입니다.
# 응답은 봉투에 싸여 옵니다 — 알맹이는 data 안에 있습니다.
curl -X POST 'https://api.directalk.io/public/v1/messages/alimtalk/batch' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Content-Type: application/json' \
  --data-raw '{
    "items": [
      {
        "recipients": [
          {
            "phone": "01012345678",
            "variables": {
              "이름": "김철수",
              "주문번호": "A-1001"
            }
          }
        ],
        "removeDuplicates": false,
        "variables": {
          "회사명": "타이탄즈"
        },
        "scheduledAt": "2026-08-20T10:00:00+09:00",
        "tags": [
          "API"
        ],
        "channelId": "@우리브랜드",
        "templateCode": "TPL_ORDER_01",
        "fallback": {
          "enabled": true,
          "channel": "SMS",
          "senderNumber": "0212345678",
          "title": "문자열",
          "message": "문자열"
        },
        "idempotencyKey": "course-123-student-456-v2"
      }
    ]
  }'

요청 (필수 항목만)

# 성공 응답은 200 입니다.
# 응답은 봉투에 싸여 옵니다 — 알맹이는 data 안에 있습니다.
curl -X POST 'https://api.directalk.io/public/v1/messages/alimtalk/batch' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Content-Type: application/json' \
  --data-raw '{
    "items": [
      {
        "recipients": [
          {
            "phone": "01012345678"
          }
        ],
        "channelId": "@우리브랜드",
        "templateCode": "TPL_ORDER_01"
      }
    ]
  }'

응답 200

{
  "success": true,
  "message": "Request processed successfully",
  "data": {
    "acceptedCount": 499,
    "failedCount": 1,
    "totalHoldAmount": 6487,
    "results": [
      {
        "index": 0,
        "idempotencyKey": "문자열",
        "success": false,
        "groupId": "문자열",
        "status": "RESERVED",
        "sendCount": 0,
        "optOutExcluded": 0,
        "holdAmount": 0,
        "scheduledAt": "2026-08-20T10:00:00+09:00",
        "error": {
          "code": 6909,
          "message": "문자열"
        }
      }
    ]
  },
  "timestamp": "2026-08-25T14:32:10.482+09:00",
  "method": "POST",
  "path": "/public/v1/messages/alimtalk/batch",
  "correlationId": "c7f1a2b4-9e30-4d15-8a6c-2f0b7d9e1c34"
}

실패 응답 예시

{
  "success": false,
  "message": "API 키가 필요합니다. Authorization: Bearer {key} 또는 X-Api-Key 헤더로 전달해 주세요.",
  "code": 8620,
  "timestamp": "2026-08-25T14:32:10.482+09:00",
  "method": "POST",
  "path": "/public/v1/messages/alimtalk/batch",
  "correlationId": "c7f1a2b4-9e30-4d15-8a6c-2f0b7d9e1c34"
}