사용량·크레딧 API로 비용 모니터링하기: 잔액, 이력, 그룹 사용량
KAT Cloud는 /payment/credit/summary로 크레딧 잔액을, /payment/credit/history로 사용·충전 이력을, 그룹 usage API로 제공량 대비 사용량을 조회합니다. 세 API로 비용 알림을 만드는 법을 정리했습니다.

KAT Cloud 비용 모니터링은 세 API로 합니다. GET /payment/credit/summary는 현재 크레딧 잔액과 결제 상태를, GET /payment/credit/history는 기간별 사용·충전 이력을, GET /payment/group/{groupId}/usage는 현재 결제 기간의 그룹별 기본 제공량 대비 사용량을 돌려줍니다. KAT Cloud는 포함량을 넘겨도 통화를 끊지 않고 초과분을 청구하므로, 이 값들을 주기적으로 확인해 알림을 거는 것이 비용 관리의 출발점입니다.
비용을 보는 세 가지 API
KAT Cloud(캣클라우드)의 크레딧·사용량 API는 보는 범위가 서로 다릅니다.

| API | 알려 주는 것 | 주로 쓰는 때 |
|---|---|---|
GET /payment/credit/summary | 크레딧 잔액, 결제 상태, 자동 충전 설정, 단가 정보 | 잔액 부족·결제 상태 알림 |
GET /payment/credit/history | 기간별 사용·충전 금액, 분류별 합계, 건별 상세 | 일·주·월 비용 리포트 |
GET /payment/group/{groupId}/usage | 현재 결제 기간의 제공량, 사용량, 남은 양 | 포함량 소진 임박 알림 |
세 API 모두 문자 발신 외 API에 속하므로 비즈니스 요금제 그룹 또는 별도 허용된 그룹에서 쓸 수 있습니다. 403 AU017이 나온다면 API 키 발급과 인증 글의 점검 방법을 참고하세요.
크레딧 잔액과 결제 상태: GET /payment/credit/summary
GET /payment/credit/summary는 현재 크레딧 잔액과 기본 정보를 조회합니다.
curl -X GET "https://studio-gateway.zerocall.kr/payment/credit/summary" \
-H "x-api-key: $KAT_API_KEY"{
"creditBalance": 50000,
"billingStatus": "ACTIVE",
"autoRechargeThreshold": 10000,
"autoRechargeAmount": 50000,
"costMap": { "sms": 15, "lms": 40, "mms": 100, "call": 2 },
"billingAnchorAt": "2026-01-01T00:00:00.000Z"
}| 필드 | 설명 | 모니터링 포인트 |
|---|---|---|
creditBalance | 현재 크레딧 잔액 | 일정 수준 아래로 떨어지면 알림 |
billingStatus | 결제 상태(ACTIVE, INACTIVE 등) | ACTIVE가 아니면 즉시 알림 |
autoRechargeThreshold | 자동 충전 기준 금액 | 잔액이 이 값에 가까우면 충전 예정 |
autoRechargeAmount | 자동 충전 금액 | 충전 주기 추정 |
costMap | 단가 정보(sms, lms, mms, call 등) | 비용 추정 계산에 참고 |
billingAnchorAt | 결제 기준일(ISO 8601) | 결제 기간 경계 확인 |
사용·충전 이력: GET /payment/credit/history
GET /payment/credit/history는 크레딧 사용과 충전 이력을 기간별로 묶어 돌려줍니다.
| 파라미터 | 설명 |
|---|---|
startDate, endDate | 시작일·종료일(KST, YYYY-MM-DD) |
type | 타입 필터(AUTO_RECHARGE, PLAN_DEDUCT, MANUAL_ADJUST, AI_CALL_REFUND 등) |
groupBy | 묶음 단위(day, week, month). 기본값 day |
fillEmptyBuckets | 빈 구간도 포함(기본값 false) |
includeDetails | 건별 상세 포함(기본값 false) |
limit, offset | 조회 개수(기본 100, 최대 500)와 오프셋(기본 0) |
curl -G "https://studio-gateway.zerocall.kr/payment/credit/history" \
-H "x-api-key: $KAT_API_KEY" \
--data-urlencode "startDate=2026-10-01" \
--data-urlencode "endDate=2026-10-28" \
--data-urlencode "groupBy=week" \
--data-urlencode "fillEmptyBuckets=true"응답의 result는 아래 구조입니다. 문서 예시에서 사용 금액은 음수로 기록되고, 건별 상세에는 부호 없는 금액(absAmount)과 방향(direction)이 따로 들어 있습니다.
{
"effectiveStartDate": "2026-03-01T00:00:00+09:00",
"effectiveEndDate": "2026-03-31T23:59:59+09:00",
"totalCount": 50,
"totalAmount": -15000,
"summary": [
{
"periodStart": "2026-03-05",
"periodEnd": "2026-03-05",
"count": 5,
"totalAmount": -500,
"startBalance": 50000,
"endBalance": 49500,
"amountByType": { "CALL": -300, "MESSAGE": -200 },
"amountByUsageCategory": { "CALL": -300, "MESSAGE": -200 }
}
],
"details": [
{
"id": 1,
"type": "CALL",
"amount": -100,
"absAmount": 100,
"direction": "DEBIT",
"sourceType": "CALL",
"usageCategory": "CALL",
"balanceBefore": 50000,
"balanceAfter": 49900,
"chatId": null,
"callHistoryId": "8f3f8fd9-7ab8-4a26-b523-4f8eb7d38b85",
"campaignId": null,
"appliedPaymentHistoryId": null,
"description": "통화 사용",
"createdAt": "2026-03-05T10:30:00.000Z"
}
],
"hasMoreDetails": true
}summary는 groupBy 기준의 구간별 요약이고, details는 includeDetails=true일 때만 채워집니다. hasMoreDetails가 true면 offset을 늘려 나머지 상세를 이어 받습니다. 건별 상세의 callHistoryId나 chatId로 어느 통화·문자가 비용을 만들었는지 거슬러 올라갈 수 있습니다. 분류 값인 usageCategory는 다음과 같습니다.
| 값 | 설명 |
|---|---|
CALL | 일반 통화 사용 |
AI_CALL | AI 통화 사용 |
MESSAGE | 문자 메시지 사용 |
PLAN | 요금제 차감 |
RECHARGE | 크레딧 충전 |
ADJUST | 수동 조정 |
REFUND | 환불 |
그룹별 제공량 대비 사용량: GET /payment/group/{groupId}/usage
GET /payment/group/{groupId}/usage는 그룹의 현재 결제 기간 기준으로 기본 제공량과 사용량을 돌려줍니다. 응답에는 groupId, plan, 결제 기간(startDate, endDate), 통화(initialCallSecond, useCallSecond, remainingCallSecond, billedCallSecond, initialCallMinute, useCallMinute, remainingCallMinute), 문자(initialMessageCount, useSmsCount, useLmsCount, useMmsCount, useTotalMessageCount, remainingMessageCount), AI 통화 건수(initialAiCallCount, useAiCallCount, remainingAiCallCount)가 들어 있습니다.
curl -X GET "https://studio-gateway.zerocall.kr/payment/group/1/usage" \
-H "x-api-key: $KAT_API_KEY"통화 필드를 읽을 때 가장 중요한 것은 청구 기준과 실제 통화 시간의 차이입니다. KAT Cloud는 통화마다 1분 단위로 올려 청구합니다(1~60초는 1분, 61초는 2분). 그래서 useCallSecond는 실제 통화 시간이고, billedCallSecond는 통화마다 올림한 청구 기준 시간입니다. 61초 통화 하나는 billedCallSecond에 120으로 잡힙니다.

