이미 받은 PG 가맹점 키(MID 등)를 하위 프로젝트에 넣고 결제수단을 켜고 끕니다. 아직 MID 가 없는 판매자는 PG 가맹 신청 을 사용합니다.
인증·권한 오류는 각 표에 없어도 공통 오류 가 날 수 있습니다.
1 PG·필수 연동 값 목록
가맹점 생성 ·프로젝트 생성 ·PG 리소스 갱신 의 resources[] 에 넣을 수 있는 PG·결제수단과, 결제수단마다 resource 에 넣어야 하는 키를 돌려줍니다.
동작 규칙
resources[].pg 에는 PG 의 symbols 중 하나, resources[].method 에는 결제수단의 symbols 중 하나를 넣습니다.
resource_keys 중 required 가 true 인 키만 필수입니다. 하나라도 비면 RESOURCE_KEY_BLANK 로 거부됩니다. required 가 false 인 키는 PG 사가 준 경우에만 넣습니다(빼거나 빈 값이어도 됩니다). 부트페이 관리자 화면의 연동 정보 저장과 같은 기준입니다.
결제 모드가 있는 결제수단(일부 PG)은 새로 붙일 때의 기본 결제 모드 기준으로 required 를 줍니다. 관리자 화면에서 다른 모드를 고른 결제수단을 갱신하면 그 모드의 필수 키로 검사합니다.
값은 가맹 계약 뒤 PG 사가 알려 줍니다. description 은 부트페이 관리자 화면의 안내 문구라 HTML 이 섞여 있을 수 있습니다.
input_type 이 textarea 인 키는 여러 줄 값(예: 인증서 PEM)입니다.
사용 중인 PG·결제수단만 나옵니다. pg 를 주면 그 PG 하나만 옵니다.
모든 리셀러가 같은 목록을 봅니다.
API 정보 GET https://api.bootpay.co.kr/v2/reseller/pgsBasic Auth (리셀러 계정 키)
1-1. 요청 파라미터
파라미터
타입
필수
설명
pg
String
선택
PG 심볼(예: nicepay). 주면 그 PG 만 돌려줍니다 (쿼리)
1-2. 코드 예제 Node.js Python cURL
import fetch from 'node-fetch'
const RESELLER_AUTH = 'Basic ' + Buffer
. from ( `${ process . env . BOOTPAY_RESELLER_CLIENT_KEY }:${ process . env . BOOTPAY_RESELLER_SECRET_KEY }` )
. toString ( 'base64' )
const res = await fetch ( 'https://api.bootpay.co.kr/v2/reseller/pgs?pg=nicepay' , {
headers: { 'Authorization' : RESELLER_AUTH }
})
const { list } = await res. json ()
const card = list[ 0 ].methods. find ( m => m.method === 'card' )
console. log (card.resource_keys. filter ( k => k.required). map ( k => k.key)) // resource 에 꼭 넣을 키 javascript Node.js Python cURL
import base64, os, requests
auth = 'Basic ' + base64.b64encode(
f " { os.environ[ 'BOOTPAY_RESELLER_CLIENT_KEY' ] } : { os.environ[ 'BOOTPAY_RESELLER_SECRET_KEY' ] } " .encode()
).decode()
res = requests.get( 'https://api.bootpay.co.kr/v2/reseller/pgs' , headers = { 'Authorization' : auth})
for pg in res.json()[ 'list' ]:
print (pg[ 'pg' ], [m[ 'method' ] for m in pg[ 'methods' ]]) python Node.js Python cURL
RESELLER_AUTH = $( printf '%s' " $BOOTPAY_RESELLER_CLIENT_KEY : $BOOTPAY_RESELLER_SECRET_KEY " | base64 )
curl "https://api.bootpay.co.kr/v2/reseller/pgs?pg=nicepay" -H "Authorization: Basic $RESELLER_AUTH " bash
1-3. 응답 {
"list" : [
{
"pg" : "nicepay" ,
"pg_name" : "나이스페이먼츠" ,
"symbols" : [ "nicepay" ],
"methods" : [
{
"method" : "card" ,
"method_name" : "카드" ,
"display_name" : "신용카드" ,
"symbols" : [ "card" , "카드" ],
"group" : 2 ,
"sandbox_supported" : true ,
"resource_keys" : [
{ "key" : "mid" , "description" : "상점 아이디를 입력해주세요." , "input_type" : "input" , "required" : true },
{ "key" : "mkey" , "description" : "상점키를 입력해주세요." , "input_type" : "input" , "required" : true },
{ "key" : "cancel_pwd" , "description" : "결제 취소 비밀번호를 입력해주세요." , "input_type" : "input" , "required" : false }
]
}
]
}
]
} json
필드
타입
필수
설명
list
Array
필수
PG 목록(부트페이 노출 순서)
pg
String
필수
PG 심볼(별칭)
pg_name
String
필수
PG 이름
symbols
Array
필수
resources[].pg 에 넣을 수 있는 값
methods
Array
필수
결제수단 목록
method
String
필수
결제수단 심볼(별칭)
method_name
String
필수
결제수단 이름
display_name
String
선택
화면 표시 이름
symbols
Array
필수
resources[].method 에 넣을 수 있는 값
group
Number
선택
결제 그룹
sandbox_supported
Boolean
필수
테스트 모드(sandbox: true) 지원 여부. true 면 연동 값(resource) 없이 sandbox: true 만으로 붙일 수 있습니다(부트페이 테스트 키로 결제)
resource_keys
Array
필수
resource 에 넣을 수 있는 키. 필수는 required 가 true 인 키만
key
String
필수
키 이름
description
String
선택
안내 문구(HTML 이 섞일 수 있습니다)
input_type
String
선택
input 한 줄 · textarea 여러 줄
required
Boolean
필수
필수 여부. true 면 비었을 때 RESOURCE_KEY_BLANK (기본 결제 모드 기준)
1-4. 에러 코드
코드
메시지
대처 방법
API_ONLY_RESELLER (601)
리셀러만 이용이 가능한 API입니다
리셀러 권한 계정 키로 호출합니다
API_SCOPE_INVALID
허용되지 않은 API 권한의 키입니다 (HTTP 401)
키에 이 API 의 리셀러 스코프 를 주거나 전체 권한(supervisor) 키로 호출합니다
PG_RESOURCE_NOT_FOUND (1004)
pg 로 보낸 PG 를 찾지 못했습니다 (HTTP 404)
pg 없이 불러 고를 수 있는 PG 를 확인합니다
2 PG 리소스 갱신
프로젝트(app) 에 등록되어 있는 PG·결제수단·발급키를 갱신합니다. 신규 결제수단을 추가하거나 PG 사가 발급한 가맹점 키가 바뀌었을 때 호출합니다.
동작 규칙
resources 배열에 포함된 결제수단은 추가 또는 갱신됩니다. 배열에 빠진 결제수단은 그대로 유지됩니다 — 전체 덮어쓰기가 아닙니다.
기존에 등록된 PG·결제수단 묶음에 같은 pg + method 조합이 들어오면 발급키만 갱신됩니다.
sandbox: true 면 테스트 모드로 등록합니다. 테스트 결제는 부트페이가 결제수단마다 가진 테스트 키로 하므로, 연동 값이 아직 없으면 resource 없이 sandbox: true 만 보내도 됩니다. 운영으로 바꿀 때는 resource 와 sandbox: false(또는 생략)를 보냅니다.
원소에 status: "off" 를 보내면 그 결제수단을 끕니다(결제창에서 빠집니다). 지우지 않으므로 연동 값·기록이 남고, status: "on" 으로 다시 켤 수 있습니다. 켜기·끄기만 할 때는 resource 를 보내지 않아도 됩니다.
응답으로 프로젝트의 최신 정보(application_keys, payment_apps) 가 다시 내려옵니다. 프로젝트 비밀키(private_key)는 나오지 않고, 결제수단 resource 는 가린 값(앞 5자 + *****)입니다.
지금 붙어 있는 결제수단은 결제수단 목록 , PG 마다 resource 에 넣을 키는 PG·필수 연동 값 목록 에서 확인합니다. 필수는 그 목록의 required: true 인 키만입니다(부트페이 관리자 화면과 같은 기준). 같은 PG 라도 결제수단마다 다릅니다 — 예: 나이스페이먼츠 카드는 mid·mkey, 카드자동은 mid·mkey·cancel_pwd.
같은 결제수단 심볼(예: card)을 여러 PG 로 한 요청에 보내도 각 원소는 그 원소의 pg 결제수단에 저장됩니다.
가맹점이나 리셀러가 결제 설정 잠금 을 켜 두었어도 이 API 는 그대로 동작합니다. 잠금은 가맹점 관리자 화면에서의 수정만 막습니다.
API 정보 PATCH https://api.bootpay.co.kr/v2/reseller/seller/app/resource/:app_idBasic Auth (리셀러 계정 키)
Rails 표준 resources 라우트라서 PATCH / PUT 둘 다 받습니다. 본 문서는 PATCH 기준으로 표기합니다.
2-1. 요청 파라미터
파라미터
타입
필수
설명
app_id
String
필수
갱신할 프로젝트 식별자 (URL 경로)
resources
Array
필수
등록·갱신할 PG·결제수단 배열. 각 원소 구조는 아래 참고
resources 배열 형식
필드
타입
필수
설명
pg
String
필수
PG 심볼 (예: nicepay, kcp, inicis, tosspayments)
method
String
필수
결제수단 심볼 (예: 카드, 계좌이체, 가상계좌, 카드자동)
sandbox
Boolean
선택
true 면 테스트 모드(부트페이 테스트 키로 결제). 생략·false 면 운영
resource
Object
선택
PG 가 발급한 가맹점 키 묶음. status 로 켜기·끄기만 하거나, sandbox: true 로 테스트 모드로만 쓸 때는 생략합니다
status
String
선택
on 켜기 · off 끄기. 생략하면 켜짐·꺼짐을 바꾸지 않습니다
결제수단 끄기·다시 켜기 status 만 보내면 연동 값은 그대로 두고 켜짐·꺼짐만 바꿉니다. 같은 요청에 연동 값을 바꿀 원소와 섞어 보내도 됩니다.
{
"resources" : [
{ "pg" : "nicepay" , "method" : "카드자동" , "status" : "off" },
{ "pg" : "nicepay" , "method" : "카드" , "status" : "on" }
]
} json 연동 값 없이 테스트 모드로 붙이기 PG 계약 전이라 연동 값이 없어도 sandbox: true 만 보내면 그 결제수단을 테스트 모드로 붙입니다(없으면 추가, 있으면 테스트 모드로 바꿉니다). 테스트 결제는 부트페이 테스트 키로 하고, 이미 저장된 연동 값·MID 기록은 그대로 둡니다. 테스트 모드를 지원하는지는 PG·필수 연동 값 목록 의 sandbox_supported 로 확인합니다.
{
"resources" : [
{ "pg" : "nicepay" , "method" : "카드" , "sandbox" : true },
{ "pg" : "nicepay" , "method" : "카드자동" , "sandbox" : true , "status" : "on" }
]
} json 운영으로 바꿀 때는 PG 에서 받은 연동 값을 resource 에 넣고 sandbox: false 로 다시 보냅니다.
2-2. 코드 예제 Node.js Python cURL
import fetch from 'node-fetch'
const RESELLER_AUTH = 'Basic ' + Buffer
. from ( `${ process . env . BOOTPAY_RESELLER_CLIENT_KEY }:${ process . env . BOOTPAY_RESELLER_SECRET_KEY }` )
. toString ( 'base64' )
const appId = '65a1c0ab8f1b5b00367a0010'
const res = await fetch ( `https://api.bootpay.co.kr/v2/reseller/seller/app/resource/${ appId }` , {
method: 'PATCH' ,
headers: {
'Content-Type' : 'application/json' ,
'Authorization' : RESELLER_AUTH
},
body: JSON . stringify ({
resources: [
{
pg: 'nicepay' ,
method: '카드' ,
sandbox: false ,
resource: {
mid: process.env. NICEPAY_MID ,
mkey: process.env. NICEPAY_MKEY
}
},
{
pg: 'nicepay' ,
method: '카드자동' ,
sandbox: false ,
resource: {
mid: process.env. NICEPAY_MID ,
mkey: process.env. NICEPAY_MKEY ,
cancel_pwd: process.env. NICEPAY_CANCEL_PWD // 카드자동은 결제 취소 비밀번호도 필수
}
}
]
})
})
const data = await res. json ()
console. log (data) javascript Node.js Python cURL
import base64, os, requests
auth = 'Basic ' + base64.b64encode(
f " { os.environ[ 'BOOTPAY_RESELLER_CLIENT_KEY' ] } : { os.environ[ 'BOOTPAY_RESELLER_SECRET_KEY' ] } " .encode()
).decode()
app_id = '65a1c0ab8f1b5b00367a0010'
payload = {
'resources' : [
{
'pg' : 'nicepay' ,
'method' : '카드' ,
'sandbox' : False ,
'resource' : {
'mid' : os.environ[ 'NICEPAY_MID' ],
'mkey' : os.environ[ 'NICEPAY_MKEY' ]
}
},
{
'pg' : 'nicepay' ,
'method' : '카드자동' ,
'sandbox' : False ,
'resource' : {
'mid' : os.environ[ 'NICEPAY_MID' ],
'mkey' : os.environ[ 'NICEPAY_MKEY' ],
'cancel_pwd' : os.environ[ 'NICEPAY_CANCEL_PWD' ] # 카드자동은 결제 취소 비밀번호도 필수
}
}
]
}
res = requests.patch(
f 'https://api.bootpay.co.kr/v2/reseller/seller/app/resource/ { app_id } ' ,
json = payload,
headers = { 'Authorization' : auth}
)
print (res.json()) python Node.js Python cURL
RESELLER_AUTH = $( printf '%s' " $BOOTPAY_RESELLER_CLIENT_KEY : $BOOTPAY_RESELLER_SECRET_KEY " | base64 )
APP_ID = '65a1c0ab8f1b5b00367a0010'
curl -X PATCH "https://api.bootpay.co.kr/v2/reseller/seller/app/resource/ $APP_ID " \
-H "Authorization: Basic $RESELLER_AUTH " \
-H 'Content-Type: application/json' \
-d '{
"resources": [
{
"pg": "nicepay",
"method": "카드",
"sandbox": false,
"resource": {
"mid": "'" $NICEPAY_MID "'",
"mkey": "'" $NICEPAY_MKEY "'"
}
},
{
"pg": "nicepay",
"method": "카드자동",
"sandbox": false,
"resource": {
"mid": "'" $NICEPAY_MID "'",
"mkey": "'" $NICEPAY_MKEY "'",
"cancel_pwd": "'" $NICEPAY_CANCEL_PWD "'"
}
}
]
}' bash
2-3. 응답 프로젝트의 최신 상태가 내려옵니다. 프로젝트 비밀키(private_key)는 프로젝트 생성 ·키 재발급 응답에서만 나오므로 여기에는 없고, resource 는 가린 값입니다.
{
"app_id" : "65a1c0ab8f1b5b00367a0010" ,
"app_name" : "한입가게 — 정기구독" ,
"real" : { "name" : "비실물" , "value" : 0 , "desc" : "" },
"unit" : "KRW" ,
"application_keys" : [
{ "type" : 1 , "name" : "WEB" , "key" : "65a1c0ab8f1b5b00367a0011" },
{ "type" : 2 , "name" : "Android" , "key" : "65a1c0ab8f1b5b00367a0012" },
{ "type" : 3 , "name" : "iOS" , "key" : "65a1c0ab8f1b5b00367a0013" },
{ "type" : 4 , "name" : "REST" , "key" : "65a1c0ab8f1b5b00367a0014" }
],
"payment_apps" : [
{
"payment_resource_id" : "65a1c0ab8f1b5b00367a0015" ,
"pg_id" : "6098a1b2c3d4e5f600000101" ,
"pg_name" : "나이스페이먼츠" ,
"pg_alias" : "nicepay" ,
"method_id" : "6098a1b2c3d4e5f600000201" ,
"method_name" : "카드" ,
"method_alias" : "card" ,
"resource_mode" : null ,
"sandbox_mode" : false ,
"easypay" : false ,
"updated_at" : "2024-01-12T18:04:11+09:00" ,
"status" : 1 ,
"resource" : {
"mid" : "nicep*****" ,
"mkey" : "EYzu8*****"
}
},
{
"payment_resource_id" : "65a1c0ab8f1b5b00367a0016" ,
"pg_id" : "6098a1b2c3d4e5f600000101" ,
"pg_name" : "나이스페이먼츠" ,
"pg_alias" : "nicepay" ,
"method_id" : "6098a1b2c3d4e5f600000202" ,
"method_name" : "카드자동" ,
"method_alias" : "card_rebill" ,
"resource_mode" : null ,
"sandbox_mode" : false ,
"easypay" : false ,
"updated_at" : "2024-01-12T18:04:11+09:00" ,
"status" : 0 ,
"resource" : {
"mid" : "nicep*****" ,
"mkey" : "EYzu8*****" ,
"cancel_pwd" : "pw123*****"
}
}
],
"status" : 20
} json 응답 파라미터
파라미터
타입
설명
app_id
String
프로젝트 식별자
app_name
String
프로젝트명
real
Object
거래 상품 유형. { name, value, desc } 구조입니다
unit
String
결제 통화
application_keys
Array
플랫폼별 SDK 연동키 묶음. WEB / Android / iOS / REST 4 건이 내려옵니다
application_keys[].type
Number
플랫폼 코드. 1 = WEB, 2 = Android, 3 = iOS, 4 = REST
application_keys[].name
String
플랫폼 이름 (WEB / Android / iOS / REST)
application_keys[].key
String
SDK 초기화에 넣는 application_id. Basic Auth 에 쓰는 client_key 와는 다른 값입니다
payment_apps
Array
프로젝트에 등록된 PG·결제수단 목록(꺼 둔 것 포함)
payment_apps[].payment_resource_id
String
등록된 결제수단 리소스 식별자
payment_apps[].pg_id / pg_name / pg_alias
String
매칭된 PG 식별자·이름·심볼
payment_apps[].method_id / method_name / method_alias
String
매칭된 결제수단 식별자·이름·심볼
payment_apps[].resource_mode
String / null
PG 연동 방식(일부 PG 만)
payment_apps[].sandbox_mode
Boolean
테스트 모드 여부
payment_apps[].easypay
Boolean
간편결제 여부
payment_apps[].updated_at
String
리소스 갱신 시각 (ISO 8601)
payment_apps[].status
Number
1 켜짐, 0 꺼짐
payment_apps[].resource
Object
등록된 PG 발급키 묶음. 키 이름은 그대로, 값은 가린 값(앞 5자 + *****, 10자보다 짧은 값은 앞 절반 + *****)입니다. 빈 값은 빈 값 그대로
status
Number
프로젝트 상태. 기본값 20 (심사통과)
응답에는 가맹점 키 원문이 없지만 요청 본문 의 resource 는 원문입니다. 이 요청을 그대로 로그·APM·에러 리포팅에 남기지 않습니다. 원문이 다시 필요하면 PG 사 통보서에서 다시 확인합니다 — 부트페이 API 는 원문을 다시 보여 주지 않습니다.
2-4. 동작 규칙
상황
결과
신규 pg + method 가 들어옴
결제수단이 추가됩니다
기존 pg + method 에 새 resource 가 들어옴
발급키가 덮어쓰기 됩니다
기존에 있던 pg + method 가 배열에서 빠짐
그대로 유지됩니다 (자동 제거되지 않습니다)
resource 안에 필수 키(required: true)가 빠짐
400 RESOURCE_KEY_BLANK 로 거부되고 아무것도 저장되지 않습니다
resource 안에 선택 키(required: false)가 빠짐
저장됩니다(그 키는 빈 값)
resources 가 없거나 빈 배열
400 PARAMS_INVALID
status: "off"
그 결제수단을 끕니다. resource·sandbox 는 보지 않고 연동 값·MID 기록은 그대로 남습니다
status: "on" + resource 없음
저장돼 있던 연동 값으로 다시 켭니다. 저장된 값에 필수 키가 빠져 있으면 400 RESOURCE_KEY_BLANK
status: "on" + resource
연동 값을 바꾸고 켭니다
status 없음
켜짐·꺼짐을 바꾸지 않습니다(꺼 둔 결제수단에 연동 값만 바꾸면 꺼진 채로 남습니다)
sandbox: true + resource 없음
연동 값 없이 테스트 모드로 붙이거나 바꾼다(없으면 결제수단 추가). 저장된 연동 값·MID 기록은 그대로입니다
sandbox: true + resource 없음 + status: "on"
테스트 모드로 바꾸고 켭니다(저장된 연동 값의 필수 키는 보지 않습니다)
테스트 모드를 지원하지 않는 결제수단에 sandbox: true + resource 없음
400 PM_NOT_SUPPORT_SANDBOX_MODE — 아무것도 저장되지 않습니다
프로젝트에 없는 결제수단을 status 만으로 켜고 끔
404 RESELLER_PAYMENT_METHOD_NOT_SET — 처음 붙일 때는 resource(테스트 모드면 sandbox: true)를 함께 보냅니다
원소에 resource·status·sandbox: true 가 모두 없음
400 PARAMS_INVALID
갱신도 가맹점 생성 (POST /v2/reseller/seller) 과 같은 RESOURCE_KEY_BLANK 검증을 거칩니다. 검사하는 키는 PG·필수 연동 값 목록 의 required: true 인 키입니다. 관리자 화면에서 결제 모드를 고른 결제수단은 그 모드의 필수 키로 검사합니다.
저장은 결제수단의 resource 를 통째로 바꾸므로 , 키 하나만 바꿀 때도 필수 키는 모두 다시 보내고(예: MID 만 바꾸려고 mid 만 보내면 다른 필수 키가 비어 400), 지금 값을 남기고 싶은 선택 키도 함께 보냅니다 — 보내지 않은 키는 빈 값이 됩니다.
끈 결제수단은 결제창에 나오지 않아 새 결제를 받지 않습니다. 이미 발급된 정기결제 빌링키로 하는 결제는 이 설정을 보지 않으므로, 정기결제를 멈추려면 빌링키·구독 쪽에서 따로 멈춥니다. 카카오·네이버 인증서 수단은 PG 하나에서만 켤 수 있습니다 — 다른 PG 에서 켜져 있으면 PM_AUTH_CERT_ALREADY_ENABLE 이므로 같은 요청에서 그쪽을 off 로 함께 보냅니다.
2-5. 에러 코드
코드
메시지
대처 방법
API_ONLY_RESELLER
리셀러만 이용이 가능한 API입니다
리셀러 권한 계정 키로 호출합니다
API_NOT_PERMIT_LV (10000)
허가된 API 권한이 아닙니다 (HTTP 401)
계정에 이 API 호출 권한이 열려 있는지 부트페이 관리자에게 문의합니다
API_NOT_PERMIT (10001)
허가된 API 권한이 아닙니다 (HTTP 401)
계정에 이 API 호출 권한이 열려 있는지 부트페이 관리자에게 문의합니다
APP_NOT_FOUND (200)
해당 app_id 의 프로젝트가 존재하지 않습니다 (HTTP 404)
app_id 오타·삭제 여부를 확인합니다
APP_NOT_PERMIT (201)
프로젝트는 있으나 본인 리셀러 하위가 아닙니다 (HTTP 401)
해당 프로젝트가 본인 하위 셀러 소속인지 확인합니다
PG_RESOURCE_NOT_FOUND
resources[].pg 심볼을 찾지 못했습니다
PG 코드 에서 PG 심볼을 확인합니다
METHOD_RESOURCE_NOT_FOUND
resources[].method 심볼을 찾지 못했습니다
PG 가 지원하는 결제수단 심볼인지 확인합니다
RESOURCE_KEY_BLANK (1006)
resources[].resource 에 필수 키(required: true)가 빠져 있습니다 (빠진 키 이름이 메시지에 나옵니다). status: "on" 만 보냈어요면 저장된 연동 값에 필수 키가 빠져 있습니다
PG·필수 연동 값 목록 에서 required: true 인 키를 채워서 보냅니다
PARAMS_INVALID
resources 가 없거나 비어 있습니다. 또는 status 가 on·off 가 아니거나, 원소에 resource·status·sandbox: true 가 모두 없습니다
갱신할 결제수단을 하나 이상, 원소마다 resource·status·sandbox: true 중 하나를 넣어 보냅니다
PM_NOT_SUPPORT_SANDBOX_MODE (1101)
sandbox: true 로 연동 값 없이 붙이려는 결제수단이 테스트 모드를 지원하지 않습니다 (어느 원소인지 메시지에 나옵니다)
PG·필수 연동 값 목록 에서 sandbox_supported 를 확인하고, 지원하지 않으면 resource 와 함께 보냅니다
RESELLER_PAYMENT_METHOD_NOT_SET (8181)
이 프로젝트에 설정되지 않은 결제수단을 켜거나 끄려 했습니다 (HTTP 404)
처음 붙일 때는 resource(테스트 모드면 sandbox: true)를 함께 보냅니다. 붙어 있는 결제수단은 결제수단 목록 에서 확인합니다
PM_AUTH_CERT_ALREADY_ENABLE (1111)
카카오·네이버 인증서 수단이 다른 PG 에서 이미 켜져 있습니다
같은 요청에서 다른 PG 의 그 수단을 status: "off" 로 함께 보냅니다
3 결제수단 목록
하위 프로젝트에 설정된 결제수단을 모두 돌려줍니다. 켜진 것과 꺼 둔 것이 함께 나옵니다. 결제수단을 붙이거나 끄고 켜는 것은 PG 리소스 갱신 으로 합니다.
동작 규칙
status 가 1 이면 켜짐(결제창에 나옵니다), 0 이면 꺼짐입니다. 꺼 둔 결제수단도 연동 값과 기록이 그대로 남아 있어 다시 켤 수 있습니다.
resource 는 키 이름은 그대로, 값은 가린 값 입니다(앞 5자 + *****, 10자보다 짧은 값은 앞 절반 + *****). PG 가맹점 키 원문이 응답에 실리는 곳은 가맹점 생성 뿐이고, 그 밖의 리셀러 API 는 가린 값만 줍니다.
sandbox_mode 가 true 면 테스트 모드입니다.
cert_expire_at 은 인증서가 필요한 결제수단(예: KCP 휴대폰 자동결제)의 가장 이른 인증서 만료 시각입니다. 인증서가 없으면 null 입니다.
프로젝트를 만들 때 함께 붙는 부트페이 기본 결제수단(테스트 모드)도 목록에 나옵니다.
payment_setting_lock 은 이 프로젝트의 결제 설정 잠금 상태입니다(가맹점 잠금 seller_locked · 리셀러 잠금 reseller_locked). 잠금과 상관없이 리셀러 API 로는 결제수단을 바꿀 수 있습니다 — 결제 설정 잠금
API 정보 GET https://api.bootpay.co.kr/v2/reseller/seller/app/:app_id/payment-methodsBasic Auth (리셀러 계정 키)
3-1. 요청 파라미터
파라미터
타입
필수
설명
app_id
String
필수
하위 프로젝트의 app_id (URL 경로)
3-2. 코드 예제 Node.js Python cURL
import fetch from 'node-fetch'
const RESELLER_AUTH = 'Basic ' + Buffer
. from ( `${ process . env . BOOTPAY_RESELLER_CLIENT_KEY }:${ process . env . BOOTPAY_RESELLER_SECRET_KEY }` )
. toString ( 'base64' )
const appId = '65a1c0ab8f1b5b00367a0010'
const res = await fetch ( `https://api.bootpay.co.kr/v2/reseller/seller/app/${ appId }/payment-methods` , {
headers: { 'Authorization' : RESELLER_AUTH }
})
const { list } = await res. json ()
console. log (list. filter ( pm => pm.status === 1 ). map ( pm => `${ pm . pg_alias }/${ pm . method_alias }` )) javascript Node.js Python cURL
import base64, os, requests
auth = 'Basic ' + base64.b64encode(
f " { os.environ[ 'BOOTPAY_RESELLER_CLIENT_KEY' ] } : { os.environ[ 'BOOTPAY_RESELLER_SECRET_KEY' ] } " .encode()
).decode()
res = requests.get( 'https://api.bootpay.co.kr/v2/reseller/seller/app/65a1c0ab8f1b5b00367a0010/payment-methods' , headers = { 'Authorization' : auth})
print (res.json()) python Node.js Python cURL
RESELLER_AUTH = $( printf '%s' " $BOOTPAY_RESELLER_CLIENT_KEY : $BOOTPAY_RESELLER_SECRET_KEY " | base64 )
curl "https://api.bootpay.co.kr/v2/reseller/seller/app/65a1c0ab8f1b5b00367a0010/payment-methods" \
-H "Authorization: Basic $RESELLER_AUTH " bash
3-3. 응답 {
"app_id" : "65a1c0ab8f1b5b00367a0010" ,
"list" : [
{
"payment_resource_id" : "65a1c0ab8f1b5b00367a0015" ,
"pg_id" : "6098a1b2c3d4e5f600000101" ,
"pg_name" : "나이스페이먼츠" ,
"pg_alias" : "nicepay" ,
"method_id" : "6098a1b2c3d4e5f600000201" ,
"method_name" : "카드" ,
"method_alias" : "card" ,
"resource_mode" : null ,
"sandbox_mode" : false ,
"easypay" : false ,
"updated_at" : "2026-10-27T10:00:00+09:00" ,
"status" : 1 ,
"resource" : {
"mid" : "nicep*****" ,
"mkey" : "EYzu8*****"
},
"cert_expire_at" : null
}
],
"payment_setting_lock" : {
"seller_locked" : false ,
"seller_changed_at" : null ,
"reseller_locked" : true ,
"reseller_changed_at" : "2026-10-29T15:00:00+09:00"
}
} json
필드
타입
필수
설명
app_id
String
필수
프로젝트 식별자
list
Array
필수
결제수단 목록
payment_resource_id
String
필수
프로젝트에 붙은 결제수단 식별자
pg_id / pg_name / pg_alias
String
필수
PG 식별자·이름·심볼
method_id / method_name / method_alias
String
필수
결제수단 식별자·이름·심볼
resource_mode
String
선택
PG 연동 방식(일부 PG 만)
sandbox_mode
Boolean
필수
테스트 모드 여부
easypay
Boolean
필수
간편결제 여부
updated_at
String
선택
마지막 변경 시각
status
Number
필수
1 켜짐, 0 꺼짐
resource
Object
필수
연동 값. 키는 그대로, 값은 가린 값. 빈 값은 빈 값 그대로
cert_expire_at
String
선택
인증서 만료 시각. 인증서가 없으면 null
payment_setting_lock
Object
필수
결제 설정 잠금 상태
seller_locked
Boolean
필수
가맹점이 자기 화면에서 켠 잠금
seller_changed_at
String
선택
가맹점 잠금을 마지막으로 바꾼 시각
reseller_locked
Boolean
필수
리셀러 잠금. 켜져 있으면 가맹점이 결제수단·테스트 모드·연동 값을 못 바꿉니다
reseller_changed_at
String
선택
리셀러 잠금을 마지막으로 바꾼 시각
3-4. 에러 코드
코드
메시지
대처 방법
API_ONLY_RESELLER (601)
리셀러만 이용이 가능한 API입니다
리셀러 권한 계정 키로 호출합니다
API_SCOPE_INVALID
허용되지 않은 API 권한의 키입니다 (HTTP 401)
키에 이 API 의 리셀러 스코프 를 주거나 전체 권한(supervisor) 키로 호출합니다
APP_NOT_FOUND (200)
프로젝트를 찾지 못했습니다 (HTTP 404)
app_id 가 올바른지 확인합니다
APP_NOT_PERMIT (201)
본인 하위 프로젝트가 아닙니다 (HTTP 401)
app_id 가 본인 리셀러 하위 셀러의 프로젝트인지 확인합니다
4 결제 설정 잠금
하위 프로젝트의 결제 설정을 리셀러가 잠그거나 풉니다. 잠기면 가맹점은 부트페이 관리자 화면에서 결제수단을 켜고 끄거나, 테스트 모드(샌드박스)를 바꾸거나, 연동 값(MID 등)을 저장할 수 없습니다.
동작 규칙
잠금은 프로젝트(app_id) 하나에 걸립니다. 그 프로젝트의 모든 결제수단에 적용됩니다.
가맹점은 이 잠금을 풀 수 없습니다. 가맹점 화면에는 "리셀러가 잠가 둔 결제 설정"이라고 보이고, 바꾸려면 리셀러에게 문의하라고 안내됩니다.
가맹점도 자기 화면에서 따로 잠글 수 있습니다(가맹점 잠금). 두 잠금은 서로 다른 값입니다 — 이 API 는 리셀러 잠금만 바꾸고, 가맹점 잠금이 켜져 있어도 리셀러 잠금을 바꿀 수 있습니다.
리셀러 API 는 두 잠금과 상관없이 동작합니다. PG 리소스 갱신 (결제수단 추가·연동 값 갱신·켜기·끄기)은 리셀러 잠금이나 가맹점 잠금이 켜져 있어도 그대로 됩니다.
지금 잠금 상태는 결제수단 목록 ·프로젝트 조회 응답의 payment_setting_lock 으로도 볼 수 있습니다.
리셀러 관리자 콘솔의 하위 가맹점 상세 화면에서도 프로젝트마다 잠그고 풀 수 있습니다.
API 정보 PUT https://api.bootpay.co.kr/v2/reseller/seller/app/:app_id/payment-lockBasic Auth (리셀러 계정 키)
4-1. 요청 파라미터
파라미터
타입
필수
설명
app_id
String
필수
하위 프로젝트의 app_id (URL 경로)
locked
Boolean
필수
true 잠금, false 풀기. 다른 값은 PARAMS_INVALID
4-2. 코드 예제 Node.js Python cURL
import fetch from 'node-fetch'
const RESELLER_AUTH = 'Basic ' + Buffer
. from ( `${ process . env . BOOTPAY_RESELLER_CLIENT_KEY }:${ process . env . BOOTPAY_RESELLER_SECRET_KEY }` )
. toString ( 'base64' )
const appId = '65a1c0ab8f1b5b00367a0010'
const res = await fetch ( `https://api.bootpay.co.kr/v2/reseller/seller/app/${ appId }/payment-lock` , {
method: 'PUT' ,
headers: { 'Authorization' : RESELLER_AUTH , 'Content-Type' : 'application/json' },
body: JSON . stringify ({ locked: true })
})
const { payment_setting_lock } = await res. json ()
console. log (payment_setting_lock.reseller_locked) // true javascript Node.js Python cURL
import base64, os, requests
auth = 'Basic ' + base64.b64encode(
f " { os.environ[ 'BOOTPAY_RESELLER_CLIENT_KEY' ] } : { os.environ[ 'BOOTPAY_RESELLER_SECRET_KEY' ] } " .encode()
).decode()
res = requests.put(
'https://api.bootpay.co.kr/v2/reseller/seller/app/65a1c0ab8f1b5b00367a0010/payment-lock' ,
headers = { 'Authorization' : auth},
json = { 'locked' : True }
)
print (res.json()[ 'payment_setting_lock' ]) python Node.js Python cURL
RESELLER_AUTH = $( printf '%s' " $BOOTPAY_RESELLER_CLIENT_KEY : $BOOTPAY_RESELLER_SECRET_KEY " | base64 )
curl -X PUT "https://api.bootpay.co.kr/v2/reseller/seller/app/65a1c0ab8f1b5b00367a0010/payment-lock" \
-H "Authorization: Basic $RESELLER_AUTH " \
-H "Content-Type: application/json" \
-d '{"locked": true}' bash
4-3. 응답 {
"app_id" : "65a1c0ab8f1b5b00367a0010" ,
"payment_setting_lock" : {
"seller_locked" : false ,
"seller_changed_at" : null ,
"reseller_locked" : true ,
"reseller_changed_at" : "2026-10-29T15:00:00+09:00"
}
} json
필드
타입
필수
설명
app_id
String
필수
프로젝트 식별자
payment_setting_lock
Object
필수
결제 설정 잠금 상태
seller_locked
Boolean
필수
가맹점이 자기 화면에서 켠 잠금. 이 API 로는 바뀌지 않습니다
seller_changed_at
String
선택
가맹점 잠금을 마지막으로 켜거나 끈 시각
reseller_locked
Boolean
필수
리셀러 잠금. 이 API 로 바꿉니다
reseller_changed_at
String
선택
리셀러 잠금을 마지막으로 켜거나 끈 시각
4-4. 잠기면 가맹점 화면에서 막히는 것
가맹점 관리자 화면 동작
리셀러 잠금
가맹점 잠금
결제수단 켜기·끄기(모두 켜기·끄기 포함)
막힘
막힘
테스트 모드(샌드박스) 켜기·끄기
막힘
막힘
연동 값(MID·가맹점 키 등) 저장
막힘
막힘
잠금 풀기
리셀러만
가맹점 프로젝트 관리자(비밀번호 확인)
막힌 동작을 가맹점이 시도하면 PM_RESELLER_SETTING_LOCKED(8220, "리셀러가 잠가 둔 결제 설정입니다. 바꾸려면 리셀러에게 문의해 주세요.")로 거절됩니다. 리셀러 API 와 부트페이 운영팀의 처리는 막지 않습니다.
4-5. 에러 코드
코드
메시지
대처 방법
API_ONLY_RESELLER (601)
리셀러만 이용이 가능한 API입니다
리셀러 권한 계정 키로 호출합니다
API_SCOPE_INVALID
허용되지 않은 API 권한의 키입니다 (HTTP 401)
키에 reseller:app:write 리셀러 스코프 를 주거나 전체 권한(supervisor) 키로 호출합니다
PARAMS_INVALID (-33)
locked 는 true 또는 false 로 보내야 합니다 (HTTP 400)
locked 를 불리언으로 보냅니다
APP_NOT_FOUND (200)
프로젝트를 찾지 못했습니다 (HTTP 404)
app_id 가 올바른지 확인합니다
APP_NOT_PERMIT (201)
본인 하위 프로젝트가 아닙니다 (HTTP 401)
app_id 가 본인 리셀러 하위 셀러의 프로젝트인지 확인합니다