Inventory Holds — 在庫の取り置き
拠点の在庫の一部を取り置きにして、販売可能在庫(available)から外します。取り置いた分は受注の引き当てに使われず、Shopify など販売チャネルの販売可能在庫からも減ります。取り置きをやめると元に戻ります。ERP の引当・店頭での顧客取り置き・展示用の確保などに使います。
Base URL
https://api.lmile.io· 認証x-ingest-secretヘッダー または operator JWT(Authorization: Bearer)(詳細) ·shopはリクエストボディに含めます(API キーで呼ぶ場合は省略できます)
エンドポイント
POST
/api/inventory/hold
参照 ID ごとに取り置き数を設定(増やす・減らす・0 で解除)
受注の引当・店頭での取り置き・取り置き数の変更
POST
/api/inventory/release
参照 ID の取り置きをまとめて解除
受け取り完了・キャンセル
しくみ(両エンドポイント共通)
販売可能在庫が 10 個の拠点での例:
3 個を取り置く
3
7
POS から在庫 12 個(絶対値)が届く
3
9
在庫が 2 個に減る
3
0
取り置きを解除する
0
2
取り置きは在庫の取込とは別に保存されます。POS・倉庫・ERP から在庫の絶対値が届いても、取り置き分を引き直すので消えません。
減るのは販売可能在庫だけです。物理在庫(
on_hand_qty)は変わりません。在庫が取り置きより少なくなると、販売可能在庫は
0で止まります(マイナスにはなりません)。取り置き分は受注ルーティングの引き当てに使われません。
拠点が出荷元に属していれば、販売可能在庫の変化は Source Inventory Webhook で通知されます。Shopify 連携はこの通知で Shopify の販売可能在庫を更新します。
店舗・倉庫など、どの拠点の在庫でも取り置けます。
参照 ID(reference_id)
取り置きの持ち主を表す ID です(受注番号・取り置き伝票番号など)。
1 つの参照 ID に、複数の商品・複数の拠点の取り置きをまとめられます。
省略すると LastMile が生成し、レスポンスの
reference_idで返します。変更・解除に必要なので保存してください。顧客名などの個人情報は入れないでください。
拠点(location)の指定(両エンドポイント共通)
内部の拠点 ID か、外部システムの識別子のいずれかで指定します。
POST /api/inventory/hold
参照 ID × 拠点の取り置き数を、lines の値に揃えます(加算ではありません)。
リクエスト
ボディパラメータ
shop
string
✓
店舗ドメイン(API キーで呼ぶ場合は省略できます)
location
object
✓
取り置く拠点(→ 上の「拠点の指定」)
lines
array
✓
取り置く商品(最大 1,000 件。同じ barcode は 1 行まで)
reference_id
string
参照 ID(最大 200 文字)。省略すると生成して返します
reason
string
理由(記録用・最大 500 文字)
source_system
string
呼び出し元のシステム名(記録用・最大 64 文字)
expires_at
string (ISO 8601)
期限。過ぎると 5 分以内に自動で解除されます。未来の時刻のみ。省略すると解除するまで残ります
lines[].barcode
string
✓
商品 barcode
lines[].quantity
integer (0〜1,000,000)
✓
この参照 ID で取り置く数(絶対値)。0 でこの商品の取り置きを解除
レスポンス
reference_id
参照 ID(省略したときは生成した値)
reference_id_generated
参照 ID を LastMile が生成したら true
location_id
解決した拠点の内部 ID
lines[].quantity
この参照 ID の取り置き数
lines[].held_qty
この拠点 × 商品の取り置き合計(他の参照 ID の分を含む)
lines[].available_qty
取り置きを引いた後の販売可能在庫
挙動・冪等性
同じ内容を再送しても結果は変わりません。そのまま再送してよいです。
参照 ID を省略した再送は、別の取り置きとして二重に取り置かれます。再送する可能性があるなら参照 ID を付けてください。
再送すると
reason/source_system/expires_atも送った値に置き換わります(省略した項目は空になります)。取り置き数を減らす・
0にする操作は、在庫が減っていても常に成功します。増やせるのは「取り置き前の販売可能在庫 − 他の参照 ID の取り置き」までです。例: 在庫 10 個・別の参照 ID が 3 個取り置き中なら、8 個は
409 insufficient_available(detail.holdable=7)。1 行でもエラーになると、そのリクエストの取り置きは 1 件も反映されません。途中まで取り置かれた状態は残りません。
POST /api/inventory/release
参照 ID の取り置きを、全拠点・全商品まとめて解除します。一部の商品だけ解除するときは /api/inventory/hold で quantity: 0 を送ります。
リクエスト
ボディパラメータ
shop
string
✓
店舗ドメイン(API キーで呼ぶ場合は省略できます)
reference_id
string
✓
解除する参照 ID
reason
string
理由(記録用・最大 500 文字)
source_system
string
呼び出し元のシステム名(記録用・最大 64 文字)
レスポンス
released[].released_qty
解除した数
released[].held_qty
解除後の、この拠点 × 商品の取り置き合計(他の参照 ID の分)
released[].available_qty
解除後の販売可能在庫
挙動・冪等性
該当する取り置きが無くても
ok: true(releasedは空)です。そのまま再送してよいです。解除した分は販売可能在庫に戻ります。
エラー
エンドポイント固有:
409
取り置ける上限を超えた(hold)
{ "ok": false, "error_kind": "insufficient_available", "detail": { "barcode": "1234567890123", "requested": 8, "holdable": 7 } }
422
拠点が解決できない(hold)
{ "ok": false, "error_kind": "location_unresolved", "error": "location not found for shop" }
422
barcode が商品マスター未登録(hold)
{ "ok": false, "error_kind": "product_not_found", "detail": { "barcode": "1234567890123" } }
400
入力不備(同じ barcode が 2 行・過去の expires_at など)
{ "ok": false, "error_kind": "invalid_payload", "error": "lines[1].barcode is duplicated" }
共通エラー(401 / 400 / 403 / 405 / 500 / 503)は Error Codes を参照。
データモデル
sot.lm_inventory_holds— 取り置き台帳(shop + reference_id + location_id + product_idで一意・quantity > 0。解除した行は削除)sot.inventory_levels.held_qty— 拠点 × 商品の取り置き合計。available_qtyはこれを引いた後の値sot.inventory_levels.available_qty_gross— 取り置きを引く前の取込値(取り置きのある行だけ。それ以外はNULL)sot.inventory_ledger— 取り置き・解除の履歴(event_type=hold/release。期限切れの解除はreason=expired)
Last updated
Was this helpful?