| 필드 | 계산 |
|---|---|
useCallMinute | 청구 기준 사용 통화(분, 1분 = 1도수) = billedCallSecond / 60 |
remainingCallMinute | initialCallMinute − useCallMinute |
remainingCallSecond | 실제 통화 시간 기준 남은 시간(초) |
기본 제공량 차감과 초과 요금은 billedCallSecond·useCallMinute 기준입니다. 소진율 알림은 useCallMinute와 initialCallMinute로 계산해야 실제 청구와 어긋나지 않습니다.
Python 비용 점검 스크립트
아래 스크립트는 하루 한 번 실행해 결제 상태, 잔액, 그룹별 소진율, 어제 사용액을 점검합니다. 알림 전송 부분은 출력으로 두었으니 사내 메신저나 메일 발송으로 바꿔 쓰면 됩니다. 슬랙으로 보내는 방법은 통화 요약을 슬랙으로 보내기의 전송 코드를 응용할 수 있습니다.
import os
from datetime import datetime, timedelta, timezone
import requests
BASE_URL = "https://studio-gateway.zerocall.kr"
KST = timezone(timedelta(hours=9))
USAGE_WARN_RATIO = 0.8 # 기본 제공량의 80%를 넘으면 경고
session = requests.Session()
session.headers.update({"x-api-key": os.environ["KAT_API_KEY"]})
def get(path, params=None):
resp = session.get(BASE_URL + path, params=params, timeout=15)
resp.raise_for_status()
body = resp.json()
return body["result"] if isinstance(body, dict) and "result" in body else body
def ratio(used, initial):
return used / initial if initial else 0.0
def check():
alerts = []
credit = get("/payment/credit/summary")
if credit["billingStatus"] != "ACTIVE":
alerts.append(f"결제 상태가 {credit['billingStatus']}입니다.")
threshold = credit.get("autoRechargeThreshold") or 0
if credit["creditBalance"] <= threshold:
alerts.append(f"크레딧 잔액 {credit['creditBalance']:,}이(가) 자동 충전 기준 이하입니다.")
for group in get("/group"):
u = get(f"/payment/group/{group['id']}/usage")
call_r = ratio(u["useCallMinute"], u["initialCallMinute"])
msg_r = ratio(u["useTotalMessageCount"], u["initialMessageCount"])
if call_r >= USAGE_WARN_RATIO:
alerts.append(f"{group['title']}: 통화 {u['useCallMinute']}/{u['initialCallMinute']}분 ({call_r:.0%})")
if msg_r >= USAGE_WARN_RATIO:
alerts.append(f"{group['title']}: 문자 {u['useTotalMessageCount']}/{u['initialMessageCount']}건 ({msg_r:.0%})")
yesterday = (datetime.now(KST) - timedelta(days=1)).strftime("%Y-%m-%d")
hist = get("/payment/credit/history", {
"startDate": yesterday, "endDate": yesterday, "groupBy": "day",
})
for bucket in hist["summary"]:
by_cat = bucket.get("amountByUsageCategory") or {}
spent = -sum(v for v in by_cat.values() if v < 0)
print(f"{bucket['periodStart']} 사용 합계 {spent:,} / 분류별 {by_cat}")
return alerts
if __name__ == "__main__":
for line in check() or ["이상 없음"]:
print(line)이력 API의 날짜는 KST 기준 YYYY-MM-DD이므로, 스크립트도 한국 시간으로 어제 날짜를 만듭니다. 그룹 목록은 GET /group에서 받으므로 그룹이 늘어나도 코드를 고칠 필요가 없습니다.
알림 기준 정하기
알림은 너무 잦으면 무시되고, 너무 늦으면 의미가 없습니다. 처음에는 아래 정도로 시작해 운영하면서 조정합니다.
| 알림 | 기준 예시 | 사용하는 값 |
|---|---|---|
| 결제 이상 | billingStatus가 ACTIVE가 아님 | credit summary |
| 잔액 부족 | creditBalance ≤ autoRechargeThreshold | credit summary |
| 포함량 소진 임박 | 사용률 80% 이상 | group usage |
| 초과 사용 진입 | remainingCallMinute 또는 remainingMessageCount가 0 이하 | group usage |
| 사용액 급증 | 어제 사용액이 최근 7일 평균의 2배 이상 | credit history(groupBy=day) |
포함량을 넘긴 뒤의 비용은 누적 구간 단가로 계산합니다. 초과 분수와 건수를 금액으로 바꾸는 방법은 KAT Cloud 요금 계산 가이드에 예시와 함께 정리했습니다. 이 글에서 다룬 엔드포인트 원문은 API 문서의 크레딧/사용량에 있습니다.
자주 묻는 질문
통화 사용량이 실제 통화 시간보다 많게 나오는 이유는 무엇인가요?
KAT Cloud는 통화마다 1분 단위로 올려 청구하므로 1~60초 통화는 1분, 61초 통화는 2분으로 계산됩니다. 그룹 사용량 API의 useCallSecond는 실제 통화 시간이고 billedCallSecond와 useCallMinute는 올림한 청구 기준이라 두 값이 다르게 나옵니다.
크레딧 이력의 금액이 음수로 나오는 것은 정상인가요?
KAT Cloud의 GET /payment/credit/history 응답에서 사용 금액은 음수로 기록됩니다. 건별 상세에는 부호 없는 금액인 absAmount와 DEBIT 같은 direction 값이 함께 들어 있으므로 리포트에는 이 값을 쓰면 편합니다.
그룹별 사용량은 어느 기간을 기준으로 계산되나요?
KAT Cloud의 GET /payment/group/{groupId}/usage는 현재 결제 기간을 기준으로 사용량을 계산하며, 기간은 응답의 startDate와 endDate로 확인할 수 있습니다. 요금제와 사용량은 그룹 단위로 관리되므로 그룹마다 따로 조회합니다.
- #사용량 조회
- #크레딧
- #비용 모니터링
- #KAT Cloud API



