콘텐츠로 이동

One-Time Password(OTP) API

One-Time Password(OTP) 인증 시스템은 게임에 OTP 인증을 적용할 수 있도록 OTP 발송OTP 검증으로 구성된 API를 제공합니다.

환경별 접근 URL

서버 URL
Production https://otp.qpyou.cn
Sandbox https://sandbox-otp.qpyou.cn

인증 방식

OTP 발송 시스템이 제공하는 API를 사용하려면 먼저 인증 토큰(API KEY)을 발급받아야 합니다. 인증 토큰은 앱 센터에 게임이 등록되면 자동으로 생성됩니다. 인증 토큰은 JSON Web Token(JWT) 명세를 따르며, 만료 시간이 없어 고정적으로 사용할 수 있습니다.


OTP 발송

OTP Short Message Service(SMS) 발송

  • Basic Info
Method POST
URL /otp/send
  • Request Header
필드 타입
Content-Type application/json
Authorization bearer
Topic 하이브 콘솔 > 노티피케이션 > SMS OTP > 발송 정보 설정에서 등록 또는 수정한 발송 ID
  • OTP SMS를 앱 개발사가 직접 발송 시 콜백

    OTP에서 OTP SMS를 직접 발송하는 것이 아니라 앱 개발사가 직접 발송하는 경우, 발송에 필요한 정보를 콜백으로 받을 수 있습니다. 하이브 콘솔 > 노티피케이션 > SMS OTP > 발송 정보 설정에서 직접 발송을 선택하면, 등록한 콜백 URL로 아래 데이터가 Request Body에 JSON 형태로 전달됩니다. 설정 방법은 직접 발송을 참고하세요. 콜백 요청 예시전달하는 데이터를 함께 확인하세요.

  • Request Body

필드 타입 필수 여부 설명
to String O 수신 전화번호
toCountryNo String O 수신 국가 코드
retry Boolean X 이 API를 사용해 동일한 수신자에게 OTP SMS를 보내려고 시도한 이력이 있는지 여부입니다. 값이 주어지지 않으면, 최근 5분 이내에 동일한 수신자에게 OTP SMS를 전송 시도한 이력이 있을 때 true, 그렇지 않으면 false로 설정됩니다.
lookup Boolean X to 값이 유효한 전화번호 형식인지 검증할지 여부로 기본값은 false입니다. true일 때는 검증을 수행하므로 API 응답에 대략 250ms ~ 2000ms 정도 소요되며, false일 때에는 보통 200ms 이내로 API 응답을 받습니다.
lang String X 언어 코드로 기본값은 en.
유효한 언어 코드
  • ko
  • en
  • ja
  • zh-cn
  • zh-tw
  • zh-hans
  • zh-hant
  • de
  • fr
  • ru
  • es
  • pt
  • id
  • th
  • vi
  • it
  • tr
  • ar
  • Response Header
필드 타입
Content-Type application/json
  • Response Body
필드 타입 설명
otp String OTP 번호
provider String SMS 제공자
expiry String OTP 유효 시간
expiryTimestamp Long OTP 유효 시간 타임스탬프(초 단위)
  • Request Sample

다음 예시는 Topic 헤더와 수신자 정보를 포함해 OTP SMS 발송 API를 호출할 때 사용합니다.

//sample 1
curl --location 'https://otp.qpyou.cn/otp/send' 
--header 'Authorization: Bearer AUTH_TOKNE_VALUE' 
--header 'Topic: testTopicName' 
--header 'Content-Type: application/json' 
--data '{
    "to" : "01012345678",
    "toCountryNo" : "82",
    "lang" : "ko"
}'
//sample 2
curl --location 'https://otp.qpyou.cn/otp/send' 
--header 'Authorization: Bearer AUTH_TOKNE_VALUE' 
--header 'Topic: testTopicName' 
--header 'Content-Type: application/json' 
--data '{
    "to" : "01012345678",
    "toCountryNo" : "82",
    "lang" : "ko",
    "retry" : true,
    "lookup" : true
}'
  • Response Sample

OTP SMS 발송 요청이 정상 처리되면 다음과 같은 응답 본문을 받습니다.

{
    "otp" : "123456",
    "provider" : "YOUR_SMS_PROVIDER",
    "expiry" : "2026-03-23T11:00:48.533695818+09:00",
    "expiryTimestamp" : 1774231248
}

콜백 예시

앱 개발사가 직접 발송하도록 설정한 경우 등록한 콜백 URL은 다음과 같은 요청 본문을 받습니다.

curl --location 'https://{your_callback_url}' 
--header 'Content-Type: application/json' 
--data '{
    "to":"01012345678",
    "toCountryNo":"82",
    "lang":"en",
    "retry":null,
    "lookup":false,
    "serviceName":"LocalTest",
    "otp":"809881",
    "provider":"DIRECTSEND",
    "expiry":"2024-06-26T11:36:29.680680500+09:00[Asia/Seoul]",
    "expiryTimestamp":1719369389680
}'

