예약 일괄 취소

delete/public/v1/messages200

groupIds 를 한 트랜잭션으로 취소하고 홀드를 푼다 (최대 1,000개). 조건은 단건 취소와 같다(발송 서버 제출 전). 취소하지 못한 건은 실패가 아니라 skipped 에 사유와 함께 담긴다. groupIds 는 요청 본문(JSON)으로 보낸다.

알아 둘 것

  • groupIds 를 요청 본문(JSON) 에 담아 보냅니다. 한 번에 최대 1,000개입니다. 쓰시는 HTTP 라이브러리가 DELETE 요청에 본문을 실어 보내는지 확인해 주세요.
  • 취소할 수 있는 건은 한꺼번에 처리됩니다. 취소 조건은 단건 예약 취소와 같습니다 — 발송 서버에 제출되기 전의 예약 발송만 취소됩니다.
  • 취소하지 못한 건이 섞여 있어도 요청은 실패하지 않습니다. 그 건들은 skipped 에 사유와 함께 담깁니다 — ALREADY_SUBMITTED(이미 제출돼 취소 불가) · ALREADY_CANCELED(이미 취소됨) · NOT_RESERVED(즉시 발송 건) · NOT_FOUND(없는 ID, 다른 회사의 ID, 모의발송 ID).
  • ALREADY_CANCELED 는 성공으로 다뤄도 됩니다. 같은 요청을 다시 보내도 안전합니다.

요청 본문

  • groupIdsstring[]필수

    취소할 발송 그룹 ID (1~1,000개 · 중복은 하나로)

    예: ["grp_01J...","grp_01K..."]

응답

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

  • successboolean필수

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

    예: true

  • messagestring필수

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

    예: "Request processed successfully"

  • dataPublicCancelManyResponse필수

    요청 결과 본문

    • canceledCountnumber필수

      취소된 그룹 수

      예: 998

    • canceledMessageCountnumber필수

      취소된 메시지 건수 (수신자 수 합)

      예: 998

    • releasedHoldAmountnumber필수

      해제된 홀드 포인트 합

      예: 12974

    • canceledstring[]필수

      취소된 그룹 ID

    • skippedPublicCancelSkipped[]필수

      취소하지 않은 그룹과 사유

  • 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호출 한도를 초과했습니다. 잠시 후 다시 시도해 주세요.

여기서 바로 실행

delete

요청은 그대로 나가지만 샌드박스 키로는 이 API 를 쓸 수 없습니다 — 응답으로 8626 이 돌아옵니다. 어떤 모양으로 막히는지 확인하는 자리이고, 실제 조회·취소는 라이브 키로 직접 호출해 주세요.

요청 (전체)

# 성공 응답은 200 입니다.
# 응답은 봉투에 싸여 옵니다 — 알맹이는 data 안에 있습니다.
curl -X DELETE 'https://api.directalk.io/public/v1/messages' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Content-Type: application/json' \
  --data-raw '{
    "groupIds": [
      "grp_01J...",
      "grp_01K..."
    ]
  }'

요청 (필수 항목만)

# 성공 응답은 200 입니다.
# 응답은 봉투에 싸여 옵니다 — 알맹이는 data 안에 있습니다.
curl -X DELETE 'https://api.directalk.io/public/v1/messages' \
  -H 'Authorization: Bearer dk_live_xxxxxxxxxxxxxxxxxxxxxxxx' \
  -H 'Content-Type: application/json' \
  --data-raw '{
    "groupIds": [
      "grp_01J...",
      "grp_01K..."
    ]
  }'

응답 200

{
  "success": true,
  "message": "Request processed successfully",
  "data": {
    "canceledCount": 998,
    "canceledMessageCount": 998,
    "releasedHoldAmount": 12974,
    "canceled": [
      "문자열"
    ],
    "skipped": [
      {
        "groupId": "문자열",
        "reason": "ALREADY_SUBMITTED"
      }
    ]
  },
  "timestamp": "2026-08-25T14:32:10.482+09:00",
  "method": "DELETE",
  "path": "/public/v1/messages",
  "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": "DELETE",
  "path": "/public/v1/messages",
  "correlationId": "c7f1a2b4-9e30-4d15-8a6c-2f0b7d9e1c34"
}