Create Shipment
POST/api/warehouses/transfers/:transfer/shipments
Creates a shipment for an already-open traditional (non-Amazon FBA) warehouse transfer. This is the explicit second step of the split lifecycle: open the transfer first (allocations only), then ship.
warehouses:writeGrant this scope to your token under Settings → Developer → Personal Access Tokens.
Effects:
- Deducts source warehouse stock
- Creates
-activeand+in_transitinventory movements - Fulfils the line-level allocations created during open (Allocated → Fulfilled)
Request body (all fields optional unless noted):
shipment_date(date) — defaults to today if omittedshipping_method_id(integer) — must exist inshipping_methodstracking_number(string, max 255)cost(numeric, >= 0, < 100000)lines(array, min 1 when present) — if omitted, all remaining open line quantities are shippedlines[].warehouse_transfer_line_id(integer, required_with:lines) — must belong to the transferlines[].quantity(numeric, required_with:lines, min 0.0001)
Responses:
201 Created— warehouse transfer object with updated shipments422 Unprocessable Entity(WarehouseTransferIsNotOpen) — transfer is not in open status422 Unprocessable Entity(WarehouseTransferLineIsUnacceptable) — a transfer line's requested quantity exceeds its allocated sum (allocations out of sync, e.g. stuck Fulfilled rows); the message includes the product SKU and the allocated quantity422 Unprocessable Entity— transfer is an Amazon FBA transfer (use the Amazon-specific flow instead)422 Unprocessable Entity— nothing is left to ship (every line has already shipped in full, or every requested quantity resolves to zero). No empty shipment is recorded.400 Bad Request(ProductIsUnacceptable) — not enough stock at the source warehouse for one of the requested lines
Requires permission: warehouse_transfers.ship
Form Request: App\Http\Requests\CreateWarehouseTransferShipmentRequest
Route name: warehouses.transfers.shipments.store
Source bin: each line may optionally set warehouse_location_id — the source-warehouse bin the line's dispatch should draw stock from. It must be an active (non-deprecated) bin in the transfer's source warehouse. When omitted, pickable source bins are walked automatically.
Serial numbers. lines[].serials (optional array of strings) names the serials leaving on a serialized line. It must hold exactly one serial per unit shipped; an empty or omitted list sends the oldest serials in stock at the source warehouse. Under Require exact match, a named serial that isn't in stock at the source returns 422 on lines.N.serials. Shipped serials are In Transit, still on the source warehouse, until received. For a destination that is never received here (FBA and other externally managed warehouses), they are marked Shipped instead. Deleting the shipment returns them to stock at the source. items[].product on the transfer now includes tracks_serials and serial_generation_mode.
Request
Responses
- 201
- 400
- 401
- 403
- 404
- 422
- 429
Created
Response Headers
Bad Request
Response Headers
Unauthenticated — the bearer token is missing, revoked, expired, or malformed. Never retry automatically; fix the credential. See the Errors guide.
Forbidden — the token lacks a required scope, the endpoint is not available to API tokens, or the user behind the token lacks the permission. A human must adjust the token scopes or user permissions; do not retry.
Not found — no record with the given identifier (or the route does not exist). Verify the ID before retrying.
Unprocessable Entity
Response Headers
Rate limited — platform limit is 1,000 requests/min; individual tokens may carry lower limits. Honor the Retry-After header before retrying. See the Rate Limits guide.