Move Fulfillment Order to Different Warehouse
PATCH/api/fulfillment-orders/:fulfillmentOrder/move
Pre-submit warehouse re-route. Relocates the WHOLE fulfillment order to a new warehouse: every line on the FO has its sales-order-line warehouse moved and its committed stock re-allocated at the target, and the FO itself is re-pointed there (the shipping provider follows the warehouse). It is the FO-level equivalent of moving each line individually. To move a single line instead, use the per-line move on the sales order.
orders:writeGrant this scope to your token under Settings → Developer → Personal Access Tokens.
Mutability gate. Allowed ONLY when the FO is status=open AND request_status=unsubmitted. Once the FO is handed to a provider (anything beyond unsubmitted) the warehouse decision is frozen — returns 409.
Backorder, warn-first. A target short on stock does NOT block the move: the shortfall backorders (Planned) and is evicted off the FO so it holds only shippable lines (a wholly-uncovered FO is deleted). Because that quietly backorders, an un-acknowledged move that would backorder returns 409 with requires_acknowledgement: true and a coverage object instead of committing — call GET .../move-preview (or read that coverage) to warn the user, then resend with acknowledge_backorder: true. Blemished products can't backorder; their shortfall is flagged as blemished_shortfall in the coverage.
Body fields:
warehouse_id(required, integer, must exist) — new destination warehouse.acknowledge_backorder(optional, boolean, default false) — set true to proceed when the move would backorder one or more lines.reason(optional, string, max 1000) — free-text note for the audit trail.
Request
Responses
- 200
- 401
- 403
- 404
- 409
- 422
- 429
OK
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.
Conflict
Response Headers
Validation failed — the body is a field → messages map (Laravel shape) or the platform envelope with a stable machine-readable code. Fix the payload and resubmit.
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.