새로운 문서를 작성 중입니다.새 문서로 이동
ClawOps Docs
배치 발신 (캠페인)

배치 발신 (캠페인)

명단을 넣으면 동시통화 한도·분당 발신 속도·발신 가능 시간대를 지키며 자동으로 순차 발신하는 배치 발신(캠페인) API 개요. 상태 모델, 제한 3층, 재시도 정책.

개요

배치 발신은 수신자 명단을 등록해 두면 플랫폼이 알아서 순차적으로 전화를 거는 기능입니다. 예약 확인, 설문, 안내 통화처럼 같은 시나리오를 여러 사람에게 반복해야 할 때 사용합니다.

배치를 만들면 생성 API 는 즉시 반환됩니다. 실제 발신은 여기서 일어나지 않고, 디스패처가 동시통화 한도·분당 발신 속도·발신 가능 시간대를 보면서 명단을 하나씩 집어 갑니다. 그래서 수만 건짜리 배치를 만들어도 요청은 바로 끝납니다.

배치가 거는 통화는 일반 발신과 완전히 같습니다. 통화 상세·녹취·전사·요약 모두 평소처럼 통화 API 로 조회할 수 있습니다.

배치가 거는 대상

발신 시 실행할 시나리오는 CallFlowId · AgentId · Url 중 정확히 하나를 지정합니다. 일반 발신(createCall) 과 같은 규칙입니다.

파라미터타입필수설명
CallFlowIdstring선택콜 플로우(결정형 ARS)로 발신. 통화 중 수집한 값이 수신자별 결과로 저장됩니다
AgentIdstring선택매니지드 에이전트(AI)로 발신
Urlstring선택VoiceML 을 반환하는 서버 URL 로 발신

제한 3층

배치는 세 가지 제한을 동시에 지킵니다. 셋 중 하나라도 막히면 그 시점에는 발신하지 않습니다.

파라미터기본값의미
동시성MaxConcurrency1이 배치가 동시에 유지할 통화 수
속도PacingPerMinute10분당 최대 발신 수
시간Rounds[].Windows · Timezone없음 · Asia/Seoul차수별 발신 가능 요일·시간대

여기에 더해 계정 전체의 동시통화 한도가 상위에 있습니다. 배치가 그 한도에 부딪히면 해당 시도는 실패로 처리되지 않고 잠시 후 다시 시도됩니다(아래 재시도 정책 참고).

자동응답기 감지

MachineDetection 으로 사람이 받았는지 자동응답기인지 판별할 수 있습니다. 기본은 꺼져 있고, 켜면 판별한 통화마다 요금이 붙습니다(AMD 부가서비스 필요). 판별만 하고 통화를 이어가는 Enable, 자동응답기면 끊는 Hangup 중에 고릅니다 — 자세한 내용은 빠른 시작을 보세요.

애드온 활성 여부는 발신할 때마다 다시 확인합니다. 배치를 만든 뒤 애드온을 해지하면 남은 통화는 감지 없이 걸립니다(배치가 실패하지는 않습니다).

발신 가능 시간대

시간대는 차수마다 지정합니다(Rounds[].Windows). Days 는 1(월)~7(일), Start/End"HH:MM" 입니다.

"Timezone": "Asia/Seoul",
"Rounds": [
  { "Windows": [{ "Days": [1,2,3,4,5], "Start": "09:00", "End": "18:00" }] }
]

생략하면 법정 허용 시간(08:00~21:00) 전체입니다. 차수를 여러 개 두고 각각 다른 시간대를 주면 "1차는 낮에, 안 받으면 2·3차는 저녁에" 같은 진행이 됩니다 — 안 받았을 때 다시 걸기를 보세요.

21시~익일 8시는 법으로 금지된 시간대입니다(광고성 전화). 이 시간에는 Windows 설정과 무관하게 발신되지 않습니다. Windows 는 그보다 더 좁게 제한할 때만 사용합니다. 법정 허용 시간과 겹치는 구간이 전혀 없는 Windows(예: 22:00~23:00)는 400으로 거절합니다 — 받아 두면 그 차수가 영원히 걸리지 않기 때문입니다.

