머천트 API: SKU, 구매 사전 등록, 선전 창고 재고를 귀사 시스템에 연동
Shopee, Coupang, momo에 입점한 사업자를 위한 API입니다. 상품 등록 시 생성한 상품 바코드를 API로 전송하고, 구매 시 운송장 번호와 내용물을 사전 등록하세요. 물건이 선전 창고에 도착하면 작업 지시서가 자동 발행되어 라벨 부착과 개별 스캔 적치가 진행되며, 재고와 차이가 실시간으로 회신됩니다.
사업자
이용 대상(8자리 대만 사업자등록번호 필요)
200건
SKU 1회 일괄 처리 한도
WO-SK
입고 시 라벨 부착 작업 지시서 자동 발행
60회/분
API 키당 기본 요청 한도
1 서비스 개요
1단계에서는 “상품 및 입고” 기능을 제공합니다. SKU 생성부터 물건이 선전 창고에 적치되어 재고가 되기까지를 다룹니다.
현재 가능한 작업
- SKU를 일괄 생성하거나 업데이트합니다(귀사의
seller_sku기준). 색상과 사이즈마다 별도의 상품 바코드를 지정하고, Shopee/Coupang/momo의 상품 옵션 번호와 연결합니다. - 11자리 관세 분류 번호를 기준으로 수입 요건을 자동 대조하여, 상품 검사나 허가가 필요한 상품 또는 수입할 수 없는 상품을 표시합니다.
- 구매 시 운송장 번호와 박스별 내용물을 사전 등록합니다. 물건이 선전 창고에 도착하면 WO-SK 라벨 부착 작업 지시서가 자동 발행되고, 창고에서 한 개씩 라벨을 부착하고 스캔하여 적치합니다.
- 창고별 재고와 재고 이력을 조회하고, 도착, 입고 완료, 수량 차이, 재고 변동을 webhook으로 실시간 수신합니다.
입고 흐름
- SKU 생성: 상품 바코드, 옵션, 신고 품명, 관세 분류 번호를 전송합니다.
- 입고 사전 등록: 운송장 번호와 SKU별 예정 수량을 전송합니다.
- 선전 창고 입고: 운송장 번호를 스캔하면 WO-SK 작업 지시서가 자동 발행되고 인쇄됩니다.
- 라벨 부착 및 적치: 창고에서 상품 바코드를 인쇄해 한 개씩 부착하고 스캔으로 수량을 셉니다.
- 입고 완료: 실제 수령 수량이 선전 창고 재고에 반영되고, 파손품은 별도로 집계되며, 차이는 귀사 시스템에 통지됩니다.
개발 예정 기능
대량 출고 주문, 신고 규정에 따라 자동으로 묶이는 출고 배치, 그리고 타오위안 창고의 사전 비축 재고, 분류, 플랫폼 배송 라벨. 출시되면 이 페이지에서 안내합니다.
2 신청 및 API 키
머천트 API는 등록된 사업자만 이용할 수 있으며, 각 API 키는 승인된 머천트 계정 하나에 연결됩니다.
이용 신청 절차
- 회원 센터에서 “회사” 신고인을 추가하고 8자리 사업자등록번호를 입력합니다.
- HowBridge 고객센터에 머천트 API 개통을 신청하세요. 심사가 승인되면 API 키가 발급됩니다.
- API 키는 한 번만 표시됩니다. 서버 측 환경 변수에 보관하고, 브라우저나 앱에는 넣지 마세요.
- webhook이 필요하면 먼저 회원 센터의 API 페이지에서 URL을 설정하고 검증한 뒤, 머천트 이벤트를 구독하세요.
Authorization: Bearer <API 키>를 사용합니다. 일반 회원이 앱이나 웹사이트에 로그인해 생성된 토큰으로는 머천트 API를 호출할 수 없습니다.Authorization: Bearer 12|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Accept: application/json
3 공통 규칙
모든 엔드포인트에 다음 규칙이 공통으로 적용됩니다.
Base URL
형식 및 언어
요청과 응답은 모두 JSON입니다. 오류 메시지는 기본적으로 번체 중국어이며, Accept-Language: en을 보내면 영어로 반환됩니다. 프로그램에서 분기할 때는 항상 영어로 고정된 error.code를 사용하세요.
응답 구조
성공 시 {"success": true, "data": …, "meta": …}, 실패 시 {"success": false, "error": {"code", "message", "errors", "context"}}를 반환하며, errors는 필드별 상세 내역입니다. 유일한 예외는 API 키가 없거나 유효하지 않은 경우로, HTTP 401과 함께 body는 {"message": "Unauthenticated."}입니다.
{
"success": false,
"error": {
"code": "VALIDATION_FAILED",
"message": "…",
"errors": [
{ "code": "TRACKING_IN_USE", "field": "packages.0.tracking_no", "message": "…" }
]
}
}
요청 한도
API 키당 분당 60회, 일일 5,000회입니다(대용량 요금제는 분당 300회, 일일 50,000회). 일괄 엔드포인트는 한 번 호출을 1회로 계산합니다. 실시간 데이터가 필요하면 폴링하지 말고 webhook을 구독하세요.
| 응답 헤더 | 설명 |
|---|---|
X-RateLimit-Limit | 분당 한도 |
X-RateLimit-Remaining | 이번 1분 동안 남은 횟수 |
X-RateLimit-Limit-DayX-RateLimit-Remaining-Day | 일일 한도 및 남은 횟수 |
Retry-After | 한도 초과 시 재시도까지 기다려야 하는 초 |
멱등성(Idempotency-Key)
쓰기 요청에는 Idempotency-Key 헤더를 포함할 수 있습니다(8–128자, 영문·숫자와 _-:.). 네트워크 타임아웃 후 같은 키와 같은 내용으로 다시 보내면 첫 번째 응답이 반환되며 헤더에 Idempotent-Replayed: true가 포함됩니다. 같은 키로 내용을 바꾸면 422가 반환됩니다. 기록은 24시간 보관됩니다.
일괄 응답
일괄 엔드포인트는 건별로 결과를 반환합니다. 모두 성공하면 200, 일부 실패하면 207, 모두 실패하면 422입니다. 각 건에는 index, status(created/updated/failed)와 실패 사유가 포함됩니다.
식별자 허용 문자
seller_sku에는 영문·숫자와 ._-만 사용할 수 있습니다(1–64자). 상품 바코드에는 추가로 /와 +를 사용할 수 있습니다(3–64자). 대소문자는 구분하지 않습니다.
4 상품 SKU
SKU는 귀사의 seller_sku를 고유 키로 사용합니다. 같은 seller_sku를 다시 보내면 업데이트로 처리되며, 포함된 필드만 변경됩니다.
SKU 일괄 생성 또는 업데이트
POST/api/v1/merchant/skus/batch
한 번에 최대 200건입니다. 각 건은 독립적으로 처리되므로 한 건이 실패해도 다른 건에는 영향이 없습니다.
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
seller_sku | string | 필수 | 귀사의 SKU 코드입니다. 예: Shopee의 상품 옵션 SKU. |
product_name | string | 신규 생성 시 필수 | 상품명입니다. 이름이 같은 SKU는 같은 상품 아래로 묶입니다. |
barcode | string | 선택 | 상품 바코드입니다. 창고는 이 코드로 라벨을 인쇄하고 스캔하여 적치합니다. 색상과 사이즈가 다르면 바코드도 달라야 합니다. 바코드가 없으면 비워 두면 되며, 시스템이 시스템 바코드를 생성합니다. 16자를 초과하면 라벨에는 시스템 바코드가 인쇄됩니다. |
gtin | string | 선택 | GTIN(국제 바코드, 8/12/13/14자리, 체크 디지트 검증). Shopee에서 “국제 바코드 없음” 상품은 00을 보내세요. |
spec | object | 선택 | 옵션 정보입니다. 예: {"color": "검정", "size": "M"}, 최대 5개 항목. |
declared_name_zhdeclared_name_en | string | 선택 | 신고 품명(중국어/영어)입니다. 소재와 용도를 적고, “샘플”, “선물”이라고 쓰지 마세요. |
declared_unit_value | number | 선택 | 신고 단가입니다. 공급업체로부터의 구매 단가이며, 플랫폼 판매가가 아닙니다. |
declared_currency | string | 선택 | CNY, TWD 또는 USD. 단가를 입력한 경우 필수입니다. |
hs_code | string | 선택 | 11자리 관세 분류 번호입니다. 시스템은 이 번호를 기준으로 수입 요건을 대조합니다. |
origin_country | string | 선택 | 원산지 ISO 코드이며, 기본값은 CN입니다. |
weight_g | integer | 선택 | 개당 무게(그램). |
dimensions_cm | array | 선택 | 길이, 너비, 높이(센티미터). 예: [20, 15, 3]. |
battery_type | string | 선택 | none, contained(내장), packed(동봉), standalone(배터리 단독). |
channels | array | 선택 | 플랫폼 상품 연결, 최대 20개: platform(shopee/coupang/momo/other), shop_id, item_id, model_id, platform_sku. |
요청 예시(POST JSON)
curl -X POST https://0523.tw/api/v1/merchant/skus/batch \ -H "Authorization: Bearer $LUCKY_MERCHANT_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: sku-sync-20260917-001" \ -d '{ "items": [ { "seller_sku": "TEE-RED-S", "barcode": "4710000000011", "product_name": "Cotton T-shirt", "spec": { "color": "red", "size": "S" }, "declared_name_en": "Cotton knitted T-shirt", "declared_unit_value": 18.5, "declared_currency": "CNY", "hs_code": "61091000006", "weight_g": 160, "channels": [ { "platform": "shopee", "shop_id": "123456", "item_id": "2233", "model_id": "445566" } ] } ] }'
응답 200
{
"success": true,
"data": [
{
"index": 0,
"seller_sku": "TEE-RED-S",
"status": "created",
"sku": {
"seller_sku": "TEE-RED-S",
"barcode": "4710000000011",
"system_barcode": null,
"pick_code": "131999",
"hs_code": "61091000006",
"regulation": { "status": "ok", "import_codes": [], "reasons": [] },
"channels": [ { "platform": "shopee", "shop_id": "123456", "item_id": "2233", "model_id": "445566", "platform_sku": null } ]
}
}
],
"meta": { "summary": { "created": 1, "updated": 0, "failed": 0 } }
}
수입 요건 판정(regulation.status)
| ok | 수입 요건 코드가 없습니다. |
| review_required | 요건이 일부 상품에만 해당합니다(예: C02 “이 항목의 일부 상품은 검사 대상”). 상품의 실제 용도에 따라 확인해야 합니다. |
| formal_required | 수입 요건(검사, 검역, 허가 등)에 해당하므로 간이 신고를 사용할 수 없습니다. |
| blocked | 중국 대륙산 물품 수입 불허(MW0, 원산지 중국 대륙)에 해당하여 입고 사전 등록을 할 수 없습니다. |
| unclassified | 관세 분류 번호가 아직 제공되지 않아 판정할 수 없습니다. |
SKU 목록 조회
GET/api/v1/merchant/skus
seller_sku, barcode, regulation_status, updated_since(ISO 8601)로 필터링하고, page/per_page(최대 100)로 페이지를 나눌 수 있습니다.
단일 SKU 조회
GET/api/v1/merchant/skus/{seller_sku}
플랫폼 상품 연결 업데이트
PUT/api/v1/merchant/skus/{seller_sku}/channels
전송한 목록으로 기존 연결 전체를 대체합니다. 같은 플랫폼 옵션을 두 개의 SKU에 동시에 연결할 수 없습니다.
상품 바코드 라벨 다운로드
GET/api/v1/merchant/skus/{seller_sku}/label.pdf?qty=10
40×30mm 라벨 PDF를 반환하며, qty는 장수입니다(1–1000). 선전 창고에서 라벨을 부착할 때도 같은 라벨을 인쇄합니다. 출고 전에 직접 라벨을 부착하려는 경우 사용하세요.
5 입고 사전 등록
공급업체가 발송하면 운송장 번호와 내용물을 사전 등록하세요. 입고 요청서 한 건에 여러 운송장 번호를 넣을 수 있으며, 각 운송장 번호 아래에 SKU와 수량을 기재합니다.
입고 요청서 생성
POST/api/v1/merchant/inbound-orders
요청서 전체를 검증하며, 오류가 하나라도 있으면 생성되지 않습니다. 하나의 운송장 번호는 동시에 진행 중인 입고 요청서 한 건에만 속할 수 있습니다. 같은 택배 안에서 중복된 SKU는 수량이 합산됩니다.
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
reference_no | string | 필수 | 귀사의 구매 주문 번호 또는 입고 요청 번호로, 같은 머천트 내에서 고유해야 합니다(영문·숫자와 ._-/). |
supplier_order_no | string | 선택 | 공급업체 주문 번호입니다. 예: 1688 주문 번호. |
warehouse_code | string | 선택 | 입고 창고입니다. 현재는 SZ(선전 창고)만 받습니다. |
notes | string | 선택 | 비고(최대 1,000자). |
packages | array | 필수 | 택배 목록, 최대 50개. |
packages[].tracking_no | string | 필수 | 중국 택배 운송장 번호. |
packages[].carrier | string | 선택 | 택배사 코드입니다. 예: yto, sf. |
packages[].items | array | 필수 | 택배 내용물: seller_sku와 qty. 입고 요청서 전체 합계 최대 500행. |
요청 예시(POST JSON)
curl -X POST https://0523.tw/api/v1/merchant/inbound-orders \ -H "Authorization: Bearer $LUCKY_MERCHANT_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: po-20260917-0001" \ -d '{ "reference_no": "PO-20260917-0001", "supplier_order_no": "1688-3312456789", "packages": [ { "tracking_no": "YT1234567890123", "carrier": "yto", "items": [ { "seller_sku": "TEE-RED-S", "qty": 40 }, { "seller_sku": "TEE-RED-M", "qty": 60 } ] } ] }'
reference_no로 다시 생성하면 409 INBOUND_REFERENCE_EXISTS가 반환되며, error.context.inbound_order_id에 기존 입고 요청서 ID가 포함됩니다. 안전하게 재시도하려면 Idempotency-Key를 포함하세요.입고 요청서 상태
| created | 사전 등록됨. 아직 도착한 택배가 없습니다. |
| partially_arrived | 일부 택배가 선전 창고에 도착했습니다. |
| arrived | 모든 택배가 도착했으며, 라벨 부착 및 적치 중입니다. |
| completed | 모두 적치 완료되었으며, 수량이 사전 등록과 일치합니다. |
| completed_with_discrepancy | 모두 완료되었으나 부족 입고, 초과 입고 또는 파손이 있습니다. |
| cancelled | 취소됨. |
택배 상태
| awaiting_arrival | 도착 대기 중. |
| labeling | 창고에 도착했으며, 작업 지시서가 발행되어 라벨 부착 및 적치 중입니다. |
| received | 적치 완료. |
| mismatch | 입고 시 택배의 귀속 계정이 사전 등록 내용과 일치하지 않아 고객센터에서 확인 중입니다. |
| cancelled | 취소 또는 무효 처리되었으며, 운송장 번호가 해제되었습니다. |
입고 요청서 목록 조회
GET/api/v1/merchant/inbound-orders
GET/api/v1/merchant/inbound-orders/{id}
status, reference_no, updated_since로 필터링할 수 있습니다. 택배마다 예정 수량, 실제 수령 수량, 파손 수량과 차이가 반환됩니다.
입고 요청서 취소
POST/api/v1/merchant/inbound-orders/{id}/cancel
아직 도착한 택배가 하나도 없을 때만 취소할 수 있습니다. 취소 후에는 운송장 번호를 다시 사전 등록할 수 있습니다.
6 재고 조회
재고는 창고별로 구분됩니다: SZ 선전 창고, TY 타오위안 창고(타오위안 창고 재고는 출고 기능과 함께 제공됩니다).
재고 조회
GET/api/v1/merchant/inventory?warehouse_code=SZ
warehouse_code와 seller_sku[](최대 200개)로 필터링할 수 있습니다.
on_hand | 보유 수량. |
reserved | 주문에 할당된 수량. |
available | 가용 수량 = 보유 수량 − 할당 수량. |
damaged | 파손 수량이며, 출고할 수 없습니다. |
응답 200
{
"success": true,
"data": [
{ "seller_sku": "TEE-RED-S", "barcode": "4710000000011", "warehouse_code": "SZ",
"on_hand": 38, "reserved": 0, "available": 38, "damaged": 2, "updated_at": "2026-09-17T15:20:11+08:00" }
],
"meta": { "total": 1, "page": 1, "per_page": 100, "last_page": 1 }
}
재고 이력
GET/api/v1/merchant/inventory/movements?after_id=0&limit=200
추가만 되고 수정되지 않는 변동 기록입니다. after_id 커서로 다음 페이지를 가져오고(요청당 최대 500건), 응답의 meta.next_after_id를 저장해 두면 이어서 조회하며 대사할 수 있습니다.
7 Webhook 이벤트
이벤트가 발생하면 귀사의 URL로 바로 전송되므로 폴링할 필요가 없습니다.
설정 방법
- 회원 센터 API 페이지에서 webhook URL을 설정하고(https만 허용) 소유권 검증을 완료하세요. 엔드포인트는 HTTP 200과 함께 body로
{"challenge": "받은 값"}을 반환해야 합니다. PUT /api/v1/merchant/webhook/events를 호출해 머천트 이벤트를 구독합니다. 이후 회원 센터에서 URL을 변경해도 머천트 이벤트 구독은 유지됩니다.
curl -X PUT https://0523.tw/api/v1/merchant/webhook/events \ -H "Authorization: Bearer $LUCKY_MERCHANT_KEY" \ -H "Content-Type: application/json" \ -d '{"events": ["inbound.arrived", "inbound.received", "inbound.discrepancy", "inventory.changed"]}'
이벤트 목록
sku.regulation_flagged | SKU의 수입 요건 판정이 확인 필요, 정식 수입신고 필요 또는 수입 불허로 변경되었습니다. |
inbound.arrived | 택배가 선전 창고에 도착했으며 작업 지시서가 발행되었습니다. |
inbound.mismatch | 입고 시 택배의 귀속 계정이 사전 등록 내용과 일치하지 않아 고객센터에서 확인 중입니다. |
inbound.received | 택배 적치가 완료되었습니다. SKU별 예정 수량, 실제 수령 수량, 파손 수량이 포함됩니다. |
inbound.discrepancy | 적치 수량이 사전 등록과 다르거나 파손이 있습니다(inbound.received와 동시에 전송됩니다). |
inventory.changed | 재고가 변동되었습니다. 변동된 SKU의 최신 재고가 포함됩니다. |
inbound.received
{
"event": "inbound.received",
"delivery_id": "5b0f1c2e-8f3a-4d7e-9c21-0a6b2d4e8f10",
"created_at": "2026-09-17T15:20:11+08:00",
"data": {
"inbound_order_id": 128,
"reference_no": "PO-20260917-0001",
"order_status": "completed_with_discrepancy",
"tracking_no": "YT1234567890123",
"work_order": "WO-SK-315",
"warehouse_code": "SZ",
"items": [
{ "seller_sku": "TEE-RED-S", "expected_qty": 40, "received_qty": 38, "damaged_qty": 2, "difference": 0 },
{ "seller_sku": "TEE-RED-M", "expected_qty": 60, "received_qty": 59, "damaged_qty": 0, "difference": -1 }
],
"received_at": "2026-09-17T15:20:10+08:00"
}
}
서명 검증
모든 전송에는 X-Lucky-Event, X-Lucky-Delivery-Id, X-Lucky-Signature: t=타임스탬프,v1=서명이 포함됩니다. webhook secret으로 “타임스탬프 + . + 원본 body”에 대해 HMAC-SHA256을 계산하여 v1과 비교하고, 5분이 지난 타임스탬프는 거부하세요. 같은 이벤트를 재시도할 때 delivery_id는 바뀌지 않으므로 중복 제거에 사용할 수 있습니다.
2xx 이외의 응답은 1분, 5분, 30분, 2시간, 6시간 후에 재시도합니다. 20회 연속 실패하면 자동으로 비활성화되며, 회원 센터에서 다시 설정해야 합니다.
// PHP $body = file_get_contents('php://input'); $header = $_SERVER['HTTP_X_LUCKY_SIGNATURE'] ?? ''; parse_str(str_replace(',', '&', $header), $sig); // ['t' => '1789…', 'v1' => 'ab12…'] $expected = hash_hmac('sha256', ($sig['t'] ?? '') . '.' . $body, getenv('LUCKY_WEBHOOK_SECRET')); if (! hash_equals($expected, $sig['v1'] ?? '') || abs(time() - (int) ($sig['t'] ?? 0)) > 300) { http_response_code(400); exit; } $event = json_decode($body, true); // de-duplicate by $event['delivery_id'] http_response_code(200);
8 오류 코드
error.code는 항상 영어로 고정됩니다. 자주 발생하는 오류는 다음과 같습니다.
| HTTP | error.code | 설명 |
|---|---|---|
| 401 | — | API 키가 없거나, 유효하지 않거나, 만료되었습니다(body는 {"message": "Unauthenticated."}). |
| 403 | MERCHANT_TOKEN_REQUIRED | 이 토큰에는 머천트 API 권한이 없습니다(예: 일반 회원 로그인으로 생성된 토큰). |
| 403 | MERCHANT_NOT_APPROVEDMERCHANT_SUSPENDED | 계정이 아직 머천트로 승인되지 않았거나, 머천트가 정지되었습니다. |
| 403 | APP_SUSPENDEDAPP_REVOKEDAPP_NOT_FOUND | API 키에 연결된 API 애플리케이션이 정지되었거나 취소되었습니다. |
| 422 | VALIDATION_FAILEDPRODUCT_NAME_REQUIRED | 데이터 형식이 잘못되었습니다. error.errors의 필드별 상세 내역을 확인하세요. |
| 422 | BATCH_TOO_LARGE | 일괄 처리 건수가 한도를 초과했습니다. |
| 207 / 409 | SKU_BARCODE_DUPLICATESKU_BARCODE_CONFLICT | 상품 바코드가 이미 다른 SKU에서 사용 중이거나, 다른 SKU의 시스템 바코드 또는 피킹 코드와 같습니다. |
| 207 / 422 | GTIN_INVALIDHS_CODE_NOT_FOUND | GTIN 체크 디지트가 잘못되었거나, 관세 분류 번호가 존재하지 않습니다. |
| 404 / 422 | SKU_NOT_FOUNDSKU_IMPORT_BLOCKED | SKU를 찾을 수 없거나, 수입 불허 상품에 해당하는 SKU라 사전 등록할 수 없습니다. |
| 409 | INBOUND_REFERENCE_EXISTS | 입고 요청서 참조 번호가 이미 존재합니다. |
| 422 | TRACKING_IN_USETRACKING_FORECASTED_BY_OTHERTRACKING_ALREADY_WAREHOUSEDTRACKING_NOT_AVAILABLE | 운송장 번호가 진행 중인 입고 요청서에 이미 있거나, 다른 회원이 사전 등록했거나, 다른 회원 명의로 이미 입고되었습니다. |
| 409 | INBOUND_NOT_CANCELLABLE | 이미 도착한 택배가 있어 입고 요청서를 취소할 수 없습니다. |
| 400 / 409 / 422 | IDEMPOTENCY_KEY_INVALIDIDEMPOTENCY_IN_PROGRESSIDEMPOTENCY_KEY_REUSED | Idempotency-Key 형식이 잘못되었거나, 다른 내용에 사용되었거나, 이전 요청이 아직 처리 중입니다. |
| 409 | CONFLICT_RETRY | 같은 데이터를 다른 요청이 수정하고 있습니다. 잠시 후 다시 보내세요. |
| 429 | RATE_LIMIT_EXCEEDED | 요청 한도를 초과했습니다. Retry-After만큼 기다린 후 재시도하세요. |
9 코드 예제
아래 예제는 서버 측에서 실행하고, API 키를 프런트엔드 코드에 넣지 마세요.
use Illuminate\Support\Facades\Http; use Illuminate\Support\Str; $api = Http::withToken(config('services.lucky.merchant_key')) ->acceptJson() ->baseUrl('https://0523.tw/api/v1/merchant') ->timeout(20); // 1) Sync SKUs (up to 200 per request) $res = $api->withHeaders(['Idempotency-Key' => (string) Str::uuid()]) ->post('/skus/batch', ['items' => $items]); foreach ($res->json('data') as $row) { if ($row['status'] === 'failed') { logger()->warning('SKU failed', $row['errors']); } } // 2) Forecast an inbound order $order = $api->withHeaders(['Idempotency-Key' => 'po-' . $po->id]) ->post('/inbound-orders', [ 'reference_no' => $po->number, 'packages' => [[ 'tracking_no' => $po->tracking_no, 'items' => [['seller_sku' => 'TEE-RED-S', 'qty' => 40]], ]], ])->throw()->json('data'); // 3) Read Shenzhen stock $stock = $api->get('/inventory', ['warehouse_code' => 'SZ'])->json('data');
// Node.js 18+ (server side only) import { randomUUID } from 'node:crypto'; const base = 'https://0523.tw/api/v1/merchant'; const headers = { Authorization: `Bearer ${process.env.LUCKY_MERCHANT_KEY}`, 'Content-Type': 'application/json', Accept: 'application/json', }; const res = await fetch(`${base}/skus/batch`, { method: 'POST', headers: { ...headers, 'Idempotency-Key': randomUUID() }, body: JSON.stringify({ items }), }); const { data, meta } = await res.json(); console.log(meta.summary); // { created, updated, failed } const stock = await fetch(`${base}/inventory?warehouse_code=SZ`, { headers }).then(r => r.json());
import os, uuid, requests base = "https://0523.tw/api/v1/merchant" session = requests.Session() session.headers.update({ "Authorization": f"Bearer {os.environ['LUCKY_MERCHANT_KEY']}", "Accept": "application/json", }) r = session.post(f"{base}/inbound-orders", headers={"Idempotency-Key": "po-20260917-0001"}, json={ "reference_no": "PO-20260917-0001", "packages": [{"tracking_no": "YT1234567890123", "items": [{"seller_sku": "TEE-RED-S", "qty": 40}]}], }, timeout=20) if r.status_code == 409: existing_id = r.json()["error"]["context"]["inbound_order_id"] else: r.raise_for_status()
10 기술 지원
연동 중 문제가 있으면 요청 시각, 엔드포인트, error.code를 알려 주세요. 원인 파악에 도움이 됩니다.
LINE 공식 계정 @0523tw
기술 지원 이메일 howyunqisoftware@gmail.com
버전 v1 1단계(2026-09-17): 상품 SKU, 입고 사전 등록, 선전 창고 라벨 부착 및 적치, 재고 조회, webhook.