문자 발송 API 연동 방법
센드엠 API는 REST 방식입니다. HTTPS로 JSON을 보내고 JSON을 받습니다. 별도 SDK 설치 없이 HTTP 요청이 가능한 언어라면 무엇이든 연동할 수 있습니다.
적용 버전 「센드엠 API 연동정의서 v3.1」 · 작성 센드엠 고객지원팀 · 작성일 2026년 9월 16일 · 최종 수정 2026년 10월 21일 · 최종 검증일 2026년 10월 21일
처음 연동하는 순서
센드엠 API는 어떻게 연동하나요?
센드엠 API 서버는 https://api.sendm.co.kr 입니다. 모든 요청에 user-id(센드엠 아이디)와 api-key(API 신청 후 발급받은 키) 두 개의 헤더를 넣어 호출합니다.
문자 발송은 POST /v1/sms/send 에 JSON을 보내면 되고, 응답의 code 가 "0" 이면 접수 성공입니다. 함께 돌아오는 data.msgId 로 나중에 발송 결과를 조회합니다.
올바른 구조는 클라이언트 → 우리 서버(Java·Node.js·PHP 등) → 센드엠 API 입니다.
연동 전에 준비할 것
| 항목 | 확인할 내용 | 어디서 |
|---|---|---|
| API 신청·승인 | 승인되면 인증키(api-key)가 발급됩니다. 승인 전에는 호출할 수 없습니다. | API 신청 |
| 발신번호 | 등록·승인된 번호만 callerNo 로 쓸 수 있습니다. | 발신번호 등록 방법 |
| 발송 서버 IP | API를 호출할 서버의 공인 IP를 등록합니다. 등록되지 않은 IP는 차단됩니다. | API 설정 |
| 잔액 | API 발송도 선불 코인에서 차감됩니다. 단가는 웹 발송과 같습니다. | 요금안내 |
인증과 환경
모든 API가 같은 인증 헤더를 씁니다. 키는 서버의 환경변수나 설정 파일에서 읽고, 소스와 예제에 실제 값을 넣지 마세요.
| 헤더 | 필수 | 설명 |
|---|---|---|
user-id | 필수 | sendm.co.kr 회원가입 아이디 |
api-key | 필수 | API 서비스 신청 후 발급받은 인증키 |
요청 헤더 예시
user-id: YOUR_SENDM_ID
api-key: YOUR_API_KEY
| 필드 | 설명 |
|---|---|
code | "0" 이면 성공, 그 외는 실패 |
message | 실패 시 사유 메시지 |
data.msgId | 발송 API가 돌려주는 메시지 ID |
응답 형식 (모든 API 공통)
{
"code": "0",
"message": "success",
"data": { "msgId": 1 }
}
code 는 문자열 "0" 입니다. 숫자 0과 비교하는 언어에서는 타입에 주의하세요. msgId 는 결과 조회에 필요하니 꼭 저장해 두세요.
제공 엔드포인트
기준 주소는 https://api.sendm.co.kr 입니다.
| 기능 | 메서드 | 경로 | Content-Type |
|---|---|---|---|
| 문자 발송 (SMS·LMS) | POST | /v1/sms/send | application/json |
| 포토문자 발송 (MMS) | POST | /v1/mms/send | multipart/form-data |
| 알림톡 발송 | POST | /v2/kakao/sendAt | multipart/form-data |
| 발신번호 목록 조회 | GET | /v1/caller/callerNoList | application/json |
| 잔여 코인·발송 가능 건수 | GET | /v2/info/coinInfo | application/json |
| 문자 발송 목록 | GET | /v1/sms/sendList | application/json |
| 문자 발송 상세(수신자별 결과) | GET | /v1/sms/sendList/{msgId} | application/json |
| 예약 문자 취소 | GET | /v1/sms/cancel/{msgId} | application/json |
| 카카오 발송 목록 | GET | /v1/kakao/sendList | application/json |
| 카카오 발송 상세 | GET | /v1/kakao/sendList/{msgId} | application/json |
| 예약 카카오 취소 | GET | /v2/kakao/cancel/{msgId} | application/json |
문자 계열은 /v1, 알림톡 발송·취소와 잔여건수 조회는 /v2 입니다. 경로의 버전을 임의로 바꾸면 동작하지 않습니다.
첫 요청 예제 문자 발송 (SMS·LMS)
아래 요청은 고객님 서버에서 실행합니다. 예시 값은 실제 발신번호·수신번호·인증키로 바꿔 쓰세요.
| 파라미터 | 필수 | 기본값 | 설명 |
|---|---|---|---|
callerNo | 필수 | - | 발신번호. 사이트에 등록·승인된 번호여야 합니다 |
message | 필수 | - | 문자 내용 |
receiveNos | 필수 | - | 수신번호. 여러 건은 # 로 구분예) 010-0000-0001#010-0000-0002 |
smsType | 선택 | SMS | SMS 단문 / LMS 장문 |
title | 선택 | - | 제목. 장문(LMS)에서만 사용 |
adYn | 선택 | N | N 일반 / Y 광고 / E 선거 |
reserveYn | 선택 | N | N 즉시발송 / Y 예약발송 |
sendDate | 선택 | 현재시간 | 발송 시각. YYYYMMDDHHMM(24시간제)예) 202303182045 (형식 예시. 지난 시각입니다) |
messageCd | 선택 | - | 문자 템플릿 코드. 지정하면 본문이 템플릿 내용으로 대체됩니다 |
kind | 선택 | - | 국제문자일 때만. I 국제문자 / L 국제문자 MMS |
country | 선택 | - | 국제문자일 때만. 국가코드. 현재 86(중국)만 지원하며, 그 외 국가코드는 102 로 거부됩니다 |
단문(SMS) 요청 예시
POST https://api.sendm.co.kr/v1/sms/send
Content-Type: application/json
user-id: YOUR_SENDM_ID
api-key: YOUR_API_KEY
{
"callerNo": "02-0000-0000",
"message": "주문이 접수되었습니다.",
"receiveNos": "010-0000-0001#010-0000-0002"
}
장문(LMS) 요청 예시 제목과 예약 시각 포함
{
"callerNo": "02-0000-0000",
"smsType": "LMS",
"title": "배송 안내",
"message": "주문하신 상품이 오늘 출고되었습니다. ...",
"receiveNos": "010-0000-0001",
"reserveYn": "Y",
"sendDate": "YYYYMMDDHHMM"
}
sendDate 에는 현재보다 뒤의 시각을 넣으세요. 표의 예시 값을 그대로 복사하면 지난 시각이 됩니다. 02-0000-0000 은 등록한 발신번호로, 010-0000-0001 은 실제 수신번호로 바꿔 서버에서 실행하세요.
adYn 을 Y 로 보내세요. API는 본문을 그대로 발송합니다. 웹 발송 화면과 달리 (광고) 표기·광고주명·무료 수신거부번호를 자동으로 붙이지 않으므로 message 에 직접 넣어야 합니다. 지켜야 할 기준은 광고문자 발송 방법에 정리되어 있습니다. 야간(21시~08시) 발송 제한도 API 발송에 동일하게 적용됩니다.
언어별 예제
같은 요청을 언어별 HTTP 코드로 정리했습니다. 공식 SDK가 아니라 표준 HTTP 호출 예제입니다.
포토문자 발송 (MMS)
파일을 첨부해야 하므로 JSON이 아니라 multipart/form-data 로 보냅니다.
| 파라미터 | 필수 | 설명 |
|---|---|---|
smsType | 선택 | 기본값 MMS |
message | 선택 | 포토문자는 본문이 없어도 됩니다 |
attachFile01attachFile02attachFile03 | 선택 | 첨부 이미지. 최대 3장 |
이미지는 JPG·JPEG·PNG만 받습니다. 1,500×1,440px보다 크면 서버가 비율을 유지해 줄이고 JPG로 변환하며, 변환 후 용량 합계가 1MB를 넘으면 거부합니다(801 여러 장, 802 한 장). 통신사 전달 안정성을 위해 장당 300KB 이하로 보내는 것을 권장합니다. 웹 발송 기준은 SMS·LMS·MMS 차이에서 확인하세요.
알림톡 발송
수신자마다 치환 내용이 다르므로 수신자 목록을 kakaoList 배열로 보냅니다.
| 파라미터 | 필수 | 설명 |
|---|---|---|
callerNo | 필수 | 발신번호(등록·승인된 번호) |
senderKey | 필수 | 카카오 채널 발신 프로필 키 |
tmplCd | 필수 | 승인된 알림톡 템플릿 코드 |
kakaoList | 필수 | 수신자·내용 리스트(JSON 배열 문자열) |
kakaoList[].receive | 필수 | 수신번호 |
kakaoList[].message | 필수 | 치환이 끝난 알림톡 내용. 승인된 템플릿과 내용이 일치해야 합니다 |
kakaoList[].btnMobUrlkakaoList[].btnPcUrl | 선택 | 버튼 연결 모바일 / PC URL |
kakaoList[].reYn | 선택 | 알림톡 실패 시 문자로 대체 발송할지 (Y/N, 기본 N) |
kakaoList[].reType | 조건부 | reYn=Y 일 때 필수. SMS / LMS |
kakaoList[].reTitle | 조건부 | reType=LMS 일 때 대체 문자 제목 (최대 40자) |
kakaoList[].reMsg | 조건부 | reYn=Y 일 때 필수. 대체 문자 내용 |
reserveYn / sendDate | 선택 | 문자 발송과 동일 |
알림톡 kakaoList 예시
[
{
"receive": "010-0000-0001",
"message": "홍길동님, 주문번호 A1234 상품이 출고되었습니다.",
"reYn": "Y",
"reType": "LMS",
"reTitle": "배송 안내",
"reMsg": "홍길동님, 주문번호 A1234 상품이 출고되었습니다."
}
]
알림톡은 템플릿 사전 승인이 필요합니다. 채널 등록부터 템플릿 승인까지는 카카오 알림톡 시작하기를 참고하세요.
접수 확인
발송 API의 응답은 "접수"까지만 알려 줍니다. 수신자에게 전달됐는지는 최종 결과 조회로 따로 확인합니다.
| 단계 | 확인 방법 | 뜻 |
|---|---|---|
| 접수 | 발송 응답 code 가 "0" | 센드엠이 요청을 받았습니다. 전달 성공이 아닙니다. |
| 최종 결과 | GET /v1/sms/sendList/{msgId} | 통신사 리포트로 수신자별 성공·실패가 정해집니다. |
접수 성공 응답 예시
{
"code": "0",
"message": "success",
"data": { "msgId": 1 }
}
msgId 를 저장해 두고 최종 결과로 상태를 바꾸세요. 응답을 받지 못하고 시간초과가 나면 같은 요청을 바로 다시 보내지 마세요. 이미 접수됐을 수 있으니 GET /v1/sms/sendList 로 접수 여부를 먼저 확인합니다.
최종 결과 조회
잔여 코인·발송 가능 건수
GET /v2/info/coinInfo 는 유형별로 몇 건을 더 보낼 수 있는지 돌려줍니다.
| 필드 | 설명 |
|---|---|
data.smsCnt | SMS 발송 가능 건수 |
data.lmsCnt | LMS 발송 가능 건수 |
data.mmsCnt | MMS 발송 가능 건수 |
data.atCnt | 알림톡 발송 가능 건수 |
data.totalCoin | 총 보유 코인 |
응답 예시
{
"code": "0",
"data": {
"smsCnt": 13181,
"lmsCnt": 4217,
"mmsCnt": 1917,
"atCnt": 13181,
"totalCoin": 105448
}
}
발송 결과 조회
발송 시 받은 msgId 로 GET /v1/sms/sendList/{msgId} 를 호출하면 요청 건수와 성공·실패·대기 건수, 그리고 수신자별 결과코드를 확인할 수 있습니다.
| 필드 | 설명 |
|---|---|
data.totalCnt | 총 발송 요청 건수 |
data.successCnt | 전송 성공 건수 |
data.failCnt | 전송 실패 건수 |
data.waitCnt | 전송 대기 건수. 통신사 사정으로 최대 48시간 대기할 수 있습니다 |
list[].receiveNo | 수신자 번호 |
list[].resultCd | 결과코드 |
list[].resultCdNm | 결과 성공/실패 표기 |
resultCd 값의 의미와 조치 방법은 문자 발송 실패 원인과 결과코드에서 설명합니다.
예약 발송 취소
GET /v1/sms/cancel/{msgId}(문자) 또는 GET /v2/kakao/cancel/{msgId}(알림톡)를 호출하면 아직 통신사로 넘어가지 않은 발송 대기건(예약 포함)을 실패 처리하고, 해당 건의 코인을 환불합니다. 결과 code 는 0 취소 완료, 99 취소할 정보 없음(없는 msgId·다른 계정 발송 건), 96 이미 발송되었거나 취소할 대기건 없음, 97 취소를 지원하지 않는 발송 경로(고객센터 문의)입니다.
응답 code 표
HTTP 상태는 오류가 나도 200 입니다. 성공·실패는 응답 본문의 code 로 판단합니다. "0" 이 아니면 message 를 함께 기록하세요.
| code | 뜻 | 해결 방법 |
|---|---|---|
0 | 접수 성공 (success) | - |
97 | 예약 발송(reserveYn=Y)인데 sendDate 가 없거나 12자리가 아님 (문자·알림톡. 포토문자는 197) | sendDate 를 YYYYMMDDHHMM 12자리로 넣습니다. 지난 시각인지는 검사하지 않으니 현재보다 뒤 시각을 넣으세요 |
100 | 헤더 없음 (No header information.) | user-id·api-key 헤더를 넣습니다 |
101 | user-id 헤더 없음 · 광고문자 21시~08시 / 선거문자 23시~06시 발송 불가 · 문자 발송 불가 상태 · 포토문자에 첨부·내용 모두 없음 · 보유 코인 없음 | 헤더를 넣거나, 예약발송으로 시간을 옮기거나, 발송 불가 상태면 고객센터에 문의합니다 |
102 | api-key 헤더 없음 · 휴대폰 인증 필요 · 국제문자 불가·지원하지 않는 국가코드 | 헤더를 넣고, sendm.co.kr 내정보에서 휴대폰 인증을 마칩니다. 국제문자는 kind·country 값을 확인합니다 |
103 | user-id 가 없거나 API 승인 전 · api-key 불일치 · 등록되지 않은 발신번호 · 고객정보 오류 · 건당 코인 없음(smsType·adYn 값 오류 포함) | API 승인 상태와 키 값을 다시 확인하고, callerNo 가 등록·승인된 번호인지 발신번호 목록 API로 확인합니다 |
104 | 고객정보 오류 · 수신자 정보 없음 · 코인 없음 | 수신번호와 잔여 코인을 확인합니다. 계속되면 고객센터 문의 |
105 | 허용되지 않은 IP(Not an allowed IP address. [IP]) · 헤더 정보 오류 · 발송 단계의 고객정보 오류(Customer information is incorrect) · 보유 코인 부족(Insufficient User Coins.) | 응답 대괄호 안의 IP를 API 설정의 발송 IP에 등록합니다. 코인 부족이면 충전합니다 |
106 | 필수 파라미터 없음(callerNo·receiveNos·message) · 요청 본문(JSON) 읽기 실패 · 파라미터 형식 오류 | Content-Type 과 JSON 형식, 경로의 {msgId} 값을 확인합니다 |
107 | 발신번호 목록 조회에서 callerNo 12자리 초과 · 알림톡에서 kakaoList 없음 또는 유효한 수신자 없음 | 검색값 길이를 줄이거나, kakaoList 와 수신번호를 확인합니다 |
108 | 보유 코인이 발송에 필요한 코인보다 적음 (There are not enough coins to send.) · 발신번호 목록 조회에서는 callerNm 50자 초과 (callerNm length is not valid.) | 코인을 충전합니다. 발신번호 목록 조회라면 callerNm 을 50자 이하로 줄입니다 |
109 | 발송 처리 실패 (발신번호 목록 조회에서는 repYn 값 오류) | 고객센터 문의 |
110 | 선거문자는 선거회원만 발송 가능 · 발송 처리 실패 | 선거문자는 회원 유형을 선거회원으로 바꾼 뒤 보냅니다 |
| 111 ~ 115 | 발송 처리 실패 (114 는 수신자 없음 포함) | 고객센터 문의 |
197 | 예약 시각 누락·오류 | reserveYn=Y 이면 sendDate 를 현재보다 뒤 시각으로 넣습니다 |
| 201 · 202 | 문자 발송 실패 | 고객센터 문의 |
740 | 허용되지 않은 HTTP 메서드 (예: Request method 'PATCH' not supported) | 엔드포인트 표의 메서드(POST/GET)로 호출합니다 |
| 801 ~ 803 | 포토문자 변환 후 이미지 용량 초과(801 여러 장 합계 1MB, 802 한 장 1MB) · 허용되지 않는 확장자·이미지 처리 오류(803) | JPG·JPEG·PNG 파일인지 확인하고, 장당 300KB 이하로 줄여 다시 보냅니다 |
950 | 발송이 제한된 단어 포함 (문자·알림톡) | 해당 단어를 빼고 다시 보냅니다. 판단이 어려우면 고객센터 문의 |
996 | 일일 발송 한도 초과 (일일 발송량 초과로 발송이 불가능 합니다.). 오늘 발송 건수와 이번 요청 건수의 합이 계정의 일일 한도를 넘으면 요청 전체를 거부합니다(일부만 발송하지 않음, 코인 차감·발송 기록 없음) | 받는 사람 수를 줄여 한도 안에서 보내거나, 다음 날 보냅니다. 한도 상향은 고객센터에 문의합니다 |
999 | 서버 내부 오류 (Fail Exception, 문자·조회 API) | 같은 요청을 반복하지 말고 발송 목록으로 접수 여부를 확인한 뒤 고객센터에 문의 |
| code | 뜻 | 해결 방법 |
|---|---|---|
106 | 알림톡 kakaoList 형식 오류 · kakaoList[n].message 누락 · reYn·reType·reMsg·reTitle 값 오류 | kakaoList 를 JSON 배열 문자열로 보내고, 대체 문자 값을 확인합니다 |
| 101 ~ 105 | 알림톡 승인 템플릿 없음(103) · 미등록 발신번호(103) · 카카오 발송 불가 계정 · 휴대폰 인증 필요 · 고객정보 오류 · 문자 대체 발송 권한 없음(102) | message 로 원인을 확인합니다. senderKey·tmplCd 가 검수 승인된 템플릿인지 확인합니다 |
700 | 카카오 발송 정보 없음 | 요청 값을 확인하고, 계속되면 고객센터 문의 |
| 800 ~ 802 | 알림톡 보유 코인 없음·부족 (포토문자의 801·802 와 뜻이 다릅니다) | 코인을 충전합니다 |
996 | 수신자 정보 없음(수신자 정보가 없습니다.) 또는 일일 발송 한도 초과(일일 발송량 초과로 발송이 불가능 합니다.). 같은 번호이므로 message 로 구분합니다 | 수신자 정보를 확인합니다. 한도 초과라면 받는 사람 수를 줄이거나 다음 날 보내고, 한도 상향은 고객센터에 문의합니다 |
997 | 수신번호 없음 · 보유 코인 없음 | 수신번호와 잔여 코인을 확인합니다 |
| 998 · 999 | 카카오 발송 처리 오류 (카카오 발송 중 오류가 발생하였습니다.). 알림톡의 999 는 문자 API 의 999(서버 내부 오류)와 뜻이 다릅니다 | 같은 요청을 반복하지 말고 카카오 발송 목록으로 접수 여부를 확인한 뒤 고객센터에 문의 |
-1 | 알림톡 서버 내부 오류 (Fail Exception) | 같은 요청을 반복하지 말고 접수 여부를 확인한 뒤 고객센터에 문의 |
| 99 · 96 · 97 | 예약 취소(/v1/sms/cancel·/v2/kakao/cancel) 결과 — 99 취소할 정보 없음, 96 이미 발송되었거나 취소할 대기건 없음, 97 취소를 지원하지 않는 발송 경로 | msgId 를 확인합니다. 97 은 고객센터 문의 |
같은 번호가 처리 단계에 따라 다른 뜻으로 쓰입니다(예: 101 은 헤더 누락일 수도, 야간 발송 제한일 수도 있습니다). 원인은 message 로 구분하세요. 이 표는 요청 접수 단계의 code 이고, 수신자별 전달 결과(resultCd)는 문자 발송 실패 원인과 결과코드에서 설명합니다.
실패 응답 예시 — 허용되지 않은 IP
{
"code": "105",
"message": "Not an allowed IP address. [203.0.113.10]",
"data": { "msgId": 0 }
}
실패 응답 예시 — 필수값 누락
{
"code": "106",
"message": "There is no receiveNos information.",
"data": { "msgId": 0 }
}
실패하면 msgId 는 0 입니다. 203.0.113.10 은 예시 IP입니다.
조회 API 요청·응답 필드
발신번호 목록 GET /v1/caller/callerNoList
| 파라미터 | 필수 | 설명 |
|---|---|---|
callerNo | 선택 | 발신번호 검색(부분 일치). 하이픈 등 숫자 외 문자는 빼고 비교하며 숫자만 12자리 이하(초과 시 107) |
callerNm | 선택 | 발신번호 이름 검색(부분 일치). 50자 이하(초과 시 108) |
repYn | 선택 | Y 대표번호 / N 그 외 |
| 필드 | 설명 |
|---|---|
totalCount | 발신번호 개수 |
list[].callerNo | 발신번호 |
list[].callerNm | 발신번호 이름 |
list[].repYn | 대표번호 여부 |
문자 발송 목록 GET /v1/sms/sendList
| 파라미터 | 기본값 | 설명 |
|---|---|---|
pageIndex | 1 | 페이지 번호 |
pageUnit | 10 | 한 페이지 건수 |
pageSize | 10 | 페이지 묶음 크기 |
caller | - | 발신번호로 거르기. 하이픈 없이 숫자만, 정확히 일치하는 번호만 조회됩니다 |
| 필드 | 설명 |
|---|---|
totalCount | 전체 발송 요청 수 |
list[].msgId | 메시지 ID (상세 조회에 사용) |
list[].callerNo · smsType · adYn · reserveYn | 요청 때 보낸 값 |
list[].sendDate | 예약이면 예약 시각, 아니면 접수 시각 (YYYYMMDDHHMM) |
list[].title · message | 제목·내용 |
list[].totalCnt · successCnt · failCnt · waitCnt | 요청·성공·실패·대기 건수 |
잔여 건수(/v2/info/coinInfo)와 발송 상세(/v1/sms/sendList/{msgId}) 필드는 최종 결과 조회에 있습니다. 전체 명세는 /openapi.json(OpenAPI 3.0)으로도 받을 수 있습니다.
제한과 주의
| 항목 | 기준 |
|---|---|
| 호출 위치 | 서버에서만 호출. 브라우저 호출 금지 |
| 발송 IP | 등록한 서버 IP만 허용 |
| 광고문자 | adYn=Y, 야간(21시~08시) 발송 제한. (광고) 표기·무료 수신거부번호는 본문에 직접 넣기 |
| 알림톡 | 승인된 템플릿과 내용이 같아야 함 |
| MMS 이미지 | 최대 3장, JPG·JPEG·PNG. 1,500×1,440px를 넘으면 서버가 줄여 JPG로 변환, 변환 후 합계 1MB 이하. 장당 300KB 이하 권장 |
| 결과 대기 | 통신사 사정으로 최대 48시간 |
| 항목 | 기준 |
|---|---|
| 문자 인코딩 | UTF-8 |
| HTTP 상태 | 항상 200. 성공 여부는 본문 code |
| 발송 IP | 계정에 등록한 IP와 정확히 같은 주소만 허용(대역 지정 없음). 서버 IP가 바뀌면 먼저 등록하세요 |
| 호출 방식 | 동시에 여러 요청을 보내지 말고, 응답을 받은 뒤 다음 요청을 보내 주세요. 받는 번호가 많으면 한 요청에 모아 보내세요 |
| 응답 대기 | 응답 대기 시간은 30초를 권장합니다. 시간이 초과되면 같은 요청을 바로 다시 보내지 말고, 발송 내역 조회(sendList)로 접수 여부를 먼저 확인하세요(중복 발송 방지) |
| 결과 조회 | 결과 조회는 1분 이상 간격을 두세요 |
| 일일 발송 한도 | 계정에 일일 발송 한도가 설정된 경우, 오늘 발송 건수와 이번 요청 건수의 합이 한도를 넘으면 요청 전체를 code "996"(일일 발송량 초과로 발송이 불가능 합니다.)으로 거부합니다(문자·포토문자·알림톡). 일부만 발송하지 않으며 코인 차감·발송 기록이 없고 msgId 는 0 입니다. 합이 한도와 같으면 발송됩니다 |
막혔다면
아래 순서로 확인하세요.
- 승인API 신청이 승인됐나요?
- IP호출하는 서버의 공인 IP를 등록했나요?
- 번호
callerNo가 등록·승인된 발신번호인가요? - 잔액보낼 만큼 코인이 있나요?
- 요청 형식경로 버전(
/v1·/v2)과 Content-Type이 맞나요?
업무별 연동 참고 (주문·예약·인증·대량 공지)
업무마다 쓰는 API와 고객 시스템이 맡을 일을 정리했습니다. 요청·응답 형식은 위 표를 따릅니다.
주문·배송 알림
- 쓰는 API
POST /v1/sms/send또는/v2/kakao/sendAt로 단계별(접수·출고·배송 완료)로 보냅니다. 결과는GET /v1/sms/sendList/{msgId}, 알림톡은/v1/kakao/sendList/{msgId}로 조회합니다. - 문자 대체알림톡이 실패했을 때 문자로 대신 보내려면
kakaoList[].reYn=Y와reType·reMsg를 넣습니다. - 고객 시스템주문번호·단계와
msgId를 함께 저장합니다. 같은 주문의 같은 단계는 한 번만 보내도록 쇼핑몰 쪽에서 막습니다. - 취소·반품보내기 전에 주문 상태를 다시 확인합니다. 예약 발송한 알림은 발송 전이면
GET /v1/sms/cancel/{msgId}로 취소합니다.
예약·방문 안내
- 쓰는 API확정 안내는 바로 보내고, 방문 전 안내는
reserveYn=Y·sendDate(YYYYMMDDHHMM)로 예약 발송합니다. - 변경예약 발송 내용을 고치는 API는 없습니다. 발송 전이면
GET /v1/sms/cancel/{msgId}(알림톡은/v2/kakao/cancel/{msgId})로 취소하고 새로 예약합니다. 이미 발송이 시작된 건은 취소할 수 없습니다. - 고객 시스템예약번호와
msgId를 함께 저장합니다(취소에 필요). 보내기 직전 예약이 취소·변경되지 않았는지 다시 확인하고, 시간대·휴무 같은 발송 조건도 고객 시스템에서 판단합니다.
회원 인증 메시지
- 쓰는 API
POST /v1/sms/send로 인증번호 문자를 보냅니다.GET /v1/sms/sendList/{msgId}결과는 참고용이며 인증 판정에 쓰지 않습니다. - 고객 시스템예측할 수 없는 인증번호 발급, 유효시간, 새 번호 발급 시 이전 번호 무효화, 재요청 간격·입력 횟수 제한, 성공 후 재사용 차단을 직접 만듭니다. 센드엠은 이 기능을 제공하지 않습니다.
- 보안인증번호를 로그나 URL에 남기지 않습니다. 같은 번호로 하루에 보낼 수 있는 횟수를 정해 두면 코인 낭비를 막을 수 있습니다.
대량 공지
- 쓰는 API
POST /v1/sms/send의receiveNos에 수신번호를#로 이어 보냅니다. 요청당 수신자 수와 호출 한도는 연동 전에 고객센터로 문의하고, 그 안에서 나눠 요청합니다. - 결과요청마다 받은
msgId를 저장하고,GET /v1/sms/sendList/{msgId}의list[]로 수신자별 결과를 모읍니다. - 재발송실패한 번호만 골라 다시 보냅니다. 전체를 다시 보내면 이미 받은 분께 두 번 갑니다. 코인이 부족하면 발송을 멈추고
GET /v2/info/coinInfo로 잔액을 확인합니다. - 예약
reserveYn·sendDate로 예약하고, 발송 전이면GET /v1/sms/cancel/{msgId}로 취소합니다.
code "0" 은 접수됐다는 뜻이고 전달 성공이 아닙니다. 시간초과로 응답을 못 받으면 바로 다시 보내지 말고 GET /v1/sms/sendList 로 접수 여부를 먼저 확인합니다. 중복 발송 방지는 고객 시스템에서 합니다. 최종 실패한 건은 코인으로 자동 환불됩니다.
이 글에서 답한 질문
API는 어디에서 호출해야 하나요?
반드시 우리 서버(백엔드)에서 호출해야 합니다. 브라우저에서 직접 호출하면 아이디와 인증키가 소스에 드러나고, 요청 IP가 사용자마다 달라 IP 등록이 소용없어집니다.
발송 IP는 어떤 주소를 등록하나요?
지금 보고 있는 PC의 IP가 아니라 API를 호출하는 서버의 공인 IP를 등록합니다. 서버를 늘리거나 옮기면 다시 등록하세요.
API로 보내면 요금이 다른가요?
같습니다. API 발송도 선불 코인에서 차감되고, 단가는 웹 발송과 같습니다.
이어서 보면 좋은 문서
최종 업데이트 : 2026년 10월 21일 · 「센드엠 API 연동정의서 v3.1」 기준