Dispatch Config — WMS 連携設定
ルーティングで在庫ロケーションへ引き当てた後、その出荷を外部 WMS / 3PL へ自動 POST するための設定を、在庫ロケーションごとに登録します。WMS ごとにペイロード形式が異なるため、宛先 URL・認証・ペイロードテンプレートを設定し、barcode / sku / product_name / quantity / properties 等を変数として差し込みます。
Base URL
https://api.lmile.io· 認証x-ingest-secretヘッダー(詳細) ·shopはリクエストボディに含めます(省略するとキーのアカウント)
引き当て確定時(
/api/routing/orders・/api/routing/reallocate)に、各 shipment(引き当て先在庫ロケーション)の設定が解決され送信されます。設定の無いロケーションは送信を skip します。送信結果はsot.lm_location_dispatch_logに記録されます。
action=label/action=printの解決キーは出荷元: 出荷ラベルを物理出力するのは引き当て店舗ではなく出荷元(MFC センター / 倉庫)のため、label(ラベル生成)とlocationIdには出荷元 location を指定してください。
エンドポイント
POST
/api/routing/dispatch-config
在庫ロケーション単位の WMS ディスパッチ設定を登録 / 更新(upsert)
POST /api/routing/dispatch-config
shop + locationId で設定を upsert します。authSecret はサーバー側で暗号化保存され、レスポンスや読み取り API には返りません(has_secret のみ)。無効化は isActive: false で同じ POST を送ります。
リクエスト
POST https://api.lmile.io/api/routing/dispatch-config
x-ingest-secret: {INGEST_SECRET}
Content-Type: application/json{
"shop": "demo-store.myshopify.com",
"locationId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"destinationUrl": "https://wms.example.com/inbound",
"httpMethod": "POST",
"contentType": "application/json",
"authType": "bearer",
"authSecret": "wms-api-token-xxxxx",
"payloadTemplate": {
"order_ref": "{{externalOrderRef}}",
"ship_to": { "pref": "{{shipTo.prefecture}}", "postal": "{{shipTo.postalCode}}" },
"from": "{{location.label}}",
"items": {
"$each": "lines",
"as": { "code": "{{barcode}}", "sku": "{{sku}}", "name": "{{product_name}}", "qty": "{{quantity}}", "note": "{{properties.刻印}}" }
}
},
"isActive": true
}ボディパラメータ
shop
string
店舗ドメイン(省略するとキーのアカウント)
locationId
string (uuid)
✓
設定対象 location(shop 内に実在すること)。create/update/cancel は引き当て先在庫ロケーション、label/print は出荷元(fulfillment source location)
tag
string
tag 条件(任意)。省略=既定設定。注文 tag がこの値に一致するとこの設定で送信
action
string
アクション種別 create(既定) / update / cancel / label / print / pickup。(shop, location, tag, action) で一意。cancel/update は Cancel / Update、label/print は Fulfillment、pickup は Carrier Pickup で使用
responseMapping
object
action=label + adapterType=generic_template 用。応答 JSON から追跡番号 / ラベル PDF を抜く dot-path マップ(下記)
adapterType
string
generic_template(既定) / shipandco。shipandco は Ship&Co 専用の住所整形・応答解釈を行う(下記)
destinationUrl
string
✓
送信先 WMS エンドポイント(Ship&Co は https://api.shipandco.com/v1/shipments、print は print server の受け口)。https:// で始まるホスト名の URL のみ(IP アドレス・localhost・.internal・.local は不可)
payloadTemplate
object/array
✓
送信ボディのテンプレート(下記)。action=print は不要(multipart 固定形のため。省略可)
httpMethod
string
HTTP メソッド(default POST)
contentType
string
Content-Type(default application/json)
authType
string
none / bearer / header(default none)
authHeaderName
string
authType=header のときのヘッダー名
authSecret
string
認証 secret(暗号化保存。省略時は既存維持。ただし destinationUrl か authHeaderName を変えるときに省略すると、保存済みの secret は消えます。送信先を変えるときは secret も送り直してください)
isActive
boolean
有効フラグ(default true)
ペイロードテンプレート
JSON を再帰的に描画します。
変数差し込み: 文字列内の
{{path}}を値に置換(dot-path 可)。path には{}と空白を除く任意の文字が使えるため、{{properties.刻印}}のような日本語キーも参照できます。文字列全体が単一{{path}}の場合は値の型を保持(数値などをそのまま渡す)。値が無い path は文字列内では空文字、単一{{path}}ではnullになります。配列展開:
{ "$each": "lines", "as": <itemテンプレート> }は対象配列を反復し、各要素のキー(barcode/sku/product_name/quantity/properties)を差し込んで配列を生成。
利用可能な変数:
shop / sourceSystem / externalOrderRef / idempotencyKey / decidedAt
注文情報
shipTo.name / shipTo.company / shipTo.phone / shipTo.email
配送先 受取人・連絡先
shipTo.country / shipTo.postalCode / shipTo.prefecture / shipTo.city / shipTo.address1 / shipTo.address2
配送先住所
location.id / location.label
引き当て先在庫ロケーション
action
dispatch アクション(create / update / cancel)
lines[].barcode / lines[].sku / lines[].product_name / lines[].quantity
明細($each 内で参照)
lines[].properties
明細単位の任意キー/値(Routing の lines[].properties。刻印テキスト等)。$each 内で {{properties.<キー>}} で個別値を参照(object のまま渡す場合は単一変数 "{{properties}}")。properties の無い明細は null
sku/product_nameは送信時にbarcodeからsot.productsを解決して補完します(出荷指示自体は barcode・数量・properties のみ保持)。properties 導入前に保存された出荷指示の明細はproperties: nullとして扱われます。
responseMapping(action=label 専用)
action=label では送信先(carrier API / 印刷 agent)の応答 JSONから追跡番号とラベル PDF を取り込みます。応答の dot-path を指定します。
trackingNumber
追跡番号のパス
carrierCode
キャリアコードのパス(任意)
labelPdfBase64
base64 エンコードされた PDF のパス(あれば優先)
labelPdfUrl
PDF ダウンロード URL のパス(labelPdfBase64 が無い場合に fetch)
取り込んだ PDF は Supabase Storage バケット shipping-labels(private)に {shop}/{routingOrderId}/{fromLocationId}.pdf(shipment の引き当てロケーション単位)で保存し、パスと追跡番号を sot.lm_fulfillment_shipments に記録します。詳細は Fulfillment。
Ship&Co アダプタ(adapter_type=shipandco)
action=label + adapterType=shipandco のとき、汎用テンプレートの代わりに Ship&Co 専用アダプタが payload を組み立てます(県名の正規化・電話整形・市区町村の address1 前置など、JSON テンプレートでは表現できない整形を行うため)。payloadTemplate は送信ボディそのものではなく Ship&Co 設定として解釈されます。設定は出荷元 location(MFC センター / 倉庫)に登録し、fromAddress にはその出荷元の差出人住所を指定します。
認証:
authType: "header"/authHeaderName: "x-access-token"/authSecret: "<Ship&Co API トークン>"(暗号化保存。ソースに直書きしません)。payloadTemplate(= Ship&Co 設定):
carrierId
✓
Ship&Co のキャリア ID(setup.carrier_id)
fromAddress
✓
依頼主(出荷元)住所。Ship&Co の from_address 形式
service
配送サービス(default sagawa_regular)
productOriginCountry
商品の原産国(default IT)
defaultProductPrice
products[].price の既定値(default 0。routing 文脈に単価が無いため。下記注記参照)
宛先住所: Routing の
shipTo(=sot.lm_routing_orders.ship_to_*)からto_addressを組み立て。県名は日本語へ正規化、address1に市区町村を前置、電話は+81→0・記号除去、郵便番号はハイフン除去。商品: 出荷指示の明細(
barcode→sku解決)をproducts[]に。SKU にGIFT/CUSTOMを含む行は除外。明細のpropertiesは Ship&Co payload には送りません(products[]はname/quantity/price/origin_countryのみ)。応答: Ship&Co 固定形(
id/delivery.label(URL) /delivery.tracking_numbers[0])から追跡番号と PDF URL を取得して取り込みます(responseMappingは使いません)。carrier_codeにはserviceを保存。失敗時: HTTP 非 200 /
delivery.label欠落はsot.lm_fulfillment_shipments.last_label_errorに記録。住所不備なら 住所修正・再発行 でリカバリします。
注記(要疎通確認): routing 文脈に商品単価が無いため
products[].priceはdefaultProductPrice(既定0)を送ります。国内・非代引きの Sagawa 便では通常問題ありませんが、実 Ship&Co API での疎通テストでprice=0が拒否されないことを確認してください。
action=print(ラベル物理印刷)
ラベル生成(action=label)の成功直後に、保存したラベル PDF を出荷元の print server へ自動送信します。destinationUrl は print server の受け口、認証は通常 authType: "header" + authHeaderName: "x-api-key" です。payloadTemplate は不要(省略可)。
送信形式は multipart/form-data 固定:
pdf
ラベル PDF(application/pdf、ファイル名は {fromLocationId}.pdf)
paper
A5
tray
Tray1
options
{"MediaType":"Cardstock","print-scaling":"none","Duplex":"None","cupsPrintQuality":"High"}(CUPS オプション JSON)
印刷は best-effort: 失敗してもラベル生成・状態遷移は成功のまま維持し、
sot.lm_fulfillment_shipments.last_print_errorに記録します。リトライしません(5xx でも実際は印刷済みの可能性があり、配送ラベルの二重出力を避けるため)。回収は Print Label(手動再印刷)。
print設定の無い出荷元は印刷を skip します(printStatus: "skipped"。非印刷拠点として正常)。
action=pickup(キャリア集荷の依頼先)
Carrier Pickup が集荷(オンコールピックアップ)を依頼するときの、集荷先の住所とキャリア接続です。adapterType は ups_pickup を指定します。
destinationUrl には UPS API のベース URL を入れます(本番 https://onlinetools.ups.com / テスト https://wwwcie.ups.com)。テスト環境では実際の集荷は発生しません。アダプタがこの URL にパスを足して呼ぶので、本番とテストの切り替えはこの 1 項目だけです。
authSecret にはキャリアの認証情報を "<clientId>:<clientSecret>" の形で入れます(action=label + adapterType=dhl と同じ形式)。
payloadTemplate は送信ボディそのものではなく、集荷設定として解釈されます:
accountNumber
✓
請求先のキャリアアカウント番号
accountCountryCode
アカウントの国コード(既定 JP)
pickupAddress
✓
集荷先。下記の全項目が必要です
serviceCode
引き取ってもらう配送サービスのコード(3 桁ゼロ埋め。既定 008 = Worldwide Expedited)
defaultReadyTime / defaultCloseTime
依頼時に時間帯を省略したときの既定値 HHmm(既定 1600 / 1800)
pickupAddress の項目:
companyName / contactName / phone
集荷先の会社名・担当者名・電話番号
addressLine
番地・建物。1 本の文字列で指定します(配列で渡した場合はカンマで連結します)
city
市区町村
stateProvince
都道府県・州を ISO 3166-2(例: 大阪 = JP-27)で指定します。日本 / 米国 / カナダでは必須です
postalCode
郵便番号(ハイフンは自動で除去します)
countryCode
国コード(ISO 3166-1)
residentialIndicator
Y = 住宅 / N = オフィス(既定 N)
項目が欠けていても既定値では埋めません。足りない項目を挙げて
422を返します(誤った住所に集荷を呼ばないため)。pickup設定の無い出荷元へ依頼すると、エラーではなくrequestable: falseと理由を返します。serviceCodeはキャリアがアカウントの契約サービスで検証します。テスト環境では通っても本番で拒否されることがあるため、テスト環境の成功を本番の根拠にしないでください。認証情報は保存後に読み出せません(レスポンスは
has_secretのみ)。変更したいときはauthSecretを送り直します。省略すれば既存の値が維持されるので、住所や時間帯だけを直せます。ここに登録する住所は既定値です。1 回の集荷だけ別の住所にしたいときは、設定を変えずにCarrier Pickup の
pickupAddressで上書きします。
レスポンス
id
設定行 id(sot.lm_location_dispatch_config.id)
has_secret
認証 secret が保存済か(secret 値そのものは返しません)
挙動・セキュリティ
upsert:
(shop, location_id, tag, action)で1件に収束(tag省略=既定、action省略=create)。authSecret省略時は既存の暗号化値を維持。解決: dispatch 時に
action(create/update/cancel/label/print/pickup)で完全一致、その中で注文tag一致を優先(無ければtag=NULL既定)。location キーはcreate/update/cancel= shipment の引き当て先在庫ロケーション、label/print/pickup= 注文の出荷元(fulfillment source location)。暗号化:
authSecretは pgcrypto で暗号化して保存(鍵は Supabase Vault 管理)。レスポンス・読み取り view・ログのいずれにも平文 secret は出ません。送信(ディスパッチ): 引き当て確定時に各 shipment の設定を解決し、テンプレート描画→
authTypeに応じた認証(bearer=Authorization: Bearer .../header= 任意ヘッダー)で送信。5xx は指数バックオフで最大 2 回再試行。observability: 送信ごとに
sot.lm_location_dispatch_logへrequest_payload(描画後・secret なし)/http_status/delivery_status/attempts/last_errorを記録。
エラー
エンドポイント固有:
422
必須欠落・不正値(error_kind: invalid_payload)
{ "ok": false, "error_kind": "invalid_payload", "error": "destinationUrl required" }
422
destinationUrl が https でない・IP アドレスや内部向けのホスト(error_kind: invalid_destination_url)
{ "ok": false, "error_kind": "invalid_destination_url", "error": "destinationUrl must use https" }
422
location が shop 内に存在しない(error_kind: location_unresolved)
{ "ok": false, "error_kind": "location_unresolved", "error": "location not found for shop" }
共通エラー(401 / 400 / 403 / 405 / 500 / 503)は Error Codes を参照。
データモデル
sot.lm_location_dispatch_config— 在庫ロケーション単位の WMS 設定(UNIQUE shop + location_id、auth_secret_encryptedは pgcrypto 暗号化、adapter_typeは将来拡張用)sot.lm_location_dispatch_log— 送信ログ(delivery_status:pending/sent/failed/skipped、request_payloadは secret なし)暗号鍵: Supabase Vault
lm_dispatch_enc_key。読み取り view(secret 除外):public.lm_v_location_dispatch_config/public.lm_v_location_dispatch_log
Last updated
Was this helpful?