StartAt / EndAt 으로 배치 자체의 시작·종료 시각도 지정할 수 있습니다. EndAt 이 지나면 남은 대상은 발신하지 않고 배치가 종료됩니다.

상태 모델

배치 상태

상태의미
running발신 중
paused일시정지 — 신규 발신만 중단, 진행 중인 통화는 유지
completed모든 대상 처리 완료
canceled취소 — 남은 대상을 모두 취소
expiredEndAt 경과로 종료
draft · scheduled콘솔에서 사용하는 준비 단계

API 로 만든 배치는 기본이 running 입니다 — 만들면 바로 발신 대기 상태가 됩니다. 명단을 확인한 뒤 시작하고 싶다면 Status: "paused" 로 만들고 나중에 resume 하세요. (콘솔은 3만 건 규모 명단을 사람이 표로 확인할 수 있도록 paused 로 만듭니다.)

수신자 상태

상태의미
pending발신 대기
dialing발신 중
done통화 정상 종료
failed발신 실패 또는 통화 비정상 종료
canceled배치 취소로 발신하지 않음
expiredEndAt 경과로 발신하지 않음

안 받았을 때 다시 걸기

기본은 한 사람에게 한 번입니다. Rounds 에 차수를 더하면 통화가 안 됐을 때 다시 겁니다.

배열 인덱스가 곧 차수입니다 — Rounds[0] 이 1차 발신이고 그 뒤가 재시도입니다. 최대 5개.

"Rounds": [
  { "Windows": [{ "Days": [1,2,3,4,5], "Start": "10:00", "End": "18:00" }] },
  { "After": 30, "On": ["no-answer","busy"],
    "Windows": [{ "Days": [1,2,3,4,5], "Start": "18:00", "End": "21:00" }] },
  { "After": 45, "On": ["no-answer","busy"],
    "Windows": [{ "Days": [1,2,3,4,5], "Start": "18:00", "End": "21:00" }] }
]

위 예시는 1차를 낮(1018시)에 걸고, 안 받으면 2·3차를 저녁(1821시)에 겁니다. 차수마다 시간대를 따로 줄 수 있는 것이 핵심입니다 — 받을 확률이 높은 시간대에 재시도를 몰 수 있습니다.

필드1차2차부터의미
After쓸 수 없음필수직전 차수를 마무리한 뒤 기다릴 시간(분). 1~1440
On쓸 수 없음필수직전 통화가 이 결과일 때만 진행
Windows선택선택이 차수의 발신 가능 시간대. 생략 = 법정 허용 시간 전체

1차에 After·On 을 쓸 수 없는 이유는 기준이 될 직전 통화가 없기 때문입니다. 발신 시작 시각은 StartAt 으로 지정하세요.

On 에는 다시 걸 통화 결과를 나열합니다. 차수마다 다르게 줄 수 있습니다.

의미
no-answer벨은 울렸는데 받지 않음
busy상대가 다른 통화 중
rejected상대가 끊었거나 통신사가 차단
failed결번·망 오류 등으로 연결되지 못함
machine자동응답기로 판별됨 (MachineDetection 을 켠 배치만)

machineMachineDetection 을 함께 켠 배치에서만 동작합니다. 감지를 끈 채로 넣으면 요청이 거절되지는 않지만 아무 일도 일어나지 않습니다 — 맞출 판정값(answeredBy)이 아예 없기 때문입니다.

켜더라도 신중히 고르세요. 한국어 자동응답기 감지는 오탐이 잦아 사람이 받은 통화를 기계로 잘못 본 경우가 적지 않고, 그러면 이미 통화한 분께 다시 걸게 됩니다.

자동응답기가 받은 통화는 통화 자체는 연결된 것이라 평소에는 done 으로 끝납니다. machine 을 고른 배치에서만 이를 미연결로 보고 다시 걸며, 재시도를 다 쓰면 status: "failed" + disposition: "completed" 로 남습니다(미연결 문자도 이때 나갑니다).

