API

결제 이력 목록 조회

작성일 2026.04.23 | 수정일 2026.04.29

GET/crm-core/v1/plans/me/billing-logs

내 결제 이력을 페이지네이션으로 조회합니다. 최근 12개월 이내, status=COMPLETED, 실제 청구·환불이 발생한 건(totalCharge/chargeAmount/refundAmount 중 하나가 양수)만 반환됩니다. 응답은 외부 노출 화이트리스트(18 필드)로 매핑되어 운영 메타(transactionId, processedBy 등)는 포함되지 않습니다.

Query Params

NameTypeRequiredDescription
limitnumber페이지 크기 (1~200, 기본 20)
offsetnumber페이지네이션 오프셋 (≥0, 기본 0)
actionstring결제 액션으로 필터링 — UPGRADE | DOWNGRADE | RENEWAL | OVERAGE 등

Response

NameTypeRequiredDescription
itemsarray<object>*결제 로그 목록 (BillingLogResponseDto)
subscriptionBillingLogIdstring*결제 로그 ID
actionstring*결제 액션 — UPGRADE | DOWNGRADE | RENEWAL | OVERAGE 등
actionDatedate*결제 발생 시각 (UTC)
statusstring*결제 상태 — PENDING | COMPLETED | FAILED
billingPeriodstring*청구 기간 (YYYY-MM)
billingPeriodStartdate*청구 기간 시작
billingPeriodEnddate*청구 기간 종료
fromTierstring이전 티어 (UPGRADE/DOWNGRADE인 경우)
toTierstring신규 티어
seatCountnumber과금 인원 수
unitPricenumber인당 단가 (원)
subtotalnumber*공급가액 (VAT 제외)
taxAmountnumber*부가세
totalChargenumber*실제 결제 금액
chargeAmountnumber*청구 금액 (legacy 필드, totalCharge 사용 권장)
refundAmountnumber*환불 금액
paymentMethodBrandstring결제 카드 브랜드 스냅샷
paymentMethodLast4string결제 카드 끝 4자리 스냅샷
calculationDetailsobject영수증 계산 상세
descriptionstring*계산 설명 텍스트
stepsarray<object>*단계별 계산 항목
labelstring*항목 레이블
formulastring*계산식 표시
valuenumber*
unitstring*단위
notestring메모
totalnumber*필터 적용 후 총 건수
limitnumber*적용된 페이지 크기
offsetnumber*적용된 오프셋

Structure

코드 예제

const crypto = require('crypto');

const apiKey = 'NCSXXXXXXXXXXXXX';
const apiSecret = 'YOUR_API_SECRET';
const dateTime = new Date().toISOString();
const salt = crypto.randomBytes(16).toString('hex');
const signature = crypto.createHmac('sha256', apiSecret).update(dateTime + salt).digest('hex');
const authHeader = HMAC-SHA256 apiKey=${apiKey}, date=${dateTime}, salt=${salt}, signature=${signature};

const response = await fetch('https://api.solapi.com/crm-core/v1/plans/me/billing-logs?limit=20&offset=0', {
method: 'GET',
headers: { 'Authorization': authHeader, 'Content-Type': 'application/json' }
});
const data = await response.json();

import hmac, hashlib, secrets, requests
from datetime import datetime, timezone

api_key = 'NCSXXXXXXXXXXXXX'
api_secret = 'YOUR_API_SECRET'
date_time = datetime.now(timezone.utc).strftime('%Y-%m-%dT%H:%M:%SZ')
salt = secrets.token_hex(16)
signature = hmac.new(api_secret.encode(), (date_time + salt).encode(), hashlib.sha256).hexdigest()
auth_header = f'HMAC-SHA256 apiKey={api_key}, date={date_time}, salt={salt}, signature={signature}'

response = requests.get('https://api.solapi.com/crm-core/v1/plans/me/billing-logs?limit=20&offset=0', headers={
'Authorization': auth_header,
'Content-Type': 'application/json'
}, params={
"limit": 20,
"offset": 0
})
data = response.json()

API_KEY="NCSXXXXXXXXXXXXX"
API_SECRET="YOUR_API_SECRET"
DATE=$(date -u +"%Y-%m-%dT%H:%M:%SZ")
SALT=$(openssl rand -hex 16)
SIGNATURE=$(echo -n "${DATE}${SALT}" | openssl dgst -sha256 -hmac "${API_SECRET}" | awk '{print $NF}')
AUTH="HMAC-SHA256 apiKey=${API_KEY}, date=${DATE}, salt=${SALT}, signature=${SIGNATURE}"

curl -X GET 'https://api.solapi.com/crm-core/v1/plans/me/billing-logs?limit=20&offset=0' \
-H "Authorization: ${AUTH}" \
-H "Content-Type: application/json"

lightbulb

DOWNGRADE_SCHEDULED, CANCEL_SCHEDULED, ADMIN_SEAT_ADJUST, PAYMENT_FAILED, 트라이얼 관련 등 실제 결제가 없는 액션은 응답에서 제외됩니다.

lightbulb

**401 응답**: `{ "errorCode": "Unauthorized", "errorMessage": "권한이 없습니다." }`