구글 스프레드시트, Python, 자사 시스템 등 외부에서 바른문자 발송 기능을 호출할 수 있는 공개 API 가이드입니다.
bmk_live_... 키를 복사해서 안전한 곳에 저장 (이후에는 다시 표시되지 않음)프로그래밍 지식 없이, 스프레드시트에서 버튼 한 번으로 대량 발송을 할 수 있습니다.
🔧 시트 준비 방법
070-0000-0000)📋 Apps Script 전체 코드 (그대로 복사)
/**
* 바른문자 API 연동 (Google Apps Script)
* 스프레드시트 메뉴 > 확장 프로그램 > Apps Script 에 붙여넣기
*/
// ⚠️ 본인의 API Key로 교체하세요
const BARUN_API_KEY = 'bmk_live_여기에_발급받은_키_붙여넣기';
const BARUN_BASE = 'https://barunsms.com/api/v1';
/**
* 문자 한 건 보내기 (셀 함수로 사용 가능)
* 사용: =sendSMS("010-1234-5678", "안녕하세요", "070-0000-0000")
*/
function sendSMS(phone, message, senderId) {
const res = UrlFetchApp.fetch(BARUN_BASE + '/messages/send', {
method: 'post',
contentType: 'application/json',
headers: { 'Authorization': 'Bearer ' + BARUN_API_KEY },
payload: JSON.stringify({
senderId: senderId,
to: phone,
message: message,
}),
muteHttpExceptions: true,
});
const data = JSON.parse(res.getContentText());
if (data.error) return '❌ ' + data.error;
return '✅ 발송완료 (잔액 ' + data.balance.toLocaleString() + '원)';
}
/**
* 시트 전체 일괄 발송
* A열: 전화번호
* B열: 메시지 (비워두면 C1 셀의 공통 메시지 사용)
* 상단 스크립트 메뉴 > 일괄 발송 실행
*/
function sendFromSheet() {
const sheet = SpreadsheetApp.getActiveSheet();
const senderId = sheet.getRange('D1').getValue(); // D1 셀에 발신번호
const commonMsg = sheet.getRange('C1').getValue(); // C1 셀에 공통 메시지
const lastRow = sheet.getLastRow();
if (!senderId) { SpreadsheetApp.getUi().alert('D1 셀에 승인된 발신번호를 입력하세요.'); return; }
// 번호 목록 만들기 (개별 메시지 사용 여부로 분기)
const recipients = [];
for (let r = 2; r <= lastRow; r++) {
const phone = sheet.getRange(r, 1).getValue();
const msg = sheet.getRange(r, 2).getValue() || commonMsg;
if (phone && msg) recipients.push({ phone: String(phone), msg: String(msg) });
}
if (recipients.length === 0) { SpreadsheetApp.getUi().alert('발송할 번호가 없습니다.'); return; }
// 메시지가 전부 동일하면 한번에, 다르면 건별로
const uniqueMessages = [...new Set(recipients.map(r => r.msg))];
if (uniqueMessages.length === 1) {
// 공통 메시지 → 1회 API 호출로 일괄 발송
const res = UrlFetchApp.fetch(BARUN_BASE + '/messages/send', {
method: 'post',
contentType: 'application/json',
headers: { 'Authorization': 'Bearer ' + BARUN_API_KEY },
payload: JSON.stringify({
senderId: senderId,
to: recipients.map(r => r.phone),
message: uniqueMessages[0],
}),
muteHttpExceptions: true,
});
const data = JSON.parse(res.getContentText());
SpreadsheetApp.getUi().alert('발송 결과: ' + JSON.stringify(data, null, 2));
} else {
// 건별 메시지 → 하나씩 발송
let success = 0, fail = 0;
recipients.forEach((r, i) => {
sheet.getRange(i + 2, 5).setValue('발송중...'); // E열에 상태 기록
const res = UrlFetchApp.fetch(BARUN_BASE + '/messages/send', {
method: 'post',
contentType: 'application/json',
headers: { 'Authorization': 'Bearer ' + BARUN_API_KEY },
payload: JSON.stringify({
senderId: senderId,
to: r.phone,
message: r.msg,
}),
muteHttpExceptions: true,
});
const data = JSON.parse(res.getContentText());
if (data.error) {
sheet.getRange(i + 2, 5).setValue('❌ ' + data.error);
fail++;
} else {
sheet.getRange(i + 2, 5).setValue('✅ 완료');
success++;
}
Utilities.sleep(100); // rate limit 완화
});
SpreadsheetApp.getUi().alert('발송 완료\n성공: ' + success + '건\n실패: ' + fail + '건');
}
}
/** 잔액 조회 */
function checkBalance() {
const res = UrlFetchApp.fetch(BARUN_BASE + '/balance', {
headers: { 'Authorization': 'Bearer ' + BARUN_API_KEY },
muteHttpExceptions: true,
});
const data = JSON.parse(res.getContentText());
SpreadsheetApp.getUi().alert('현재 잔액: ₩' + data.balance.toLocaleString() +
'\n요금제: ' + data.pricingPlan +
'\nSMS: ' + data.unitPrices.sms + '원');
}
/** 메뉴 추가 — 스프레드시트 열 때 자동 실행 */
function onOpen() {
SpreadsheetApp.getUi().createMenu('바른문자')
.addItem('📨 시트 전체 일괄 발송', 'sendFromSheet')
.addItem('💰 잔액 조회', 'checkBalance')
.addToUi();
}💡 셀 함수로도 사용 가능
위 코드를 넣은 뒤, 스프레드시트 셀에 바로 이렇게 입력하면 해당 행만 발송됩니다:
=sendSMS(“010-1234-5678”, “안녕하세요”, “070-0000-0000”)모든 요청은 HTTPS여야 하며, Authorization: Bearer bmk_... 헤더가 필요합니다.
/api/v1/messages/send문자 발송 (SMS/LMS 자동 판정)
요청 본문
{
"senderId": "070-0000-0000", // 승인된 발신번호
"to": "010-1234-5678", // 또는 배열: ["010-...", "010-..."]
"message": "안녕하세요",
"title": "선택 (LMS일 때 표시)",
"scheduledAt": "2026-05-01T10:00:00+09:00" // 선택 — 예약 발송
}응답 예시
{
"success": true,
"messageId": "sendon_1714521600_xxx",
"type": "SMS",
"recipients": 1,
"sent": 1,
"failed": 0,
"unitPrice": 9,
"cost": 9,
"balance": 99991
}/api/v1/balance현재 잔액 및 적용 요금제 조회
응답 예시
{
"balance": 99991,
"pricingPlan": "기본",
"unitPrices": { "sms": 9, "lms": 27, "mms": 50, "rcs": 30 }
}/api/v1/senders등록/승인된 발신번호 목록
응답 예시
{
"senders": [
{ "phoneNumber": "070-0000-0000", "status": "VERIFIED", "createdAt": "..." }
]
}cURL
curl -X POST https://barunsms.com/api/v1/messages/send \
-H "Authorization: Bearer bmk_live_xxxxxxxxxxx" \
-H "Content-Type: application/json" \
-d '{
"senderId": "070-0000-0000",
"to": "010-1234-5678",
"message": "안녕하세요, 바른문자입니다."
}'Python
import requests
API_KEY = 'bmk_live_xxxxxxxxxxx'
resp = requests.post(
'https://barunsms.com/api/v1/messages/send',
headers={'Authorization': f'Bearer {API_KEY}'},
json={
'senderId': '070-0000-0000',
'to': ['010-1111-2222', '010-3333-4444'],
'message': '안녕하세요, 바른문자입니다.',
},
)
print(resp.json())Q. API로 발송 시 요금은 대시보드와 다른가요?
A. 동일합니다. 회원님께 적용된 요금제 단가대로 잔액에서 차감됩니다. 월 10만 건 이상 대량 발송 고객은 별도 요금제 협의 가능합니다.
Q. 한 번에 몇 명까지 보낼 수 있나요?
A. 1회 호출당 최대 1,000명입니다. 그 이상은 여러 번 나눠서 호출하시면 됩니다.
Q. 발송 실패 시 환불되나요?
A. 네, 실제 발송 성공한 건수만큼만 잔액에서 차감됩니다. 실패 건은 차감되지 않습니다.
Q. API Key를 분실했어요
A. 보안상 키 원본은 저장되지 않아 복구할 수 없습니다. 대시보드에서 해당 키를 폐기하고 새로 발급받아주세요.
Q. 발신번호 승인은 어떻게 받나요?
A. 발신번호 신청 페이지에서 서류 제출 후 관리자 승인을 받으시면 됩니다. (영업일 기준 1~2일 소요)
Q. 예약 발송은 어떻게 하나요?
A. scheduledAt 필드에 ISO 8601 형식 날짜(예: 2026-05-01T10:00:00+09:00)를 넣으시면 해당 시각에 자동 발송됩니다.