API Documentation
Help Center/API Documentation/WMS Receiving API

WMS Receiving API

Last updated 2026-10-13

Create and query inbound receipts, confirm receiving lines, one-click receive, and receiving tasks.

Create an inbound receipt#

POST /api/wms/inbound-receipts
POST /api/wms/inbound-receipts
{
  "warehouse_id": "<uuid>",                       // required
  "source_type": "purchase",                      // required: purchase|manual|portal|drayage|return
  "source_id": "<purchase-order-uuid>",           // required when source_type=purchase
  "merchant_id": "<uuid>",                        // optional (auto-filled in standard edition)
  "container_no": "MSKU1234567",
  "seal_no": "S98765",
  "vendor_id": "<uuid>",
  "expected_date": "2026-10-20",
  "title": "货权标识(缺省为 merchant 名)",
  "lines": [
    { "item_id": "<uuid>", "expected_qty": 100, "uom": "CTN", "lot_no": "LOT-001" }
  ]
}
  • source_type is one of purchase / manual / portal / drayage / return.
  • A generated receipt_no (RCPT-YYYYMMDD-XXXX) is returned in data.
  • Permission: wms.inbound.create.

Query receipts#

GET — list and detail
GET /api/wms/inbound-receipts?q=MSKU1234567&status=receiving&warehouse_id=<uuid>&page=1&page_size=20
GET /api/wms/inbound-receipts/<id>   // lines + receiving progress + item names

Confirm a receiving line#

POST /api/wms/inbound-receipts/[id]/receive-line
POST /api/wms/inbound-receipts/<receipt-id>/receive-line
{
  "receipt_line_id": "<uuid>",   // required
  "received_qty": 98,            // required, >= 0
  "damaged_qty": 2,
  "rejected_qty": 0,
  "location_id": "<uuid>",       // required (may be empty for cross-dock)
  "lot_no": "LOT-001",
  "manufacture_date": "2026-09-01",
  "expiry_date": "2027-09-01",
  "serial_nos": ["SN-001", "SN-002"],
  "is_cross_dock": false,
  "condition": "good",           // good | damaged
  "allow_over_receive": false,
  "note": "外箱轻微破损"
}
  • Batch / expiry / serial numbers are strictly validated (v2).
  • Desktop one-click receive: POST /api/wms/inbound-receipts/[id]/receive-all with { lines: [{ line_id, received_qty, location_id }] }.
  • Finish receiving: POST /api/wms/inbound-receipts/[id]/complete-receive; lock it with POST /api/wms/inbound-receipts/[id]/close (received → closed, immutable afterwards).

Receiving tasks#

Create a receiving task
POST /api/wms/receiving-tasks
{
  "receipt_id": "<uuid>",        // required
  "assignee_id": "<uuid>",       // optional
  "receiving_method": "decide"   // palletized | direct | decide (default decide)
}
// idempotent: an existing open task for the receipt returns meta.existing=true

GET /api/wms/tasks?task_type=receive&status=in_progress&warehouse_id=<uuid>&with_progress=1
Receipt lifecycle: imported / new → receiving → received → closed. Receive-line APIs require status new / imported / receiving (checked_in kept for legacy data). After a receiving task is created, desktop direct receiving on that receipt is locked — complete or cancel the task first.