Inventory Adjust
재고 증감 이력을 Vendor에서 쿠팡으로 전달하는 API 입니다.
- API 호출 방향 : Vendor -> Coupang
- URL : /v1/3pfl/inventory/adjust
- Interface Style : Restful API
- HTTP Protocol : HTTPS
- Method : POST
Request Body
| Property Name | Parent Object | Data Type | Size | Mandatory | Description |
| Root | Array | Y | Array 형식
|
||
| skuId | Root Array | Long | Y | SKU ID | |
| centerCode | Root Array | String | Y | 센터 코드 | |
| uniqueKey | Root Array | String | N | 재고 History를 특정할 수 있는 key | |
| availableQuantity | Root Array | Long | Y | 현재 주문이 가능한 가용 재고 수량. 아래의 diff가 적용된 수량입니다. | |
| diff | Root Array | Long | Y | 변경된 수량 (+/-) | |
| reasonCode | Root Array | String | Y | 변경 사유 | |
| reasonMessage | Root Array | String | N | 변경 사유에 대한 추가 설명 | |
| countedAt | Root Array | String | Y | 변경 이벤트가 발생했던 시점 (yyyy-MM-dd HH:mm:ss.SSS) |
Request Example
[
{
"skuId": 10001234,
"centerCode": "CENTER001",
"uniqueKey": "273626354",
"availableQuantity": 1373,
"diff": -40,
"reasonCode": "TRASH",
"reasonMessage": null,
"countedAt": "2020-12-01 15:03:39.836"
},
{
"skuId": 10001235,
"centerCode": "CENTER001",
"uniqueKey": "273626355",
"availableQuantity": 1413,
"diff": 40,
"reasonCode": "FIND",
"reasonMessage": null,
"countedAt": "2020-12-01 15:03:40.173"
},
{
"skuId": 10001236,
"centerCode": "CENTER001",
"uniqueKey": "273626356",
"availableQuantity": 1403,
"diff": -10,
"reasonCode": "ETC_ADJUST",
"reasonMessage": "쿠팡 요청으로 인한 조정",
"countedAt": "2020-12-01 15:03:40.364"
}
]
Response
| Property Name | Data Type | Size | Mandatory | Description |
| code | String | 20 | N | 결과값
|
| message | String | 100 | N | 에러 사유 |
| data | String/Object | - | N | Response Data |
Response Example
{
"code": "0",
"message": null,
"data": null
}
유의사항
- Vendor에서 발생한 재고에 대한 +/- 이력을 해당 API로 보내주시면 됩니다.
- 재고이력 데이터는 일간(Daily) / 월간(Monthly) 정산 목적에서 수집하는 log성 데이터입니다.
- 재고스냅샷(InventorySnapshot) API 와는 차이점이 있습니다.
- 재고스냅샷 API는 쿠팡에서 실제 재고를 고객에게 보여주기 위해 수집하는 데이터 입니다. 그리하여 쿠팡이 필요할 때 직접 Vendor 쪽에 API를 호출하여 재고를 가져올 수 있어야 합니다.
- 재고이력 API는 해당 재고의 변경사항들을 모두 기록하기 위해 수집하는 데이터입니다.
- 재고이력 API는 다음 시나리오 중에 하나를 선택해서 호출해주시면 됩니다.
- 재고에 대한 수량 변경 사항이 발생할 때마다 실시간으로 재고이력 API 호출
- Ex) 재고에 대한 입고확정이 발생하여, 재고 수량이 변경되면 재고이력 API 호출
- Ex) 재고에 대해 창고 내에서 수량조정이 발생하여, 재고 수량이 변경되면 재고이력 API 호출
- 재고에 대한 수량 변경사항을 모두 기록해두었다가, 하루에 한 번 Batch로 재고이력 API 호출
- Ex) 재고에 대한 변경사항을 모두 저장해두었다가, 새벽 1시마다 Batch로 재고이력 API 호출
- 재고에 대한 수량 변경 사항이 발생할 때마다 실시간으로 재고이력 API 호출
- uniqueKey
- 업체에서 해당 재고이력을 지칭할 수 있는 Key(PK / UniqueKey)를 넣어서 보내주시면 됩니다.
- Ex) sequenceId
- 되도록 재고이력을 지칭할 수 있는 Key를 만들어서 보내주시길 바라며, 만약 UniqueKey를 보낼 수 없다면, 꼭 쿠팡쪽에 문의 주시기 바랍니다.
- 만약 재고조정 데이터의 diff를 잘못된 수량으로 보내셨다면, 수정된 수량만큼 새로운 uniqueKey를 발행하여 보내주시길 바랍니다.
-
ex.
# 기존 잘못보낸 request body (수량 10개)
{
...
"uniqueKey": "123456789",
"diff": 10,
...
}
# 수량을 5개로 소급적용하려면, 수정된 수량(delta)만큼의 새로운 재고조정 데이터를 만들어서 요청
# delta = 5 - 10 = -5
{
...
"uniqueKey": "3372635228",
"diff": -5,
...
}
# 혹은 다음과 같이, -10개로 보내고 5개로 다시 보내주셔도 좋습니다.
{
...
"uniqueKey": "3372635229",
"diff": -10,
...
},
{
...
"uniqueKey": "4837326263",
"diff": 5,
...
}
-
- 업체에서 해당 재고이력을 지칭할 수 있는 Key(PK / UniqueKey)를 넣어서 보내주시면 됩니다.
- reasonCode
- 재고 변동 사유에 대한 코드입니다.
- 재고 변동 사유마다 다음 코드로 설정하여 보내주시면 됩니다.
- 추가 조정 사유가 필요하거나, 조정 사유에 대해서 궁금한 점이 있으시면 쿠팡쪽으로 문의 부탁드립니다.
| reasonCode | Description |
| EXCHANGE_OUTBOUND | 교환으로 인해, 센터에서 다시 출고 |
|
FIND |
내부습득 |
|
LOST_SKU_FIND |
내부분실건 환입 |
|
LOST |
내부분실 |
|
DELIVERED_LOST |
택배사분실 |
|
CUSTOMER_SCAM |
고객사기 |
|
UNCOLLECTED |
반품미회수 |
|
ADJUST_TRANSFER_LOSS |
반품가용화 재고이관중 분실 |
|
INVENTORY_TRANSFER_IN |
재고 이관 +
|
|
INVENTORY_TRANSFER_OUT |
재고 이관 –
|
|
RELEASE_DELIVERED_DAMAGE (Deprecated) |
파손으로 인한 반출 |
|
RELEASE _ETC_01 (Deprecated) |
반출 케이스 1 |
|
RELEASE _ETC_02 (Deprecated) |
반출 케이스 2 (select * where category like ” RELEASE_*” from inventoryTable |
|
TRASH |
폐기
|
|
LIQUIDATION |
업체판매 |
|
DONATION |
기부 |
|
UNCOLLECTED_RETURN |
미회수 후 고객반품 |
|
UNKNOWN_RETURN |
임의반품 |
|
EXCHANGE_RETURN |
교환으로 인해, 다시 센터로 입고 |
|
CLAIM_OUTBOUND_RETURN |
선 배송건 환입 |
|
DELIVERED_LOST_RETURN |
택배사 분실건 환입 |
|
DAMAGE_RETURN |
출고 후 파손으로 인해, 회수된 건 환입
|
|
ADJUST_AFTER_CLOSED |
월말 재고 대사 이후 일괄적 조정 |
|
ETC_ADJUST |
기타 조정 원인
|
- countedAt
- Millisecond 단위까지 전송해주셔야 합니다.
- Ex) 2020-12-01 18:03:48.372
- 재고이력 API를 호출한 시간이 아닌, 해당 재고이력 이벤트가 실제로 발생했던 시간으로 보내주셔야 합니다.
- Bad
- 재고이력을 별도로 쌓아놓음
- 이후 배치로 재고이력 API를 호출할 때, countedAt에 currentTimeMillies()로 설정하여 보냄
- Good
- 재고이력 발생할 때마다 countedAt에 발생시간을 각각 기록해둠
- 이후 배치로 재고이력 API 호출할 때, 기록했던 countedAt을 그대로 보냄
- Also Good
- 재고이력이 발생할 때마다 재고이력 API 호출
- 이 때, countedAt에 currentTimeMillis()를 설정하여 보냄
- Bad
- Millisecond 단위까지 전송해주셔야 합니다.