💳 충전 / 요금 API

충전 / 요금 API

imsend의 모든 발송 채널(SMS, 알림톡, MCP 등)은 하나의 포인트 잔액을 공유합니다.
충전은 TossPayments를 통해 처리되며, 발송 성공 시에만 포인트가 차감됩니다.

포인트 구조
포인트 잔액 1개 ← SMS API 차감 / 알림톡 차감 / MCP 차감
충전(TossPayments) → 포인트 증가 → 모든 채널에서 공통 사용

빌링 타입 조회

GET /api/v1/tenant/billing-type

가맹점의 빌링 타입(선불/후불)을 반환합니다. 잔액·단가 없이 가볍게 호출 가능하며, 프론트엔드가 충전 UI 표시 여부를 판단할 때 사용합니다.

GET /api/v1/tenant/billing-type
X-API-Key: your_api_key_here

응답 예시

{
  "success": true,
  "data": {
    "tenantId": "moonpd",
    "billingType": "PREPAID",
    "showRechargeUI": true
  }
}
  • billingType: "PREPAID"(선불) 또는 "POSTPAID"(후불)
  • showRechargeUI: billingType === "PREPAID" 일 때 true. 프론트 분기 단순화용
POSTPAID(후불) 가맹점은 신용한도(creditLimit) 내에서 발송하고 월말 정산하므로 충전 페이지가 불필요합니다.

잔액 조회

GET /api/v1/sms/balance

현재 포인트 잔액과 채널별 단가를 반환합니다.

GET /api/v1/sms/balance
X-API-Key: your_api_key_here

응답 예시

{
  "success": true,
  "data": {
    "tenantId": "moonpd",
    "tenantName": "문피디",
    "balance": 4980,
    "billingType": "PREPAID",
    "creditLimit": 0,
    "available": 4980,
    "unit": "point",
    "priceSms": 12,
    "priceLms": 35,
    "priceMms": 85,
    "priceAlimtalk": 10,
    "priceEmail": 1.2
  }
}
  • 응답은 data 객체로 감싸집니다. 잔액 단위는 "point"이며 포인트 ↔ 원(KRW) = 1:1입니다.
  • available: 사용 가능 잔액. POSTPAIDbalance + creditLimit, PREPAIDbalance와 동일.

충전 페이지 열기

GET /charge?apiKey={키}&returnUrl={콜백URL}

TossPayments 결제 페이지를 포함한 imsend 충전 페이지 URL을 생성합니다.
팝업 또는 새 탭으로 열면 결제 완료 후 returnUrl로 리다이렉트됩니다.