재시도도 최초 발신과 똑같은 제한을 받습니다 — 동시통화 한도, 분당 발신 속도, 그 차수의 발신 가능 시간대가 그대로 적용됩니다. After 로 계산한 시각이 그 차수의 시간대 밖이면 시간대가 열릴 때까지 기다렸다가 겁니다(낮 10시 30분이 되어도 저녁 차수면 18시에 걸립니다). 예를 들어 20시 50분에 실패한 통화의 "30분 뒤" 재시도는 금지 시간대(21~08시)에 걸려 다음 날 아침 8시로 밀립니다.

수신자별 시도 횟수는 결과의 dialRound 로, 다음 시도 예정 시각은 expectedDialAt 으로 확인할 수 있습니다(시간대 제한이 이미 반영된 값입니다).

재시도하면 통화가 여러 번 일어나므로 callflow.ended 웹훅같은 수신자에 대해 여러 번 발생합니다. 수신자당 한 번을 가정한 처리가 있다면 확인하세요.

내부 재시도와는 다릅니다

위의 Rounds 재시도는 "전화를 안 받았을 때"이고, 이와 별개로 발신 자체가 실패했을 때의 내부 재시도가 항상 동작합니다. 둘은 서로의 횟수를 소모하지 않습니다.

  • 일시적 실패(5xx·타임아웃): 되돌려 다시 시도하며, 최대 3회까지입니다.
  • 영구 실패(잘못된 번호 등): 재시도 없이 즉시 failed.
  • 동시통화 한도 초과: 그 번호의 잘못이 아니므로 횟수를 소모하지 않고 잠시 후 다시 집어 갑니다.

끝내 통화가 안 된 분께 문자 보내기

MessagePolicy 로 통화가 안 된 수신자에게 문자를 보낼 수 있습니다.

"MessagePolicy": {
  "OnFinalFail": { "Body": "{{customer_name}}님, 전화드렸는데 연결이 어려워 문자 남깁니다." }
}
  • OnFirstFail첫 통화가 안 됐을 때 바로. 재시도 전화는 그 뒤에 이어집니다. (재시도 차수가 있어야 쓸 수 있습니다. 다시 걸지 않으면 첫 실패가 곧 최종 실패입니다.)
  • OnFinalFail — 재시도를 모두 소진하고 끝내 통화가 안 됐을 때.

둘 다 지정하면 한 수신자가 문자를 2통 받습니다. 통화가 연결된 분께는 보내지 않습니다.

본문의 {{변수}} 는 그 수신자의 Variables 값으로 치환됩니다 — 통화 멘트와 같은 문법이라 명단에 넣은 {{customer_name}} 을 그대로 쓸 수 있습니다. 참조한 변수가 없는 수신자가 한 명이라도 있으면 배치 생성이 400 으로 거절됩니다(빈칸으로 나간 문자는 되돌릴 수 없습니다).

문자도 발신과 같은 시간대 제한을 지키며, 보낼 시점이 24시간 이상 지나면 보내지 않습니다 (일시정지해 둔 배치를 며칠 뒤 재개했을 때 뒤늦은 문자가 나가지 않도록). 배치를 취소하면 아직 보내지 않은 문자도 함께 취소됩니다.

문자 발신번호 등록은 음성 발신 등록과 별개 절차입니다. 등록되지 않은 번호는 발송 요청이 성공한 것처럼 보여도 통신사에서 거절될 수 있습니다. 배치 생성 응답의 warnings 에서 확인하시고, 실제 전달 여부는 결과의 messageDeliveryStatus 를 보세요.

광고성 문자는 (광고) 표기와 무료 수신거부 안내가 법으로 의무입니다. 본문에 직접 넣어 주세요.

콘솔과 API

콘솔의 배치 발신 화면에서 CSV 명단 업로드·진행 현황 확인· 결과 내려받기를 할 수 있습니다. API 와 같은 데이터를 보므로 섞어 써도 됩니다.

배치 발신은 계정별로 활성화가 필요한 기능입니다. 활성화되지 않은 계정이 배치를 생성하면 403 batch_disabled 가 반환됩니다. 사용을 원하시면 지원팀에 문의하세요.

다음 단계