재고 확인 및 공급가 사전 등록
주문 품목의 재고 상태를 확인하고, 선택적으로 공급가를 사전 등록합니다.
Endpoint
POST /vendor-api/inventory/confirm요청 파라미터
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
confirmations | array | O | 확인 항목 배열 (최대 100건) |
confirmations[].ord_prd_no | string | O | 주문품목번호 (세트 구성품은 {주문품목번호}^s{n}, 공통 규격) |
confirmations[].stock_available | boolean | O | 재고 가용 여부 (true: 출고 가능, false: 출고 불가) |
confirmations[].unavailable_reason | string | 조건부 | 출고 불가 사유 (stock_available=false 시 필수) |
confirmations[].memo | string | - | 메모 (최대 500자) |
confirmations[].supply_price | object | - | 공급가 정보 (공통 스키마 참조) |
unavailable_reason 허용값
| 값 | 설명 |
|---|---|
out_of_stock | 재고 부족 (품절) |
reserved | 다른 주문에 예약됨 |
damaged | 상품 파손 |
discontinued | 단종 |
other | 기타 사유 |
요청 예시
curl -X POST "https://brightmall-backend.certi.life/vendor-api/inventory/confirm" \
-H "Content-Type: application/json" \
-H "X-Vendor-Api-Key: <발급받은 API 키>" \
-H "X-Vendor-Id: 01KC51ST1WSTAET481SHPH3PSY" \
-d '{
"confirmations": [
{
"ord_prd_no": "202601220157_000020196_[1]",
"stock_available": true,
"supply_price": {
"unit_price": 75000,
"quantity": 2,
"total_amount": 150000
}
},
{
"ord_prd_no": "202601220157_000020196_[2]",
"stock_available": false,
"unavailable_reason": "out_of_stock",
"memo": "재입고 예정일: 2026-02-15"
}
]
}'응답 예시
{
"request_id": "req_mkp3inv_abc123",
"timestamp": "2026-01-29T07:00:00.000Z",
"success_count": 2,
"failure_count": 0,
"available_count": 1,
"unavailable_count": 1,
"results": [
{
"ord_prd_no": "202601220157_000020196_[1]",
"success": true,
"stock_available": true,
"previous_status": "pending",
"new_status": "preparing",
"supply_price_recorded": true,
"message": "재고 확인 및 공급가 등록 완료"
},
{
"ord_prd_no": "202601220157_000020196_[2]",
"success": true,
"stock_available": false,
"previous_status": "pending",
"new_status": "cancel_requested",
"supply_price_recorded": false,
"message": "재고 부족 확인 (취소 요청 접수)"
}
]
}응답 필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
success_count | number | 처리 성공 건수 |
failure_count | number | 처리 실패 건수 |
available_count | number | 재고 가용 건수 |
unavailable_count | number | 재고 불가 건수 |
results[].ord_prd_no | string | 보낸 주문품목번호 그대로 |
results[].base_ord_prd_no | string | (v1.9.0) 세트 구성품 번호로 보낸 경우 몰 주문품목번호 |
results[].success | boolean | 처리 성공 여부 |
results[].stock_available | boolean | 재고 가용 여부 |
results[].previous_status | string | 변경 전 품목 상태 |
results[].new_status | string | 변경된 품목 상태 |
results[].supply_price_recorded | boolean | 공급가를 품목에 반영했는지 (구성품 번호로 보낸 공급가는 false — 검토용 기록만) |
results[].quantity_mismatch | object | (v1.9.0) supply_price.quantity 가 몰 주문 수량과 다를 때 { expected, received } — 거절 아님, 금액은 몰 수량 x 단가 |
results[].message | string | 처리 결과 메시지 |
results[].error_code | string | 실패 사유. 실패한 항목은 처리되지 않으니 고쳐서 다시 보내 주세요 |
Endpoint
PUT /vendor-api/inventory/confirm주문 한 건에 대해 이 요청이 그 주문의 내 품목 전체 상태라고 보내는 방식(snapshot)입니다.
요청 파라미터
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
ord_no | string | O | 주문번호 |
confirmations | array | O | 확인 항목 배열 (최대 100건) — POST와 동일 스키마 |
confirmations[].ord_prd_no | string | O | 주문품목번호 (세트 구성품은 {주문품목번호}^s{n}) |
confirmations[].stock_available | boolean | O | 재고 가용 여부 |
confirmations[].unavailable_reason | string | 조건부 | 출고 불가 사유 (stock_available=false 시 필수) |
confirmations[].memo | string | - | 메모 |
confirmations[].supply_price | object | - | 공급가 정보 (공통 스키마) |
동작
| 품목 | 처리 |
|---|---|
| 요청에 있는 품목 | POST 와 같은 처리 |
| 요청에 없는 내 품목 (상태 없음·pending·preparing) | 상태는 그대로 두고 입고 대기 표시(confirm_excluded_at) |
| 배송 이후(shipped·delivered)·취소 요청 품목 | 변경 없음 |
입고 대기 표시가 있는 품목은 「결제완료」 주문 조회에 다시 나오지 않고(같은 품목을 두 번 수집하지 않도록) 거래명세서에서 빠집니다. 입고 후 다음 PUT 또는 POST 재고 확인에 넣으면 확인 처리되고 표시가 지워집니다. 취소되지 않습니다 — 예전(v0.2.0)의 cancel_requested 자동 전환·recovered 회복은 없어졌습니다. 응답 필드 이름 omitted_and_cancelled 는 호환을 위해 그대로입니다.
세트 구성품 번호(^s{n})는 몰 주문품목번호로 셉니다. 구성품이 하나라도 요청에 있으면 그 몰 품목은 빠진 품목이 아닙니다.
빠진 품목 표시를 하지 않는 경우 (v1.9.0)
요청 항목 중 하나라도 아래 코드로 실패하면 이 요청이 주문 전체를 나타낸다고 볼 수 없으므로 빠진 품목 표시를 하지 않습니다(omitted_count: 0, omission_skipped_reason 에 이유). 정상 항목은 그대로 처리됩니다. 실패한 항목을 고쳐 PUT 을 다시 보내 주세요.
| 코드 | 뜻 |
|---|---|
INVALID_ORD_PRD_NO | 번호를 읽을 수 없음 ({ord_no}_[n] 또는 {ord_no}_[n]^s{m} 이 아님). v1.9.0 전에는 ORD_PRD_NO_MISMATCH 로 왔습니다 |
ORD_PRD_NO_MISMATCH | 다른 주문(ord_no 와 다른 주문번호)의 품목번호 |
LINE_ITEM_NOT_FOUND | 이 주문에 없는 품목번호 |
UNAUTHORIZED | 다른 입점사 품목 |
ORDER_NOT_FOUND | 주문을 찾지 못함 |
그 밖의 실패(INVALID_SUPPLY_PRICE·INVALID_INVENTORY_STATUS·SUB_ITEM_CONFLICT 등)는 품목은 찾은 경우라 요청에 없는 품목만 표시합니다. 실패한 그 품목은 요청에 있었으므로 표시하지 않고, 바뀌지도 않습니다.
unavailable_reason 허용값
| 값 | 설명 |
|---|---|
out_of_stock | 재고 부족 (품절) |
reserved | 다른 주문에 예약됨 |
damaged | 상품 파손 |
discontinued | 단종 |
other | 기타 사유 |
요청 예시 — 세트 구성품 2개 + 일반 품목 1개 (품목 [3] 은 입고 대기)
curl -X PUT "https://brightmall-backend.certi.life/vendor-api/inventory/confirm" \
-H "Content-Type: application/json" \
-H "X-Vendor-Api-Key: $API_KEY" \
-H "X-Vendor-Id: $VENDOR_ID" \
-d '{
"ord_no": "202610301742_000028212",
"confirmations": [
{ "ord_prd_no": "202610301742_000028212_[1]^s1", "stock_available": true,
"supply_price": { "unit_price": 1100, "quantity": 12, "total_amount": 13200 } },
{ "ord_prd_no": "202610301742_000028212_[1]^s2", "stock_available": true,
"supply_price": { "unit_price": 1100, "quantity": 12, "total_amount": 13200 } },
{ "ord_prd_no": "202610301742_000028212_[2]", "stock_available": true,
"supply_price": { "unit_price": 7000, "quantity": 3, "total_amount": 21000 } }
]
}'응답 예시
{
"request_id": "req_put_abc123",
"timestamp": "2026-10-30T10:00:00.000Z",
"success_count": 3,
"failure_count": 0,
"available_count": 3,
"unavailable_count": 0,
"results": [
{
"ord_prd_no": "202610301742_000028212_[1]^s1",
"base_ord_prd_no": "202610301742_000028212_[1]",
"success": true,
"stock_available": true,
"previous_status": "pending",
"new_status": "preparing",
"supply_price_recorded": false,
"message": "재고 확인 완료 (세트 구성품 2건을 주문품목 202610301742_000028212_[1] 한 줄로 처리 — 구성품 공급가는 검토용으로만 기록, 몰 공급가 유지)"
},
{
"ord_prd_no": "202610301742_000028212_[1]^s2",
"base_ord_prd_no": "202610301742_000028212_[1]",
"success": true,
"stock_available": true,
"previous_status": "pending",
"new_status": "preparing",
"supply_price_recorded": false,
"message": "재고 확인 완료 (세트 구성품 2건을 주문품목 202610301742_000028212_[1] 한 줄로 처리 — 구성품 공급가는 검토용으로만 기록, 몰 공급가 유지)"
},
{
"ord_prd_no": "202610301742_000028212_[2]",
"success": true,
"stock_available": true,
"previous_status": "pending",
"new_status": "preparing",
"supply_price_recorded": true,
"message": "재고 확인 및 공급가 등록 완료"
}
],
"omitted_count": 1,
"omitted_and_cancelled": [
{
"ord_prd_no": "202610301742_000028212_[3]",
"previous_status": "pending",
"new_status": "pending",
"message": "Item omitted from PUT confirmations (status kept, marked confirm_excluded_at; include it in a later PUT/POST confirm when stock arrives)"
}
]
}응답 예시 — 읽을 수 없는 번호 (HTTP 400, 아무 품목도 바뀌지 않음)
{
"success_count": 0,
"failure_count": 1,
"results": [
{
"ord_prd_no": "202610301742_000028212_[1]-3",
"success": false,
"stock_available": true,
"message": "Invalid ord_prd_no format: 202610301742_000028212_[1]-3 (expected {ord_no}_[n], or {ord_no}_[n]^s{m} for a set sub-item)",
"error_code": "INVALID_ORD_PRD_NO"
}
],
"omitted_count": 0,
"omitted_and_cancelled": [],
"omission_skipped_reason": "Omitted lines were NOT marked because some items could not be matched to this vendor's lines on order 202610301742_000028212: 202610301742_000028212_[1]-3(INVALID_ORD_PRD_NO). Fix those items and resend the PUT. ..."
}응답 필드 설명 (PUT 추가분)
| 필드 | 타입 | 설명 |
|---|---|---|
omitted_count | number | 이번 PUT 에 없어서 입고 대기로 표시된 품목 수 |
omitted_and_cancelled[] | array | 그 품목 목록 (이름은 호환용 — 취소되지 않음) |
omitted_and_cancelled[].ord_prd_no | string | 주문품목번호 |
omitted_and_cancelled[].previous_status | string | 상태 |
omitted_and_cancelled[].new_status | string | previous_status 와 같음 (상태 유지) |
omitted_and_cancelled[].message | string | 메시지 |
omission_skipped_reason | string | (v1.9.0) 빠진 품목 표시를 하지 않았을 때 이유. 표시했으면 없음 |
에러
| 코드 | 상태 | 설명 |
|---|---|---|
ORDER_NOT_FOUND_OR_NO_VENDOR_ITEMS | 404 | 이 주문에 처리 전(상태 없음·pending·preparing) 내 품목이 없음 |
INVALID_ORD_PRD_NO | 400/207 (항목) | 번호를 읽을 수 없음 — 빠진 품목 표시 안 함 |
ORD_PRD_NO_MISMATCH | 400/207 (항목) | confirmations 의 ord_prd_no 가 ord_no 에 속하지 않음 — 빠진 품목 표시 안 함 |
SUB_ITEM_CONFLICT | 400/207 (항목) | 같은 품목의 세트 구성품끼리 stock_available 이 다름 — 그 품목은 처리 안 됨 |
주의사항
- 공급가를 입력하면 메타데이터만 저장되며, 정산 생성은 배송 등록/수정 시점에서 발생합니다
- shipped/delivered 품목은 PUT 누락이어도 무변경입니다 (post-shipment 가드)
- 다른 vendor 품목, 자사몰(DNTM) 품목, order/order_item/결제 정보는 절대 손대지 않습니다
참고사항
- 이 API는 선택사항이지만, 공급가를 사전에 등록하면 거래명세서를 미리 확인할 수 있습니다.
- POST: 멱등성 지원. 동일한 공급가와 수량이면 기존 상태 유지, 변경되면 메타데이터 업데이트.
- PUT: Snapshot replace. confirmations에 명시한 품목만 처리, 누락된 상태 없음·pending·preparing 품목은 상태 그대로 입고 대기 표시(취소 아님). 주문 품목으로 찾지 못한 항목이 있으면 표시하지 않음.
- 출고 불가(
stock_available: false)로 등록한 품목은 번복할 수 없습니다. 취소 프로세스가 즉시 시작되므로, 재고 유무를 전송하기 전에 반드시 실재고를 확인해주세요.
Last updated on