콜백 데이터 정보

이름 타입 필수 여부 설명
expiry String O OTP 유효 시간
(예시: 2024-06-25T11:39:43.076573600+09:00[Asia/Seoul])
expiryTimestamp Long O OTP 유효 시간 타임스탬프(밀리초 단위)
(예시: 1719283183076)
lang String X 언어 코드로 기본값은 en
lookup boolean X to 값이 유효한 전화번호 형식인지 검증.
기본값은 false
otp String O OTP 번호
provider String O SMS 제공자,
직접 발송이므로 DIRECTSEND 고정값으로 전달됨
retry boolean X 재시도 여부
serviceName String O 발송 정보 설정 메뉴에서 설정한 발송 서비스 명(영문)
to String O 수신 전화번호
toCountryNo String O 수신 국가 코드

오류 응답 코드

HTTP Status id error 설명
400 40004 VALIDATION_FAIL 요청 본문 유효성 검증에 실패하면 발생합니다.
400 40003 INVALID_PHONE_NUMBER 전화번호 유효성 검증에 실패하면 발생합니다.
422 42202 NO_TOPIC 헤더의 Topic에 전달한 값이 유효하지 않으면 발생합니다.
409 40902 DUPLICATE_OTP_EXISTS 동일한 인증 대상에 대해 일정 시간 내 중복 OTP 발급 요청이 감지되면 DUPLICATE_OTP_EXISTS 오류를 반환합니다. 최대 15초 후 다시 시도해 주세요.
429 42903 SMS_LIMIT_EXCEEDED 동일한 번호로 24시간 동안 설정한 발송 한도를 초과해 요청하면 발생합니다. 응답 메시지에는 설정된 한도 값이 포함될 수 있습니다.

Topic 값이 유효하지 않은 경우

요청 헤더의 Topic 값이 하이브 콘솔에 등록한 발송 ID와 일치하지 않으면 이 오류가 발생합니다. Topic 헤더 값과 하이브 콘솔 > 노티피케이션 > SMS OTP > 발송 정보 설정에 등록한 발송 ID를 확인하세요.

{
    "id" : 42202,
    "error" : "NO_TOPIC",
    "reason" : "No such 'Topic' Data"
}

동일한 OTP가 중복 생성된 경우

같은 요청을 같은 구간 안에서 두 번 보내면 동일한 OTP가 생성됩니다. 이때 첫 번째 요청은 성공하고 두 번째 요청은 DUPLICATE_OTP_EXISTS로 실패합니다. 현재 구간이 끝난 뒤 다음 구간에서 같은 요청을 다시 보내세요.

{
    "id" : 40902,
    "error" : "DUPLICATE_OTP_EXISTS",
    "reason" : "Already sent OTP to this phone number."
}

24시간 발송 한도를 초과한 경우

같은 전화번호로 24시간 동안 허용된 발송 횟수를 넘기면 이 오류가 발생합니다. 이 한도는 고정값이 아닙니다. 아래 예시의 응답 메시지에 포함된 횟수는 설정한 한도 값을 보여주는 예시입니다. 하이브 콘솔 > 노티피케이션 > SMS OTP > 발송 정보 설정에서 일일 발송 한도를 확인하세요.

{
    "id" : 42903,
    "error" : "SMS_LIMIT_EXCEEDED",
    "reason" : "Too many requests in 24 hours. (Can not exceed 10 times)"
}

OTP 검증

Method POST
URL /otp/verify
  • Request Header
필드 타입
Content-Type application/json
Authorization bearer
Topic 하이브 콘솔 > 노티피케이션 > SMS OTP > 발송 정보 설정에서 등록 또는 수정한 발송 ID
  • Request Body
필드 타입 필수 여부 설명
toCountryNo String O 수신 국가 번호
to String O 수신 전화번호
otp String O 수신 OTP
  • Response Header
필드 타입
Content-Type application/json
  • Response Body
필드 타입 설명
result boolean OTP 검증 결과
  • Request Sample 1

다음 예시는 수신 전화번호와 OTP 번호를 전달해 OTP를 검증할 때 사용합니다.

// sample 1
curl --location 'https://otp.qpyou.cn/otp/verify' 
--header 'Authorization: bearer AUTH_TOKEN_VALUE' 
--header 'Topic: testTopicName' 
--header 'Content-Type: application/json' 
--data '{
    "toCountryNo" : "82",
    "to" : "01012345678",
    "otp" : "123456"
}'
  • Response Sample

OTP가 일치한 경우 응답 본문은 다음과 같습니다.

{
    "result" : true
}