알림톡 발송 접수

post/public/v1/messages/alimtalk202

Idempotency-Key 헤더로 중복 접수를 막을 수 있다. 샌드박스 키로 호출하면 과금·실발송 없는 모의발송으로 처리된다 — 응답 모델은 같고 groupId 는 sandbox- 프리픽스의 가짜 값이라 조회·취소할 수 없다.

알아 둘 것

  • 접수(202)는 발송 성공이 아닙니다. 실제 도달 여부는 응답의 `groupId` 로 결과 조회를 폴링해 확인합니다.
  • 승인된 템플릿만 발송할 수 있습니다 (미승인 템플릿은 6901).
  • 수신거부·중복 제외는 접수 시점에 서버가 적용합니다 — 응답의 `sendCount` 가 실제로 나가는 건수입니다.

요청 본문

  • recipientsPublicRecipientDto[]필수

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

    • phonestring필수

      수신 번호 (하이픈 무관)

      예: "01012345678"

    • variablesobject선택null 가능

      수신자별 변수값 (키 = 템플릿 변수명 #{키}) · 키는 한글·영문·숫자·-·_ 조합(사이 공백 허용) 20자 이내, 값은 문자열

      예: {"이름":"김철수","주문번호":"A-1001"}

  • 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 가능

    대체발송

    • enabledboolean필수

      대체발송 사용 여부

      예: true

    • channelstring선택null 가능

      대체 채널 (SMS·LMS)

      SMSLMS
    • senderNumberstring선택null 가능

      대체발송 발신번호 (하이픈 없이 · 승인건만)

      예: "0212345678"

    • titlestring선택null 가능

      대체 문자 제목 (LMS) · 비우면 템플릿 제목

    • messagestring선택null 가능

      대체 문자 본문 · 비우면 템플릿 본문

응답

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

  • successboolean필수

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

    예: true

  • messagestring필수

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

    예: "Request processed successfully"

  • dataPublicAcceptResponse필수

    요청 결과 본문

    • groupIdstring필수

      발송 그룹 ID · 결과 조회(폴링)의 키

    • statusstring필수

      접수 상태 (QUEUED 즉시 · RESERVED 예약)

      예: "QUEUED"

    • sendCountnumber필수

      발송 수 (수신거부·중복 제외 후)

      예: 1206

    • optOutExcludednumber필수

      수신거부로 제외된 수

      예: 3

    • holdAmountnumber필수

      선차감 홀드 포인트

      예: 13266

    • scheduledAtstring필수null 가능date-time

      예약 시각 · 즉시 발송은 null

  • 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이 키에 허용되지 않은 발송 채널입니다.
8626403PUBLIC_LIVE_KEY_REQUIRED샌드박스 키로는 실발송 API 를 호출할 수 없습니다. 모의발송은 /v1/sandbox/messages 를 사용해 주세요.
8627409PUBLIC_IDEMPOTENCY_CONFLICT같은 Idempotency-Key 로 이미 접수된 발송이 있습니다.
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템플릿 변수에 연결되지 않은 항목이 있습니다.

여기서 바로 실행

post

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

요청 (전체)

# 접수 성공 응답은 202 입니다 (200 이 아닙니다).
# 응답은 봉투에 싸여 옵니다 — 알맹이는 data 안에 있습니다.
curl -X POST 'https://api.directalk.io/public/v1/messages/alimtalk' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 9f1c2b7e-4a63-4f18-9d0b-5e7c8a1f2d34' \
  --data-raw '{
    "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": "문자열"
    }
  }'

요청 (필수 항목만)

# 접수 성공 응답은 202 입니다 (200 이 아닙니다).
# 응답은 봉투에 싸여 옵니다 — 알맹이는 data 안에 있습니다.
curl -X POST 'https://api.directalk.io/public/v1/messages/alimtalk' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Content-Type: application/json' \
  -H 'Idempotency-Key: 9f1c2b7e-4a63-4f18-9d0b-5e7c8a1f2d34' \
  --data-raw '{
    "recipients": [
      {
        "phone": "01012345678"
      }
    ],
    "channelId": "@우리브랜드",
    "templateCode": "TPL_ORDER_01"
  }'

응답 202

{
  "success": true,
  "message": "Request processed successfully",
  "data": {
    "groupId": "문자열",
    "status": "QUEUED",
    "sendCount": 1206,
    "optOutExcluded": 3,
    "holdAmount": 13266,
    "scheduledAt": "2026-08-20T10:00:00+09:00"
  },
  "timestamp": "2026-08-25T14:32:10.482+09:00",
  "method": "POST",
  "path": "/public/v1/messages/alimtalk",
  "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",
  "correlationId": "c7f1a2b4-9e30-4d15-8a6c-2f0b7d9e1c34"
}