मर्चेंट API: SKU, ख़रीद की अग्रिम सूचना और शेन्ज़ेन वेयरहाउस का स्टॉक अपने सिस्टम से जोड़ें
Shopee, Coupang और momo पर दुकान चलाने वाली पंजीकृत कंपनियों के लिए। लिस्टिंग के समय बने उत्पाद बारकोड API से भेजें, ख़रीदारी के समय ट्रैकिंग नंबर और सामग्री की अग्रिम सूचना दें, और माल शेन्ज़ेन वेयरहाउस पहुँचते ही वर्क ऑर्डर अपने-आप बनता है, बारकोड लगाया जाता है और हर पीस स्कैन करके शेल्फ़ पर रखा जाता है; स्टॉक और अंतर तुरंत वापस भेजे जाते हैं।
पंजीकृत कंपनियाँ
कौन आवेदन कर सकता है (8 अंकों की कर पहचान संख्या आवश्यक)
200 आइटम
एक थोक अनुरोध में अधिकतम SKU
WO-SK
वेयरहाउस पहुँचने पर अपने-आप लेबलिंग वर्क ऑर्डर
60 / मिनट
प्रति कुंजी डिफ़ॉल्ट रेट लिमिट
1 सेवा का परिचय
चरण 1 में “उत्पाद और इनबाउंड” शामिल है: SKU बनाने से लेकर माल के शेन्ज़ेन वेयरहाउस में शेल्फ़ पर स्टॉक के रूप में रखे जाने तक।
अभी आप क्या कर सकते हैं
- SKU थोक में बनाएँ या अपडेट करें (आपके
seller_skuके आधार पर), हर रंग और साइज़ के लिए अलग उत्पाद बारकोड के साथ, और उन्हें Shopee / Coupang / momo के उत्पाद वेरिएंट नंबर से जोड़ें। - 11 अंकों के ताइवान टैरिफ कोड के आधार पर आयात आवश्यकताओं की अपने-आप जाँच करें, और उन उत्पादों को चिह्नित करें जिन्हें निरीक्षण या परमिट चाहिए या जिनका आयात नहीं हो सकता।
- ख़रीदारी के समय ट्रैकिंग नंबर और हर बॉक्स की सामग्री की अग्रिम सूचना दें; माल शेन्ज़ेन वेयरहाउस पहुँचने पर WO-SK लेबलिंग वर्क ऑर्डर अपने-आप बनता है, और वेयरहाउस हर पीस पर बारकोड लगाकर उसे स्कैन करके शेल्फ़ पर रखता है।
- वेयरहाउस-वार स्टॉक और स्टॉक लेजर देखें, और वेयरहाउस पहुँचने, इनबाउंड पूरा होने, मात्रा में अंतर और स्टॉक में बदलाव की सूचना webhook से तुरंत पाएँ।
इनबाउंड प्रक्रिया
- SKU बनाएँ: उत्पाद बारकोड, वेरिएंट, घोषित उत्पाद नाम और टैरिफ कोड भेजें।
- इनबाउंड की अग्रिम सूचना: ट्रैकिंग नंबर और हर SKU की अपेक्षित मात्रा भेजें।
- शेन्ज़ेन वेयरहाउस में प्राप्ति: ट्रैकिंग नंबर स्कैन होते ही WO-SK वर्क ऑर्डर अपने-आप बनकर प्रिंट होता है।
- बारकोड लगाना और शेल्फ़ पर रखना: वेयरहाउस उत्पाद बारकोड प्रिंट करता है, हर पीस पर लगाता है और स्कैन करके गिनता है।
- इनबाउंड पूरा: वास्तव में प्राप्त मात्रा शेन्ज़ेन वेयरहाउस के स्टॉक में जुड़ती है, क्षतिग्रस्त माल अलग गिना जाता है, और अंतर की सूचना आपके सिस्टम को भेजी जाती है।
नियोजित सुविधाएँ
थोक आउटबाउंड ऑर्डर, घोषणा नियमों के अनुसार अपने-आप समूहित शिपमेंट बैच, और ताओयुआन वेयरहाउस में अग्रिम स्टॉक, छँटाई और प्लेटफ़ॉर्म शिपिंग लेबल। ये सुविधाएँ शुरू होने पर इसी पेज पर घोषित की जाएँगी।
2 आवेदन और API कुंजी
मर्चेंट API केवल पंजीकृत कंपनियों के लिए है, और हर कुंजी एक स्वीकृत मर्चेंट खाते से जुड़ी होती है।
सक्रिय करने के चरण
- सदस्य केंद्र में “कंपनी” प्रकार का घोषणाकर्ता जोड़ें और 8 अंकों की कर पहचान संख्या भरें।
- मर्चेंट API सक्रिय करवाने के लिए HowBridge ग्राहक सहायता से संपर्क करें; स्वीकृति मिलने पर कुंजी जारी की जाएगी।
- कुंजी केवल एक बार दिखाई जाती है। इसे सर्वर-साइड एनवायरनमेंट वेरिएबल में रखें, ब्राउज़र या ऐप में न डालें।
- अगर webhook चाहिए, तो पहले सदस्य केंद्र के API पेज पर URL सेट और सत्यापित करें, फिर मर्चेंट इवेंट सब्सक्राइब करें।
Authorization: Bearer <कुंजी> का उपयोग होता है। सामान्य सदस्य के ऐप या वेबसाइट में लॉग इन करने से बने टोकन मर्चेंट 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 फ़ील्ड-वार विवरण है। एकमात्र अपवाद कुंजी न भेजना या अमान्य कुंजी है: HTTP 401, और body {"message": "Unauthenticated."} होती है।
{
"success": false,
"error": {
"code": "VALIDATION_FAILED",
"message": "…",
"errors": [
{ "code": "TRACKING_IN_USE", "field": "packages.0.tracking_no", "message": "…" }
]
}
}
रेट लिमिट
हर कुंजी के लिए प्रति मिनट 60 और प्रति दिन 5,000 अनुरोध (हाई-वॉल्यूम प्लान में प्रति मिनट 300 और प्रति दिन 50,000); एक थोक अनुरोध एक ही गिना जाता है। रियल-टाइम डेटा के लिए polling न करें, webhook सब्सक्राइब करें।
| रिस्पॉन्स हेडर | विवरण |
|---|---|
X-RateLimit-Limit | प्रति मिनट सीमा |
X-RateLimit-Remaining | इस मिनट में बचे अनुरोध |
X-RateLimit-Limit-DayX-RateLimit-Remaining-Day | दैनिक सीमा और बचे अनुरोध |
Retry-After | सीमा पार होने पर कितने सेकंड बाद दोबारा कोशिश की जा सकती है |
आइडेम्पोटेंसी (Idempotency-Key)
राइट अनुरोधों में Idempotency-Key हेडर भेजा जा सकता है (8–128 अक्षर: अंग्रेज़ी अक्षर, अंक और _-:.)। नेटवर्क टाइमआउट के बाद उसी key और उसी सामग्री के साथ दोबारा भेजने पर पहला रिस्पॉन्स मिलता है, हेडर Idempotent-Replayed: true के साथ; उसी key को अलग सामग्री के साथ भेजने पर 422 लौटता है। रिकॉर्ड 24 घंटे तक रखे जाते हैं।
थोक रिस्पॉन्स
थोक एंडपॉइंट हर आइटम का परिणाम अलग से बताते हैं: सब सफल होने पर 200, कुछ विफल होने पर 207, और सब विफल होने पर 422। हर आइटम में index, status (created / updated / failed) और विफलता का कारण होता है।
पहचानकर्ता के अक्षर
seller_sku में केवल अंग्रेज़ी अक्षर, अंक और ._- (1–64 अक्षर) हो सकते हैं; उत्पाद बारकोड में इनके अलावा / और + (3–64 अक्षर) भी हो सकते हैं। बड़े और छोटे अक्षर एक समान माने जाते हैं।
4 उत्पाद SKU
SKU की अद्वितीय पहचान आपका seller_sku है: वही seller_sku दोबारा भेजने पर 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 पर “GTIN नहीं है” वाले उत्पादों के लिए 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। |
उदाहरण का अनुरोध करें (पोस्ट 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 पंक्तियाँ। |
उदाहरण का अनुरोध करें (पोस्ट 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 पर भेज दी जाती है, polling की ज़रूरत नहीं।
सेटअप कैसे करें
- सदस्य केंद्र के 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 बार विफल होने पर webhook अपने-आप निष्क्रिय हो जाता है और सदस्य केंद्र में दोबारा सेट करना पड़ता है।
// 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 | — | कुंजी नहीं भेजी गई, कुंजी अमान्य है या समाप्त हो चुकी है (body {"message": "Unauthenticated."} होती है)। |
| 403 | MERCHANT_TOKEN_REQUIRED | इस टोकन के पास मर्चेंट API की अनुमति नहीं है (जैसे सामान्य सदस्य के लॉग इन से बना टोकन)। |
| 403 | MERCHANT_NOT_APPROVEDMERCHANT_SUSPENDED | खाता अभी मर्चेंट के रूप में स्वीकृत नहीं है, या मर्चेंट निलंबित है। |
| 403 | APP_SUSPENDEDAPP_REVOKEDAPP_NOT_FOUND | इस कुंजी से जुड़ा 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 कोड उदाहरण
नीचे दिए उदाहरण सर्वर-साइड पर चलाएँ; कुंजी को फ़्रंटएंड कोड में न डालें।
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।