충전 흐름
1. getChargePageUrl(returnUrl)로 URL 생성
2. 팝업 또는 새 탭으로 오픈
3. 사용자가 imsend.kr에서 TossPayments 결제
4. 결제 완료 시 returnUrl로 리다이렉트
충전 금액
포인트 ↔ 원(KRW) = 1:1. 충전 금액은 고정 프리셋 버튼(1만 / 3만 / 5만 / 10만원)으로만 선택합니다 — 임의 금액 직접 입력은 지원하지 않습니다.
iframe(모달) 임베드 시
팝업/새 탭이 아니라 모달(iframe)로 띄울 경우, 충전 페이지가 부모 창에 postMessage 로 신호를 보냅니다. 받아서 처리하세요(보안상 origin https://imsend.kr 검증 권장):
{ type:'imsend:charge:resize', height } — 카드결제 단계 등 필요한 높이(px). iframe 높이를 맞추세요(초기 권장 440×560, transition:height 부드럽게).
{ type:'imsend:charge:close', success } — 결제 완료/취소 시 모달을 닫고 잔액을 갱신하세요.
팝업(window.open) 방식은 추가 처리 없이 자동으로 닫히고 returnUrl 로 이동합니다.

URL 파라미터

파라미터 필수 설명
apiKey필수발급받은 API 키
returnUrl선택결제 완료 후 리다이렉트 URL (URL 인코딩 필요)

예시

# 직접 URL 구성
https://imsend.kr/charge?apiKey=your_key&returnUrl=https%3A%2F%2Fmyapp.com%2Fcharge%2Fcomplete

# Java SDK
String url = client.payment().getChargePageUrl("https://myapp.com/charge/complete");
// 팝업으로 열기
window.open(url, '_blank', 'width=500,height=700');

충전 이력 조회

GET /api/v1/sms/point-history

파라미터 설명
page페이지 번호 (기본: 1)
size페이지 크기 (기본: 20, 최대: 100)
GET /api/v1/sms/point-history?page=1&size=20
X-API-Key: your_api_key_here

응답 예시

{
  "success": true,
  "balance": 4980,
  "list": [
    {
      "ledger_seq": 1024,
      "tx_type": "CHARGE",
      "amount": 10000,
      "balance_after": 14980,
      "description": "TossPayments 충전",
      "reg_date": "2026-05-04T14:23:00"
    },
    {
      "ledger_seq": 1025,
      "tx_type": "USE",
      "amount": 12,
      "balance_after": 14968,
      "description": "SMS 발송 차감",
      "reg_date": "2026-05-04T14:25:30"
    }
  ],
  "total": 48,
  "payments": [
    {
      "payment_seq": 305,
      "pg_type": "TOSS",
      "amount": 10000,
      "status": "DONE",
      "order_id": "ORD-20260504-0001",
      "reg_date": "2026-05-04T14:22:58"
    }
  ]
}
  • 필드명은 snake_case(ledger_seq, tx_type, balance_after, reg_date)입니다.
  • tx_type: CHARGE(충전) / USE(선불 차감) / CREDIT_USED(후불 차감) / REFUND(환불).
  • total은 포인트 원장 전체 건수입니다.
  • payments[]im_payment의 실제 Toss 충전 레코드(DONE)를 함께 반환합니다.

월별 빌링 집계

GET /api/v1/sms/billing

연간 월별/분기별 발송 건수와 발송 비용(SUM(unit_price))을 집계하여 반환합니다.

GET /api/v1/sms/billing?year=2026
X-API-Key: your_api_key_here

응답 예시

{
  "success": true,
  "data": {
    "tenantId": "moonpd",
    "billingType": "PREPAID",
    "creditLimit": 0,
    "balance": 4980,
    "year": "2026",
    "months": [
      { "period": "2026-05", "total_count": 1100, "sms_count": 800, "lms_count": 300, "total_amount": 16520 },
      { "period": "2026-04", "total_count": 1900, "sms_count": 1500, "lms_count": 400, "total_amount": 28500 }
    ],
    "quarters": [
      { "period": "2026-Q2", "total_count": 3000, "total_amount": 45020 }
    ],
    "yearTotal": { "totalCount": 3000, "totalAmount": 45020 }
  }
}
  • 응답은 data 객체로 감싸집니다. 월/분기 행의 식별자는 period입니다.
  • 집계는 발송 비용(과금액) 합산만 제공합니다 — 충전 금액과의 분리(charge vs use) 항목은 없습니다.
  • total_amount는 해당 기간 im_sms_log.unit_price 합계, sms_count/lms_count는 유형별 건수입니다.

채널별 단가

발송 성공(수신 확인) 시에만 차감됩니다. imsend는 3중 단가 체계로 운영되며, 발송 경로·가맹점에 따라 실제 적용 단가가 달라집니다. 내 계정에 실제 적용되는 단가는 항상 잔액 조회 API로 확인하세요.

단가 체계 적용 대상 우선순위
① 기본 단가모든 가맹점 공통 기본값 (아래 표의 파란색)최저 우선
② 가맹점별 협의 단가계약·협의로 가맹점마다 별도 설정 — 설정 시 기본 단가에 우선 적용기본보다 우선
③ MCP 단가AI 에이전트(MCP) 발송 전용 별도 체계 (아래 표의 보라색)MCP 발송에만

📌 일반 API(X-API-Key) 발송은 ②가맹점별 협의 단가 → ①기본 단가 순으로 적용됩니다. AI 에이전트(MCP) 발송은 가맹점 단가와 무관하게 ③MCP 단가가 적용됩니다.

채널 단가 비고
SMS (단문)12원/건90바이트 이내
LMS (장문)35원/건2,000자 이내
MMS85원/건이미지 포함
이메일1.2원/건HTML 지원
카카오 알림톡10원/건승인 템플릿 필요
MCP — SMS17원/건AI 에이전트 발송
MCP — LMS40원/건AI 에이전트 발송
MCP — 이메일1.5원/건AI 에이전트 발송
MCP — 알림톡15원/건AI 에이전트 발송

차감 정책

  • 수신 확인(DELIVERED) 시 1회 차감 — 발송 시점에는 차감하지 않습니다. 결과 폴러(SmsResultScheduler)가 GT Agent 결과를 수신해 DELIVERED로 확정될 때 단 한 번 차감합니다.
  • 실패 건 미차감 — FAILED 상태는 포인트 차감 없음
  • TIMEOUT 자동 환불 — 결과 미수신(TIMEOUT/NO_RESULT)으로 5분이 경과하면 RecoveryScheduler가 실제 청구 단가(unit_price)를 환불(tx_type=REFUND)하고 result_code='TIMEOUT_REFUNDED'로 마킹해 중복 환불을 방지합니다.
  • 과금 타입별 원장 기록 — 선불(PREPAID)은 tx_type=USE, 후불(POSTPAID)은 tx_type=CREDIT_USED로 기록됩니다.
  • 잔액 부족 시 발송 차단 — 사전 잔액 확인 후 발송 요청
✅ 결과 폴러는 약 30초 주기(fixedDelay=30000)로 동작합니다. 수신 확인이 완료되는 시점에 차감되며, GT Agent 결과 도착 시점에 따라 차감 시각은 달라질 수 있습니다.

예정: MCP 직접 결제

🚧 준비 중 — 카카오페이 가맹 완료 후 제공 예정입니다.
현재는 imsend.kr 웹에서 충전 후 MCP를 사용하세요.

카카오페이 가맹 완료 후 MCP charge_point 도구에서 직접 결제가 가능해집니다.

// 현재 (준비 중)
{ "tool": "charge_point", "amount": 10000 }
// → "충전 페이지: https://imsend.kr/Home/charge"

// 예정 (카카오페이 가맹 후)
{ "tool": "charge_point", "amount": 10000 }
// → 카카오페이 결제 링크 반환
(주)임팩시스 · imsend 충전/요금 API v1 info@imcorp.kr