하위 가맹점의 PG 가맹 신청서에 올라간 서류 목록과, 서류마다 3분 동안만 열 수 있는 열람 주소를 돌려준다. 신청서 id 는 등록 상태 조회 의 onboarding_id 다.
핵심 요약
- 지금 신청서에 붙는 서류는 사업자등록증 하나다. 올리지 않았으면
list 가 빈 배열이다.
url 은 3분 뒤 막힌다. 저장해 두지 말고 열 때마다 이 API 를 다시 부른다.
- 서류는 개인정보다.
url 을 로그·에러 리포팅·브라우저 주소 공유에 남기지 않는다.
- 부를 때마다 열람 기록이 신청서에 남는다(리셀러가 열었다는 기록).
- 판매자가 콘솔에서 직접 낸 신청서도 본인 하위 가맹점 것이면 열 수 있다.
- 다른 가맹점이나 다른 리셀러 하위의 신청서는 없는 것과 같은
PG_WAIT_NOT_FOUND 다.
- 열기 전에 서류가 그 하위 가맹점이 올린 파일인지 확인한다. 아니거나 지워진 파일이면 그 서류는
list 에 나오지 않는다.
API 정보
GEThttps://api.bootpay.co.kr/v2/reseller/seller/:provider_id/onboarding/:onboarding_id/documentsBasic Auth (리셀러 계정 키)
요청 파라미터
| 파라미터 |
타입 |
필수 |
설명 |
provider_id |
String |
필수 |
하위 가맹점 provider_id (URL 경로) |
onboarding_id |
String |
필수 |
신청서 id (URL 경로) — 등록 상태 조회 의 onboarding_id |
코드 예제
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 providerId = '65a1c0aa8f1b5b00367a0001'
const onboardingId = '65a1c0aa8f1b5b00367a0050'
const res = await fetch(`https://api.bootpay.co.kr/v2/reseller/seller/${providerId}/onboarding/${onboardingId}/documents`, {
headers: { 'Authorization': RESELLER_AUTH }
})
const { list } = await res.json()
// list[0].url 을 바로 열어 보여 준다 — 저장하지 않는다javascript
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/65a1c0aa8f1b5b00367a0001/onboarding/65a1c0aa8f1b5b00367a0050/documents',
headers={'Authorization': auth}
)
print([doc['file_name'] for doc in res.json()['list']])python
RESELLER_AUTH=$(printf '%s' "$BOOTPAY_RESELLER_CLIENT_KEY:$BOOTPAY_RESELLER_SECRET_KEY" | base64)
curl "https://api.bootpay.co.kr/v2/reseller/seller/65a1c0aa8f1b5b00367a0001/onboarding/65a1c0aa8f1b5b00367a0050/documents" \
-H "Authorization: Basic $RESELLER_AUTH"bash
응답
{
"onboarding_id": "65a1c0aa8f1b5b00367a0050",
"list": [
{
"kind": "business_license",
"file_name": "사업자등록증.pdf",
"mime_type": "application/pdf",
"size": 482113,
"uploaded_at": "2026-10-20T11:02:00+09:00",
"url": "https://s.bootapi.com/api/v1/secure_documents/example_file_id/download?expires=1793090063&p=65a1c0aa8f1b5b00367a0001&sig=example_signature",
"expires_at": "2026-10-27T10:03:00+09:00",
"expires_in": 180
}
]
}json
| 필드 |
타입 |
필수 |
설명 |
onboarding_id |
String |
필수 |
신청서 id |
list |
Array |
필수 |
서류 목록. 서류가 없으면 [] |
kind |
String |
필수 |
서류 종류. 지금은 business_license(사업자등록증) |
file_name |
String |
선택 |
올린 파일 이름 |
mime_type |
String |
선택 |
파일 형식 |
size |
Number |
선택 |
파일 크기(바이트) |
uploaded_at |
String |
선택 |
올린 시각 |
url |
String |
필수 |
열람 주소. 3분 뒤 막힌다 |
expires_at |
String |
필수 |
url 이 막히는 시각 |
expires_in |
Number |
필수 |
url 유효 시간(초). 180 |
에러 코드
| 코드 |
메시지 |
대처 방법 |
API_ONLY_RESELLER (601) |
리셀러만 이용이 가능한 API 다 |
리셀러 권한 계정 키로 호출한다 |
API_SCOPE_INVALID |
허용되지 않은 API 권한의 키다 (HTTP 401) |
키에 이 API 의 리셀러 스코프 를 주거나 전체 권한(supervisor) 키로 호출한다 |
PROVIDER_NOT_FOUND (300) |
본인 하위 가맹점이 아니다 (HTTP 404) |
provider_id 가 본인 리셀러 하위인지 확인한다 |
PG_WAIT_NOT_FOUND (11000) |
그 가맹점의 신청서가 아니다 (HTTP 404) |
등록 상태 조회 에서 onboarding_id 를 다시 확인한다 |
COMMERCE_REQUEST_FAILED (8182) |
서류 주인을 확인하지 못했다(연동 서버 오류). 열람 주소를 주지 않는다 |
잠시 뒤 다시 부른다 |