Händler-API: SKUs, Einkaufsvoranmeldungen und Bestand im Lager Shenzhen an Ihr System anbinden
Für eingetragene Unternehmen, die auf Shopee, Coupang und momo verkaufen. Übermitteln Sie die beim Einstellen der Artikel erzeugten Produktbarcodes per API und melden Sie beim Einkauf Sendungsnummern und Inhalte vor. Sobald die Ware im Lager Shenzhen eintrifft, wird automatisch ein Auftrag angelegt, etikettiert und jedes Stück einzeln gescannt und eingelagert; Bestand und Abweichungen werden in Echtzeit zurückgemeldet.
Unternehmen
Zugelassen (8-stellige Steuernummer erforderlich)
200 Einträge
Max. SKUs pro Sammelanfrage
WO-SK
Automatischer Etikettierauftrag bei Wareneingang
60 / Min.
Standard-Ratenlimit pro Schlüssel
1 Überblick
Phase 1 umfasst „Produkte und Wareneingang“: vom Anlegen einer SKU bis zur Einlagerung der Ware als Bestand im Lager Shenzhen.
Was Sie heute tun können
- SKUs gesammelt anlegen oder aktualisieren (maßgeblich ist Ihre
seller_sku), mit einem eigenen Produktbarcode für jede Farbe und Größe, verknüpft mit den Variantennummern auf Shopee / Coupang / momo. - Einfuhrbestimmungen automatisch anhand der 11-stelligen taiwanischen Zolltarifnummer prüfen und Produkte kennzeichnen, die eine Prüfung oder Genehmigung benötigen oder nicht eingeführt werden dürfen.
- Beim Einkauf Sendungsnummern und den Inhalt jedes Kartons voranmelden; bei Eingang im Lager Shenzhen wird automatisch ein WO-SK-Etikettierauftrag angelegt, und das Lager etikettiert jedes Stück einzeln, scannt es und lagert es ein.
- Bestand pro Lager und Bestandsbuchungen abfragen und per Webhook in Echtzeit über Eingang im Lager, abgeschlossenen Wareneingang, Mengenabweichungen und Bestandsänderungen informiert werden.
Ablauf des Wareneingangs
- SKUs anlegen: Produktbarcode, Varianten, Anmeldebezeichnung und Zolltarifnummer übermitteln.
- Wareneingang voranmelden: Sendungsnummern und die angemeldete Menge jeder SKU übermitteln.
- Eingang im Lager Shenzhen: Nach dem Scannen der Sendungsnummer wird automatisch ein WO-SK-Auftrag angelegt und gedruckt.
- Etikettieren und einlagern: Das Lager druckt die Produktbarcodes, etikettiert jedes Stück und zählt es per Scan.
- Wareneingang abgeschlossen: Die tatsächlich erhaltene Menge geht in den Bestand des Lagers Shenzhen ein, beschädigte Ware wird separat erfasst, und Abweichungen werden an Ihr System gemeldet.
Geplante Funktionen
Sammel-Versandaufträge, automatisch nach Anmeldevorschriften gruppierte Versandchargen sowie vorgelagerter Bestand, Sortierung und Plattform-Versandetiketten im Lager Taoyuan. Diese Funktionen werden bei Veröffentlichung auf dieser Seite angekündigt.
2 Zugang und API-Schlüssel
Die Händler-API steht nur eingetragenen Unternehmen offen; jeder Schlüssel ist an ein freigegebenes Händlerkonto gebunden.
Schritte zur Freischaltung
- Legen Sie im Mitgliederbereich einen Anmelder vom Typ „Unternehmen“ an und geben Sie die 8-stellige Steuernummer ein.
- Wenden Sie sich an den HowBridge-Kundenservice, um die Händler-API freischalten zu lassen. Nach erfolgreicher Prüfung wird ein Schlüssel ausgegeben.
- Der Schlüssel wird nur einmal angezeigt. Speichern Sie ihn in einer serverseitigen Umgebungsvariable und niemals im Browser oder in einer App.
- Wenn Sie Webhooks nutzen möchten, richten Sie zuerst auf der API-Seite im Mitgliederbereich die URL ein und verifizieren Sie sie; abonnieren Sie anschließend die Händlerereignisse.
Authorization: Bearer <Schlüssel>. Tokens, die bei der Anmeldung normaler Mitglieder in der App oder auf der Website erzeugt werden, können die Händler-API nicht aufrufen.Authorization: Bearer 12|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Accept: application/json
3 Allgemeine Konventionen
Für alle Endpunkte gelten die folgenden Regeln.
Base URL
Format und Sprache
Anfragen und Antworten sind JSON. Fehlermeldungen sind standardmäßig in traditionellem Chinesisch; mit Accept-Language: en erhalten Sie sie auf Englisch. Für die Programmlogik verwenden Sie immer den festen englischen error.code.
Antwortstruktur
Bei Erfolg wird {"success": true, "data": …, "meta": …} zurückgegeben, bei Fehlern {"success": false, "error": {"code", "message", "errors", "context"}}, wobei errors die Details pro Feld enthält. Einzige Ausnahme ist ein fehlender oder ungültiger Schlüssel: HTTP 401 mit dem Body {"message": "Unauthenticated."}.
{
"success": false,
"error": {
"code": "VALIDATION_FAILED",
"message": "…",
"errors": [
{ "code": "TRACKING_IN_USE", "field": "packages.0.tracking_no", "message": "…" }
]
}
}
Ratenbegrenzung
Pro Schlüssel 60 Anfragen pro Minute und 5.000 pro Tag (im High-Volume-Tarif 300 pro Minute und 50.000 pro Tag); eine Sammelanfrage zählt als eine Anfrage. Für Echtzeitdaten abonnieren Sie Webhooks, statt regelmäßig abzufragen (Polling).
| Antwort-Header | Beschreibung |
|---|---|
X-RateLimit-Limit | Limit pro Minute |
X-RateLimit-Remaining | Verbleibende Anfragen in dieser Minute |
X-RateLimit-Limit-DayX-RateLimit-Remaining-Day | Tageslimit und verbleibende Anfragen |
Retry-After | Sekunden bis zum erneuten Versuch nach Überschreiten des Limits |
Idempotenz (Idempotency-Key)
Schreibende Anfragen können den Header Idempotency-Key mitsenden (8–128 Zeichen: Buchstaben, Ziffern und _-:.). Wird nach einem Netzwerk-Timeout mit demselben Key und demselben Inhalt erneut gesendet, erhalten Sie die ursprüngliche Antwort mit dem Header Idempotent-Replayed: true; derselbe Key mit anderem Inhalt ergibt 422. Einträge werden 24 Stunden aufbewahrt.
Sammelantworten
Sammel-Endpunkte melden das Ergebnis jedes Eintrags: 200, wenn alle erfolgreich sind, 207 bei teilweisem Fehlschlag und 422, wenn alle fehlschlagen. Jeder Eintrag enthält index, status (created / updated / failed) und die Fehlergründe.
Zulässige Zeichen in Kennungen
seller_sku darf nur Buchstaben, Ziffern und ._- enthalten (1–64 Zeichen); Produktbarcodes dürfen zusätzlich / und + enthalten (3–64 Zeichen). Groß- und Kleinschreibung wird nicht unterschieden.
4 Produkt-SKUs
Eine SKU wird eindeutig über Ihre seller_sku identifiziert: Wird dieselbe seller_sku erneut gesendet, gilt das als Aktualisierung, und nur die mitgesendeten Felder werden geändert.
SKUs gesammelt anlegen oder aktualisieren
POST/api/v1/merchant/skus/batch
Bis zu 200 Einträge pro Anfrage. Jeder Eintrag wird unabhängig verarbeitet; ein Fehler wirkt sich nicht auf die übrigen Einträge aus.
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
seller_sku | string | Pflicht | Ihre SKU-Nummer, z. B. die Varianten-SKU bei Shopee. |
product_name | string | Pflicht beim Anlegen | Produktname. SKUs mit gleichem Namen werden unter einem Produkt zusammengefasst. |
barcode | string | Optional | Produktbarcode; das Lager druckt damit Etiketten und scannt ihn beim Einlagern. Jede Farbe und Größe braucht einen eigenen Barcode. Ohne Barcode lassen Sie das Feld leer, und das System erzeugt einen Systembarcode. Bei mehr als 16 Zeichen wird auf dem Etikett stattdessen der Systembarcode gedruckt. |
gtin | string | Optional | GTIN (8 / 12 / 13 / 14 Stellen, Prüfziffer wird validiert). Für Shopee-Produkte „ohne GTIN“ senden Sie 00. |
spec | object | Optional | Varianten, z. B. {"color": "schwarz", "size": "M"}, höchstens 5. |
declared_name_zhdeclared_name_en | string | Optional | Anmeldebezeichnung (Chinesisch / Englisch). Geben Sie Material und Verwendungszweck an; schreiben Sie nicht „Muster“ oder „Geschenk“. |
declared_unit_value | number | Optional | Angemeldeter Stückwert: Ihr Einkaufspreis pro Stück beim Lieferanten, nicht der Verkaufspreis auf der Plattform. |
declared_currency | string | Optional | CNY, TWD oder USD; Pflicht, wenn ein Stückwert angegeben ist. |
hs_code | string | Optional | 11-stellige Warennummer; das System prüft damit die Einfuhrbestimmungen. |
origin_country | string | Optional | ISO-Code des Ursprungslands, Standard CN. |
weight_g | integer | Optional | Gewicht pro Stück (Gramm). |
dimensions_cm | array | Optional | Länge, Breite, Höhe (cm), z. B. [20, 15, 3]. |
battery_type | string | Optional | none, contained (eingebaut), packed (beigepackt), standalone (nur Batterie). |
channels | array | Optional | Plattform-Produktzuordnungen, höchstens 20: platform (shopee / coupang / momo / other), shop_id, item_id, model_id, platform_sku. |
Anforderungsbeispiel (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" } ] } ] }'
Antwort 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 } }
}
Bewertung der Einfuhrbestimmungen (regulation.status)
| ok | Keine Codes für Einfuhrbestimmungen. |
| review_required | Die Bestimmung betrifft nur einen Teil der Produkte (z. B. C02 „einige Produkte unter dieser Position unterliegen der Prüfpflicht“); anhand des tatsächlichen Verwendungszwecks bestätigen. |
| formal_required | Einfuhrbestimmungen betroffen (Prüfung, Quarantäne, Genehmigung usw.); eine vereinfachte Zollanmeldung ist nicht möglich. |
| blocked | Waren mit Ursprung in Festlandchina, deren Einfuhr nicht zulässig ist (MW0, Ursprungsland Festlandchina); keine Wareneingangs-Voranmeldung möglich. |
| unclassified | Noch keine Zolltarifnummer angegeben, daher keine Bewertung möglich. |
SKUs abfragen
GET/api/v1/merchant/skus
Filterbar nach seller_sku, barcode, regulation_status und updated_since (ISO 8601); Paginierung über page / per_page (max. 100).
Einzelne SKU
GET/api/v1/merchant/skus/{seller_sku}
Plattform-Produktzuordnungen aktualisieren
PUT/api/v1/merchant/skus/{seller_sku}/channels
Die übermittelte Liste ersetzt alle bisherigen Zuordnungen vollständig; dieselbe Plattformvariante kann nicht gleichzeitig mit zwei SKUs verknüpft sein.
Barcode-Etiketten herunterladen
GET/api/v1/merchant/skus/{seller_sku}/label.pdf?qty=10
Gibt ein PDF mit Etiketten im Format 40×30mm zurück; qty ist die Anzahl der Etiketten (1–1000). Das Lager Shenzhen druckt beim Etikettieren dasselbe Etikett; dieser Endpunkt ist für den Fall gedacht, dass Sie vor dem Versand selbst etikettieren möchten.
5 Wareneingangs-Voranmeldung
Nachdem der Lieferant die eingekaufte Ware versendet hat, melden Sie Sendungsnummern und Inhalte vor. Ein Wareneingangsauftrag kann mehrere Sendungsnummern enthalten, unter denen jeweils SKUs und Mengen aufgeführt sind.
Wareneingangsauftrag anlegen
POST/api/v1/merchant/inbound-orders
Validierung als Ganzes: Bei einem einzigen Fehler wird nichts angelegt. Eine Sendungsnummer kann jeweils nur zu einem laufenden Wareneingangsauftrag gehören; doppelte SKUs im selben Paket werden mengenmäßig zusammengeführt.
| Feld | Typ | Pflicht | Beschreibung |
|---|---|---|---|
reference_no | string | Pflicht | Ihre Bestell- oder Wareneingangsnummer, eindeutig pro Händler (Buchstaben, Ziffern und ._-/). |
supplier_order_no | string | Optional | Bestellnummer des Lieferanten, z. B. eine 1688-Bestellnummer. |
warehouse_code | string | Optional | Eingangslager; derzeit nur SZ (Lager Shenzhen). |
notes | string | Optional | Anmerkungen (max. 1.000 Zeichen). |
packages | array | Pflicht | Liste der Pakete, max. 50. |
packages[].tracking_no | string | Pflicht | Sendungsnummer eines chinesischen Paketdienstes. |
packages[].carrier | string | Optional | Code des Paketdienstes, z. B. yto oder sf. |
packages[].items | array | Pflicht | Paketinhalt: seller_sku und qty, max. 500 Zeilen pro Wareneingangsauftrag. |
Anforderungsbeispiel (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 erneut angelegt, antwortet die API mit 409 INBOUND_REFERENCE_EXISTS, und error.context.inbound_order_id enthält die ID des ursprünglichen Wareneingangsauftrags. Für sichere Wiederholungen senden Sie einen Idempotency-Key mit.Status des Wareneingangsauftrags
| created | Vorangemeldet; noch kein Paket im Lager eingetroffen. |
| partially_arrived | Ein Teil der Pakete ist im Lager Shenzhen eingetroffen. |
| arrived | Alle Pakete sind im Lager eingetroffen; Etikettierung und Einlagerung laufen. |
| completed | Alles eingelagert, die Mengen entsprechen der Voranmeldung. |
| completed_with_discrepancy | Alles abgeschlossen, jedoch mit Unterlieferung, Überlieferung oder Beschädigung. |
| cancelled | Storniert. |
Paketstatus
| awaiting_arrival | Wartet auf Eingang im Lager. |
| labeling | Im Lager eingetroffen, Auftrag angelegt; Etikettierung und Einlagerung laufen. |
| received | Einlagerung abgeschlossen. |
| mismatch | Die Zuordnung des Pakets beim Wareneingang stimmt nicht mit Ihrer Voranmeldung überein; der Kundenservice prüft den Fall. |
| cancelled | Storniert oder ungültig gemacht; die Sendungsnummer wurde freigegeben. |
Wareneingangsaufträge abfragen
GET/api/v1/merchant/inbound-orders
GET/api/v1/merchant/inbound-orders/{id}
Filterbar nach status, reference_no und updated_since. Für jedes Paket werden vorangemeldete, erhaltene und beschädigte Mengen sowie die Abweichung zurückgegeben.
Wareneingangsauftrag stornieren
POST/api/v1/merchant/inbound-orders/{id}/cancel
Nur möglich, solange noch kein Paket im Lager eingetroffen ist; nach der Stornierung können die Sendungsnummern erneut vorangemeldet werden.
6 Bestandsabfrage
Der Bestand wird pro Lager geführt: SZ Lager Shenzhen, TY Lager Taoyuan (der Bestand im Lager Taoyuan wird zusammen mit den Versandfunktionen freigeschaltet).
Bestand abfragen
GET/api/v1/merchant/inventory?warehouse_code=SZ
Filterbar nach warehouse_code und seller_sku[] (max. 200).
on_hand | Menge auf Lager. |
reserved | Für Aufträge reservierte Menge. |
available | Verfügbare Menge = auf Lager − reserviert. |
damaged | Beschädigte Menge; nicht versandfähig. |
Antwort 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 }
}
Bestandsbuchungen
GET/api/v1/merchant/inventory/movements?after_id=0&limit=200
Bewegungsdatensätze, die nur ergänzt und nie geändert werden. Blättern Sie mit dem Cursor after_id vorwärts (max. 500 Datensätze pro Anfrage) und merken Sie sich meta.next_after_id aus der Antwort, um den Abgleich fortzusetzen.
7 Webhook-Ereignisse
Ereignisse werden in dem Moment, in dem sie eintreten, an Ihre URL gesendet – Polling ist nicht nötig.
Einrichtung
- Richten Sie auf der API-Seite im Mitgliederbereich die Webhook-URL ein (nur https) und schließen Sie die Inhaberschaftsprüfung ab: Ihr Endpunkt muss mit HTTP 200 und dem Body
{"challenge": "empfangener Wert"}antworten. - Rufen Sie
PUT /api/v1/merchant/webhook/eventsauf, um Händlerereignisse zu abonnieren. Eine spätere Änderung der URL im Mitgliederbereich hebt die Abonnements der Händlerereignisse nicht auf.
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"]}'
Ereignisliste
sku.regulation_flagged | Die Bewertung der Einfuhrbestimmungen einer SKU hat sich zu „Prüfung erforderlich“, „förmliche Zollanmeldung erforderlich“ oder „Einfuhr nicht zulässig“ geändert. |
inbound.arrived | Ein Paket ist im Lager Shenzhen eingetroffen, und ein Auftrag wurde angelegt. |
inbound.mismatch | Die Zuordnung eines Pakets beim Wareneingang stimmt nicht mit der Voranmeldung überein; der Kundenservice prüft den Fall. |
inbound.received | Die Einlagerung eines Pakets ist abgeschlossen, mit vorangemeldeten, erhaltenen und beschädigten Mengen je SKU. |
inbound.discrepancy | Die eingelagerte Menge weicht von der Voranmeldung ab, oder es gibt Beschädigungen (wird zusammen mit inbound.received gesendet). |
inventory.changed | Der Bestand hat sich geändert, mit dem aktuellen Bestand der betroffenen SKUs. |
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"
}
}
Signatur prüfen
Jede Zustellung enthält X-Lucky-Event, X-Lucky-Delivery-Id und X-Lucky-Signature: t=Zeitstempel,v1=Signatur. Berechnen Sie mit Ihrem Webhook-Secret einen HMAC-SHA256 über „Zeitstempel + . + Roh-Body“, vergleichen Sie ihn mit v1 und lehnen Sie Zeitstempel ab, die älter als 5 Minuten sind. Bei Wiederholungen desselben Ereignisses bleibt die delivery_id gleich und kann zur Deduplizierung genutzt werden.
Bei einer Antwort außerhalb von 2xx wird nach 1 Minute, 5 Minuten, 30 Minuten, 2 Stunden und 6 Stunden erneut zugestellt; nach 20 aufeinanderfolgenden Fehlschlägen wird der Webhook automatisch deaktiviert und muss im Mitgliederbereich neu eingerichtet werden.
// 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 Fehlercodes
error.code ist immer Englisch. Im Folgenden die häufigsten Fehler.
| HTTP | error.code | Beschreibung |
|---|---|---|
| 401 | — | Kein Schlüssel mitgesendet, Schlüssel ungültig oder abgelaufen (Body ist {"message": "Unauthenticated."}). |
| 403 | MERCHANT_TOKEN_REQUIRED | Dieses Token hat keine Berechtigung für die Händler-API (z. B. ein Token aus der Anmeldung eines normalen Mitglieds). |
| 403 | MERCHANT_NOT_APPROVEDMERCHANT_SUSPENDED | Das Konto ist noch nicht als Händler freigegeben, oder der Händler ist gesperrt. |
| 403 | APP_SUSPENDEDAPP_REVOKEDAPP_NOT_FOUND | Die zum Schlüssel gehörende API-Anwendung ist gesperrt oder widerrufen. |
| 422 | VALIDATION_FAILEDPRODUCT_NAME_REQUIRED | Ungültiges Datenformat; siehe die Details pro Feld in error.errors. |
| 422 | BATCH_TOO_LARGE | Die Anzahl der Einträge in der Sammelanfrage überschreitet das Limit. |
| 207 / 409 | SKU_BARCODE_DUPLICATESKU_BARCODE_CONFLICT | Der Produktbarcode wird bereits von einer anderen SKU verwendet oder stimmt mit dem Systembarcode oder Kommissioniercode einer anderen SKU überein. |
| 207 / 422 | GTIN_INVALIDHS_CODE_NOT_FOUND | Ungültige GTIN-Prüfziffer, oder die Zolltarifnummer existiert nicht. |
| 404 / 422 | SKU_NOT_FOUNDSKU_IMPORT_BLOCKED | SKU nicht gefunden, oder die SKU ist eine nicht einfuhrfähige Ware und kann nicht vorangemeldet werden. |
| 409 | INBOUND_REFERENCE_EXISTS | Die Referenznummer des Wareneingangsauftrags existiert bereits. |
| 422 | TRACKING_IN_USETRACKING_FORECASTED_BY_OTHERTRACKING_ALREADY_WAREHOUSEDTRACKING_NOT_AVAILABLE | Die Sendungsnummer befindet sich bereits in einem laufenden Wareneingangsauftrag, wurde von einem anderen Mitglied vorangemeldet oder ist bereits unter einem anderen Mitglied im Lager eingegangen. |
| 409 | INBOUND_NOT_CANCELLABLE | Es ist bereits ein Paket im Lager eingetroffen; der Wareneingangsauftrag kann nicht storniert werden. |
| 400 / 409 / 422 | IDEMPOTENCY_KEY_INVALIDIDEMPOTENCY_IN_PROGRESSIDEMPOTENCY_KEY_REUSED | Der Idempotency-Key hat ein ungültiges Format, wurde für einen anderen Inhalt verwendet, oder die vorherige Anfrage wird noch verarbeitet. |
| 409 | CONFLICT_RETRY | Derselbe Datensatz wird gerade von einer anderen Anfrage geändert; bitte später erneut senden. |
| 429 | RATE_LIMIT_EXCEEDED | Ratenlimit überschritten; warten Sie gemäß Retry-After und versuchen Sie es dann erneut. |
9 Codebeispiele
Führen Sie die folgenden Beispiele serverseitig aus und legen Sie den Schlüssel niemals in Frontend-Code ab.
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 Technischer Support
Wenn bei der Integration Probleme auftreten, nennen Sie uns bitte Anfragezeitpunkt, Endpunkt und error.code, damit wir Ihnen bei der Fehlersuche helfen können.
Offizielles LINE-Konto @0523tw
E-Mail für technische Fragen howyunqisoftware@gmail.com
Version v1 Phase 1 (2026-09-17): Produkt-SKUs, Wareneingangs-Voranmeldung, Etikettierung und Einlagerung im Lager Shenzhen, Bestandsabfrage, Webhooks.