API Marchands : connectez vos SKU, vos préannonces d'achat et votre stock de Shenzhen à votre système
Pour les entreprises qui vendent sur Shopee, Coupang et momo. Envoyez par API les codes-barres produit créés lors de la mise en ligne et préannoncez les numéros de suivi et le contenu de vos achats ; dès l'arrivée à l'entrepôt de Shenzhen, un ordre de travail est créé automatiquement, chaque pièce est étiquetée, scannée et mise en stock, et le stock comme les écarts vous sont renvoyés en temps réel.
Entreprises
Public éligible (numéro fiscal taïwanais à 8 chiffres requis)
200
SKU maximum par requête groupée
WO-SK
Ordre d'étiquetage créé automatiquement à l'arrivée
60 / min
Limite de débit par défaut par clé
1 Présentation
La phase 1 couvre « produits et réception » : de la création d'un SKU jusqu'à la mise en stock des marchandises à l'entrepôt de Shenzhen.
Ce que vous pouvez faire dès maintenant
- Créer ou mettre à jour des SKU en masse (identifiés par votre
seller_sku), avec un code-barres produit distinct pour chaque couleur et chaque taille, et les lier aux références de variantes Shopee / Coupang / momo. - Vérifier automatiquement les exigences à l'importation à partir du code tarifaire à 11 chiffres et signaler les produits soumis à inspection, à autorisation ou interdits à l'importation.
- Préannoncer les numéros de suivi et le contenu de chaque carton lors de l'achat ; à l'arrivée à l'entrepôt de Shenzhen, un ordre d'étiquetage WO-SK est créé automatiquement et l'entrepôt étiquette, scanne et met en stock chaque pièce.
- Consulter le stock par entrepôt et le journal des mouvements de stock, et recevoir en temps réel par webhook les arrivées, les réceptions terminées, les écarts de quantité et les variations de stock.
Processus de réception
- Créer les SKU : envoyez les codes-barres produit, les variantes, les désignations déclarées et les codes tarifaires.
- Préannoncer la réception : envoyez les numéros de suivi et la quantité annoncée pour chaque SKU.
- Arrivée à l'entrepôt de Shenzhen : le scan du numéro de suivi crée et imprime automatiquement un ordre de travail WO-SK.
- Étiquetage et mise en stock : l'entrepôt imprime les codes-barres produit, étiquette chaque pièce et la scanne pour le comptage.
- Réception terminée : les quantités reçues entrent dans le stock de Shenzhen, les articles endommagés sont comptés à part et les écarts sont notifiés à votre système.
Fonctionnalités prévues
Commandes d'expédition en masse, lots d'expédition regroupés automatiquement selon les règles de déclaration, ainsi que stock prépositionné, tri et étiquettes d'expédition des places de marché à l'entrepôt de Taoyuan. Leur mise en service sera annoncée sur cette page.
2 Accès et clés
L'API Marchands est réservée aux entreprises immatriculées ; chaque clé est liée à un compte marchand approuvé.
Étapes d'activation
- Dans l'espace membre, ajoutez un déclarant de type « entreprise » avec son numéro fiscal taïwanais à 8 chiffres.
- Contactez le service client HowBridge pour demander l'activation de l'API Marchands ; une clé vous est délivrée après validation.
- La clé ne s'affiche qu'une seule fois. Conservez-la dans une variable d'environnement côté serveur, jamais dans un navigateur ni dans une app.
- Pour utiliser les webhooks, configurez et vérifiez d'abord votre URL sur la page API de l'espace membre, puis abonnez-vous aux événements marchands.
Authorization: Bearer <clé>. Les jetons générés lors d'une connexion membre à l'app ou au site web ne peuvent pas appeler l'API Marchands.Authorization: Bearer 12|xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx Accept: application/json
3 Conventions
Les règles suivantes s'appliquent à tous les endpoints.
Base URL
Format et langue
Les requêtes et les réponses sont au format JSON. Les messages d'erreur sont en chinois traditionnel par défaut ; envoyez Accept-Language: en pour les recevoir en anglais. Dans votre code, basez toujours votre logique sur error.code, dont la valeur est toujours en anglais.
Structure des réponses
En cas de succès : {"success": true, "data": …, "meta": …} ; en cas d'échec : {"success": false, "error": {"code", "message", "errors", "context"}}, où errors détaille les erreurs champ par champ. Seule exception : une clé absente ou invalide renvoie HTTP 401 avec le corps {"message": "Unauthenticated."}.
{
"success": false,
"error": {
"code": "VALIDATION_FAILED",
"message": "…",
"errors": [
{ "code": "TRACKING_IN_USE", "field": "packages.0.tracking_no", "message": "…" }
]
}
}
Limites de débit
60 requêtes par minute et 5 000 par jour par clé (300 par minute et 50 000 par jour avec l'offre haut volume) ; une requête groupée compte pour une seule. Pour des données en temps réel, abonnez-vous aux webhooks au lieu d'interroger l'API en boucle.
| En-tête de réponse | Description |
|---|---|
X-RateLimit-Limit | Limite par minute |
X-RateLimit-Remaining | Requêtes restantes pour la minute en cours |
X-RateLimit-Limit-DayX-RateLimit-Remaining-Day | Limite quotidienne et requêtes restantes |
Retry-After | Délai en secondes avant de réessayer après dépassement de la limite |
Idempotence (Idempotency-Key)
Les requêtes d'écriture acceptent l'en-tête Idempotency-Key (8 à 128 caractères : lettres, chiffres et _-:.). Après un délai d'attente réseau dépassé, renvoyer la requête avec la même clé d'idempotence et le même contenu renvoie la réponse initiale, avec l'en-tête Idempotent-Replayed: true ; la même clé avec un contenu différent renvoie 422. Les enregistrements sont conservés 24 heures.
Réponses groupées
Les endpoints groupés renvoient un résultat pour chaque élément : 200 si tout réussit, 207 en cas d'échec partiel, 422 si tout échoue. Chaque élément comporte index, status (created / updated / failed) et le motif d'échec.
Caractères des identifiants
seller_sku n'accepte que des lettres, des chiffres et ._- (1 à 64 caractères) ; les codes-barres produit acceptent en plus / et + (3 à 64 caractères). La casse n'est pas prise en compte.
4 SKU produits
Un SKU est identifié de manière unique par votre seller_sku : renvoyer le même seller_sku met à jour le SKU, et seuls les champs transmis sont modifiés.
Créer ou mettre à jour des SKU en masse
POST/api/v1/merchant/skus/batch
Jusqu'à 200 éléments par requête. Chaque élément est traité indépendamment : l'échec de l'un n'affecte pas les autres.
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
seller_sku | string | Obligatoire | Votre référence SKU, par exemple la référence de variante sur Shopee. |
product_name | string | Obligatoire à la création | Nom du produit. Les SKU portant le même nom sont regroupés sous un même produit. |
barcode | string | Facultatif | Code-barres produit : l'entrepôt imprime les étiquettes et scanne la mise en stock à partir de ce code. Chaque couleur et chaque taille doivent avoir un code différent. Sans code-barres, laissez le champ vide : le système génère un code-barres système. Au-delà de 16 caractères, l'étiquette porte le code-barres système. |
gtin | string | Facultatif | Code-barres international GTIN (8 / 12 / 13 / 14 chiffres, clé de contrôle vérifiée). Pour l'option Shopee « produit sans GTIN », envoyez 00. |
spec | object | Facultatif | Variante, par exemple {"color": "noir", "size": "M"}, 5 attributs maximum. |
declared_name_zhdeclared_name_en | string | Facultatif | Désignation déclarée (en chinois / anglais) : indiquez la matière et l'usage, n'écrivez pas « échantillon » ni « cadeau ». |
declared_unit_value | number | Facultatif | Valeur unitaire déclarée : votre prix d'achat unitaire auprès du fournisseur, et non le prix de vente sur la place de marché. |
declared_currency | string | Facultatif | CNY, TWD ou USD ; obligatoire si une valeur unitaire est renseignée. |
hs_code | string | Facultatif | Code de classement tarifaire à 11 chiffres, utilisé par le système pour vérifier les exigences à l'importation. |
origin_country | string | Facultatif | Code ISO du pays d'origine, CN par défaut. |
weight_g | integer | Facultatif | Poids unitaire (en grammes). |
dimensions_cm | array | Facultatif | Longueur, largeur et hauteur (en centimètres), par exemple [20, 15, 3]. |
battery_type | string | Facultatif | none, contained (intégrée), packed (fournie avec l'article), standalone (batterie seule). |
channels | array | Facultatif | Correspondances avec les produits des places de marché, 20 maximum : platform (shopee / coupang / momo / other), shop_id, item_id, model_id, platform_sku. |
Exemple de requête (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" } ] } ] }'
Réponse 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 } }
}
Vérification des exigences à l'importation (regulation.status)
| ok | Aucun code d'exigence à l'importation. |
| review_required | L'exigence ne concerne qu'une partie des produits (par exemple C02 « certains produits de cette position sont soumis à inspection ») ; à confirmer selon l'usage réel du produit. |
| formal_required | Des exigences à l'importation s'appliquent (inspection, quarantaine, autorisation, etc.) ; la déclaration simplifiée ne peut pas être utilisée. |
| blocked | Produit de Chine continentale interdit à l'importation (MW0, originaire de Chine continentale) ; il ne peut pas faire l'objet d'une préannonce de réception. |
| unclassified | Aucun code tarifaire fourni pour le moment : vérification impossible. |
Lister les SKU
GET/api/v1/merchant/skus
Filtrez par seller_sku, barcode, regulation_status ou updated_since (ISO 8601) ; paginez avec page / per_page (100 maximum).
Consulter un SKU
GET/api/v1/merchant/skus/{seller_sku}
Mettre à jour les correspondances avec les places de marché
PUT/api/v1/merchant/skus/{seller_sku}/channels
La liste envoyée remplace intégralement les correspondances existantes ; une même variante de place de marché ne peut pas être liée à deux SKU.
Télécharger les étiquettes code-barres
GET/api/v1/merchant/skus/{seller_sku}/label.pdf?qty=10
Renvoie un PDF d'étiquettes 40×30 mm ; qty correspond au nombre d'étiquettes (1 à 1000). L'entrepôt de Shenzhen imprime la même étiquette lors de l'étiquetage ; cet endpoint vous sert si vous souhaitez étiqueter vous-même avant l'expédition.
5 Préannonces de réception
Une fois vos achats expédiés, préannoncez les numéros de suivi et le contenu. Un ordre de réception peut comporter plusieurs numéros de suivi, chacun listant ses SKU et leurs quantités.
Créer un ordre de réception
POST/api/v1/merchant/inbound-orders
Validation globale : en cas d'erreur, rien n'est créé. Un numéro de suivi ne peut appartenir qu'à un seul ordre de réception en cours ; les SKU en double dans un même colis sont fusionnés et leurs quantités additionnées.
| Champ | Type | Obligatoire | Description |
|---|---|---|---|
reference_no | string | Obligatoire | Votre numéro de commande d'achat ou d'ordre de réception, unique pour un même marchand (lettres, chiffres et ._-/). |
supplier_order_no | string | Facultatif | Numéro de commande fournisseur, par exemple un numéro de commande 1688. |
warehouse_code | string | Facultatif | Entrepôt de réception ; seul SZ (entrepôt de Shenzhen) est accepté pour le moment. |
notes | string | Facultatif | Remarques (1 000 caractères maximum). |
packages | array | Obligatoire | Liste des colis, 50 maximum. |
packages[].tracking_no | string | Obligatoire | Numéro de suivi d'un transporteur express chinois. |
packages[].carrier | string | Facultatif | Code du transporteur, par exemple yto ou sf. |
packages[].items | array | Obligatoire | Contenu du colis : seller_sku et qty, 500 lignes maximum pour l'ensemble de l'ordre de réception. |
Exemple de requête (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 renvoie 409 INBOUND_REFERENCE_EXISTS, avec l'id de l'ordre de réception d'origine dans error.context.inbound_order_id. Pour réessayer sans risque, envoyez l'en-tête Idempotency-Key.Statuts de l'ordre de réception
| created | Préannoncé ; aucun colis n'est encore arrivé. |
| partially_arrived | Une partie des colis est arrivée à l'entrepôt de Shenzhen. |
| arrived | Tous les colis sont arrivés ; étiquetage et mise en stock en cours. |
| completed | Mise en stock terminée, quantités conformes à la préannonce. |
| completed_with_discrepancy | Terminé, mais avec des manquants, des excédents ou des articles endommagés. |
| cancelled | Annulé. |
Statuts des colis
| awaiting_arrival | En attente d'arrivée. |
| labeling | Arrivé à l'entrepôt ; ordre de travail créé, étiquetage et mise en stock en cours. |
| received | Mise en stock terminée. |
| mismatch | Le rattachement du colis constaté à son arrivée ne correspond pas à votre préannonce ; le service client vérifie. |
| cancelled | Annulé ou invalidé ; le numéro de suivi a été libéré. |
Lister les ordres de réception
GET/api/v1/merchant/inbound-orders
GET/api/v1/merchant/inbound-orders/{id}
Filtrez par status, reference_no ou updated_since. Chaque colis renvoie les quantités annoncées, reçues et endommagées, ainsi que l'écart.
Annuler un ordre de réception
POST/api/v1/merchant/inbound-orders/{id}/cancel
L'annulation n'est possible que tant qu'aucun colis n'est arrivé ; après annulation, les numéros de suivi peuvent être préannoncés à nouveau.
6 Stock
Le stock est tenu par entrepôt : SZ entrepôt de Shenzhen, TY entrepôt de Taoyuan (le stock de Taoyuan ouvrira avec les fonctionnalités d'expédition).
Consulter le stock
GET/api/v1/merchant/inventory?warehouse_code=SZ
Filtrez par warehouse_code et seller_sku[] (200 maximum).
on_hand | Quantité en stock. |
reserved | Quantité réservée par des commandes. |
available | Quantité disponible = en stock − réservée. |
damaged | Quantité endommagée, non expédiable. |
Réponse 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 }
}
Journal des mouvements de stock
GET/api/v1/merchant/inventory/movements?after_id=0&limit=200
Enregistrements de mouvements en ajout seul, jamais modifiés. Paginez vers l'avant avec le curseur after_id (500 enregistrements maximum par requête) et conservez le meta.next_after_id de la réponse pour reprendre le rapprochement.
7 Événements webhook
Les événements sont envoyés à votre URL dès qu'ils se produisent, sans interrogation en boucle.
Configuration
- Configurez l'URL du webhook sur la page API de l'espace membre (https uniquement) et effectuez la vérification de propriété : votre endpoint doit répondre HTTP 200 avec le corps
{"challenge": "valeur reçue"}. - Appelez
PUT /api/v1/merchant/webhook/eventspour vous abonner aux événements marchands. Modifier ensuite l'URL dans l'espace membre ne supprime pas ces abonnements.
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"]}'
Liste des événements
sku.regulation_flagged | La vérification des exigences à l'importation d'un SKU passe à « à confirmer », « déclaration en douane formelle requise » ou « importation interdite ». |
inbound.arrived | Un colis est arrivé à l'entrepôt de Shenzhen et l'ordre de travail a été créé. |
inbound.mismatch | Le rattachement d'un colis constaté à son arrivée ne correspond pas à la préannonce ; le service client vérifie. |
inbound.received | Mise en stock d'un colis terminée, avec les quantités annoncées, reçues et endommagées de chaque SKU. |
inbound.discrepancy | Les quantités mises en stock diffèrent de la préannonce ou incluent des articles endommagés (envoyé en même temps que inbound.received). |
inventory.changed | Le stock a changé ; inclut le stock à jour des SKU concernés. |
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"
}
}
Vérifier la signature
Chaque envoi comporte X-Lucky-Event, X-Lucky-Delivery-Id et X-Lucky-Signature: t=horodatage,v1=signature. Calculez un HMAC-SHA256 avec votre secret webhook sur « horodatage + . + corps brut », comparez-le à v1 et rejetez les horodatages de plus de 5 minutes. Lors des nouvelles tentatives d'un même événement, delivery_id reste identique et peut servir à dédoublonner.
Toute réponse autre que 2xx entraîne une nouvelle tentative après 1 minute, 5 minutes, 30 minutes, 2 heures et 6 heures ; après 20 échecs consécutifs, le webhook est désactivé automatiquement et doit être reconfiguré dans l'espace membre.
// 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 Codes d'erreur
error.code est toujours en anglais. Voici les erreurs courantes.
| HTTP | error.code | Description |
|---|---|---|
| 401 | — | Clé absente, invalide ou expirée (corps : {"message": "Unauthenticated."}). |
| 403 | MERCHANT_TOKEN_REQUIRED | Ce jeton n'a pas accès à l'API Marchands (par exemple un jeton issu d'une connexion membre classique). |
| 403 | MERCHANT_NOT_APPROVEDMERCHANT_SUSPENDED | Le compte n'est pas encore approuvé comme marchand, ou le marchand est suspendu. |
| 403 | APP_SUSPENDEDAPP_REVOKEDAPP_NOT_FOUND | L'application API associée à cette clé est suspendue ou révoquée. |
| 422 | VALIDATION_FAILEDPRODUCT_NAME_REQUIRED | Format de données invalide ; consultez le détail champ par champ dans error.errors. |
| 422 | BATCH_TOO_LARGE | Nombre d'éléments supérieur à la limite de la requête groupée. |
| 207 / 409 | SKU_BARCODE_DUPLICATESKU_BARCODE_CONFLICT | Le code-barres produit est déjà utilisé par un autre SKU, ou identique au code-barres système ou au code de préparation d'un autre SKU. |
| 207 / 422 | GTIN_INVALIDHS_CODE_NOT_FOUND | Clé de contrôle du GTIN erronée, ou code tarifaire inexistant. |
| 404 / 422 | SKU_NOT_FOUNDSKU_IMPORT_BLOCKED | SKU introuvable, ou SKU interdit à l'importation qui ne peut pas être préannoncé. |
| 409 | INBOUND_REFERENCE_EXISTS | Le numéro de référence de l'ordre de réception existe déjà. |
| 422 | TRACKING_IN_USETRACKING_FORECASTED_BY_OTHERTRACKING_ALREADY_WAREHOUSEDTRACKING_NOT_AVAILABLE | Le numéro de suivi figure déjà sur un ordre de réception en cours, a déjà été préannoncé par un autre membre ou est déjà arrivé à l'entrepôt au nom d'un autre membre. |
| 409 | INBOUND_NOT_CANCELLABLE | Un colis est déjà arrivé : l'ordre de réception ne peut pas être annulé. |
| 400 / 409 / 422 | IDEMPOTENCY_KEY_INVALIDIDEMPOTENCY_IN_PROGRESSIDEMPOTENCY_KEY_REUSED | En-tête Idempotency-Key mal formé, réutilisé avec un contenu différent, ou requête précédente encore en cours de traitement. |
| 409 | CONFLICT_RETRY | La même donnée est en cours de modification par une autre requête ; renvoyez la requête un peu plus tard. |
| 429 | RATE_LIMIT_EXCEEDED | Limite de débit dépassée ; attendez la durée indiquée par Retry-After avant de réessayer. |
9 Exemples de code
Exécutez les exemples ci-dessous côté serveur ; ne placez jamais votre clé dans du code front-end.
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 Assistance technique
En cas de problème lors de l'intégration, indiquez-nous l'heure de la requête, l'endpoint et le error.code afin que nous puissions vous aider à investiguer.
Compte officiel LINE @0523tw
E-mail technique howyunqisoftware@gmail.com
Version v1, phase 1 (2026-09-17) : SKU produits, préannonces de réception, étiquetage et mise en stock à Shenzhen, consultation du stock, webhooks.